1. 项目背景与核心价值
抽烟行为检测是计算机视觉在公共安全领域的一个重要应用方向。传统的监控系统依赖人工查看,效率低下且容易漏检。我们团队开发的这套基于深度学习的抽烟检测算法,能够实时分析监控画面,自动识别抽烟动作,准确率达到了93.6%。这个毕设项目不仅完整实现了算法核心,还提供了完整的训练代码和部署方案。
在实际测试中,系统在1080p分辨率下能达到15FPS的处理速度,完全可以满足实时监控需求。特别值得一提的是,我们针对中国特色的监控场景(如逆光、低照度等)做了专门优化,这使得算法在复杂环境下的表现优于多数开源方案。
2. 技术方案选型与对比
2.1 目标检测模型选择
经过对比测试,我们最终选择了YOLOv5s作为基础检测框架。这个选择主要基于以下几点考量:
- 推理速度:在RTX 3060上,YOLOv5s处理1080p图像仅需25ms
- 准确率:在自建数据集上mAP@0.5达到0.89
- 模型大小:仅14.4MB,便于边缘设备部署
与其他模型的对比数据:
| 模型 | mAP@0.5 | 推理速度(FPS) | 参数量(M) |
|---|---|---|---|
| Faster R-CNN | 0.91 | 8 | 136 |
| SSD300 | 0.85 | 22 | 26.3 |
| YOLOv5s | 0.89 | 40 | 7.2 |
2.2 关键点检测方案
为了准确识别抽烟动作,我们开发了基于HRNet的关键点检测模块,专门定位以下关键点:
- 嘴唇中心点
- 手持香烟的位置
- 肘关节位置
关键点检测网络结构如下:
python复制class KeypointNet(nn.Module):
def __init__(self):
super().__init__()
self.backbone = HRNet(cfg.MODEL.HRNET)
self.head = nn.Sequential(
nn.Conv2d(2048, 512, 3, padding=1),
nn.BatchNorm2d(512),
nn.ReLU(),
nn.Conv2d(512, cfg.MODEL.NUM_JOINTS, 1)
)
def forward(self, x):
x = self.backbone(x)
return self.head(x)
3. 数据集构建与增强
3.1 数据采集与标注
我们收集了超过15,000张包含各种抽烟场景的图像,涵盖:
- 不同光照条件(强光、逆光、夜间)
- 多种抽烟姿势(手持、嘴叼、传递等)
- 各类干扰场景(喝水、打电话等相似动作)
使用Labelme工具进行标注,每个实例标注:
- 边界框
- 5个关键点
- 遮挡状态标签
3.2 数据增强策略
为提高模型鲁棒性,采用了以下增强方法:
python复制train_transform = A.Compose([
A.RandomBrightnessContrast(p=0.5),
A.HueSaturationValue(p=0.5),
A.RandomShadow(p=0.3),
A.MotionBlur(blur_limit=7, p=0.2),
A.RandomFog(p=0.1),
A.CoarseDropout(max_holes=8, max_height=32, max_width=32, p=0.3)
], keypoint_params=A.KeypointParams(format='xy'))
4. 模型训练与优化
4.1 多任务损失函数
我们设计了复合损失函数:
code复制L = λ1*Ldet + λ2*Lkp + λ3*Lpose
其中:
- Ldet:检测损失(CIoU Loss)
- Lkp:关键点损失(Modified Wing Loss)
- Lpose:姿态一致性损失
4.2 训练技巧
- 渐进式学习率:初始lr=0.01,每30个epoch衰减0.1
- 困难样本挖掘:对误检样本进行3倍加权
- 模型蒸馏:使用教师模型(YOLOv5x)生成软标签
训练曲线显示,模型在120个epoch后收敛:

5. 部署与性能优化
5.1 TensorRT加速
将PyTorch模型转换为TensorRT引擎:
bash复制trtexec --onnx=smoke_det.onnx \
--saveEngine=smoke_det.engine \
--fp16 \
--workspace=2048
优化前后性能对比:
| 优化方式 | 延迟(ms) | 显存占用(MB) |
|---|---|---|
| 原始模型 | 42.5 | 1240 |
| FP32 TRT | 28.7 | 890 |
| FP16 TRT | 16.3 | 560 |
5.2 边缘设备部署
在Jetson Xavier NX上的部署方案:
- 使用Docker封装推理环境
- 实现多路视频流并行处理
- 动态调整推理分辨率(根据负载自动切换480p/720p/1080p)
6. 实际应用与效果评估
6.1 测试指标
在保留测试集上的表现:
| 指标 | 数值 |
|---|---|
| 精确率 | 92.4% |
| 召回率 | 94.1% |
| FPS | 15(1080p) |
| 漏检率 | 3.2% |
| 误检率 | 4.7% |
6.2 典型误检分析
- 喝水动作(相似度83%)
- 手持笔写字(相似度76%)
- 打电话手势(相似度68%)
针对这些情况,我们增加了时序分析模块,通过连续帧验证显著降低了误检。
7. 源码结构与使用说明
项目目录结构:
code复制├── configs/ # 模型配置
├── data/ # 数据集处理
├── deploy/ # 部署脚本
├── docs/ # 文档
├── models/ # 模型定义
├── tools/ # 训练测试工具
├── utils/ # 辅助函数
└── README.md
快速开始:
bash复制# 训练
python tools/train.py --cfg configs/smoke.yaml
# 测试
python tools/test.py --weights runs/train/exp/weights/best.pt
# 部署
python deploy/trt_convert.py --weights best.pt
8. 常见问题与解决方案
8.1 性能调优
Q:模型在边缘设备上帧率不足?
A:可以尝试以下方法:
- 降低输入分辨率(从1080p降到720p)
- 使用--half参数启用FP16推理
- 调整检测阈值(--conf-thres 0.4)
8.2 数据不足
Q:标注数据有限怎么办?
A:建议:
- 使用生成对抗网络(GAN)合成数据
- 采用迁移学习,先在公开数据集(如COCO)上预训练
- 应用更强的数据增强
9. 扩展方向
- 多模态融合:结合红外成像检测香烟热点
- 3D姿态估计:更准确地分析抽烟动作
- 跨摄像头追踪:实现人员行为分析
- 轻量化改进:适用于更低端设备
这个项目从构思到实现历时6个月,期间我们迭代了12个模型版本。最大的收获是认识到:在实际场景中,鲁棒性往往比单纯的准确率指标更重要。比如我们发现,适当降低检测阈值(从0.5调到0.4)虽然会增加少量误检,但能显著减少漏检,而这在安防场景中更为关键。