驾驶员危险行为检测系统效果展示



项目简介
驾驶员危险行为检测系统是一个基于计算机视觉技术的智能监控系统,能够实时检测驾驶员的疲劳和分心行为,并及时发出告警,帮助降低交通事故风险。系统采用Flask Web框架提供友好的操作界面,所有数据处理均在本地完成,保护用户隐私。
算法原理
一、核心技术栈
- 人脸关键点检测:Google MediaPipe Face Mesh(468个3D人脸关键点)
- 图像处理:OpenCV
- 数值计算:NumPy、SciPy
二、疲劳检测算法
1. EAR(Eye Aspect Ratio)- 眼睛纵横比
原理:通过计算眼睛的垂直距离与水平距离的比值来判断眼睛是否闭合。当眼睛睁开时,EAR值较大;当眼睛闭合时,EAR值接近0。
计算公式:
EAR = (||p2-p6|| + ||p3-p5||) / (2 × ||p1-p4||)
其中:
- p1、p4:眼睛左右角点
- p2、p3:上眼睑关键点
- p5、p6:下眼睑关键点
MediaPipe关键点索引:
- 左眼:362, 385, 387, 263, 373, 380
- 右眼:33, 160, 158, 133, 153, 144
判定逻辑:
- 阈值:默认0.21(可配置)
- 当EAR < 阈值且持续20帧(约0.7秒)时,判定为疲劳闭眼
- 分别计算左右眼EAR后取平均值,提高准确性
2. MAR(Mouth Aspect Ratio)- 嘴部纵横比
原理:通过计算嘴部的垂直张开程度与水平宽度的比值来检测打哈欠行为。打哈欠时嘴部张开,MAR值显著增大。
计算公式:
MAR = (||p2-p6|| + ||p3-p5||) / (2 × ||p1-p4||)
MediaPipe关键点索引:
- 左嘴角:61
- 右嘴角:291
- 上唇:13, 14
- 下唇:78, 308
判定逻辑:
- 阈值:默认0.55(可配置)
- 当MAR > 阈值且持续15帧(约0.5秒)时,判定为打哈欠
- 告警级别:warning(低于闭眼的danger级别)
三、分心检测算法
头部姿态估计(Head Pose Estimation)
原理:使用PnP(Perspective-n-Point)算法,通过2D图像点和3D模型点的对应关系,计算头部的三维旋转角度(欧拉角)。
算法流程:
-
3D模型点定义(标准人脸模型):
- 鼻尖:(0.0, 0.0, 0.0)
- 下巴:(0.0, -330.0, -65.0)
- 左眼左角:(-225.0, 170.0, -135.0)
- 右眼右角:(225.0, 170.0, -135.0)
- 左嘴角:(-150.0, -150.0, -125.0)
- 右嘴角:(150.0, -150.0, -125.0)
-
2D图像点提取:从MediaPipe检测的468个关键点中提取对应点
-
相机内参矩阵构建:
K = [[focal_length, 0, center_x], [0, focal_length, center_y], [0, 0, 1]] -
PnP求解 :使用
cv2.solvePnP()计算旋转向量和平移向量 -
旋转向量转旋转矩阵:使用Rodrigues变换
-
旋转矩阵转欧拉角:
- Yaw(偏航角):左右转头
- Pitch(俯仰角):低头/抬头
- Roll(翻滚角):头部倾斜
判定逻辑:
- 阈值:默认30°(可配置)
- 当任一角度超过阈值且持续90帧(约3秒)时,触发分心告警
- 自动识别偏转方向:头部左偏/右偏、低头/抬头、头部倾斜
- 告警级别:持续>5秒为danger,否则为warning
四、架构设计模式
系统采用多种设计模式保证代码质量和可扩展性:
- 策略模式:BaseDetector定义统一接口,FatigueDetector和DistractionDetector实现不同检测策略
- 模板方法模式:process()方法定义标准流程(预处理→特征提取→检测→后处理→通知)
- 工厂模式:DetectorFactory统一创建和管理检测器实例
- 观察者模式:检测器触发告警时通知告警服务,实现解耦
- 单例模式:VideoService确保全局唯一的视频流管理器
五、系统架构
采用混合架构样式:
- 分层架构:表现层(Web界面)→ 业务逻辑层(检测器、服务)→ 数据访问层(SQLite)
- 管道-过滤器:视频采集 → 预处理 → 人脸检测 → 特征提取 → 行为分析 → 告警判断
- 事件驱动:检测器发布事件,告警服务订阅并处理
环境要求
硬件要求
最低配置:
- CPU:Intel i3 或同等性能处理器
- 内存:4GB RAM
- 摄像头:720p USB摄像头
- 存储:2GB 可用空间
推荐配置:
- CPU:Intel i5 或更高
- 内存:8GB RAM
- 摄像头:1080p USB摄像头
- 存储:5GB 可用空间
软件要求
- 操作系统:Windows 10+、Ubuntu 18.04+、macOS 10.14+
- Python版本:3.8 或更高版本(推荐3.10+)
- 浏览器:Chrome 90+、Edge 90+、Firefox 88+
- 摄像头驱动:确保摄像头可正常使用
Python依赖包
核心依赖(requirements.txt):
Flask==2.3.3 # Web框架
Flask-CORS==4.0.0 # 跨域支持
opencv-python==4.8.0.76 # 图像处理
mediapipe==0.10.14 # AI人脸检测
numpy==1.24.3 # 数值计算
scipy==1.11.2 # 科学计算
python-dateutil==2.8.2 # 日期处理
Pillow==10.0.0 # 图像处理
安装步骤
1. 获取项目代码
如果已有项目文件,跳过此步骤。否则:
bash
#源码可以从github仓库firc-projects获取
git clone <项目地址>
cd DrivingBehavior
2. 创建虚拟环境(推荐)
Windows系统:
bash
python -m venv venv
venv\Scripts\activate
Linux/macOS系统:
bash
python3 -m venv venv
source venv/bin/activate
3. 安装依赖包
bash
pip install -r requirements.txt
国内用户加速安装(使用清华镜像源):
bash
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
安装前检查:
- 确认Python版本 ≥ 3.8:
python --version - 升级pip到最新版本:
python -m pip install --upgrade pip
4. 验证安装
bash
python -c "import cv2; import mediapipe; import flask; print('安装成功!')"
如果输出"安装成功!",说明依赖包安装正确。
运行步骤
方法一:使用启动脚本
Windows系统:
bash
run.bat
Linux/macOS系统:
bash
./run.sh
方法二:手动启动
bash
cd src
python app.py
访问系统
启动成功后,在浏览器中访问:
http://localhost:5000
或在局域网其他设备访问(需查看本机IP):
http://<本机IP>:5000
使用流程
- 启动监控:点击"启动监控"按钮
- 授权摄像头:允许浏览器访问摄像头
- 实时检测:系统自动开始检测疲劳和分心行为
- 查看告警:检测到危险行为时会自动弹出告警提示
- 查看历史:切换到"历史记录"页面查看所有告警记录
- 统计分析:切换到"统计分析"页面查看数据图表
- 系统设置:在"系统设置"页面调整检测阈值和参数
注意事项
一、使用环境要求
-
光照条件:
- 避免过暗或过亮的环境
- 避免强光直射摄像头
- 建议在正常室内光照下使用
-
摄像头位置:
- 正对驾驶员面部
- 距离建议50-100厘米
- 确保脸部清晰可见,无遮挡
-
佩戴物品:
- 普通眼镜不影响检测
- 墨镜会降低检测准确率
- 口罩会影响嘴部检测(打哈欠检测可能不准确)
二、性能优化
-
降低卡顿:
- 关闭其他占用CPU的程序
- 降低视频分辨率(修改config.py中的VIDEO_WIDTH和VIDEO_HEIGHT)
- 确保电脑配置满足最低要求
-
调整灵敏度:
- 如果误报频繁:提高阈值(EAR_THRESHOLD、MAR_THRESHOLD、HEAD_POSE_THRESHOLD)
- 如果漏报频繁:降低阈值
- 在"系统设置"页面可实时调整,无需重启
三、数据管理
-
数据存储:
- 告警记录存储在SQLite数据库中(data/database.db)
- 数据不会占用内存,存储在磁盘文件中
- 每条记录约200字节,10000条约2MB
-
清理数据:
- 进入"系统设置"页面
- 可清除N天前的旧数据或清空所有记录
- 建议定期清理30天前的数据
-
日志文件:
- 系统日志存储在logs/system.log
- 如遇问题可查看日志排查
四、安全与隐私
- 本地处理:所有视频数据在本地处理,不上传云端
- 局域网访问:如需远程访问,确保网络安全
- 防火墙设置:开放5000端口时需评估安全风险
五、常见问题
Q1:摄像头无法打开?
- 检查摄像头是否正常连接
- 确认摄像头未被其他程序占用
- 在浏览器中允许摄像头访问权限
- 修改config.py中的CAMERA_INDEX参数(0、1、2等)
Q2:检测不准确?
- 调整光照条件
- 调整摄像头角度和距离
- 在设置页面调整检测阈值
- 确保脸部无遮挡
Q3:如何在其他设备访问?
- 确保config.py中HOST = '0.0.0.0'
- 查看本机IP地址(Windows:ipconfig,Linux:ifconfig)
- 在其他设备浏览器访问http://:5000
- 确保防火墙允许5000端口
Q4:如何扩展新功能?
- 在src/detectors/创建新检测器文件
- 继承BaseDetector基类
- 实现extract_features()和detect()方法
- 在DetectorFactory中注册新检测器
六、开发调试
- 调试模式:config.py中DEBUG = True时启用热重载
- 日志级别:可修改LOG_LEVEL为DEBUG查看详细信息
- API测试:所有API返回JSON格式,可用Postman测试
文件夹结构介绍
DrivingBehavior/
│
├── data/ # 数据存储目录(运行时自动创建)
│ └── database.db # SQLite数据库,存储告警记录
│
├── docs/ # 项目文档目录
│ ├── 心得体会.md # 开发心得与经验总结
│ ├── 架构设计文档.md # 系统架构设计详细说明
│ ├── 架构评审文档.md # ATAM架构评审报告
│ ├── 界面原型设计.md # UI原型设计规范
│ └── 需求文档.md # 功能与非功能需求说明
│
├── logs/ # 日志目录(运行时自动创建)
│ └── system.log # 系统运行日志
│
├── prototypes/ # 界面原型
│ └── index.html # 静态原型页面
│
├── src/ # 源代码主目录
│ ├── app.py # Flask主应用入口
│ │ - 定义路由(页面和API)
│ │ - 视频流推送
│ │ - 错误处理
│ │
│ ├── config.py # 配置管理模块
│ │ - 系统参数配置(阈值、端口等)
│ │ - 环境配置(开发/生产)
│ │ - 动态配置更新
│ │
│ ├── detectors/ # 检测器模块
│ │ ├── __init__.py # 模块初始化
│ │ ├── base_detector.py # 检测器基类(抽象接口)
│ │ │ - 定义处理流程模板
│ │ │ - 实现观察者模式
│ │ │ - DetectorFactory工厂类
│ │ ├── fatigue_detector.py # 疲劳检测器
│ │ │ - EAR计算(眼睛纵横比)
│ │ │ - MAR计算(嘴部纵横比)
│ │ │ - 闭眼和哈欠检测逻辑
│ │ └── distraction_detector.py # 分心检测器
│ │ - 头部姿态估计(PnP算法)
│ │ - 欧拉角计算
│ │ - 偏转方向识别
│ │
│ ├── models/ # 数据模型层
│ │ ├── __init__.py # 模块初始化
│ │ └── alert_model.py # 告警数据模型
│ │ - SQLite数据库操作
│ │ - 告警记录增删改查
│ │ - 统计查询接口
│ │
│ ├── services/ # 业务服务层
│ │ ├── __init__.py # 模块初始化
│ │ ├── video_service.py # 视频服务
│ │ │ - 摄像头管理(单例模式)
│ │ │ - 视频流捕获和处理
│ │ │ - 调用检测器进行分析
│ │ └── alert_service.py # 告警服务
│ │ - 告警记录管理
│ │ - 统计数据计算
│ │ - 观察者回调处理
│ │
│ ├── utils/ # 工具类模块
│ │ ├── __init__.py # 模块初始化
│ │ └── logger.py # 日志工具
│ │ - 统一日志格式
│ │ - 文件和控制台输出
│ │
│ ├── static/ # 静态资源目录
│ │ ├── css/ # 样式文件
│ │ │ └── style.css # 自定义样式
│ │ └── js/ # JavaScript脚本
│ │ ├── common.js # 公共工具函数
│ │ ├── monitor.js # 实时监控逻辑
│ │ ├── history.js # 历史记录页面逻辑
│ │ ├── statistics.js # 统计分析页面逻辑
│ │ └── settings.js # 系统设置页面逻辑
│ │
│ └── templates/ # HTML模板目录
│ ├── base.html # 基础模板(导航栏、布局)
│ ├── index.html # 实时监控页面
│ ├── history.html # 历史记录页面
│ ├── statistics.html # 统计分析页面
│ └── settings.html # 系统设置页面
│
├── requirements.txt # Python依赖包清单
├── run.bat # Windows启动脚本
├── run.sh # Linux/macOS启动脚本
├── README.md # 项目说明文档
目录设计说明
-
分层架构:
detectors/:检测算法实现(业务逻辑层)services/:服务封装(业务逻辑层)models/:数据访问(数据访问层)templates/和static/:界面展示(表现层)
-
模块化设计:每个模块职责单一,便于维护和扩展
-
配置集中管理:所有参数在config.py中统一配置
-
数据与代码分离:data/和logs/目录存储运行时数据
技术特性
- ✅ 实时检测:30FPS流畅检测
- ✅ 双模检测:同时支持疲劳和分心检测
- ✅ 智能告警:分级告警(warning/danger)
- ✅ Web界面:友好美观的响应式界面
- ✅ 数据可视化:Chart.js图表展示统计趋势
- ✅ 灵活配置:支持运行时动态调整参数
- ✅ 本地处理:保护隐私,无需联网
- ✅ 易于扩展:支持添加新检测算法
开发路线图
v1.0(当前版本)
- ✅ 基础疲劳检测(闭眼、打哈欠)
- ✅ 基础分心检测(头部姿态)
- ✅ Web监控界面
- ✅ 历史记录查询
- ✅ 统计分析
- ✅ 系统设置