免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

基于YOLOv5与树莓派的驾驶员危险行为检测系统实战

基于YOLOv5与树莓派的驾驶员危险行为检测系统实战 简介这是一套面向嵌入式AI初学者与高校实践者的驾驶员危险驾驶行为检测预警系统基于YOLOv5深度学习模型开发专为树莓派等边缘设备轻量化部署优化适用于毕业设计、课程设计、学科竞赛及工程实训等场景。资源包共105个文件涵盖39个核心Python源码含模型训练、推理、告警逻辑、18个配置类YAML文件定义类别、超参与硬件适配参数、3个MP3语音提示音频、2个关键人脸特征点检测.dat模型文件以及Dockerfile、ONNX导出模型、UI界面与图标资源等完整支撑从训练到端侧部署全流程压缩包大小为174.34MB。已有153人学习下载项目经实测可在树莓派4B上稳定运行支持打哈欠、闭眼、分心、抽烟等多类危险行为实时识别与声光预警。用户获取后可直接烧录运行无需二次调试配套README详述环境搭建、引脚连接与功能验证步骤并提供面包板快速复现方案降低硬件门槛助力嵌入式AI项目落地实践。1. 项目缘起从实验室到路边的真实需求去年夏天我参与了一个智能交通相关的校企合作项目其中一个核心任务就是解决驾驶员疲劳驾驶、分心驾驶等危险行为的实时监测问题。最初我们尝试了基于传统计算机视觉的方案比如通过计算眼睛闭合时间PERCLOS来判断疲劳或者用HOGSVM检测驾驶员是否在打电话。但在实际路测中这些方法在复杂光照、驾驶员姿态多变的情况下鲁棒性很差误报率居高不下。项目一度陷入僵局直到我们转向了基于深度学习的方案特别是YOLOv5才真正打开了局面。这个“基于深度学习YOLOv5的驾驶员危险驾驶行为检测预警系统”听起来像是一个典型的毕设或课设题目但它背后指向的是一个非常实际且具有社会价值的应用场景。将这样一个系统部署到树莓派这样的边缘计算设备上意味着它可以从昂贵的服务器或工控机中解放出来真正走进每一辆普通的营运车辆、教练车甚至私家车实现低成本、低功耗的实时预警。这不仅仅是完成一个作业更是将前沿技术落地到真实世界的一次有价值的尝试。如果你正在为类似的项目寻找思路或者对如何把AI模型塞进一个小小的树莓派感到好奇那么我接下来分享的这套从算法选型、模型优化到边缘部署的完整流程或许能给你带来一些直接的启发。2. 核心任务拆解我们要检测什么以及为什么是YOLOv5在动手写一行代码之前我们必须明确系统的检测目标。驾驶员危险驾驶行为是一个宽泛的概念我们需要将其具体化为几个可被视觉算法识别的关键类别。基于行业共识和实际道路安全需求我通常将其聚焦为以下几类使用手机驾驶员手持手机并置于视线范围内无论是打电话还是刷屏幕都是典型的分心行为。抽烟手持香烟或做出吸烟动作。未系安全带驾驶员肩部安全带带扣未处于扣合状态。双手脱离方向盘在非自动驾驶状态下驾驶员双手均未与方向盘接触。疲劳驾驶通过检测“闭眼”和“打哈欠”两种状态来间接判断。单纯的闭眼可能是眨眼但结合打哈欠和长时间的闭眼就能有效提示疲劳。为什么选择YOLOv5来完成这个多目标检测任务在项目初期我们对比过Faster R-CNN、SSD和YOLO系列。Faster R-CNN精度高但速度慢在树莓派上根本无法实时运行。SSD速度尚可但在小目标检测如手中的香烟上精度损失明显。YOLOv5则是一个绝佳的平衡点速度与精度的卓越平衡YOLOv5的四种模型s, m, l, x提供了从快到精的灵活选择。对于树莓派4B/5这样的设备YOLOv5s模型经过优化后完全有可能达到接近实时的检测速度例如5-10 FPS这对于预警系统来说是可接受的。易于训练和部署PyTorch框架生态友好YOLOv5提供了极其完善的训练脚本、数据增强管道和模型导出工具如导出为ONNX或TorchScript大大降低了从零开始研发的难度。社区活跃资源丰富遇到任何问题从数据标注格式到模型剪枝技巧几乎都能在社区找到讨论和解决方案这对于项目开发至关重要。因此我们的技术路线非常清晰使用YOLOv5s或针对树莓派进一步优化的nano版本作为基础检测模型在一个数据集中同时学习并检测上述5类手机、香烟、未系安全带、双手脱离、闭眼、打哈欠行为目标。3. 数据集的构建、标注与增强实战模型性能的上限很大程度上由数据集决定。对于这个特定场景公开可用的、质量高的驾驶员行为数据集非常稀少。因此自建数据集是绕不开的一步。3.1 数据收集与爬取策略我们的数据主要有三个来源公开数据集整合例如Distracted Driver Detection、State Farm Distracted Driver Detection等但这些数据集类别往往与我们的需求不完全匹配主要用作补充。模拟拍摄在确保安全的前提下如在停车场静止车辆内邀请不同性别、体型、穿着的人员模拟各种危险驾驶行为进行多角度、不同光照条件下的拍摄。这是获取高质量、针对性数据的主要方式。网络视频抽帧从一些行车记录仪分享视频或电影电视剧中需注意版权抽取包含相关行为的帧。这种方法效率高但背景复杂需要仔细清洗。最终我们积累了大约8000张有效图像并按照8:1:1的比例划分为训练集、验证集和测试集。3.2 标注规范与工具选择我们使用LabelImg进行标注格式选择YOLO所需的TXT格式。每个TXT文件对应一张图片每行内容为class_id x_center y_center width height坐标是归一化后的值。注意标注的准确性至关重要。例如“使用手机”这个类别必须确保手机主体在驾驶员手部附近且朝向面部“双手脱离方向盘”需要同时标注两只手不在方向盘上的位置或者直接标注“空手”区域。模糊不清的行为宁可舍弃也不要引入噪声。3.3 数据增强的针对性技巧YOLOv5内置了强大的数据增强Mosaic, MixUp等但我们还可以根据场景进行定制以提升模型鲁棒性光照变化随机调整亮度、对比度、饱和度模拟清晨、黄昏、夜间行车以及进出隧道的光照突变。模拟运动模糊对部分图像施加方向性模糊模拟车辆颠簸或摄像头抖动。遮挡模拟随机添加一些矩形遮挡块模拟被方向盘、遮阳板或车内饰物部分遮挡的情况。背景替换将裁剪出的驾驶员区域粘贴到不同的车辆内饰背景中增加背景多样性。这些增强操作可以通过Albumentations库方便地集成到YOLOv5的训练管道中。4. 模型训练、优化与压缩为边缘部署做准备有了高质量的数据集就可以开始训练模型了。但这不仅仅是跑通train.py那么简单。4.1 训练环境搭建与超参数调优我们在一台配备RTX 3080的服务器上进行训练。首先从YOLOv5官方GitHub仓库克隆代码。关键的超参数设置在data/custom.yaml定义数据集路径和类别和models/yolov5s.yaml定义模型结构中。训练命令的核心是python train.py --img 640 --batch 16 --epochs 100 --data data/driver_behavior.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name driver_detection--img 640输入图像尺寸。更小的尺寸如320速度更快但精度可能下降需要权衡。--batch 16批大小根据GPU显存调整。--epochs 100迭代轮数通常需要观察验证集损失曲线提前停止。4.2 针对树莓派的模型优化策略直接在服务器上训练好的yolov5s.pt模型有十几MB在树莓派上直接推理速度仍不理想。必须进行优化模型剪枝使用诸如torch-pruning这样的工具移除网络中冗余的通道或层。例如我们可以对卷积层的通道数进行稀疏化训练然后剪掉贡献度低的通道。这能在基本保持精度的情况下显著减少模型大小和计算量。知识蒸馏用一个更大的教师模型如YOLOv5m来指导我们的小模型YOLOv5s训练让小模型学习教师模型的输出分布和中间特征从而提升小模型的能力。量化这是为边缘设备提速的关键一步。我们将PyTorch模型转换为TorchScript然后进行动态量化或静态量化推荐后者精度损失更可控。量化将模型权重和激活从FP32转换为INT8能大幅减少内存占用和加速计算尤其适合树莓派这类具有整数计算优势的ARM处理器。# 示例静态量化后导出 import torch model torch.jit.load(yolov5s.torchscript.pt) model.eval() model_fp32 model model_int8 torch.ao.quantization.quantize_dynamic( model_fp32, # 原始模型 {torch.nn.Linear, torch.nn.Conv2d}, # 要量化的模块类型 dtypetorch.qint8 ) torch.jit.save(model_int8, yolov5s_quantized_int8.pt)经过“剪枝量化”组合拳后我们的模型大小可以从14MB压缩到3-4MB推理速度提升2-3倍而mAP平均精度仅下降1-2个百分点这在边缘场景是完全可接受的 trade-off。5. 树莓派端环境部署与推理加速这是将算法从“实验室玩具”变为“车上设备”的关键一跃。树莓派4B或5的性能虽然远超前辈但直接运行PyTorch完整版和原生YOLOv5推理脚本仍然吃力。5.1 系统选择与基础环境配置我强烈推荐使用64位的 Raspberry Pi OS Lite无桌面环境以最大化节省系统资源。通过raspi-config工具超频CPU/GPU、增加交换空间swap也是常规操作。基础环境安装步骤# 1. 更新系统 sudo apt update sudo apt upgrade -y # 2. 安装Python3及pip sudo apt install python3-pip python3-venv -y # 3. 创建虚拟环境避免污染系统 python3 -m venv yolov5_env source yolov5_env/bin/activate # 4. 安装PyTorch的ARM64版本 # 访问PyTorch官网获取最新的适用于aarch64的whl文件链接 pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cpu # 5. 安装其他依赖如OpenCV, NumPy等 pip3 install opencv-python-headless numpy tqdm pandas注意务必安装opencv-python-headless它不包含GUI相关的库体积更小更适合无桌面环境的树莓派。5.2 推理引擎的选择与优化在树莓派上直接使用PyTorch运行模型效率并非最优。我们有更好的选择ONNX Runtime将YOLOv5模型导出为ONNX格式然后使用ONNX Runtime进行推理。ONNX Runtime针对不同硬件有高度优化的执行提供者Execution Providers在ARM CPU上表现优异。# 在训练服务器上导出ONNX模型 python export.py --weights best.pt --include onnx --img 640 --simplify将导出的.onnx文件拷贝到树莓派使用ONNX Runtime加载和推理通常能获得比原生PyTorch更快的速度。TensorRT如果使用带有NVIDIA Jetson的树莓派HAT这是一个更高级的选项。TensorRT是NVIDIA的深度学习推理优化器能实现极致的性能。但需要额外的硬件。LibTorchC接口对于追求极致性能的开发者可以使用PyTorch的C前端LibTorch避免Python解释器的开销。但这需要C编程能力。在我们的项目中ONNX Runtime因其易用性和良好的性能提升成为了首选。实测在树莓派4B上使用ONNX Runtime推理量化后的INT8模型处理一张640x640的图像耗时可以从约500ms降低到200ms左右达到了5 FPS的实时性门槛。5.3 摄像头驱动与图像采集树莓派连接USB摄像头或官方CSI摄像头都很方便。使用picamera2库针对CSI摄像头或cv2.VideoCapture针对USB摄像头进行视频流读取。一个常见的坑是帧率与分辨率的平衡。高分辨率如1080p会给推理带来巨大压力。我们的策略是用高分辨率采集用于显示或录像但将缩放后的低分辨率图像如640x640送入模型推理。import cv2 cap cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) while True: ret, frame cap.read() if not ret: break # 高分辨率frame用于显示 display_frame frame.copy() # 低分辨率img用于推理 img cv2.resize(frame, (640, 640)) # ... 进行推理 ... # 将推理结果边界框映射回高分辨率坐标系并绘制在display_frame上 cv2.imshow(Detection, display_frame)6. 系统集成与预警逻辑设计检测出行为只是第一步如何根据检测结果做出合理、及时的预警是系统是否好用的关键。6.1 行为状态机与误报过滤直接对每一帧的检测结果进行报警会导致警报泛滥。我们需要引入一个基于时间窗的状态机来平滑判断。例如对于“疲劳驾驶闭眼”的检测单帧检测到“闭眼”可能只是眨眼。我们设定一个时间窗口如2秒和一个阈值如在此窗口内有80%的帧都检测到闭眼。只有当连续多帧的检测结果满足阈值条件时才触发“疲劳驾驶”状态并启动预警。一旦预警触发系统可以进入一个“冷却期”如10秒在此期间即使再次检测到闭眼也不重复报警避免打扰驾驶员。这种机制能有效过滤瞬时误检让系统更智能。6.2 多模态预警输出预警方式需要根据车辆环境设计声音预警通过树莓派的音频接口或外接扬声器播放清晰的提示音或语音如“请勿使用手机”、“请集中注意力”。可以使用pygame或pyaudio库实现。视觉预警在连接到树莓派的小屏幕如3.5寸LCD上用醒目的颜色如红色闪烁警示图标或文字。数据上报通过树莓派的GPIO引脚连接一个蜂鸣器进行硬件报警或者通过4G/5G模块将报警事件时间、行为类型、图片快照上传到云端管理平台用于车队管理。6.3 系统资源管理与看门狗树莓派长期运行需要稳定性保障。我们需要编写一个简单的看门狗脚本监控主检测进程是否存活如果崩溃则自动重启。同时要注意控制内存和CPU占用避免因内存泄漏导致系统卡死。可以使用psutil库来监控系统资源。7. 实测中的挑战与调优经验把系统装上车进行路测才是真正的试金石。我们遇到了几个预料之外但又在情理之中的问题7.1 光照变化的极端挑战黄昏时分阳光从侧面射入驾驶室在驾驶员脸上形成强烈的明暗对比模型对“闭眼”的检测完全失效。解决方案是数据增强加强在训练数据中增加更多极端光照条件的模拟样本。预处理中加入直方图均衡化CLAHE在图像送入模型前先进行自适应直方图均衡化提升图像对比度特别是在暗部区域这能显著改善模型在低光照下的表现。import cv2 clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) lab cv2.cvtColor(img, cv2.COLOR_BGR2LAB) l, a, b cv2.split(lab) l_clahe clahe.apply(l) lab_clahe cv2.merge((l_clahe, a, b)) img_enhanced cv2.cvtColor(lab_clahe, cv2.COLOR_LAB2BGR)7.2 摄像头抖动与图像模糊车辆行驶中的震动会导致图像模糊影响小目标如香烟的检测。除了在数据增强中加入运动模糊我们还在推理管线中加入了简单的图像清晰度评估。如果检测到当前帧过于模糊则暂时跳过该帧的推理或者降低该帧检测结果的置信度权重等待下一帧清晰的图像。7.3 模型热启动与延迟树莓派冷启动后第一次运行模型推理会特别慢可能长达数秒这是因为模型需要加载和初始化。为了解决“上车启动即用”的需求我们设计了一个后台预热线程。在系统启动后主程序加载前先在一个后台线程中用一张空白图片跑一遍完整的推理流程让模型和运行时环境完成“热身”这样当真正的视频流进来时延迟就会大大降低。7.4 功耗与散热持续满负荷运行的树莓派发热严重长期在高温下工作可能引发降频甚至死机。我们加装了散热风扇和金属散热片并将树莓派放置在中控台通风较好的位置。同时在软件层面我们不是每帧都进行检测而是采用了跳帧检测的策略例如每3帧处理1帧在保证行为连续性能被捕捉的前提下有效降低了平均CPU占用率和温度。经过这些实战调优我们的系统最终能够在树莓派4B上以5-8 FPS的速度稳定运行对常见危险驾驶行为的检测准确率mAP0.5达到85%以上误报率控制在可接受范围内基本满足了项目原型的预期目标。这个过程让我深刻体会到边缘AI部署不仅仅是“跑通一个模型”更是一个在有限资源下对算法、工程和硬件进行全方位权衡和优化的系统工程。本文还有配套的精品资源点击获取
返回列表