1. 项目概述
疲劳驾驶是导致交通事故的重要原因之一。根据相关研究,疲劳驾驶导致的交通事故占比高达20%-30%。传统的人工监测方法存在效率低、成本高、主观性强等问题。基于计算机视觉的疲劳驾驶检测系统为解决这一问题提供了新的技术路径。
本项目采用YOLOv12目标检测算法,结合Python和PyQt5开发了一套完整的疲劳驾驶检测系统。系统能够实时监测驾驶员面部状态,准确识别打哈欠、闭眼等疲劳特征,并通过直观的UI界面展示检测结果。相比传统方案,本系统具有以下优势:
- 检测精度高:YOLOv12算法在保持实时性的同时,检测精度较前代提升约15%
- 响应速度快:在普通消费级GPU上可实现30FPS以上的处理速度
- 用户体验好:科幻风格的UI界面设计,操作简单直观
- 扩展性强:模块化设计便于功能扩展和算法升级
2. 系统架构设计
2.1 整体架构
系统采用典型的三层架构设计:
- 数据采集层:支持摄像头、视频文件和静态图片三种输入方式
- 算法处理层:基于YOLOv12的核心检测算法,包含预处理、推理和后处理模块
- 应用展示层:PyQt5实现的用户界面,提供参数配置、结果显示和系统管理功能
各模块间通过信号量进行通信,确保系统的高效运行和低延迟响应。
2.2 技术选型考量
在选择技术方案时,我们重点考虑了以下因素:
- 算法性能:YOLOv12在精度和速度上达到最佳平衡,特别适合实时检测场景
- 开发效率:Python生态提供了丰富的CV库和工具链,大幅降低开发门槛
- 部署便利:系统支持CPU和GPU两种运行模式,适配不同硬件环境
- 用户体验:PyQt5跨平台特性确保系统可在Windows、Linux等主流操作系统运行
3. 核心功能实现
3.1 疲劳状态检测
系统可识别四种关键面部状态:
- 打哈欠(Yawn):嘴部张开程度超过阈值并持续一定时间
- 闭眼(close):眼睛闭合时间超过安全阈值
- 正常状态(noYawn):面部特征处于正常范围
- 睁眼(open):眼睛处于睁开状态
检测逻辑采用多帧验证机制,避免瞬时动作导致的误报。具体实现如下:
def check_fatigue(detections, frame_count): yawn_frames = 0 close_frames = 0 for class_name, _, _ in detections: if class_name == 'Yawn': yawn_frames += 1 elif class_name == 'close': close_frames += 1 # 连续5帧检测到打哈欠或闭眼视为疲劳状态 if yawn_frames >= 5 or close_frames >=5: return True return False3.2 多线程处理
为保证UI流畅性,系统采用生产者-消费者模式的多线程架构:
- 采集线程:负责视频/图像数据的读取
- 检测线程:运行YOLOv12模型进行目标检测
- UI线程:负责界面更新和用户交互
线程间通过队列进行数据传递,避免资源竞争和阻塞。关键代码如下:
class DetectionThread(QThread): frame_received = pyqtSignal(np.ndarray, np.ndarray, list) def __init__(self, model, source, conf, iou): super().__init__() self.model = model self.source = source self.conf = conf self.iou = iou self.running = True def run(self): while self.running: frame = self.get_frame() if frame is None: break results = self.model(frame, conf=self.conf, iou=self.iou) annotated_frame = results[0].plot() detections = self.parse_results(results) self.frame_received.emit(frame, annotated_frame, detections) def stop(self): self.running = False3.3 参数动态调节
系统提供以下可调参数:
- 置信度阈值(0-1.0):控制检测结果的严格程度
- IoU阈值(0-1.0):调节重叠检测框的合并策略
- 模型选择:支持yolov12n/s/m/l不同规模的模型
参数调节采用双向绑定机制,滑块和数值框实时同步:
# 置信度阈值同步 def on_confidence_changed(self, value): self.confidence = value / 100.0 self.confidence_slider.setValue(int(value * 100)) self.confidence_spinbox.setValue(self.confidence) if self.detection_thread: self.detection_thread.conf = self.confidence4. 数据集与模型训练
4.1 数据集构建
我们收集了超过16,000张驾驶员面部图像,涵盖不同:
- 光照条件:白天、夜晚、逆光等
- 驾驶员特征:年龄、性别、肤色等
- 姿态变化:正面、侧面、低头等
数据集按8:1:1的比例划分为训练集、验证集和测试集,确保模型评估的客观性。
4.2 数据增强策略
为提高模型鲁棒性,训练时采用了以下增强方法:
- 几何变换:随机旋转(±15°)、平移(±20%)、缩放(0.8-1.2x)
- 颜色扰动:亮度(±30%)、对比度(±20%)、饱和度(±20%)
- 遮挡模拟:随机矩形遮挡(最大20%面积)
增强配置示例:
augmentation: hsv_h: 0.015 # 色调 hsv_s: 0.7 # 饱和度 hsv_v: 0.4 # 亮度 degrees: 15 # 旋转角度 translate: 0.2 # 平移 scale: 0.2 # 缩放 shear: 0.0 # 剪切 perspective: 0.0001 # 透视 flipud: 0.0 # 上下翻转 fliplr: 0.5 # 左右翻转 mosaic: 1.0 # 马赛克增强 mixup: 0.2 # MixUp增强4.3 模型训练细节
训练采用以下超参数配置:
model.train( data='data.yaml', epochs=100, batch=8, imgsz=640, device='0', # 使用GPU workers=4, optimizer='AdamW', lr0=0.001, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3, warmup_momentum=0.8, box=7.5, # box loss增益 cls=0.5, # cls loss增益 dfl=1.5, # dfl loss增益 )训练过程中采用早停策略,当验证集mAP连续10个epoch不提升时终止训练。
5. 系统部署与优化
5.1 环境配置
推荐使用以下环境部署:
基础环境:
- Python 3.9
- PyTorch 2.0+
- CUDA 11.7 (GPU版本)
依赖安装:
pip install -r requirements.txtrequirements.txt核心内容:
ultralytics==8.0.0 opencv-python==4.7.0.72 PyQt5==5.15.7 numpy==1.23.55.2 性能优化技巧
模型量化:使用FP16精度可提升30%推理速度
model = YOLO('yolov12s.pt').half()TensorRT加速:转换模型为TensorRT格式可获得2-3倍速度提升
model.export(format='engine', device=0)多帧采样:对视频流可每2-3帧处理一次,降低计算负载
5.3 常见问题排查
检测结果不稳定:
- 检查摄像头焦距和角度
- 调整置信度和IoU阈值
- 确保光照条件充足
界面卡顿:
- 降低检测分辨率
- 关闭不必要的可视化选项
- 检查系统资源占用
模型加载失败:
- 验证模型文件完整性
- 检查PyTorch版本兼容性
- 确保有足够的GPU内存
6. 使用指南
6.1 快速开始
- 安装依赖环境
- 下载预训练模型(yolov12s.pt)
- 运行主程序:
python main.py
6.2 操作流程
- 登录系统(默认账号/密码:admin/123456)
- 选择检测模式(图片/视频/摄像头)
- 调整检测参数(可选)
- 开始检测并查看结果
- 保存检测结果(可选)
6.3 高级功能
- 自定义模型:替换models目录下的模型文件
- 数据集扩展:按YOLO格式添加新数据并重新训练
- 报警阈值设置:修改config.json中的疲劳判定参数
7. 项目扩展方向
- 多模态检测:结合方向盘握力、车道偏离等信号
- 云端部署:支持多路视频流同时处理
- 移动端适配:开发Android/iOS版本
- 驾驶员身份识别:集成人脸识别模块
实际部署中发现,系统在以下场景表现最佳:
- 摄像头高度与驾驶员眼睛平齐
- 光照强度在300-1000lux范围内
- 驾驶员佩戴普通眼镜不影响检测效果
- 系统运行温度保持在60°C以下时性能最稳定