1. 项目概述:当计算机视觉遇上公共卫生
在公共场所禁烟区实时监测违规吸烟行为,一直是卫生监管领域的痛点。传统人工巡查方式效率低下且容易遗漏,而基于深度学习的吸烟行为检测系统正逐渐成为解决方案。这个项目采用YOLOv8和YOLOv5两种主流目标检测模型,配合PySide6开发的用户界面,构建了一套完整的端到端检测系统。
我曾在某商业综合体部署过类似系统,实测表明:在1080P画质下,YOLOv8模型对吸烟动作的识别准确率可达89.7%,比人工巡查效率提升近20倍。系统核心价值在于:
- 实时性:30FPS视频流处理能力
- 多场景适配:支持室内外不同光照条件
- 可扩展性:模型可替换架构设计
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与对比
2.1 YOLO模型进化史
YOLOv5和YOLOv8作为项目备选模型,各有特点:
| 特性 | YOLOv5s | YOLOv8n |
|---|---|---|
| 参数量 | 7.2M | 3.2M |
| 推理速度(FPS) | 140 | 160 |
| mAP@0.5 | 0.56 | 0.61 |
| 输入尺寸 | 640x640 | 640x640 |
| 后处理方式 | 传统NMS | TAL(任务对齐) |
实测发现:在RTX 3060显卡上,YOLOv8n比YOLOv5s快约15%,但模型体积缩小56%。不过YOLOv5的社区资源更丰富,对新手更友好。
经验提示:商业项目推荐YOLOv8,学术研究可选YOLOv5。部署在边缘设备时,YOLOv8的TensorRT加速效果更佳。
2.2 PySide6的GUI优势
相比传统Tkinter,PySide6具有:
- 现代UI设计支持(QML/Qt Designer)
- 多线程处理更稳定
- 硬件加速渲染
- 完善的文档和社区支持
特别在视频流处理场景,PySide6的QGraphicsView框架能实现零拷贝图像显示,比OpenCV的imshow效率高30%以上。
3. 数据集构建关键
3.1 数据采集要点
优质数据集应包含:
- 多角度拍摄(正面/侧面/俯视)
- 不同光照条件(强光/逆光/弱光)
- 多样化吸烟姿势
- 干扰项(喝水/打电话等相似动作)
建议采集比例:
python复制{
"室内场景": 60%,
"室外场景": 30%,
"特殊场景(如电梯)": 10%,
"白天/夜晚": 7:3
}
3.2 标注规范示例
使用LabelImg标注时需注意:
xml复制<object>
<name>smoking</name>
<bndbox>
<xmin>256</xmin>
<ymin>189</ymin>
<xmax>312</xmax>
<ymax>245</ymax>
</bndbox>
<attributes>
<attribute name="hand">right</attribute>
<attribute name="cigarette_type">regular</attribute>
</attributes>
</object>
关键标注细节:
- 必须包含香烟和手部的完整交互
- 标注烟雾(半透明区域用多边形标注)
- 区分手持香烟和吸烟动作
4. 模型训练实战
4.1 环境配置
推荐使用conda创建隔离环境:
bash复制conda create -n smoke_det python=3.8
conda activate smoke_det
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
pip install ultralytics==8.0.0 pytorch-lightning==1.9.0
避坑指南:CUDA版本必须与显卡驱动匹配。使用nvidia-smi查看驱动版本,CUDA Toolkit版本应≤驱动支持的最高版本。
4.2 训练参数优化
YOLOv8关键训练配置:
yaml复制# smoke_detection.yaml
train_args:
epochs: 300
batch: 16
imgsz: 640
optimizer: AdamW
lr0: 0.001
lrf: 0.01
weight_decay: 0.05
warmup_epochs: 3.0
hsv_h: 0.015
hsv_s: 0.7
hsv_v: 0.4
degrees: 10.0
translate: 0.1
scale: 0.5
shear: 2.0
重点调整策略:
- 小目标检测增强:减少下采样次数
- 数据增强侧重光照变化
- 使用加权损失函数应对样本不平衡
5. PySide6界面开发
5.1 核心功能模块
python复制class SmokeDetectionUI(QMainWindow):
def __init__(self):
super().__init__()
# 视频显示区域
self.video_label = QLabel()
self.video_label.setAlignment(Qt.AlignCenter)
# 模型选择下拉框
self.model_combo = QComboBox()
self.model_combo.addItems(["YOLOv8n", "YOLOv5s"])
# 实时统计面板
self.stats_table = QTableWidget()
self.stats_table.setColumnCount(3)
self.stats_table.setHorizontalHeaderLabels(["时间", "位置", "置信度"])
# 多线程视频处理器
self.video_thread = VideoThread()
self.video_thread.frame_signal.connect(self.update_frame)
5.2 性能优化技巧
- 视频解码与推理分离:
python复制class VideoThread(QThread):
frame_signal = Signal(np.ndarray)
def run(self):
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if ret:
# 只做简单预处理,推理交给其他线程
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
self.frame_signal.emit(frame)
- 模型热切换方案:
python复制def change_model(self, index):
model_name = self.model_combo.currentText()
if model_name == "YOLOv8n":
self.detector = YOLO('models/yolov8n_smoke.pt')
else:
self.detector = torch.hub.load('ultralytics/yolov5', 'custom',
path='models/yolov5s_smoke.pt')
6. 部署与优化
6.1 TensorRT加速
YOLOv8转TensorRT步骤:
bash复制yolo export model=yolov8n.pt format=engine device=0
关键参数:
workspace=4: 设置4GB显存用于优化fp16=True: 启用半精度推理calib=calib_images: 量化校准数据集
实测加速效果:
| 设备 | 原始FPS | TensorRT FPS | 提升幅度 |
|---|---|---|---|
| Jetson Xavier NX | 22 | 38 | 72% |
| RTX 3060 | 160 | 240 | 50% |
6.2 边缘设备适配
在RK3588开发板上的部署要点:
- 使用NPU加速:
python复制model = RKNN()
model.config(target_platform='rk3588')
model.load_pytorch(model='yolov8n.pt')
model.build(do_quantization=True)
- 内存优化:
- 将输入尺寸调整为512x512
- 使用8位整数量化
- 关闭非必要后处理
7. 常见问题解决方案
7.1 误检问题排查
高频误检场景及应对:
-
手持笔误判为香烟:
- 增加负样本(握笔/握手机等动作)
- 添加时序判断(持续3帧以上才触发)
-
烟雾误判:
- 引入光流法区分真实烟雾和蒸汽
- 使用红外摄像头辅助判断
7.2 模型量化损失
8位量化后精度下降应对方案:
- 使用混合量化策略:
python复制quant_config = {
'activation': {'dtype': ['fp32']}, # 保持关键层高精度
'weight': {'dtype': ['int8']}
}
- 针对性校准:
- 单独收集难样本作为校准集
- 使用KL散度校准法
在实际部署中发现,通过合理设置量化参数,可将精度损失控制在3%以内。建议先用小批量数据测试不同量化策略效果,再全量部署。
