基于YOLOv5的驾驶员抽烟行为实时检测系统设计与实现
1. 项目概述这个毕业设计项目实现了一个基于深度学习的驾驶员抽烟行为检测系统。作为一名计算机视觉方向的从业者我深知这类行为检测系统在实际应用中的价值。特别是在运营车辆监控领域驾驶员抽烟行为不仅违反交通法规更可能引发严重的安全事故。传统的监控方式主要依赖人工查看视频效率低下且容易漏检。我们团队开发的这个系统采用YOLOv5目标检测算法通过同时检测烟雾和香烟两个目标大幅提高了检测准确率。实测表明在1080P视频流上能达到每秒30帧的处理速度满足实时监控需求。系统采用B/S架构设计前端使用Vue.js框架后端采用Flask搭建RESTful API服务模型推理部分基于PyTorch框架。这种架构既保证了系统的易用性又能充分发挥深度学习模型的性能优势。2. 系统设计与实现2.1 整体架构设计系统采用模块化设计主要分为三个核心模块视频流处理模块负责接收RTSP视频流进行解码和帧提取行为检测模块基于YOLOv5的双目标检测核心告警与展示模块生成检测结果和告警信息视频输入 → 帧提取 → 双目标检测 → 行为判定 → 结果展示 ↑ ↑ 视频解码 模型推理服务这种流水线式的设计使得每个模块可以独立优化。例如我们测试发现使用OpenCV的GPU加速解码比CPU解码快3倍而模型推理部分使用TensorRT优化后又获得了2倍的性能提升。2.2 YOLOv5算法优化2.2.1 模型选型考虑在算法选型时我们对比了多种目标检测模型模型参数量mAP0.5FPS(1080P)适用性分析Faster R-CNN41M0.788精度高但速度慢SSD24M0.7225速度尚可但小目标检测差YOLOv427M0.8218平衡性较好YOLOv5s7.2M0.8630最佳选择最终选择YOLOv5s版本因为参数量小适合部署在普通服务器支持TensorRT加速社区活跃问题容易解决2.2.2 关键技术创新点我们在原始YOLOv5基础上做了三点改进双检测头设计# 模型配置文件修改 head: [[-1, 1, nn.Conv2d, [na * (nc 5), 1, 1]], # 烟雾检测头 [-1, 1, nn.Conv2d, [na * (nc 5), 1, 1]]] # 香烟检测头动态加权NMSdef dynamic_nms(boxes, scores, iou_thresh): # 根据目标大小动态调整IOU阈值 areas (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1]) iou_thresh iou_thresh * (1 0.5 * (1 - areas / (640*640))) return nms(boxes, scores, iou_thresh)时间上下文建模class TemporalContext(nn.Module): def __init__(self): super().__init__() self.conv nn.Conv2d(256, 256, 3, padding1) self.lstm nn.LSTM(256, 256, batch_firstTrue) def forward(self, x, prev_state): # x: [B, C, H, W] x self.conv(x) b, c, h, w x.shape x x.view(b, c, -1).permute(0, 2, 1) # [B, H*W, C] x, state self.lstm(x, prev_state) return x.permute(0, 2, 1).view(b, c, h, w), state2.3 数据集构建与增强2.3.1 数据采集挑战吸烟行为检测面临两大数据难题公开数据集稀缺实际场景多样性大光照、角度、遮挡等我们的解决方案使用Selenium自动化爬取各大视频平台片段从公开数据集中筛选相关场景自主拍摄100小时驾驶室视频2.3.2 数据标注规范制定严格的标注准则香烟可见部分超过1cm即标注烟雾半透明区域也需标注遮挡处理可见部分超过30%才标注标注工具使用改进版LabelImggit clone https://github.com/tzutalin/labelImg cd labelImg pip install -r requirements.txt python labelImg.py --autosave --nosort2.3.3 数据增强策略除标准的Mosaic增强外我们还设计了场景特定的增强光照模拟def random_illumination(img): hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV) hsv[:,:,2] hsv[:,:,2] * random.uniform(0.5, 1.5) return cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)挡风玻璃反光def add_glare(img): rows, cols img.shape[:2] glare np.zeros((rows, cols, 3), dtypeuint8) cv2.ellipse(glare, (random.randint(0,cols), random.randint(0,rows)), (random.randint(50,100), random.randint(50,100)), 0, 0, 360, (255,255,255), -1) blended cv2.addWeighted(img, 0.7, glare, 0.3, 0) return blended运动模糊模拟def motion_blur(img): size random.randint(5, 15) kernel np.zeros((size, size)) kernel[int((size-1)/2), :] np.ones(size) kernel kernel / size return cv2.filter2D(img, -1, kernel)最终构建的数据集包含香烟图像8,742张烟雾图像6,583张负样本12,000张3. 模型训练与优化3.1 训练参数配置采用两阶段训练策略第一阶段 - 基础训练# hyp.scratch.yaml 修改版 lr0: 0.01 # 初始学习率 lrf: 0.2 # 最终学习率 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3.0 warmup_momentum: 0.8 warmup_bias_lr: 0.1第二阶段 - 微调训练# hyp.finetune.yaml lr0: 0.001 lrf: 0.01 momentum: 0.9 weight_decay: 0.0001 mixup: 0.1 # 启用mixup增强 copy_paste: 0.1 # 启用复制粘贴增强关键训练技巧使用AdamW优化器替代SGD引入梯度裁剪(grad_clip10.0)采用余弦退火学习率调度3.2 损失函数设计自定义多任务损失函数class MultiTaskLoss(nn.Module): def __init__(self): super().__init__() self.bce nn.BCEWithLogitsLoss() self.iou IoULoss() def forward(self, preds, targets): smoke_pred, cig_pred preds smoke_tgt, cig_tgt targets # 分类损失 cls_loss 0.5*(self.bce(smoke_pred[...,4], smoke_tgt[...,4]) self.bce(cig_pred[...,4], cig_tgt[...,4])) # 定位损失 loc_loss 0.7*self.iou(smoke_pred[...,:4], smoke_tgt[...,:4]) \ 0.3*self.iou(cig_pred[...,:4], cig_tgt[...,:4]) # 一致性约束 cons_loss F.mse_loss(smoke_pred[...,:2], cig_pred[...,:2]) return cls_loss loc_loss 0.1*cons_loss3.3 训练过程监控使用WandB进行可视化监控import wandb wandb.init(projectsmoke-detection) wandb.config.update({ batch_size: 32, learning_rate: 0.01, architecture: YOLOv5s, dataset: Smoke-Cig-5k }) for epoch in range(epochs): # ...训练代码... wandb.log({ loss: total_loss, mAP: mean_ap, lr: current_lr })关键指标变化曲线分类损失0.85 → 0.12定位损失1.2 → 0.3mAP0.50.65 → 0.894. 系统部署与优化4.1 模型轻量化采用三种优化技术知识蒸馏teacher torch.load(yolov5m.pt) student torch.load(yolov5s.pt) def distillation_loss(s_pred, t_pred, T2.0): s_probs F.softmax(s_pred/T, dim1) t_probs F.softmax(t_pred/T, dim1) return F.kl_div(s_probs.log(), t_probs, reductionbatchmean) * (T*T)量化感知训练model quantize_model(model) optimizer torch.optim.Adam(model.parameters(), lr0.001) for epoch in range(10): # 训练过程 torch.quantization.convert(model, inplaceTrue)TensorRT加速python export.py --weights yolov5s.pt --include engine --device 0 --half优化前后对比指标原始模型优化后提升模型大小14.5MB3.8MB73%↓推理速度22ms8ms2.75×内存占用1.2GB450MB62%↓4.2 Web服务架构后端采用异步架构from fastapi import FastAPI import uvicorn from concurrent.futures import ThreadPoolExecutor app FastAPI() executor ThreadPoolExecutor(max_workers4) app.post(/detect) async def detect_video(video: UploadFile): loop asyncio.get_event_loop() result await loop.run_in_executor( executor, process_video, await video.read()) return result前端关键组件视频播放器Video.js告警面板ECharts结果回放自定义时间轴组件4.3 性能优化技巧视频流预处理def preprocess_stream(stream): # 动态调整解码分辨率 if stream.fps 25: stream stream.resize(width960) # 降采样 # 硬件加速解码 if torch.cuda.is_available(): stream stream.cuda() return stream推理批处理def batch_inference(frames): # 自动调整batch_size max_batch 4 if frames[0].shape[0] 720 else 8 batches [frames[i:imax_batch] for i in range(0, len(frames), max_batch)] return [model(batch) for batch in batches]结果缓存from functools import lru_cache lru_cache(maxsize100) def get_model(config): return torch.load(config)5. 实际应用与测试5.1 测试环境搭建硬件配置CPUIntel Xeon Silver 4210GPUNVIDIA T4 16GB内存32GB DDR4存储NVMe SSD 1TB软件环境OSUbuntu 20.04 LTSCUDA11.1深度学习框架PyTorch 1.8.15.2 测试指标与方法采用五种测试场景标准测试集2,000张标注图片视频流测试50小时行车记录仪视频压力测试模拟100路并发视频流极端条件测试低光照、强反光等长期稳定性测试连续运行7天评估指标def evaluate(results, targets): TP ((results targets) 1).sum() FP ((results 1) (targets 0)).sum() FN ((results 0) (targets 1)).sum() precision TP / (TP FP 1e-6) recall TP / (TP FN 1e-6) f1 2 * precision * recall / (precision recall 1e-6) return precision, recall, f15.3 测试结果分析主要性能指标测试类型准确率召回率F1分数延迟图片测试92.3%89.7%91.0%15ms视频测试88.5%86.2%87.3%33ms压力测试85.1%83.9%84.5%68ms极端条件76.8%72.4%74.5%-长期运行89.2%87.6%88.4%29ms典型误检情况分析手持手机误检为香烟12%车窗雾气误检为烟雾8%阳光反射造成误检5%改进措施增加手机等负样本引入时序一致性校验添加反射检测模块6. 项目总结与展望6.1 关键技术突破双目标协同检测通过联合检测香烟和烟雾将误检率降低40%实时性优化在1080P分辨率下达到30FPS处理速度小目标检测对香烟这类小目标mAP达到0.856.2 实际应用价值交通管理已试点应用于某地公交监控系统保险评估为保险公司提供驾驶行为分析企业安全管理物流公司驾驶员行为监控6.3 未来改进方向多模态融合加入声音传感器检测打火机声音3D姿态估计分析手部动作确认吸烟行为边缘计算移植到Jetson等边缘设备这个项目从选题到实现历时6个月期间遇到最大的挑战是小目标检测和实时性平衡问题。通过创新性地使用双检测头设计和动态NMS策略我们最终取得了不错的效果。在实际部署中发现模型的鲁棒性比纯精度指标更重要下一步计划收集更多极端场景数据来进一步提升系统稳定性。