智能驾驶辅助检测

ChangeCode
转载
发布时间: 2025-06-10 15:39:40 | 阅读数 0收藏数 0评论数 0
封面
驾驶员 ID、位置/速度数据以及安全带和酒精检测,用于车辆中的致命事故风险缓解 (FARM)。

准备工作:

材料:

材料名称
数量
备注
Raspberry Pi 摄像头模块
1
Raspberry Pi 4 B 型
1
Blues Wireless Raspberry Pi 入门套件
1
模拟酒精传感器 (MQ3)
1
1

起因

根据美国国家公路运输安全管理局 (NHTSA) 的最新车祸和死亡数据,2020 年美国有超过 38, 000 人死亡,为 2007 年以来的最高水平。2021 年的估计值大于 40, 000 人。

2021 年的估计甚至高于 2020 年。

根据 NHTSA 的数据,在 45% 的致命事故中,乘用车司机至少参与了以下危险行为之一:超速、酒后驾车或不系安全带

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

我把这个项目称为 Fatal Accident Risk Mitigation (FARM)。它是车队管理功能的概念验证:确定您的团队中谁在驾驶车辆,他们是否系了安全带,他们是否以安全的速度行驶,以及是否在车内检测到酒精(从打开的瓶子或他们的呼吸中)。这一切都可以通过在 Raspberry Pi 4 上运行的 Edge Impulse 对象检测模型、Raspberry Pi 摄像头、在 Raspberry Pi HAT 上运行的 Blues Wireless Notecard 和 DFRobot MQ-3 气体传感器来完成。该设置可以通过车辆的 12V 电源(即点烟器)甚至电池组供电。

2

创建模型

为此我需要数据。我在外出开车时使用 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
3

图像标注

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

4

Edge Impulse辅助

为每张照片添加标签很乏味,但 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 提供了足够的空间。

5

模型结果

模型的 Precision 分数很好!

6

Linux模型部署

我将模型部署为 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)。

7

代码测试

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

8

测试结果

使用 Notecard Pi Carrier、摄像头和气体传感器安装 Raspberry Pi。

我还连接了一个小型便携式显示器和 USB 键盘/鼠标,这样我就可以看到我何时获得了 GPS 的卫星定位(每次关闭记事卡时,您都必须重新获取卫星)。一旦我得到 GPS 位置,我就开车四处转了一会儿。我设置了我的代码,以便每 2 分钟发送一次备注,其中包含驾驶员 ID 信息、他们是否系安全带以及是否检测到酒精。速度和 GPS 信息由 Notecard 以预定的时间间隔自动发送(在我的情况下,我将其设置为每 20 秒一次,用于精细位置和速度数据)。

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

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

9

上路测试

然后,我按照 Blues Wireless 的优秀教程创建了一条到 Datacake 的路线,在那里我可视化了 Notes 中感兴趣的数据:位置信息的纬度和经度、司机姓名、速度、安全带信息以及检测到的酒精数据(静态和趋势)。以下是 Datacake dashboard configuration 选项卡中的有效负载解码器代码:

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;
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 在可视化数据方面做得很扎实


我既不能确认也不能否认我(停着的)车里有啤酒来捕捉酒精趋势。

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


10

最后的思考

这是一个有趣的项目。我对模型识别我以及我是否系安全带的性能感到满意。酒精传感器也表现非常出色。只需喝一口啤酒并呼气,传感器就会触发检测酒精的阈值。我在为 Notecard 设置正确的参数时遇到了一些挑战,但一旦我这样做了,结果看起来就相当不错。感谢 Rob Lauer 和 Blues Wireless 的支持团队一直以来的帮助。总的来说,Blues Wireless Notecard 有很多功能,我期待在未来的项目中尝试它。

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

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


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


URL
RPi Blues Fleet Mgmt 源代码.url
185B
阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载