1. 项目概述
这个基于YOLOv5的抽烟行为检测系统,是我在指导学弟学妹毕业设计时开发的一个实用案例。随着高校对毕业设计要求的不断提高,传统选题往往难以满足创新性和实用性的双重标准。这个项目将深度学习技术应用于公共场所禁烟监管这一实际问题,既保证了技术深度,又具备实际应用价值。
系统采用当前最先进的YOLOv5目标检测算法,通过计算机视觉技术自动识别监控画面中的抽烟行为。相比传统的人工巡逻方式,这种自动化解决方案可以7×24小时不间断工作,显著提高监管效率。从技术实现来看,项目涉及数据采集、标注、模型训练和部署全流程,完整覆盖了深度学习项目的典型环节。
2. 技术选型与方案设计
2.1 为什么选择YOLOv5
在目标检测领域,YOLO系列算法以其出色的速度和精度平衡著称。经过多个版本的迭代,YOLOv5在保持实时性的同时,进一步提升了检测精度。具体到这个项目,选择YOLOv5主要基于以下考虑:
- 实时性要求:公共场所监控需要实时或近实时处理,YOLOv5的推理速度可达140FPS,完全满足需求
- 小目标检测:抽烟行为中香烟等目标较小,YOLOv5的Mosaic数据增强和FPN+PAN结构对小目标检测效果更好
- 部署便利:支持导出为ONNX格式,便于在不同平台部署
- 社区支持:活跃的开源社区和丰富的预训练模型,降低了开发门槛
2.2 系统架构设计
整个系统采用经典的深度学习项目架构:
- 数据层:负责图片数据的采集、清洗和标注
- 训练层:基于PyTorch框架的模型训练和优化
- 推理层:加载训练好的模型进行实时检测
- 应用层:将检测结果可视化或触发告警
这种分层设计使得各模块职责清晰,便于后续维护和扩展。例如,当需要增加新的检测类别时,只需更新数据层和重新训练模型,其他层基本无需改动。
3. 数据集构建与处理
3.1 数据采集策略
由于没有现成的抽烟行为数据集,我们需要自行构建。主要采用以下方法:
- 网络爬虫:使用Python的Scrapy框架,以"smoking person"、"cigarette in mouth"等为关键词,从公开图片网站抓取
- 公开数据集筛选:从COCO、OpenImages等数据集中筛选包含抽烟场景的图片
- 实地采集:在允许的场所拍摄模拟抽烟行为的照片(需注意隐私和法律问题)
经过清洗去重后,最终获得了约5000张可用图片。这个规模对于单类别检测任务来说已经足够,特别是配合数据增强技术使用。
提示:在实际操作中,建议将不同场景(室内、室外)、不同角度(正面、侧面)的图片比例控制在合理范围,避免数据偏差。
3.2 数据标注实践
使用LabelImg进行标注时,有几个关键点需要注意:
- 标注一致性:确保所有标注人员对"什么是抽烟行为"有统一标准。我们定义的规则是:香烟在嘴部附近且明显处于吸烟状态
- 边界框质量:框体应紧密贴合目标,但不必过于精确,因为YOLO本身对边界框位置有一定容错能力
- 负样本处理:适当加入一些"疑似但不是"的负样本,提高模型鲁棒性
标注完成后,数据集按8:1:1的比例划分为训练集、验证集和测试集。划分时确保同一场景的不同角度图片属于同一个集合,避免数据泄露。
4. 模型训练与优化
4.1 YOLOv5模型配置
项目采用YOLOv5s模型,这是该系列中最轻量级的版本,适合在普通GPU甚至CPU上运行。模型配置文件主要关注以下几个部分:
yaml复制# model/yolov5s.yaml
nc: 1 # 类别数
depth_multiple: 0.33 # 模型深度系数
width_multiple: 0.50 # 层宽度系数
anchors:
- [116,90, 156,198, 373,326] # P5/32
- [30,61, 62,45, 59,119] # P4/16
- [10,13, 16,30, 33,23] # P3/8
对于抽烟检测这种单类别任务,可以适当简化网络结构。我们移除了原模型中一些冗余的BottleneckCSP层,在保持精度的同时提升了推理速度。
4.2 训练参数调优
训练时主要调整以下超参数:
python复制parser.add_argument('--epochs', type=int, default=300)
parser.add_argument('--batch-size', type=int, default=16)
parser.add_argument('--img-size', type=int, default=640)
parser.add_argument('--adam', action='store_true') # 使用Adam优化器
parser.add_argument('--multi-scale', action='store_true') # 多尺度训练
实际训练中发现几个关键点:
- 学习率不宜过大,初始设为0.01容易震荡,最终采用0.001配合余弦退火策略
- 多尺度训练对提升模型鲁棒性效果显著,但会增加约30%的训练时间
- 早停策略(patience=50)可以有效防止过拟合
4.3 数据增强技巧
除了YOLOv5自带的Mosaic增强外,我们还增加了以下增强策略:
- HSV色彩空间扰动:模拟不同光照条件
- 随机旋转:角度范围±15度,因为抽烟时手部角度多变
- 模糊增强:模拟监控摄像头画质不佳的情况
- 遮挡增强:随机遮挡部分画面,提高对局部遮挡的鲁棒性
这些增强手段使得模型在测试集上的mAP@0.5从0.82提升到了0.87,效果显著。
5. 模型部署与性能优化
5.1 模型导出与简化
训练完成后,将模型导出为ONNX格式以便跨平台部署:
bash复制python export.py --weights runs/train/exp/weights/best.pt --img 640 --batch 1 --include onnx
导出时需要注意:
- 固定输入尺寸(如640×640)可以优化推理性能
- 对于边缘设备,可以进一步使用ONNX Runtime或TensorRT进行量化加速
5.2 推理性能优化
在实际部署中,我们采用了以下优化措施:
- 多线程处理:使用生产者-消费者模式,将图像采集和推理放在不同线程
- 批处理推理:当处理多路视频时,将多帧打包成一个batch输入,提高GPU利用率
- 结果缓存:对静态场景,复用前一帧的检测结果,减少计算量
经过优化后,在NVIDIA T4显卡上可以同时处理8路1080P视频流(每路15FPS),完全满足实际监控需求。
6. 实际应用中的挑战与解决方案
6.1 常见问题及解决方法
在真实场景测试中,我们遇到了以下几个典型问题:
-
误检问题:
- 现象:将拿笔、吃香蕉等动作误判为抽烟
- 解决:增加更多类似场景的负样本重新训练
-
漏检问题:
- 现象:侧面角度或烟雾不明显时检测不到
- 解决:增加数据增强中的旋转角度范围,并专门收集侧面抽烟数据
-
光照影响:
- 现象:夜间或逆光环境下性能下降
- 解决:在预处理中增加自动亮度调整,并使用更多低光照数据训练
6.2 性能瓶颈分析
通过profiling工具分析,发现主要瓶颈在以下环节:
-
图像预处理:占用了约20%的推理时间
- 优化:使用GPU加速的OpenCV版本,预处理时间减少60%
-
NMS后处理:当检测目标较多时耗时明显
- 优化:改用快速NMS实现,速度提升3倍
-
结果可视化:在Jetson等边缘设备上绘制框体较慢
- 优化:降低绘制频率,非关键帧只做检测不绘制
7. 项目扩展与改进方向
这个基础版本完成后,还可以从以下几个方向进行扩展:
- 多行为检测:增加打电话、打架等异常行为检测,形成完整的安防系统
- 跟踪计数:结合DeepSORT等算法,统计违规次数和人员轨迹
- 云端协同:边缘设备负责检测,云端集中管理和分析数据
- 轻量化部署:使用知识蒸馏等技术,进一步压缩模型体积
从实际应用角度看,还可以考虑与现有的安防系统集成,开发管理后台和手机告警功能,形成完整的解决方案。
