1. 项目概述:基于YOLOv12的疲劳驾驶检测系统
这个项目实现了一个端到端的疲劳驾驶检测解决方案,核心是采用最新的YOLOv12目标检测算法,结合驾驶员面部特征分析技术。系统包含完整的Python实现、训练好的模型权重、用户友好的UI界面以及登录注册功能模块。
我在实际开发中发现,相比传统基于OpenCV的疲劳检测方案,YOLOv12在准确率和实时性上都有显著提升。特别是在夜间或光线不佳的场景下,模型的鲁棒性表现突出。整套系统可以在普通消费级GPU上达到30FPS的处理速度,完全满足实时检测需求。
2. 系统架构设计
2.1 技术栈选型
系统采用分层架构设计:
- 前端:PyQt5实现的桌面UI界面
- 业务逻辑:Python 3.8+作为主要开发语言
- 核心算法:YOLOv12目标检测模型
- 数据存储:SQLite本地数据库存储用户信息
选择PyQt5而非Web方案主要考虑到:
- 桌面应用更符合车载环境的使用场景
- 避免网络延迟对实时检测的影响
- 部署更简单,不需要额外配置Web服务器
2.2 数据处理流程
系统工作流程分为四个关键阶段:
- 视频采集:通过车载摄像头获取实时视频流
- 人脸检测:YOLOv12模型定位驾驶员面部
- 特征分析:计算眼睛闭合度、打哈欠频率等指标
- 状态判断:基于时间序列分析判断疲劳程度
3. 核心算法实现
3.1 YOLOv12模型优化
我们在原生YOLOv12基础上做了三点改进:
- 将输入分辨率调整为640×480,在精度和速度间取得平衡
- 使用K-means++重新聚类anchor box尺寸,更适配人脸检测
- 添加SE注意力模块,提升小目标检测能力
模型训练的关键参数配置:
# yolov12_custom.yaml nc: 1 # 只检测人脸一类 depth_multiple: 0.33 width_multiple: 0.50 anchors: [[12,16], [19,36], [40,28]] # 优化后的anchor尺寸3.2 疲劳特征提取算法
我们实现了多维度疲劳特征检测:
眼部特征:
- 使用dlib提取68个人脸关键点
- 计算眼睛纵横比(EAR)判断闭眼状态
def eye_aspect_ratio(eye): # 计算眼部6个关键点的距离比 A = dist(eye[1], eye[5]) B = dist(eye[2], eye[4]) C = dist(eye[0], eye[3]) return (A + B) / (2.0 * C)嘴部特征:
- 计算嘴部纵横比(MAR)检测打哈欠
- 设置阈值0.3,连续3帧超过即判定为哈欠
头部姿态:
- 使用solvePnP算法估计头部偏转角度
- 持续低头超过5秒触发警告
4. 系统实现细节
4.1 UI界面设计
登录界面采用Material Design风格,主要包含:
- 用户名/密码输入框
- 记住密码功能
- 新用户注册入口
主界面设计要点:
- 实时视频显示区域
- 疲劳状态指示器(进度条形式)
- 历史记录查询按钮
- 系统设置入口
使用QSS实现界面美化:
/* 自定义按钮样式 */ QPushButton { background-color: #4CAF50; border: none; color: white; padding: 8px 16px; border-radius: 4px; }4.2 数据库设计
用户表结构:
CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );驾驶记录表:
CREATE TABLE driving_records ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, start_time TIMESTAMP, end_time TIMESTAMP, fatigue_count INTEGER, FOREIGN KEY(user_id) REFERENCES users(id) );5. 部署与优化
5.1 环境配置
推荐使用conda创建Python环境:
conda create -n fatigue_detection python=3.8 conda activate fatigue_detection pip install -r requirements.txt关键依赖库版本:
torch==1.12.1+cu113 torchvision==0.13.1+cu113 opencv-python==4.6.0.66 PyQt5==5.15.75.2 性能优化技巧
视频处理优化:
- 使用多线程分离图像采集和模型推理
- 设置视频缓存队列避免帧丢失
模型加速:
- 启用TensorRT加速
- 使用半精度(FP16)推理
内存管理:
- 定期清理GPU缓存
- 限制历史记录加载数量
6. 常见问题解决方案
6.1 模型检测问题排查
问题1:人脸检测框抖动严重
- 解决方案:添加卡尔曼滤波平滑检测结果
- 实现代码:
self.kf = KalmanFilter(dim_x=4, dim_z=2) self.kf.F = np.array([[1,0,1,0], [0,1,0,1], [0,0,1,0], [0,0,0,1]]) # 状态转移矩阵问题2:夜间检测效果差
- 解决方案:添加红外摄像头支持
- 或使用图像增强算法:
def enhance_image(image): lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB) l, a, b = cv2.split(lab) clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8)) limg = clahe.apply(l) return cv2.cvtColor(cv2.merge((limg,a,b)), cv2.COLOR_LAB2BGR)6.2 系统运行问题
问题3:UI界面卡顿
- 解决方案:
- 减少界面刷新频率
- 将视频渲染移到单独线程
- 使用QPixmap缓存静态元素
问题4:模型加载慢
- 优化方案:
- 使用模型量化技术
- 实现模型预加载机制
- 将模型转换为ONNX格式
7. 项目扩展方向
多模态检测:
- 加入方向盘握力传感器数据
- 整合车辆CAN总线信息
云端部署:
- 使用Flask构建REST API
- 支持多终端数据同步
报警系统集成:
- 添加声音震动报警
- 连接车载音响系统
在实际部署中发现,结合车辆速度信息能显著提高检测准确率。当车速超过60km/h时,适当降低疲劳判定阈值,可以更早发现危险驾驶状态。