1. 项目概述
这个基于YOLOv11的吸烟行为检测系统是我最近完成的一个计算机视觉项目,它能够实时识别监控画面中的吸烟行为。作为一名长期从事计算机视觉开发的工程师,我发现公共场所的吸烟监管一直是个难题——传统的人工巡查效率低下,而现有的智能监控系统又往往缺乏针对性的识别能力。这个项目就是为了解决这个问题而设计的。
系统最核心的能力是同时检测五种关键目标:香烟本体、人物、烟雾、电子烟设备以及综合性的吸烟行为。在实际测试中,系统在12,000多张标注图像上训练后,对吸烟行为的识别准确率达到了92.以上。这个性能指标已经可以满足大多数公共场所的监管需求。
2. 系统架构设计
2.1 技术选型考量
选择YOLOv11作为基础模型是经过深思熟虑的。相比前代版本,YOLOv11在保持实时性的同时,对小目标的检测精度有了显著提升——这对识别香烟这样的细小物体至关重要。我在项目初期对比了YOLOv8、YOLOv9和YOLOv11三个版本,最终选择v11主要是基于以下测试数据:
- 在相同数据集上,YOLOv11的mAP@0.5比v8高出7.2%
- 推理速度仅比v8慢15%,但远快于两阶段的检测模型
- 对小目标(香烟)的召回率提升了近10%
2.2 系统工作流程
系统的完整工作流程可以分为以下几个关键环节:
- 输入处理层:支持三种输入方式(图片、视频、实时摄像头),通过OpenCV进行帧提取和预处理
- 核心检测层:YOLOv11模型进行目标检测和行为识别
- 结果处理层:对检测结果进行后处理,包括非极大值抑制(NMS)和置信度过滤
- 可视化输出层:通过PyQt5构建的UI界面展示检测结果
3. 数据集构建与处理
3.1 数据采集策略
构建一个高质量的吸烟行为数据集是这个项目成功的关键。我们采用了多样化的采集策略:
- 场景覆盖:包含室内、室外、白天、夜晚、不同天气条件
- 视角多样性:正面、侧面、俯视、仰视等多种拍摄角度
- 行为变化:包含手持香烟、正在吸烟、持电子烟等不同行为状态
最终的数据集包含12,486张图像,按照7:2:1的比例划分为训练集、验证集和测试集。特别需要注意的是,测试集是完全独立采集的,确保评估结果的客观性。
3.2 标注规范与技巧
标注质量直接影响模型性能。我们制定了严格的标注规范:
- 香烟标注:必须完整标注可见的香烟部分,包括过滤嘴和烟体
- 烟雾标注:用矩形框包围可见烟雾区域,注意包含半透明部分
- 行为标注:只有当香烟或电子烟明显靠近口部时才标注为"smoking"
标注过程中有几个实用技巧:
- 对于半透明的烟雾,适当扩大标注框范围
- 对小尺寸香烟,使用放大工具确保标注精度
- 对遮挡情况,只标注可见部分
4. 模型训练与优化
4.1 训练参数配置
模型训练采用以下关键参数配置:
python复制model = YOLO('yolo11s.pt') # 使用预训练权重
results = model.train(
data='data.yaml',
epochs=100,
batch=8,
imgsz=640,
device='0',
workers=4,
optimizer='AdamW',
lr0=0.001,
weight_decay=0.05
)
参数选择背后的考量:
- batch_size=8:在显存允许范围内尽可能增大,提高训练稳定性
- imgsz=640:平衡检测精度和推理速度
- AdamW优化器:相比SGD更适合小批量训练
- 学习率0.001:防止大学习率导致的小目标漏检
4.2 关键训练技巧
在训练过程中,有几个技巧显著提升了模型性能:
- 渐进式图像尺寸:前50轮使用512x512训练,后50轮切换到640x640
- 困难样本挖掘:对验证集中漏检的样本进行针对性增强
- 类别平衡采样:对"香烟"这类小目标适当增加采样权重
训练过程中的典型损失曲线显示:
- 分类损失在30轮后趋于稳定
- 定位损失需要50轮以上才能充分收敛
- 小目标检测损失下降最慢,需要针对性优化
5. 系统实现细节
5.1 核心检测逻辑
检测线程的核心代码如下,实现了高效的多线程检测:
python复制class DetectionThread(QThread):
def run(self):
while self.running:
ret, frame = self.cap.read()
if not ret: break
# 预处理
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
resized = cv2.resize(frame, (640, 640))
# 推理
results = self.model(resized, conf=self.conf, iou=self.iou)
# 后处理
boxes = results[0].boxes.xyxy.cpu().numpy()
classes = results[0].boxes.cls.cpu().numpy()
confidences = results[0].boxes.conf.cpu().numpy()
# 发送结果
self.frame_received.emit(frame, results)
5.2 性能优化技巧
为了确保系统实时性,我们实施了多项优化:
- 异步处理:UI线程和检测线程分离,避免界面卡顿
- 智能跳帧:视频检测时根据系统负载动态调整处理帧率
- 模型量化:使用FP16精度减少模型大小和计算量
- 缓存机制:对连续帧中静止区域减少重复检测
这些优化使系统在普通GPU上能达到25-30FPS的处理速度,完全满足实时性要求。
6. 界面设计与交互
6.1 UI架构设计
系统界面采用PyQt5实现,主要包含以下功能模块:
- 登录/注册面板:基于本地JSON文件的账户管理
- 主控制面板:检测模式选择、参数调整
- 双画面显示区:并排展示原始画面和检测结果
- 数据表格区:详细列出检测到的目标信息
- 状态栏:实时显示系统状态和性能指标
6.2 交互细节优化
在UI交互方面,我们特别注重用户体验:
- 参数联动:滑块和数值框双向绑定,操作更直观
- 智能提示:鼠标悬停时显示参数说明
- 状态反馈:检测过程中按钮状态和颜色的变化
- 结果导出:一键保存检测结果和统计报告
界面采用深色主题设计,不仅美观,还能减少长时间监控带来的视觉疲劳。
7. 实际应用与部署
7.1 部署方案
系统支持多种部署方式:
- 本地部署:适合单个监控点,直接运行Python程序
- 服务器部署:通过Flask封装API,支持多客户端访问
- 边缘设备部署:使用TensorRT加速,可在Jetson等设备运行
对于大型场所,我们推荐使用服务器部署方案:
- 后端:Docker容器化部署,负载均衡
- 前端:通过WebSocket实时获取检测结果
- 存储:检测结果存入数据库,便于后续查询分析
7.2 性能实测数据
在不同硬件平台上的性能测试结果:
| 硬件平台 | 分辨率 | FPS | 功耗 |
|---|---|---|---|
| RTX 3060 | 1080p | 28 | 120W |
| Jetson Xavier NX | 720p | 15 | 20W |
| Intel i7-1165G7 | 720p | 8 | 28W |
从数据可以看出,系统在主流硬件上都能达到实用级的性能表现。
8. 常见问题与解决方案
8.1 典型问题排查
在实际使用中,我们遇到过几个典型问题:
-
漏检问题:特别是对小尺寸香烟的检测
- 解决方案:增加小目标检测头,调整anchor大小
-
误检问题:类似香烟的细长物体被误识别
- 解决方案:在数据集中增加负样本,提高分类鲁棒性
-
实时性问题:高分辨率视频处理卡顿
- 解决方案:实现动态分辨率调整,复杂场景降低处理分辨率
8.2 实用调试技巧
分享几个项目调试中的实用技巧:
- 可视化调试:使用
--vis参数实时显示anchor匹配情况 - 热力图分析:通过Grad-CAM查看模型关注区域
- 性能分析:用Py-Spy定位性能瓶颈
- 数据增强:针对性增加困难样本的增强幅度
9. 项目扩展方向
这个系统还有多个值得探索的扩展方向:
- 多模态融合:结合红外传感器提高夜间检测精度
- 行为分析:识别递烟、点烟等更复杂的行为
- 跨摄像头追踪:实现吸烟人员的跨区域追踪
- 云端协同:多个检测终端的数据汇总和分析
目前我们正在开发的一个有趣扩展是"吸烟频率分析"功能,可以统计特定区域一段时间内的吸烟行为频率,为管理决策提供数据支持。