基于YOLOv5的火焰检测系统:从数据集构建到实时部署

发布时间:2026/7/14 10:22:15
基于YOLOv5的火焰检测系统:从数据集构建到实时部署 1. 为什么选择YOLOv5做火焰检测第一次接触火焰检测项目是在三年前当时客户需要在化工厂部署一套智能监控系统。传统的光学传感器方案误报率太高经常因为高温蒸汽触发警报。测试了几种深度学习框架后YOLOv5的表现让我印象深刻——在RTX 3060显卡上能达到45FPS的实时检测速度同时保持92%的准确率。YOLOv5相比前代有三大优势特别适合火焰检测轻量化设计YOLOv5s模型仅14MB大小部署在树莓派上都能流畅运行多尺度检测通过FPNPAN结构能同时捕捉远处的小火苗和近处的大面积火焰训练友好自带数据增强和自动锚框计算新手也能快速上手去年帮某森林公园部署系统时我们对比了不同版本的YOLO。在相同数据集上YOLOv5的火焰检测效果明显优于其他版本模型mAP0.5推理速度(FPS)模型大小YOLOv30.7628236MBYOLOv40.8335244MBYOLOv5s0.894514MBYOLOv70.913871MB2. 构建火焰数据集的实战技巧2.1 数据采集的坑与经验刚开始做火焰识别时我犯了个典型错误——只用网络爬取的火焰图片训练。结果在实际监控场景中系统把夕阳、车灯全都误判成火焰。后来发现高质量的负样本和正样本同样重要。现在我的标准采集方案包含正样本室内酒精灯、户外篝火、工业电焊等不同场景的火焰视频按每秒5帧抽取图像负样本红色衣物、电暖器、电焊光、车尾灯等易混淆场景特殊场景雨天/雾天/夜晚等复杂环境下的火焰最近一个项目中我们使用GoPro拍摄了200段不同场景的火焰视频配合网络公开数据集最终构建了包含15,842张图像的数据集。这里分享几个实用资源Fire Detection Dataset 含标注的1,421张图像BoWFire Dataset 经典火焰/烟雾数据集自建数据集工具包 含视频抽帧脚本2.2 标注中的注意事项用过LabelImg的人都知道火焰边缘标注是个头疼问题。我的经验是标注规范火焰跳动部分全部标注轻微烟雾不标技巧先用矩形框大致标注再用多边形工具微调边缘质量控制标注完成后用CVAT做二次校验# 将VOC格式转为YOLO格式的脚本 import xml.etree.ElementTree as ET import os def convert(size, box): dw 1./size[0] dh 1./size[1] x (box[0] box[1])/2.0 y (box[2] box[3])/2.0 w box[1] - box[0] h box[3] - box[2] x x*dw w w*dw y y*dh h h*dh return (x,y,w,h) def convert_annotation(xml_file, txt_file): tree ET.parse(xml_file) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) with open(txt_file, w) as f: for obj in root.iter(object): cls obj.find(name).text if cls not in classes: continue cls_id classes.index(cls) bbox obj.find(bndbox) b (float(bbox.find(xmin).text), float(bbox.find(xmax).text), float(bbox.find(ymin).text), float(bbox.find(ymax).text)) bb convert((w,h), b) f.write(str(cls_id) .join([str(a) for a in bb]) \n)3. 模型训练的关键调参技巧3.1 针对火焰特性的改进火焰检测有三大难点小目标、动态变化、类火干扰。我们在YOLOv5基础上做了这些改进损失函数优化使用Focal Loss解决正负样本不平衡采用CIoU Loss提升边界框回归精度# hyp.scratch.yaml修改建议 loss: ciou: 0.05 # CIoU loss gain cls: 0.5 # cls loss gain cls_pw: 1.0 # cls BCELoss positive_weight obj: 1.0 # obj loss gain obj_pw: 1.0 # obj BCELoss positive_weight fl_gamma: 2.0 # Focal Loss gamma注意力机制 在Backbone末端添加SE模块增强火焰特征提取class SEBlock(nn.Module): def __init__(self, c, r16): super().__init__() self.squeeze nn.AdaptiveAvgPool2d(1) self.excitation nn.Sequential( nn.Linear(c, c // r, biasFalse), nn.ReLU(inplaceTrue), nn.Linear(c // r, c, biasFalse), nn.Sigmoid() ) def forward(self, x): bs, c, _, _ x.shape y self.squeeze(x).view(bs, c) y self.excitation(y).view(bs, c, 1, 1) return x * y.expand_as(x)3.2 训练参数设置经过20次实验验证的最佳参数组合输入分辨率640x640平衡精度与速度Batch Size16显存占用约8GB优化器AdamWlr0.001weight_decay0.0005数据增强Mosaic增强概率0.5HSV色域扰动H增益0.015S增益0.7V增益0.4随机旋转-10°~10°python train.py --img 640 --batch 16 --epochs 300 --data fire.yaml \ --weights yolov5s.pt --cfg models/yolov5s.yaml \ --hyp data/hyps/hyp.fire.yaml --device 04. 部署优化的实战经验4.1 模型压缩技巧在 Jetson Nano 上部署时我们用了这些优化手段FP16量化模型大小减少50%速度提升30%TensorRT加速使用trtexec转换引擎剪枝移除置信度低于0.1的输出通道# TensorRT转换示例 import torch from torch2trt import torch2trt model torch.load(best.pt).eval().cuda() x torch.ones((1,3,640,640)).cuda() model_trt torch2trt(model, [x], fp16_modeTrue) torch.save(model_trt.state_dict(), best_trt.pth)4.2 多线程处理框架针对监控场景的Python部署框架from threading import Thread import queue class Detector: def __init__(self, model_path): self.model load_model(model_path) self.queue queue.Queue(maxsize10) def inference(self): while True: img self.queue.get() results self.model(img) # 告警逻辑处理... def start(self): Thread(targetself.inference, daemonTrue).start() # 使用示例 detector Detector(best.pt) detector.start() cap cv2.VideoCapture(0) while True: ret, frame cap.read() detector.queue.put(frame)5. 实际应用中的调优案例去年在某油田项目中发现一个典型问题白天检测准确率98%但夜间骤降到72%。通过分析发现两个关键因素红外摄像头适配训练数据增加红外火焰图像修改HSV增强参数降低V通道扰动动态阈值调整def dynamic_threshold(img): # 根据图像亮度自动调整置信度阈值 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) brightness np.mean(gray) return 0.3 if brightness 50 else 0.5最终将夜间检测准确率提升到89%误报率从35%降到8%。这个案例让我深刻体会到好的AI系统20%算法30%数据50%场景理解

相关新闻