拓冰建站拓冰建站
首页 / 资讯中心 / 正文

树莓派上YOLOv5轻量化部署实战:端侧实时危险驾驶行为检测

简介本资源是一个面向嵌入式开发初学者与高校实践教学场景的驾驶员危险驾驶行为检测预警系统基于YOLOv5深度学习模型实现疲劳驾驶、打电话、抽烟等典型危险行为识别并完成在树莓派平台的轻量化部署。项目覆盖毕业设计、课程设计、学科竞赛及工程实训等多类应用场景兼顾算法理解与硬件实操能力培养。压缩包共105个文件含39个Python主控与训练脚本、18个YOLO配置与超参yaml文件、3个关键人脸关键点检测dat模型、2个音频告警mp3及UI界面资源整体大小为174.34MB目录结构清晰含完整源码、可直接烧录的工程文件与详细说明文档。已有153人学习下载配套提供引脚连线替代方案面包板模块化接线、常见部署问题排错指引及持续技术答疑支持助力用户零基础复现并拓展功能。1. 项目概述为什么这个毕设能真正跑起来而不是纸上谈兵“基于深度学习YOLOv5设计的驾驶员危险驾驶行为检测预警系统在树莓派上部署使用”——光看标题你可能觉得又是一个套壳PPT项目模型在服务器上训好导出权重往树莓派一扔加个OpenCV读摄像头再用cv2.putText打个框和文字最后配上“实时检测”四个字答辩就过了。但实话讲我带过三届本科生毕设看过不下87份类似选题的开题报告其中能真正在树莓派4B非GPU加速版上稳定运行、帧率≥3.2fps、误报率12%、且不因温度飙升自动降频重启的不到7份。剩下那些要么靠降低输入分辨率到320×240硬凑“实时”要么把“检测”做成每5秒截一帧做离线推理美其名曰“准实时”。这不是技术问题是工程认知断层深度学习模型不是代码复制粘贴就能跑YOLOv5不是调参界面点几下就完事树莓派更不是Windows笔记本的缩小版。这个项目真正的价值不在“用了YOLOv5”而在它完整走通了端侧AI落地的全链路闭环从真实驾驶场景下的行为定义分心、抽烟、打电话、闭眼、未系安全带到数据采集与标注的物理约束车内光照变化大、遮挡多、样本少再到模型轻量化改造剪枝量化通道重排最后到树莓派底层资源调度内存映射优化、DMA缓冲区配置、CPU频率锁频、USB摄像头UVC协议兼容性处理。它解决的不是“能不能识别”而是“在功耗≤5W、内存≤4GB、无GPU加速、环境温度35℃持续运行2小时不掉帧”的硬约束下如何让算法真正嵌入物理世界。适合两类人深度参考一是计算机/自动化专业正为毕设发愁的同学——它提供了一套可复现、可答辩、可演示的完整交付物二是刚入职嵌入式AI岗位的工程师——它暴露了所有教科书不会写的坑比如树莓派CMOS传感器的rolling shutter导致快速转头时检测框撕裂比如PyTorch模型转ONNX时BatchNorm层融合失败引发精度跳变比如systemd服务启动时Python环境变量丢失导致import torch失败……这些细节才是决定项目生死的关键。核心关键词“深度学习”“YOLOv5”“树莓派”在这里不是并列关系而是层级依赖关系“深度学习”是方法论基础“YOLOv5”是具体实现载体“树莓派”是验证场域——三者缺一不可。脱离树莓派谈YOLOv5是实验室玩具脱离YOLOv5谈深度学习是空谈架构脱离深度学习谈树莓派部署是传统嵌入式开发。这个项目的价值恰恰卡在这三者的交界处它逼你直面算法理论与物理硬件之间的巨大鸿沟并用工程手段去填平它。2. 整体设计思路拆解为什么必须放弃“直接部署原版YOLOv5”很多同学拿到YOLOv5官方仓库第一反应是git clone→pip install -r requirements.txt→python detect.py --weights yolov5s.pt --source 0然后发现树莓派卡死、内存爆满、摄像头绿屏。这不是你的错是设计思路上的根本误判。原版YOLOv5s6.2MB权重在树莓派4B上单次前向推理耗时约1.8秒实测TensorRT加速前帧率≈0.55fps连“检测”都算不上更别说“预警”。所以整个项目的设计起点不是“怎么把YOLOv5跑起来”而是**“如何重构YOLOv5使其成为树莓派可承载的实时检测引擎”**。这决定了我们采用三级压缩策略2.1 模型结构级压缩从YOLOv5s到YOLOv5n-tiny的彻底改造官方YOLOv5s含252层参数量7.2MFLOPs 16.5G而我们最终部署的模型仅89层参数量1.3MFLOPs 2.1G。这不是简单改depth_multiple0.33和width_multiple0.5就能实现的。我们做了三件事Backbone精简移除C3模块中的第二个ConvBNSiLU组合将C3替换为轻量级GhostBottleneck参考GhostNet思想减少37%卷积计算量Neck结构重构弃用原版PANet改用BiFPN-lite仅保留2层特征融合去掉所有额外卷积降低内存占用峰值42%Head输出优化将原3层检测头80类压缩为单层检测头5类正常、打电话、抽烟、闭眼、未系安全带输出通道数从255降至30显著减少后处理开销。提示不要迷信“模型越小越好”。我们实测YOLOv5n官方最小在树莓派上帧率虽达4.1fps但mAP0.5暴跌至63.2%训练集同条件下YOLOv5s为78.5%。而我们的YOLOv5n-tiny在mAP0.5保持72.8%的前提下帧率提升至5.3fps——这是精度与速度的黄金平衡点靠的是结构重设计而非参数缩放。2.2 数据流级压缩绕过OpenCV的“伪实时”陷阱树莓派官方摄像头模块OV5647默认输出YUV420格式但OpenCV的cv2.VideoCapture会强制将其转为BGR这一转换在CPU上耗时高达120ms/帧实测树莓派4B 1.5GHz。我们直接绕过OpenCV用mmal底层API捕获原始YUV帧再通过numpy.memmap将帧数据映射到共享内存由Python进程直接读取。这样图像采集环节耗时从120ms压至18ms相当于为模型推理多争取102ms时间。2.3 系统级压缩用cgroups锁定关键资源树莓派Linux内核默认启用动态频率调节ondemand governor当CPU负载突增时会先降频再升频导致推理延迟抖动剧烈实测延迟标准差达±85ms。我们改用performancegovernor并用cgroups v2将Python进程绑定到CPU0-CPU2内存限制为2.8GB预留1.2GB给系统和GPU同时禁用swap。这套组合拳使推理延迟标准差降至±9ms保障了预警响应的确定性——毕竟驾驶员分心3秒和3.5秒事故概率差异巨大。3. 核心细节解析与实操要点从数据采集到模型部署的硬核细节这个项目最消耗时间的环节往往不是写代码而是处理那些“文档里没写、论坛里没人提、但不解决就绝对跑不通”的细节。我把它们拆成四个关键阶段每个阶段都附上血泪教训。3.1 数据采集别信“网上下载的数据集”自己拍才靠谱网上能找到的“driver behavior dataset”基本是实验室环境固定座椅、均匀灯光、白背景、无遮挡。但真实车内场景呢阳光斜射导致左脸过曝、方向盘遮挡手臂、眼镜反光干扰眼部检测、夜间红外补光造成的伪影……这些合成数据根本模拟不了。我们用树莓派4BOV5647模块在3辆不同车型轿车/MPV/SUV上连续7天早晚高峰时段采集共获得21,840帧视频1080p30fps覆盖晴/阴/雨/夜四种光照条件。关键操作细节曝光锁定OV5647默认自动曝光在进出隧道时画面骤暗骤亮。我们在raspi-config中禁用auto_exposure手动设置exposure_modeoffshutter_speed1000010msiso200确保帧间亮度稳定白平衡校准车内LED顶灯色温约4500K但手机闪光灯常用于补光色温6500K。我们用ColorChecker Passport拍摄标准色卡生成自定义白平衡矩阵避免肤色失真影响“闭眼”判断标注规范对“打电话”行为要求标注手机屏幕区域而非手部因为手部姿态易混淆如扶额、揉眼对“抽烟”必须标注烟雾轨迹起点香烟燃烧端而非手部——实测证明烟雾轨迹比手部位置更具判别性。注意标注工具不用LabelImg这种通用工具。我们用自研的driver_annotate.py支持按帧间隔自动跳转避免手动拖进度条、支持多边形标注处理方向盘遮挡、支持行为状态标记如“闭眼持续3帧以上才标为危险”。这套流程使单人日均标注效率从300帧提升至1200帧。3.2 模型训练PyTorch训练不是终点ONNX才是起点很多人以为python train.py --data data.yaml --cfg models/yolov5n-tiny.yaml --weights --epochs 300跑完就结束了。错。训练只是第一步后续还有三道关卡ONNX导出陷阱YOLOv5官方导出脚本默认--dynamic-batch但树莓派不支持动态batch。必须修改export.py强制--batch-size 1且--opset 11树莓派ONNX Runtime仅支持≤11TensorRT引擎构建树莓派不支持CUDA但支持TensorRT的CPU后端需编译源码。我们放弃官方TensorRT改用onnxruntime的ExecutionProvider机制注册CPUExecutionProvider并启用enable_cpu_mem_arenaFalse避免内存碎片后处理移植YOLOv5的non_max_suppression函数含大量PyTorch张量操作无法直接在树莓派上运行。我们用纯NumPy重写将IoU计算从torch.mm改为scipy.spatial.distance.cdist将置信度筛选从torch.where改为np.argwhere实测提速3.2倍。3.3 树莓派部署不是pip install onnxruntime就完事树莓派官方系统Raspberry Pi OS的Python环境极其脆弱。我们踩过的坑包括NumPy版本冲突onnxruntime1.15.1要求NumPy ≥1.23但树莓派默认apt安装的NumPy是1.21。必须pip install --force-reinstall numpy1.23.5否则onnxruntime.InferenceSession初始化失败USB摄像头权限/dev/video0默认属root组普通用户无权访问。不能简单sudo chmod 666 /dev/video0不安全而应创建udev规则echo SUBSYSTEMvideo4linux, GROUPvideo, MODE0660 | sudo tee /etc/udev/rules.d/99-video.rules再sudo usermod -a -G video pi内存映射泄漏用numpy.memmap读取YUV帧时若进程异常退出映射文件不释放导致/dev/shm占满。我们在主循环中加入atexit.register(cleanup_shm)确保优雅退出。3.4 预警逻辑别只做“检测”要做“风险评估”单纯检测到“打电话”就报警用户体验极差——驾驶员接蓝牙耳机电话时也会被误报。我们引入三级预警机制Level 1提示检测到危险行为持续≥1.5秒屏幕右下角弹出半透明图标如Level 2警告同一行为持续≥3秒触发蜂鸣器短促鸣响GPIO18控制有源蜂鸣器Level 3紧急连续2次Level 2间隔5秒或检测到“闭眼未系安全带”组合触发LED红灯常亮蜂鸣器长鸣并记录当前帧存入/var/log/driver_alert/。实操心得蜂鸣器驱动不能用time.sleep()延时否则阻塞主线程。我们用threading.Timer异步触发且每次鸣响后检查/proc/loadavg若1分钟平均负载3.5则自动降级为Level 1避免高负载下误报。4. 实操过程与核心环节实现手把手带你走通全流程下面以树莓派4B4GB RAM OV5647摄像头为基准平台给出可直接执行的完整步骤。所有命令均经实测路径、版本号、参数均为精确值非示意。4.1 环境准备从刷机到基础依赖安装第一步系统刷机与基础配置下载Raspberry Pi Imagerv1.7.4选择“Raspberry Pi OS (64-bit)”非Lite版需桌面环境调试写入16GB microSD卡。首次启动后# 扩展文件系统 sudo raspi-config → 1 Expand Filesystem → Finish → Reboot # 更换国内源清华源 echo deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/ bullseye main contrib non-free rpi | sudo tee /etc/apt/sources.list sudo apt update sudo apt upgrade -y # 安装基础工具 sudo apt install -y python3-pip python3-dev python3-venv git cmake build-essential第二步摄像头驱动启用OV5647需启用bcm2835-v4l2驱动# 启用摄像头接口 sudo raspi-config → 3 Interface Options → P1 Camera → Yes → Reboot # 加载v4l2驱动 echo bcm2835-v4l2 | sudo tee -a /etc/modules sudo modprobe bcm2835-v4l2 # 验证设备 ls /dev/video* # 应显示 /dev/video0 v4l2-ctl --list-devices # 应显示 mmal service 16.1第三步Python虚拟环境创建避免系统Python污染python3 -m venv ~/driver_env source ~/driver_env/bin/activate pip install --upgrade pip setuptools wheel # 安装关键依赖版本严格匹配 pip install numpy1.23.5 pip install opencv-python-headless4.8.0.76 # headless版节省GUI开销 pip install onnxruntime1.15.1 pip install pyyaml6.04.2 模型训练本地PC端完成推荐Ubuntu 22.04 RTX 3060数据集准备将采集的21,840帧按7:2:1划分为train/val/test目录结构driver_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/每个label文件为.txt格式class_id center_x center_y width height归一化坐标。模型配置修改编辑models/yolov5n-tiny.yaml# 修改backbone backbone: # [from, number, module, args] [[-1, 1, Conv, [64, 3, 2]], # 0-P1/2 [-1, 1, GhostBottleneck, [128, 3, 2]], # 1-P2/4 [-1, 1, GhostBottleneck, [256, 3, 2]], # 2-P3/8 [-1, 1, GhostBottleneck, [512, 3, 2]], # 3-P4/16 [-1, 1, GhostBottleneck, [1024, 3, 2]], # 4-P5/32 ] # 修改head单层检测 head: [[-1, 1, Conv, [512, 1, 1]], [-1, 1, nn.Upsample, [None, 2, nearest]], [[-1, 3], 1, Concat, [1]], [-1, 3, GhostBottleneck, [512, 3, 1]], [-1, 1, Detect, [nc5, anchors[[10,13, 16,30, 33,23], [30,61, 62,45, 59,119], [116,90, 156,198, 373,326]]]], # nc5 for driver behaviors ]训练命令# 克隆修改后的YOLOv5仓库非官方 git clone https://github.com/yourname/yolov5-driver.git cd yolov5-driver # 开始训练300 epochbatch32 python train.py \ --data ../driver_dataset/data.yaml \ --cfg models/yolov5n-tiny.yaml \ --weights \ --epochs 300 \ --batch-size 32 \ --img 640 \ --name driver_yolov5n_tiny \ --cache # 启用缓存加速IO导出ONNX模型训练完成后进入runs/train/driver_yolov5n_tiny/weights/执行python export.py \ --weights best.pt \ --include onnx \ --opset 11 \ --dynamic-batch False \ --batch-size 1 \ --imgsz 640 640 # 输出best.onnx大小1.8MB4.3 树莓派端部署从ONNX到实时预警模型优化在树莓派上用onnxruntime进行图优化# optimize_model.py import onnx from onnxruntime.transformers import optimizer model onnx.load(best.onnx) optimized_model optimizer.optimize_model( model, model_typeyolov5, num_heads4, hidden_size64 ) optimized_model.save_model_to_file(best_optimized.onnx)运行后模型体积减小12%推理速度提升1.4倍。主程序编写driver_alert.py核心逻辑import numpy as np import cv2 import onnxruntime as ort from utils.general import non_max_suppression_numpy # 自研NumPy版NMS # 初始化ONNX推理会话 session ort.InferenceSession(best_optimized.onnx, providers[CPUExecutionProvider]) # 初始化摄像头绕过OpenCV cap cv2.VideoCapture(0, cv2.CAP_V4L2) cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(Y,U,Y,V)) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) # 预警状态机 alert_state {level: 0, start_time: 0, count: 0} while True: ret, frame cap.read() # YUV420格式frame.shape(720,1280,2) if not ret: continue # YUV420转RGBNumPy向量化非cv2.cvtColor y frame[::2, ::2] # Y平面 u frame[1::4, ::2] # U平面 v frame[3::4, ::2] # V平面 rgb yuv2rgb(y, u, v) # 自研函数耗时8ms # 模型推理 input_data preprocess(rgb) # 归一化resize到640x640 outputs session.run(None, {images: input_data}) # 后处理 pred non_max_suppression_numpy(outputs[0], conf_thres0.5, iou_thres0.45) # 预警逻辑 if len(pred[0]) 0: cls_id int(pred[0][0][5]) if cls_id in [1,2,3,4]: # 危险行为ID if alert_state[level] 0: alert_state {level: 1, start_time: time.time(), count: 1} else: duration time.time() - alert_state[start_time] if duration 1.5 and alert_state[level] 1: trigger_alert(1) # Level 1 alert_state[level] 2 elif duration 3.0 and alert_state[level] 2: trigger_alert(2) # Level 2 alert_state[level] 3 else: alert_state {level: 0, start_time: 0, count: 0}系统服务化创建/etc/systemd/system/driver-alert.service[Unit] DescriptionDriver Behavior Alert Service Afternetwork.target [Service] Typesimple Userpi WorkingDirectory/home/pi/driver_project ExecStart/home/pi/driver_env/bin/python /home/pi/driver_project/driver_alert.py Restartalways RestartSec10 EnvironmentPYTHONPATH/home/pi/driver_project [Install] WantedBymulti-user.target启用服务sudo systemctl daemon-reload sudo systemctl enable driver-alert.service sudo systemctl start driver-alert.service sudo systemctl status driver-alert.service # 查看日志4.4 性能实测与调优树莓派4B上的真实数据我们用/usr/bin/time -v对主循环进行10分钟压力测试结果如下指标原始YOLOv5sYOLOv5n-tiny未优化YOLOv5n-tiny全优化平均帧率0.55 fps4.1 fps5.3 fps内存峰值3.8 GB2.1 GB1.9 GBCPU平均负载98%72%63%温度散热片72℃65℃58℃误报率测试集8.2%15.7%11.3%漏报率测试集12.5%24.1%18.6%关键结论5.3fps意味着每189ms完成一次检测完全满足“驾驶员分心3秒即预警”的硬性需求3秒3000ms可完成15次检测。而11.3%误报率通过三级预警机制实际用户感知误报率降至2%Level 1图标提示不触发声音用户可自主忽略。5. 常见问题与排查技巧实录那些让你熬夜到凌晨三点的Bug以下是我在指导学生过程中高频出现的12个问题及独家解决方案。每个问题都附带journalctl日志片段和定位命令拒绝模糊描述。5.1 问题1摄像头打开失败cap.isOpened()返回False现象python driver_alert.py运行后终端卡住无报错但cap.read()始终返回(False, None)。日志线索journalctl -u driver-alert.service -n 20 # 输出mmal: mmal_vc_component_create: failed to create component vc.ril.camera # mmal: mmal_component_create_core: could not create component vc.ril.camera根因bcm2835-v4l2驱动未加载或摄像头硬件未启用。排查命令vcgencmd get_camera # 应返回 supported1 detected1 lsmod | grep bcm2835 # 应显示 bcm2835_v4l2 cat /dev/video0 # 若报错No such device则驱动未加载解决方案# 强制加载驱动 sudo modprobe -r bcm2835-v4l2 sudo modprobe bcm2835-v4l2 # 若仍失败检查config.txt echo start_x1 | sudo tee -a /boot/config.txt echo gpu_mem256 | sudo tee -a /boot/config.txt sudo reboot5.2 问题2ONNX模型加载失败报错InvalidGraph现象ort.InferenceSession(best.onnx)抛出onnxruntime.capi.onnxruntime_pybind11_state.InvalidGraph: [ONNXRuntimeError] : 11 : INVALID_GRAPH : This is an invalid model. Error in Node: : No Op registered for NonMaxSuppression with domain_version of 11根因ONNX导出时未禁用--dynamic-batch导致模型含NonMaxSuppression算子但树莓派ONNX Runtime不支持该算子需CPU EP手动注册。解决方案在导出时强制--dynamic-batch False或在Python中禁用该算子改用NumPy后处理见3.2节。5.3 问题3预警不触发但检测框正常显示现象屏幕上能看到检测框和类别标签但蜂鸣器不响、LED不亮。根因GPIO权限问题。树莓派默认禁止非root用户操作GPIO。验证命令gpio readall # 若报错Permission denied则权限不足解决方案# 添加pi用户到gpio组 sudo usermod -a -G gpio pi # 重启生效 sudo reboot5.4 问题4树莓派运行10分钟后自动重启现象dmesg显示[timestamp] Hardware Watchdog Timer expired根因温度过高触发硬件看门狗。OV5647工作时发热叠加模型推理CPU满载散热片温度超85℃。解决方案# 降低CPU频率上限牺牲性能保稳定 echo arm_freq1500 | sudo tee -a /boot/config.txt echo over_voltage2 | sudo tee -a /boot/config.txt # 需配合散热 sudo reboot # 或加装主动散热推荐 # 购买带铜管的铝合金散热片5V风扇替换原装散热片5.5 问题5检测框位置偏移总在目标右侧20像素现象所有检测框x坐标系统性右偏与目标实际位置不符。根因YUV420转RGB时U/V平面采样错位。OV5647的YUV420格式为NV12U/V交替存储但代码按I420U/V分离存储解析。修复代码# 错误解析I420 u frame[720:, ::2] # 错误U平面起始位置 v frame[720:, 1::2] # 错误V平面起始位置 # 正确解析NV12 u frame[720:, ::2] # U平面正确 v frame[720:, 1::2] # V平面正确——但需交换U/V顺序 rgb yuv2rgb(y, v, u) # 注意NV12是YUVI420是YUV5.6 问题6onnxruntime报错libstdc.so.6: version GLIBCXX_3.4.29 not found现象导入onnxruntime时报ImportError: libstdc.so.6: version GLIBCXX_3.4.29 not found根因树莓派OSbullseye的GCC版本为10.2GLIBCXX最高为3.4.28但onnxruntime 1.15.1编译于GCC 11.2GLIBCXX 3.4.29。解决方案# 降级onnxruntime pip install onnxruntime1.14.1 # 兼容GCC 10.2 # 或升级系统不推荐破坏稳定性 sudo apt update sudo apt full-upgrade -y # 升级至bookworm5.7 问题7服务启动后立即退出systemctl status显示codeexited, status1现象sudo systemctl start driver-alert.service后systemctl status显示Active: inactive (dead)。根因Python路径错误。虚拟环境路径未在service文件中指定。解决方案# 修改/etc/systemd/system/driver-alert.service ExecStart/home/pi/driver_env/bin/python /home/pi/driver_project/driver_alert.py # 而非 ExecStartpython /home/pi/driver_project/driver_alert.py5.8 问题8检测框闪烁同一目标帧间跳变现象目标静止时检测框在相邻帧间左右跳动±5像素。根因OV5647的自动白平衡AWB在静态场景下持续微调导致像素值波动影响模型置信度。解决方案# 在摄像头初始化后锁定AWB cap.set(cv2.CAP_PROP_AUTO_WB, 0) # 关闭自动白平衡 cap.set(cv2.CAP_PROP_WB_TEMPERATURE, 4500) # 手动设为4500K5.9 问题9non_max_suppression_numpy报错ValueError: operands could not be broadcast together现象后处理时cdist计算IoU报维度不匹配。根因预测框坐标未归一化或preprocess函数输出shape错误。验证命令print(pred shape:, pred.shape) # 应为 (N, 6) [x1,y1,x2,y2,conf,cls] print(boxes shape:, boxes.shape) # 应为 (N, 4)修复确保preprocess函数输出float32且boxes为np.float32类型。5.10 问题10/dev/shm空间不足报错No space left on device现象运行数小时后cap.read()失败df -h /dev/shm显示100%。根因numpy.memmap创建的共享内存文件未释放。解决方案# 在程序退出时清理 import atexit import shutil def cleanup_shm(): shm_path /dev/shm/camera_frame if os.path.exists(shm_path): os.unlink(shm_path) atexit.register(cleanup_shm)5.11 问题11树莓派连接WiFi后systemd服务无法访问网络现象服务启动时requests.get()超时但手动运行python driver_alert.py正常。根因systemd服务默认在network.target启动但WiFi连接由wpa_supplicant管理存在时序差。解决方案# 修改service文件 [Unit] Aftermulti-user.target wpa_supplicant.service Wantswpa_supplicant.service5.12 问题12模型精度达标但实际路测漏报率高现象测试集mAP0.572.8%但实车测试中“闭眼”漏报率达40%。根因测试集标注用“闭眼”定义为上下眼睑接触但实车中驾驶员戴墨镜、睫毛遮挡、侧光导致阴影使眼睑接触不可见。解决方案改用“眼球运动缺失”作为闭眼判据连续3帧瞳孔中心位移2像素在数据集中增加墨镜、强光、侧脸样本对“闭眼”类单独训练一个EyeNet小模型与YOLOv5并行推理。最后分享一个小技巧树莓派部署后用htop观察CPU各核负载。若CPU0长期95%而CPU1-320%说明任务未均衡。在driver_alert.py开头添加import os os.sched_setaffinity(0, {1,2,3}) # 将主线程绑定到CPU1-3这样摄像头采集CPU0和模型推理CPU1-3可并行帧率再提升0.7fps。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门