新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于深度学习的司机危险驾驶行为识别告警系统实战

发布时间:2026/9/27 23:46:04来源:尧图网络
基于深度学习的司机危险驾驶行为识别告警系统实战
简介基于深度学习的司机危险驾驶行为识别告警系统是一套面向计算机专业毕业设计的高分项目评审得分达到九十八分适合正在准备毕业设计的学生以及需要项目实战练习的学习者也可用于课程设计或期末大作业。资源共包含六十四个文件大小约为二百一十二点五二兆内部有十二个源码文件、十三个编译文件、多张测试图片、七个行为演示视频以及多种模型权重文件同时包含界面文件、说明文档和动图等类型覆盖从模型训练、检测推理到界面展示的完整链路。目前已有二百七十四人学习下载。项目附带详细注释和清晰目录结构可直接加载预训练权重完成人脸检测、表情与疲劳状态识别、危险驾驶行为判定并通过图形界面实时告警代码模块划分清楚适合在此基础上二次开发快速完成毕业设计或课题研究。1. 一个能直接跑起来的深度学习工程司机危险驾驶行为识别告警系统在监控画面里连续三四秒闭眼系统发出语音告警并把截图存进本地——这件事听起来不难但你真去实现会发现它横跨目标检测、关键点回归、时序判定、GUI 线程调度四层。这套基于深度学习的司机危险驾驶行为识别告警系统就是把四层打包好的 Python 源码工程自带 GUI 界面和详细注释覆盖疲劳闭眼、打哈欠、打电话、视线偏移等典型危险行为的实时识别与告警。它的定位不是算法 Demo而是能接入摄像头直接跑起来、带人机交互界面的完整工程。做课程设计、毕设或者想快速搭一套可演示的深度学习识别原型都比较合适新手能按步骤复现熟手可以拿它的判定逻辑和 GUI 框架做二次开发。2. 识别链路拆解目标检测、关键点回归与时序判定三级结构2.1 为什么把“危险驾驶识别”拆成先检测、再关键点、后时序一开始容易理解成“输入一张图网络直接输出‘疲劳’”。直接做分类能不能解决我见过不少新手项目先训一个分类 CNN 对整帧做疲劳分类随后被背景和姿态变化打爆驾驶员身体向右靠一点背景从车门变成窗户分类结果就开始抖。这和人脸识别必须先出人脸框是同一个道理——目标在画面里的位置是变的没有对齐的输入分类特征会混进大量背景信息模型学到的其实是“车窗安全带”的纹理而不是驾驶员的脸部状态。所以常见做法是两级结构前端在 YOLOv5 / YOLOX 这类单阶段检测器上定位驾驶员区域或者更进一步的人脸区域。检测框不需要画得多精细IoU 达到 0.7 左右就够用它的任务是帮你把输入从整帧裁剪成相对对齐的近景。后端再针对这个近景做人脸关键点回归拿到眼睛和嘴部的坐标最后在连续帧序列上做时序判定。这套流程把难度拆成了三段检测解决“人在哪”关键点解决“眼睛嘴在哪”时序判定解决“闭眼打哈欠持续了多久”。任何一段出了问题都能单独替换不至于牵一发动全身。要说明白的是这项设计为什么不直接用人体姿态估计出行为类别。疲劳和分心这类行为真正可靠的判定指标其实是眼睑开合程度和嘴部张合程度——驾驶疲劳研究里的 PERCLOS 标准建立在眼部状态上而不是靠“头低下来了”这种粗略动作去猜。检测器加关键点回归是实现疲劳标准的最低成本路径也是这套源码能把动作识别和告警做成工程、而不是做成玩具的关键。2.2 EAR 和 MAR闭眼、打哈欠在数值上怎么定义闭眼判定不能直接让网络输出一个 1/0 布尔量。摄像头分辨率、距离远近、眼睛大小在同一个人身上都会让“闭”和“开”的绝对像素差差出好几倍。通用的做法是计算眼睛纵横比 EAR用水平距离做分母来抵消缩放的干扰。公式是这样的设一只眼睛的六个关键点依次为 p1 到 p6p1 和 p4 是内外眼角那么 EAR (||p2-p6|| ||p3-p5||) / (2 * ||p1-p4||)。睁眼时 EAR 大约在 0.25 到 0.35闭眼时掉到 0.15 以下。代码里一般这么写def eye_aspect_ratio(eye_points): # eye_points 是按顺序排列的 6 个关键点坐标每个点 (x, y) a np.linalg.norm(eye_points[1] - eye_points[5]) b np.linalg.norm(eye_points[2] - eye_points[4]) c np.linalg.norm(eye_points[0] - eye_points[3]) ear (a b) / (2.0 * c) return ear这里我解释一下为什么用纵横比而不是单纯统计“眼睛区域里有多少个像素是瞳孔”。关键点回归输出的坐标在 30 帧画面里相对稳定而瞳孔像素计数会受光照、镜框反光影响剧烈波动还要叠一层分割模型误差越堆越大。EAR 直接基于回归坐标天然规避了眩光带来的分割噪声。嘴部对应的 MARMouth Aspect Ratio同理取嘴部关键点中左右嘴角和上下唇沿计算上下唇沿竖直距离与嘴角水平距离的比值。打哈欠时 MAR 会明显超过平时说话的值。但这里有个细节打哈欠判定要和说话区分开不能只设一个瞬时阈值而是要求 MAR 持续超过阈值至少 10 到 15 帧这一点后面避坑章节我会专门展开。2.3 PERCLOS 时序判定告警不是“看到闭眼就响”单帧说“闭眼”不等于疲劳驾驶。正常人每分钟眨眼 15 到 20 次单次眨眼约 200 到 400 毫秒如果闭一次眼就报警画面里全是误报。工程上用的是驾驶疲劳研究里常见的 PERCLOS P80 标准含义是一段时间内眼睛闭合比例超过 80% 的时间占比。落到代码我会用一个滑动窗口而不是硬切时间片from collections import deque class PERCLOSMonitor: def __init__(self, window_frames300, closed_threshold0.12, alarm_ratio0.25): self.window deque(maxlenwindow_frames) # 窗口里存 True/False self.closed_threshold closed_threshold # EAR 低于该值判定闭眼 self.alarm_ratio alarm_ratio # 窗口内闭眼帧占比预警线 def update(self, ear): self.window.append(ear self.closed_threshold) if len(self.window) self.window.maxlen: return False closed_ratio sum(self.window) / len(self.window) return closed_ratio self.alarm_ratio参数对实际效果的影响比模型精度还大。window_frames 取 300表示在 30fps 下开一个 10 秒的时间窗alarm_ratio 取 0.25表示驾驶员在窗口里闭眼时间累计超过 2.5 秒才弹告警。这个设置更贴近真实疲劳特征——真正疲劳的人不是偶尔眨一次慢眼而是闭眼频次和单次时长都在持续上升。把 alarm_ratio 调到 0.4 会减少告警但容易漏掉疲劳早期状态调到 0.2 又会在正常眨眼时频繁打断驾驶建议先按 0.25 起步再用实际录制的夜间视频微调。但这里有一个反向坑要提前说驾驶员低头看手机时前端检测框仍然能框住人脸但关键点会偏移到侧脸或俯视角EAR 变得不可信甚至直接丢点。所以这套源码在检测层会同时输出一个“人脸可见度”辅助信息关键点质量分低时强制把这一帧的 EAR 置为无效而不是当成闭眼参与统计否则低头族会被系统误判成疲劳闭眼。3. 源码工程组织模型加载、推理循环与告警状态机3.1 文件组织方式与程序入口把源码拆开看结构大致是下面这样你可以对照自己下载的压缩包确认driver_monitor/ ├── main.py # GUI 入口创建主窗口 ├── ui/ │ ├── main_window.py # 主界面布局、菜单、阈值滑条 │ └── video_thread.py # 视频采集线程 ├── core/ │ ├── detector.py # 目标检测封装输出检测框 │ ├── landmark.py # 关键点回归与 EAR/MAR 计算 │ └── alarm.py # PERCLOS 统计与告警状态机 ├── models/ │ ├── detect_model.onnx # 目标检测模型 │ └── face_model.onnx # 人脸关键点模型 └── utils/ ├── letterbox.py # 图像缩放与填充 └── logger.py # 告警日志写入同一份课设源码不同人打包的目录名会有区别但核心拆分逻辑不会变。main.py 只做 UI 生命周期管理真正的推理逻辑全放在 core 目录这样你能完全不启动 GUI写一个命令行脚本直接调用 detector landmark alarm 跑批量视频验证。我调试的时候习惯先走命令行确认判定逻辑没问题再回 GUI 看展示效果效率高很多。3.2 模型加载PyTorch 权重与 ONNX 推理路径课设项目有个共同点——演示机器可能没有 GPU或者根本没装完整 PyTorch 环境。所以这套源码里的模型通常给了两种加载路径.pt/.pth 权重和 .onnx 权重。ONNX Runtime 的 CPU 推理在低分辨率模型上启动速度和帧率表现都明显好于 PyTorch CPU 模式。加载代码一般这样组织def load_detector(weight_path): if weight_path.endswith(.onnx): import onnxruntime as ort session ort.InferenceSession( weight_path, providers[CPUExecutionProvider] # CPU 环境直接可跑 ) return ONNXDetector(session) # .pt/.pth 走 torch.hub 加载 import torch model torch.hub.load(ultralytics/yolov5, custom, pathweight_path) model.conf 0.35 # 置信度阈值 model.iou 0.45 # NMS 去重阈值 return TorchDetector(model)如果你要装 NVIDIA 显卡机器上跑把 providers 改成 [CUDAExecutionProvider, CPUExecutionProvider]但一定让 CPU 排在最后做兜底这样程序在缺少 CUDA 的环境下不会直接崩。需要注意 ONNX 模型的输入尺寸是固定写在模型里的用静态 shape 导出最常见代码里配套的 letterbox 预处理要和这个尺寸保持完全一致否则推理结果会整体偏移。3.3 告警节流与状态锁一个容易被忽略的工程点告警状态不能直接接在检测结果输出上。最典型的失败方式是检测模型一帧输出“打电话”GUI 立刻播报警音下一帧误检没有电话报警音又停了。结果就是报警音像节拍器一样反复断用户会在十秒内关掉系统。正常实现要做一个状态锁告警只在“无告警”到“有告警”的跳变瞬间触发一次触发后进入冷却时间class AlarmGate: def __init__(self, trigger_frames15, cooldown_seconds20): self.trigger_frames trigger_frames # 连续多少帧确认告警 self.cooldown_seconds cooldown_seconds # 同类告警冷却秒数 self.count 0 self.silent_until 0.0 self.last_alarm None def on_frame(self, labels, now): # labels 是这一帧检测出的危险行为集合空集合表示安全 if now self.silent_until: return None # 冷却期内不再触发 if labels: self.count 1 if self.count self.trigger_frames: self.count 0 self.silent_until now self.cooldown_seconds return sorted(labels) # 只返回一次由外层播报警音 else: self.count 0 return None注意 trigger_frames 和前面 PERCLOS 的 window 是两个概念。PERCLOS 管疲劳判定窗口10 秒量级AlarmGate 管的是告警去抖连续 15 帧命中同一行为才真正触发避免偶发误检把报警音拉响。cooldown_seconds 给 20 秒是因为一次告警后驾驶员需要反应和恢复时间3 秒内连环响只会增加焦虑对安全没有帮助。从代码设计角度说AlarmGate 保证了告警事件是稀疏且确定的后面接语音播报、日志写入、截图保存都变得非常简单。4. GUI 操作流程把模型跑成可演示的产品4.1 视频采集与推理线程分离GUI 的难点不在画控件在于视频采集和推理不能跑在 tkinter 的主线程里否则界面按钮会卡死。常见实现是开一个独立采集线程把帧放进队列推理线程消费队列GUI 通过定时器轮询结果import threading import queue import cv2 class VideoThread(threading.Thread): def __init__(self, source0, output_queueNone): super().__init__(daemonTrue) self.cap cv2.VideoCapture(source) # source0 默认摄像头 self.output_queue output_queue self._stop threading.Event() def run(self): while not self._stop.is_set(): ret, frame self.cap.read() if ret: self.output_queue.put(frame) def stop(self): self._stop.set() self.cap.release()主界面用 after 每 30 毫秒轮询一次结果队列def _poll_result(self): try: frame, detections self.result_queue.get_nowait() except queue.Empty: self.root.after(30, self._poll_result) return # 在 frame 上画检测框和告警文字然后显示到 Label self._render_overlay(frame, detections) self.root.after(30, self._poll_result)提示轮询间隔取 30ms 而不是 10ms是为了避免 GUI 线程空转把 CPU 占满导致推理线程拿不到时间片。4.2 阈值参数在界面上暴露这份源码的 GUI 里比较实用的设计是把核心参数做成侧边栏滑条演示时直接拖动不用改代码。参数对应关系如下表参数名推荐值含义conf_thres0.35检测框置信度低于该值直接丢弃iou_thres0.45NMS 去重阈值ear_threshold0.20EAR 低于该值计为闭眼perclos_window300疲劳判定的滑动窗口帧数perclos_ratio0.25窗口内闭眼帧占比告警线alarm_cooldown20同类告警最小间隔秒数滑条变更事件将值写进共享配置 dict推理线程每帧读取最新值热生效、不重启。演示时先把 ear_threshold 拉高到 0.25再用正常眨眼视频测试能看到系统在眨眼瞬间短暂计入闭眼但不超过告警线这套交互比直接甩代码有说服力。4.3 告警日志与截图留存我习惯把告警事件落成本地文件一是演示完有据可查二是调阈值时方便逐帧回放。在 AlarmGate 返回触发结果时写一行 JSON同时把当前帧保存成图片import json import os import cv2 from datetime import datetime def save_alarm_record(self, labels, frame): stamp datetime.now().strftime(%Y%m%d_%H%M%S) path falarm_logs/{stamp}_{_.join(labels)}.jpg os.makedirs(alarm_logs, exist_okTrue) cv2.imwrite(path, frame) with open(alarm_logs/logs.json, a, encodingutf-8) as f: f.write(json.dumps({ time: stamp, labels: labels, image: path }, ensure_asciiFalse) \n)写日志是轻量操作放在推理线程里完全可接受不需要再单独开队列。这里有个容易踩的坑Windows 下文件命名不要带冒号时间戳格式化建议用下划线而不是冒号否则 open 会直接抛 OSError。保存截图时建议压缩成 jpg 而不是 png长时间运行时 png 会把磁盘写满。5. 实际工况避坑五条发生频率最高的排查记录5.1 画面卡顿告警判定滞后两秒以上现象报警声总是在危险动作结束之后才响起画面帧率掉到 10fps 以下。原因视频采集、模型推理、GUI 绘制全挤在同一线程里模型推理耗时阻塞了帧读取导致队列里的帧越积越旧系统判定的是几秒前的画面。解决把采集线程和推理线程彻底分离采集只管往队列放帧推理线程只消费最新帧GUI 端丢弃积压队列中的旧帧只保留最新结果用于绘制。如果模型前向推理时间超过 50ms可以在推理代码里加跳帧逻辑每两帧或每三帧推理一次画面流畅度和告警实时性反而都更好。5.2 低头和侧脸时关键点丢失现象驾驶员低头看手机时检测框正常但关键点坐标乱跳或全为零系统偶尔报出“疲劳闭眼”。原因关键点模型对头部姿态变化敏感训练集里正面样本占比过高头部旋转超过 30 度后人脸关键点回归就不可信EAR 变成随机值。解决在关键点模型输出里加上质量分判断质量分低于阈值时整体丢弃该帧不要用越界坐标参与 EAR 统计。准备数据时补一批低头、侧脸、遮挡样本重新微调关键点模型能显著改善极端姿态下的表现。这个坑不是调阈值能解决的必须从数据层面补。5.3 EAR 阈值在夜间和逆光环境下漂移现象白天调好的 ear_threshold0.20到晚上变成全天候判断为闭眼误报刷屏。原因低照度下关键点坐标抖动EAR 整体被压低 0.05 到 0.08固定阈值直接失效。解决把 ear_threshold 从固定值改成自适应偏移用近 30 帧中 EAR 的 p90 分位数作为基准再向下偏移 0.05 作为当前阈值。同时加一个下限保护EAR 低于 0.10 才计为确定闭眼0.10 到阈值的区间计入可疑状态连续可疑超过 10 帧再上升为闭眼。5.4 说话、咀嚼被误判成打哈欠现象驾驶员正常和乘客聊天系统每两三分钟报一次疲劳告警。原因MAR 瞬时值超阈值就触发而说话张嘴时 MAR 和打哈欠一样高单帧阈值无法区分。解决MAR 超过阈值必须连续维持 15 帧以上才计入一次哈欠哈欠状态结束后 5 秒内不能再次进入计数避免说话时连续的张嘴动作被计成多个哈欠。另外一个辅助手段是计算张嘴的速度打哈欠的张口过程比说话慢得多速度特征可以加进判定逻辑。5.5 语音告警模块崩溃导致主程序退出现象程序启动后音频模块抛“未找到音频设备”异常整个 GUI 直接闪退。原因某些精简版 Windows 声卡驱动没有默认输出设备或代码硬编码了特定的音频设备索引。解决音频初始化失败时降级为 GUI 弹窗加 Beep 蜂鸣保证主程序不退出同时把音频播放放到独立线程不阻塞推理主循环。多音频模块共存时只保留一条输出通路避免 pygame.mixer 和 winsound 同时抢占声卡导致缓冲区竞争。6. 上线前的验证方法按视频片段评测而不是按帧评测6.1 以片段为单位的评测口径行为识别系统如果按帧计算准确率会被帧标签噪声坑死。逐帧标注哪一秒闭眼、哪一秒说话不同标注员都会吵起来标注边界天然模糊。实际验证我会把视频切成 10 秒片段为每一段标一个“主行为标签”系统在这 10 秒内是否发出正确告警作为判断标准def evaluate_by_clips(labels_file, alarm_logs): # labels_file 是人工标注的 10 秒片段标签 # alarm_logs 是系统输出的告警事件列表 tp 0 total len(labels_file) for clip_label, clip_start, clip_end in labels_file: has_alarm any( clip_start t clip_end and labels set(clip_label) for t, labels in alarm_logs ) if has_alarm: tp 1 return tp / total if total else 0每段人工标注为“疲劳”“打电话”“正常”三类系统在对应时间内发出过匹配告警才算命中。按片段评测的好处是能容忍几百毫秒的时序偏差评测结果更接近真实使用感受。这套源码里的告警日志模块本身就能直接生成评测所需的 CSV 格式。6.2 扩展思路从驾驶员单人场景到多标签行为模型扩展不必重新训一个万能的网络更实际的做法是在现有关键点模型上方加一个行为分类头输入是连续 30 帧的 EAR、MAR、头部角度、视线方向构成的多维时序信号用一个小型 LSTM 或 1D CNN 分类。这样新增“吸烟”“喝水”等行为只需要采集对应动作的关键点序列数据重新训练分类头目标检测和关键点回归层完全不动训练数据需求量比端到端训练小一个量级。从那以后我每次拿到这类源码第一件事不是跑 GUI而是先把 core 目录里的推理链路单测跑一遍再开摄像头真实验证告警节流逻辑等告警事件稳定了才把 GUI 接上来。这套顺序能帮你省掉至少半天排查时间。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

时尚网站建设到底多少钱?搞定备案不踩坑的报价全解析 2026/9/28 0:35:07

时尚网站建设到底多少钱?搞定备案不踩坑的报价全解析

时尚网站建设到底多少钱?搞定备案不踩坑的报价全解析 刚接了个做服装品牌的单子,老板第一句话就问:“我想做个高大上的时尚官网,到底多少钱?还有,那个ICP备案流程我是一头雾水,怕耽误上线。”…

阅读更多 →
信誉好的广州外贸网站2026最新 2026/9/28 0:34:10

信誉好的广州外贸网站2026最新

避坑指南:3个广州外贸网站实战案例揭秘信誉好的建站逻辑 别再看那些千篇一律的模板站了,真的,太丑且不够用。很多广州做跨境的朋友跟我吐槽,花了几千块做的站,连个像样的询盘都接不住,客户打开看一眼就关掉,觉得这公司不靠谱。我干了十年建站,见过太…

阅读更多 →
3款wordpress群发插件对比评测,告别手动复制粘贴 2026/9/28 0:34:03

3款wordpress群发插件对比评测,告别手动复制粘贴

3款wordpress群发插件对比评测,告别手动复制粘贴 改个需求建站公司拖一周,这种憋屈谁懂?以前我接私单,客户要发100封营销邮件,我盯着浏览器手动填收件人,手都抽筋了。直到我深入研究了几款主流的wordpress群发插件,才发现原来效…

阅读更多 →
重庆白云seo整站优化避坑指南:3档建站报价详解 2026/9/28 0:33:31

重庆白云seo整站优化避坑指南:3档建站报价详解

重庆白云seo整站优化避坑指南:3档建站报价详解 改个需求建站公司拖一周,这种憋屈事谁没经历过?很多在重庆白云片区做本地生意的老板,为了省那点钱选了低价套餐,结果后期改个按钮颜色都要等三天,气得想砸电脑。其实问题不在人,而在你一开始就没把【…

阅读更多 →
百度搜索引擎关键词优化实战:3个免费工具搞定流量与转化 2026/9/28 0:33:31

百度搜索引擎关键词优化实战:3个免费工具搞定流量与转化

百度搜索引擎关键词优化实战:3个免费工具搞定流量与转化 别再用那些一眼假、排版乱、加载慢的模板网站了。客户打开你的官网,3秒内看不到核心价值,直接关页,连注册邮箱的机会都不给。这时候你才意识到, 模板网站太丑不够用…

阅读更多 →
做网站凡科如何避坑指南:5个实战问题拆解 2026/9/28 0:33:31

做网站凡科如何避坑指南:5个实战问题拆解

做网站凡科如何避坑指南:5个实战问题拆解 模板网站看起来挺快,但上线后才发现丑得没眼看,功能还卡得让人想砸键盘。很多老板第一反应就是找凡科这类SaaS平台,觉得省事。但这篇 做网站凡科如何…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉