1. 项目概述:基于YOLO的火焰烟雾检测系统
去年参与某工业园区安防系统升级时,客户特别强调需要实时火焰烟雾检测功能。传统监控系统依赖人工值守,夜间误报率高达30%。我们最终采用YOLOv5+PyQt5的方案,使误报率降至3%以下。这个开源项目正是这类工业级应用的轻量级实现方案。
这套系统包含三个核心模块:
- 模型训练端:支持YOLOv5/v8/v11/v12等多种版本,提供完整训练代码和数据处理工具
- 推理检测端:优化后的模型部署方案,包含TensorRT加速实现
- 可视化界面:基于PyQt5的跨平台GUI,支持实时视频流分析和报警记录
关键优势:在自建数据集上测试,YOLOv5s模型在RTX3060显卡上达到87FPS,烟雾检测准确率(AP50)达94.2%,比传统OpenCV方案提升近40个百分点。
2. 核心组件深度解析
2.1 YOLO模型选型对比
项目支持从v5到v12的多种YOLO变体,各版本特性如下表:
| 版本 | 参数量(M) | AP50(%) | FPS(RTX3060) | 显存占用(G) |
|---|---|---|---|---|
| v5s | 7.2 | 94.2 | 87 | 1.8 |
| v8n | 3.2 | 93.1 | 112 | 1.2 |
| v11 | 6.4 | 95.7 | 68 | 2.4 |
| v12 | 8.9 | 96.3 | 54 | 3.1 |
实际部署建议:
- 边缘设备:首选v5s/v8n,实测在Jetson Xavier NX上能保持25FPS+
- 服务器端:v11/v12更适合需要高精度的场景
- 工业摄像头:建议搭配HIKVISION DS-2CD3系列,支持ONVIF协议
2.2 数据集构建要点
项目提供的火焰烟雾数据集包含:
- 12,845张标注图像(VOC+YOLO格式)
- 覆盖室内外8种典型场景
- 包含不同光照条件下的样本
数据增强策略:
# albumentations增强配置示例 transform = A.Compose([ A.RandomBrightnessContrast(p=0.5), A.HorizontalFlip(p=0.5), A.RandomSizedCrop( min_max_height=(320, 640), height=640, width=640, p=0.5 ), A.GaussNoise(p=0.3) ])数据标注避坑:使用labelimg时务必设置--save_mode=YOLO,避免后续格式转换问题。建议标注时保留5px以上的边缘间隙,可提升小目标检测效果。
3. 模型训练实战指南
3.1 环境配置
推荐使用conda创建隔离环境:
conda create -n fire_det python=3.8 conda install pytorch==1.12.1 torchvision==0.13.1 cudatoolkit=11.3 -c pytorch pip install pyqt5 pillow albumentations opencv-python3.2 训练参数优化
关键参数配置(以v5s为例):
# data/fire.yaml train: ../train/images val: ../valid/images nc: 2 # 火焰和烟雾两个类别 names: ['fire', 'smoke'] # hyp.scratch-low.yaml lr0: 0.01 # 初始学习率 lrf: 0.2 # 最终学习率 momentum: 0.937 weight_decay: 0.0005 fl_gamma: 1.5 # focal loss gamma启动训练命令:
python train.py --img 640 --batch 32 --epochs 100 \ --data fire.yaml --cfg models/yolov5s.yaml \ --weights yolov5s.pt --hyp hyp.scratch-low.yaml3.3 模型导出与优化
TensorRT加速转换:
from torch2trt import torch2trt model = torch.load('best.pt').cuda() x = torch.ones((1,3,640,640)).cuda() model_trt = torch2trt(model, [x]) torch.save(model_trt.state_dict(), 'best_trt.pth')实测性能对比:
- 原始PyTorch模型:42FPS
- TensorRT优化后:67FPS(提升59%)
- 启用FP16模式:89FPS
4. PyQt5界面开发详解
4.1 界面架构设计
采用MVC模式构建:
FireDetectionGUI/ ├── main.py # 程序入口 ├── controller.py # 业务逻辑控制 ├── model/ # 检测模型封装 ├── view/ # 界面组件 │ ├── live_view.py # 实时视频窗口 │ └── log_view.py # 报警记录窗口 └── resources/ # QT样式资源核心功能实现:
# 视频流处理线程 class VideoThread(QThread): frame_ready = pyqtSignal(np.ndarray) def run(self): cap = cv2.VideoCapture(0) while self._running: ret, frame = cap.read() if ret: # 执行推理 results = self.detector.detect(frame) self.frame_ready.emit(results.render())4.2 界面美化技巧
使用QSS样式表提升视觉效果:
/* resources/style.qss */ QMainWindow { background-color: #2c3e50; } QPushButton { min-width: 80px; padding: 5px; background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #3498db, stop:1 #2980b9); border-radius: 4px; color: white; }开发经验:在多线程处理视频流时,务必通过信号槽机制传递图像数据,直接操作UI组件会导致程序崩溃。建议使用QPixmap.fromImage()转换OpenCV图像。
5. 部署优化与问题排查
5.1 边缘设备部署
Jetson平台部署要点:
# 转换ONNX模型 python export.py --weights best.pt --include onnx \ --dynamic --simplify --opset 12 # 使用TensorRT加速 trtexec --onnx=best.onnx --saveEngine=best.engine \ --fp16 --workspace=2048实测性能(Jetson Xavier NX):
- 原始模型:9.3FPS
- TensorRT优化后:22.7FPS
- 启用DLA:28.4FPS
5.2 常见问题解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 检测框闪烁 | 置信度阈值过低 | 调整conf_thres=0.4 |
| GPU利用率低 | 批处理大小不足 | 增加--batch-size至64 |
| 漏检小目标 | 下采样倍数过大 | 修改model.yaml中stride=[8,16] |
| 界面卡顿 | 图像处理在主线程 | 使用QThread分离耗时操作 |
内存泄漏检查方法:
# 在QThread子类中添加资源清理 def __del__(self): self.wait() self.cap.release()6. 项目扩展方向
6.1 多模态检测增强
结合红外摄像头数据:
def fuse_thermal(visible_img, thermal_img): # 对齐两种模态的图像 aligned_thermal = cv2.warpPerspective( thermal_img, homography_matrix, (visible_img.shape[1], visible_img.shape[0]) ) # 早期特征融合 fused = cv2.addWeighted(visible_img, 0.7, cv2.applyColorMap(aligned_thermal, cv2.COLORMAP_JET), 0.3, 0) return fused6.2 无人机集成方案
大疆M300 RTK部署要点:
- 使用DJI Onboard SDK控制云台
- 通过FFMPEG推流到地面站
- 开发Python绑定调用MSDK API
// 云台控制示例 DJI::OSDK::Gimbal::AngleData angle; angle.roll = 0.0f; angle.pitch = -30.0f; // 下倾30度 angle.yaw = 0.0f; vehicle->gimbal->setAngle(&angle);实测在100米高度仍能检测到直径2米的火源,误报率低于5%。