×

致命事故风险缓解(FARM)开源分享

消耗积分:0 | 格式:zip | 大小:0.19 MB | 2023-01-30

王越建

分享资料个

描述

根据美国国家公路交通安全管理局 (NHTSA)最新的汽车事故和死亡数据,2020 年美国死亡人数超过 38,000 人,为 2007 年以来的最高水平。2021 年估计超过 40,000 人。

poYBAGPXHYWAMq_8AAIqBk4penk668.png
2021 年的估计甚至高于 2020 年。
 

根据美国国家公路交通安全管理局 (NHTSA) 的说法,在 45% 的致命事故中,乘用车司机至少有以下一种危险行为:超速、酗酒或未系安全带(2023 年 1 月 13 日更新:前几天我在收音机里听说激进驾驶也是事故的一个因素,所以我在我的项目中添加了另一个传感器!)

借助 Edge Impulse 对象检测模型和 Blues Wireless Notecard,我们可以利用机器学习和无线物联网的力量来帮助减轻这些危险行为!

我将此项目称为致命事故风险缓解 (FARM) 这是车队管理能力的概念证明:确定您的团队中谁在驾驶车辆,他们是否系好安全带,他们是否以安全速度行驶,是否在车内检测到酒精,以及(更新)他们是否激进驾驶(急加速和/或急刹车)这一切都可以使用在 Raspberry Pi 4 上运行的 Edge Impulse 对象检测模型、Raspberry Pi 相机、在 Raspberry Pi HAT 上运行的 Blues Wireless Notecard、DFRobot MQ-3 气体传感器(更新)和 Seeed Studio 来完成Grove LIS3DHTR 3 轴加速度计该装置可以通过车辆的 12V 电源(即点烟器)甚至电池组供电。

该项目的第一步是创建模型,为此我需要数据。我在外出开车时使用 Raspberry Pi 和相机拍了数百张照片,所以我有一些真实的样本来展示模型会看到的东西。我收集了大约 300 张我在一天中不同时间系好安全带驾驶的照片,以及不同日照量来改变输入。这是我为捕获这些图像而开发的简短 Python 脚本:

import os
import time

FRAMES = 200
TIMEBETWEEN = 6

frameCount = 0
while frameCount < FRAMES:
    imageNumber = str(frameCount).zfill(7)
    os.system("raspistill -o image%s.jpg"%(imageNumber))
    frameCount += 1
    time.sleep(TIMEBETWEEN - 6) #Takes roughly 6 seconds to take a picture

获得图像后,我将批量上传到我的 Edge Impulse 项目中。可以在此处找到该项目的公共版本然后是乏味的工作:贴标签。幸运的是,Edge Impulse 能够在其框架内标记每个图像,从而使这变得非常简单。对于每张图片,我在我的脸周围画了一个边界框,在肩部区域附近画了一个边界框,显示系好安全带(但也有一些背景表明我系了安全带)。

pYYBAGPXHYiARz9XAAFDv08TfGI501.png
给每张照片贴标签很乏味,但 Edge Impulse 环境让这一切变得简单。
 

在所有图像都贴上标签后,我开始了 Impulse Design 过程。在大多数情况下,我保留了 Edge Impulse 推荐的默认参数。如前所述,我使用了对象检测框架。因为我使用的是 Raspberry Pi 4,所以我并不过分关心模型大小。我使用了 320x320 RGB 输入图像,并使用迁移学习在由 Edge Impulse 专家之一导入的 YOLOV5 数据集上训练了 50 个训练周期。还有一个社区 YOLOV5 模型也可以使用。该模型的精度得分为 98.3%,推理时间为 272 毫秒。模型大小为 3.5 MB,因此有足够的空间容纳 Raspberry Pi 4。

poYBAGPXHYqAESjhAAA0VRTi99U713.png
模型的精确度得分很高!
 

然后我将模型部署为 Linux (ARM V7).eim 文件。

pYYBAGPXHYyAMW4JAAB8W9kf6ow029.png
我将模型部署为 Linux .eim 文件。
 

由于我过去曾使用 .eim 文件完成项目,因此我利用该经验开发 Python 代码来加载模型、读取图像、对这些图像进行分类,然后对推理结果采取行动(在本例中发送数据到 Blues Wireless Notehub.io)。Python 脚本可以在我的 github 上看到,该项目有一个链接(请参阅代码部分)。

永远不会满足,一旦我启动并运行我的代码,我决定在设置中添加一个酒精传感器,看看我是否可以检测到车内是否存在酒精。我有一个一年前购买的 DFRobot 重力气体传感器 (MQ3),并为这个项目回收了它。大多数 MQ3 传感器都是 5V 和模拟的,这在 Raspberry Pi 上表现不佳。然而,DFRobot 重力传感器具有 I2C 接口,可承受 3.3V 和 5V,因此连接到 Raspberry Pi 非常容易(没有 5V 到 3.3V TTL,也没有 ADC)。

为了测试我的代码,我将 Raspberry Pi(带有 HAT)摄像头、酒精传感器、(更新)和加速度计安装到我汽车的仪表板上,并将其插入 12V 电源:

pYYBAGPXHZaAeiArAAunJrwDjXI786.jpg
使用 Notecard Pi 载体、相机和气体传感器安装 Raspberry Pi。
 

我还连接了一个小型便携式显示器和 USB 键盘/鼠标,这样我就可以看到何时获得 GPS 卫星定位(每次关闭 Notecard 电源时,都必须重新获取卫星)。一旦我获得了 GPS 位置,我就开车四处转转。我设置了我的代码,以便每 2 分钟发送一次带有驾驶员 ID 信息的注释,如果他们系好安全带,如果检测到酒精,(更新)以及激进加速和制动的计数速度和 GPS 信息由 Notecard 以预定的时间间隔自动发送(在我的例子中,我将其设置为每 20 秒一次以获得精细的位置和速度数据)。

笔记被发送到 Blues Wireless Notehub.io。您可以在下面看到发送到Notehub.io的示例注释

poYBAGPXHZqAAbQyAAG6y7fYWIQ743.png
来自 Notehub.io 的示例注释捕获推理和位置/速度信息
 

然后我按照 Blues Wireless 的优秀教程创建了一条通往Datacake的路线,在那里我可视化了 Notes 中感兴趣的数据:位置信息的纬度和经度、驾驶员姓名、速度、安全带信息、检测到的酒精数据(静态和趋势) ,(更新)和攻击性驾驶的计数下面是 Datacake 仪表板配置选项卡中的有效载荷解码器代码:

function Decoder(request) {
    
    var data = JSON.parse(request.body);
    var device = data.device;
    
    var file = data.file;
    
    var decoded = {};
    
    decoded.pi_location = "(" + data.where_lat + "," + data.where_lon + ")";
    //detect excessive speed, convert to mph, 30 mph for test purposes
    //recommend higher (80 mph?) to detect excessive speeding
    if ( (data.body.velocity * 2.23694) > 30.0 )
    {
        decoded.max_velocity = data.body.velocity * 2.23694;
    }   
    
    if (file === "locations.qos") {
        
        decoded.voltage = data.body.voltage;
        decoded.motion = data.body.motion;
        decoded.seconds = data.body.seconds;
        
    } else if (file === "_session.qo") {
        
        decoded.voltage = data.voltage;

    } else if (file === "sensors.qo") {
        
        // custom application code
        decoded.faceID = data.body.faceID;
        decoded.confidence = data.body.confidence;
        decoded.seatbelt = data.body.seatbelt;
        decoded.alcohol_detected = data.body.alcohol_detected;
        //new aggressive driving data (hard acceleration and braking)
        decoded.num_hard_accel = data.body.num_hard_accel; 
        decoded.num_hard_brake = data.body.num_hard_brake;
        decoded.time = data.when;
    }
    
    if (("tower_lat" in data) && ("tower_lon" in data)) {
        decoded.tower_location = "(" + data.tower_lat + "," + data.tower_lon + ")";
    }
    if (("where_lat" in data) && ("where_lon" in data)) {
        decoded.device_location = "(" + data.where_lat + "," + data.where_lon + ")";
    }
    
    decoded.rssi = data.rssi;
    decoded.bars = data.bars;
    decoded.temp = data.temp;
    decoded.orientation = data.orientation;
    decoded.card_temperature = data.body.temperature;
    
    // Array where we store the fields that are being sent to Datacake
    var datacakeFields = []
    
    // take each field from decodedElsysFields and convert them to Datacake format
    for (var key in decoded) {
        if (decoded.hasOwnProperty(key)) {           
            datacakeFields.push({field: key.toUpperCase(), value: decoded[key], device: device})
        }
    }      
    
    // forward data to Datacake
    return datacakeFields;
    
}

Datacake 在可视化数据方面做得很好,如下所示:

pYYBAGPXHZ-ASXiYAAE2fW5VuxY732.png
我既不能确认也不能否认我在(停放的)车里喝了啤酒来捕捉酒精趋势。
 

仪表板识别驾驶员,如果他们系了安全带,车速(可以设置一个阈值,所以你只看到他们是否超速),安全带趋势(如果他们在整个驾驶过程中都系着安全带),检测到酒精趋势(和上次读数)、地图上的位置信息、(更新)以及驾驶员加速和猛踩刹车的次数如果您需要任何这些行为的即时警报,Notehub.io有一个Twilio 路由选项,因此您可以接收短信(例如,如果检测到酒精)。我没有在这个演示中实现它,但它是未来的一种可能性。

添加加速度计

如前所述,广播中关于激进驾驶导致事故的报道启发我在硬件中添加加速度计传感器以跟踪激进驾驶行为。我在他们的 Grove 套件中放置了一个 Seeed Studio Grove 加速度计,通过 Notecarrier Pi HAT 上的 Grove 连接器,这是一个非常简单的连接。

pYYBAGPXHaOAPcp9AAYJKCPdS3k895.jpg
将加速度计连接到 Notecarrier Pi HAT 非常简单。
 

我用双面胶带固定加速度计,Y 面朝前(俯仰),X 面朝另一边(滚动),Z 面朝上。我在 Seeed Studio 网站上找到了一些 Python 代码,经过一些修改后,我的测试按预期运行。然后,我在路上进行设置并四处行驶,以测试加速度计如何检测怠速的汽车、正常驾驶以及急加速和制动。我对数据中不同阶段的独特性感到惊喜:

poYBAGPXHaWAdugCAACcehAF7b0675.png
你可以清楚地看到我什么时候加速,什么时候猛踩刹车。
 

不出所料,当我空闲时,数据几乎没有变化。当我开车时,数据有一点变化。但是当我激进地驾驶时,你可以清楚地看到当我加速时正方向的尖峰和当我在 Y 轴上踩刹车时的负方向尖峰(黄色图),这是俯仰。这是有道理的,因为如果您快速加速或减速,那是变化最大的轴。所以我简单地在y轴数据上设置了一个阈值。如果大于 10000 或小于 0,则说明驾驶员驾驶过于激进。我设置了计数器来跟踪硬停止和启动的次数,并将其传递给Notehub.io并将其路由到 Datacake。如果您想添加额外的检查,您甚至可以跟踪急转弯。我没有在图表上标记它,但 x 轴(灰色图)显示我在这个数据集中进行了 3 次右转。您可以看到数据中的 3 个(小)尖峰。如果我要更积极地进行这些转弯,那么这些尖峰将更加明显并且很容易达到阈值。我将我的代码范围限制在硬加速和刹车上。

最后的想法

这是一个我认为相当简单的项目,但随着我对车祸及其原因的研究越来越多,它变得越来越复杂。我对识别我的模型的性能以及我是否系好安全带感到满意。酒精传感器也表现出色。只需喝一口啤酒并正常呼吸,传感器就会触发检测酒精的阈值。加速度计也表现出色。我在为 Notecard 设置正确参数时遇到了一些挑战,但一旦我这样做了,结果看起来相当不错。感谢 Rob Lauer 和 Blues Wireless 的支持团队一直以来的帮助。总体而言,Blues Wireless Notecard 具有很多功能,我期待在未来的项目中尝试使用它。

这个项目的巧妙之处在于没有图像被发送到任何地方,所以它是安全的。Raspberry Pi 上本地存储了一张调试照片(以确认相机正在查看的内容),但可以在代码中将其禁用。否则,唯一发送到 Notehub 和 Datacake 的只是元数据!

我确实想评论的一件事是一些限制。第一:太阳。特别是在新英格兰的冬天,太阳在天空中的角度很低。根据您驾驶的方向,Raspberry Pi 摄像头可能会被阳光遮挡,从而导致无法检测到驾驶员和安全带。这也许可以通过不同的传感器(ToF、毫米波雷达?)来解决。但在大多数情况下,这不是问题。第二:我的模型只有我自己和安全带的课程。如果需要考虑其他驱动因素,则需要进行类似的数据收集和标记(以及模型更新)。第三,我只在车上收集数据。如果您有车队,则需要为每种车辆类型收集数据(因为每辆车的安全带位置不同)。当我在我妻子的车里测试我的代码时,我很容易被识别出来,但安全带却没有。此外,由于这是基于 EO 相机的系统,因此无法在黑暗中工作。也许我可以用用于夜间驾驶的NoIR 摄像头,但我只将范围限制在白天。这可能是未来的增强。最后,酒精传感器可以检测多种类型的酒精,包括洗手液,所以你可能会得到误报。不过,进一步细化传感器读数可能会过滤掉它。

如果您读到了这篇文章的结尾,感谢您的阅读。我希望你喜欢。我很高兴我能够解决导致大多数致命事故的几个因素:超速、攻击性驾驶、酗酒和不系安全带我希望这能激发未来的生产产品,以降低道路风险,以“建设更智能的世界”。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !