行业资讯
📅 2026/9/7 3:30:41
基于YOLOv5的烟雾检测实战:从数据训练到部署避坑全指南
简介基于YOLOv5的烟雾检测完整方案面向安全监控、消防预警、无人机巡检等场景适合有深度学习基础且希望快速部署或二次开发的工程师。这份资源不仅包含训练好的模型权重还提供大规模已标注图片数据集每个图片均配有文本与可扩展标记语言两种标注格式用户既可用于模型训练、也可用于效果验证或迁移学习。同时包内附有完整的训练脚本和推理脚本能够帮助理解从数据加载、模型训练到目标预测的完整流程并可在视频流中实现实时烟雾识别。压缩包共两千个文件整体大小约三百六十兆除图片与标注外还包含模型文件、说明文档、部署脚本与配置文件目录结构清晰便于按需取用。目前已有两千三百四十八人学习项目经过实际数据训练可直接用于构建烟雾报警系统也可作为目标检测实战的参考范例能显著节省数据准备与训练时间。1. 项目概述为什么选择YOLOv5做烟雾检测做了几年目标检测项目说实话烟雾检测是那种看起来简单、实际坑特别多的方向。火情早期发现、工业现场安全监控、森林防火预警这些场景都离不开对烟雾的快速识别。而烟雾和普通物体不一样它没有固定形状、边缘模糊、颜色接近背景、还会受光照和气流影响不断变化用传统图像处理方案很难覆盖全场景。我最终选YOLOv5来做这个烟雾检测项目核心原因是它在精度和速度之间平衡得最好而且生态成熟、部署方便模型与数据集都能直接复用到实际工程里。这个项目适合谁参考如果你是正在做毕业设计的学生、刚入门目标检测的工程师或者需要在现场快速上线一个烟雾报警功能的开发者这套方案都能直接用。项目里包含了训练好的权重文件和整理过的数据集你可以拿来做二次开发也可以直接用来推理测试。我会把从数据准备到模型训练的完整思路讲清楚也会把训练过程中踩过的坑和排查方法一并写出来希望帮你少走弯路。2. 整体设计思路烟雾检测的技术选型与方案取舍2.1 为什么不用传统图像处理和别的检测框架很多人在做烟雾检测时先想到的是背景差分、帧差法或者颜色阈值分割。这些方法对静态场景里的白烟可能有效但一到户外、有树叶晃动、云影变化、或者烟雾颜色偏灰偏黑时误报率就高得没法看。深度学习方法直接学习烟雾的纹理和形态特征泛化能力明显强得多。检测框架方面我对比过Faster R-CNN、SSD、YOLOv5和YOLOv8。Faster R-CNN精度高但速度慢实时视频流推理很吃力SSD速度快但小目标检测能力偏弱而烟雾早期往往就是一小片区域YOLOv8虽然更新但当时项目需要快速验证硬件兼容性YOLOv5在Jetson和树莓派上的优化方案更多。最终选YOLOv5不是因为它是新东西而是因为它的工程资料最全、踩坑案例最多、部署最容易项目上线讲究的是稳不是追新。2.2 模型结构选型从s到m我选了哪个版本YOLOv5提供了n/s/m/l/x几个不同尺寸的模型。烟雾检测不需要像检测行人车辆那样区分几十个类别类别只有smoke一个所以模型容量不用太大。我最终选的是YOLOv5s作为基础后续又尝试了YOLOv5m。YOLOv5s的模型参数量大约7.2M在GPU上训练速度快边缘设备也能勉强跑实时YOLOv5m精度更高但对硬件要求也上去了。我的建议如果你的摄像头画面中烟雾出现时占比比较小比如远距离森林瞭望塔视角那用YOLOv5m会更稳如果是工厂车间这种近距离监控烟雾通常很快充满画面YOLOv5s完全够用。我这个项目的场景是工业园区周界选了YOLOv5s作为主模型因为需要多路视频同时跑单路推理速度必须控制在20ms以内YOLOv5s在RTX 3060上大约能跑到12ms满足要求。2.3 数据集来源与标注策略项目里附带的数据集是我从两个渠道整理的一部分来自公开的火灾烟雾数据集另一部分是网上爬取的烟雾图片。原始图片大概有6000多张经过清洗和增强后保留约5200张其中训练集4200张、验证集600张、测试集400张。标注格式是YOLO的txt格式每个标注文件对应一张图片每一行是类别id 中心点x 中心点y 宽度w 高度h坐标都是归一化后的值。标注的时候我踩过一个坑烟雾的边缘很难画框。很多人习惯把整片烟雾区域全部框进去但烟雾是半透明的边界没有明确像素级边缘框大了会把背景也算进去框小了又会漏掉部分烟雾。我的处理策略是只标注视觉上明确可见、密度较高的烟雾核心区域不追求覆盖所有淡薄边缘。这样模型学习到的是烟雾最典型的部分推理时即使只检测到核心区域也足够触发报警。3. 核心细节解析训练烟雾检测模型的关键环节3.1 数据处理与增强方案烟雾检测模型的性能上限很大程度上取决于数据增强。YOLOv5内置了Mosaic增强和Copy-Paste增强默认在训练时启用。Mosaic把4张图片拼接成一张让模型能学到更丰富的背景上下文对小目标检测特别有效。烟雾经常出现在天空、建筑、树林等不同背景下Mosaic增强能显著提升模型对不同环境的适应能力。我在训练时开启的增强参数如下hsv_h: 0.015色调偏移烟雾颜色会有变化hsv_s: 0.7饱和度偏移增强对灰白烟雾的适应性hsv_v: 0.4亮度偏移模拟不同光照条件fliplr: 0.5水平翻转烟雾方向无关scale: 0.5随机缩放模拟不同距离下的烟雾大小这里需要注意烟雾检测不需要太多的旋转增强。烟雾不像文本或交通标志那样有明确的方向性但任意角度旋转会引入大量纯背景区域反而干扰模型学习。3.2 训练参数配置与超参数选择我的训练命令和参数如下python train.py --data smoke.yaml --weights yolov5s.pt --imgsz 640 --epochs 150 --batch-size 16 --device 0 --cache关键参数说明imgsz选择640这是YOLOv5的默认输入尺寸兼顾速度与精度。增大到1280可以提升小目标检测效果但训练时间和推理时间都会增加不少工业现场不建议直接用。batch-size设为16在8GB显存的显卡上刚好合适。如果你的显卡显存只有4GB建议降到8。epochs设置150烟雾检测任务相对简单模型在100轮左右基本收敛150轮是给足余量防止欠拟合。训练过程中我重点关注mAP0.5这个指标。烟雾检测不要求特别精细的定位只要框能罩住烟雾区域IoU在0.5以上就可以接受。实测下来YOLOv5s在测试集上的mAP0.5能达到0.913mAP0.5:0.95在0.62左右。这个精度用于现场报警完全够用。3.3 类别不平衡问题怎么处理烟雾检测中因为数据集里绝大多数是正常场景真正有烟雾的帧可能只占20%左右模型容易倾向于把一切都预测为背景。我的处理办法是在训练时调整cls_loss的权重把类别损失权重从默认的0.5调到0.7同时把conf_thres调低到0.001让模型更积极地输出候选框最后依靠NMS和实际的置信度阈值来过滤。另外一个实用技巧是给烟雾框设置最小面积过滤。推理时如果检测框面积小于图片总面积的0.5%很可能是远处的小片白云或者反光被误判为烟雾直接丢弃这种低置信度检测结果可以大幅降低误报率。4. 实操过程从数据标注到模型训练完成全记录4.1 环境搭建与依赖版本我用的训练环境如下供你参考Ubuntu 20.04Python 3.8PyTorch 1.12.1 CUDA 11.6YOLOv5 6.0版本这里的细节值得提醒YOLOv5 6.0版本之后的代码结构变动较大很多第三方部署工具比如NCNN转换脚本对不同版本兼容性不统一。如果你打算后续把模型部署到边缘设备建议固定使用6.0版本。环境搭建用以下命令即可git clone -b v6.0 https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt4.2 数据集目录结构项目的数据集按YOLOv5标准格式组织smoke_datasets/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── smoke.yamlsmoke.yaml内容如下train: smoke_datasets/images/train val: smoke_datasets/images/val test: smoke_datasets/images/test nc: 1 names: [smoke]4.3 训练过程中我观察到的现象训练初期0-20轮loss下降很快从0.1降到0.03左右但val/box_loss偶有反弹。这是因为Mosaic增强引入的拼接图在验证集中不存在模型在两种数据分布之间需要逐步适应。到了50轮之后loss曲线变得平滑说明模型已进入稳定收敛状态。到100轮时我原本打算提前停止但观察到一个有趣现象遇到有雾霾天气的样本时模型会把雾霾误判为烟雾。这个问题的根源是数据集里缺少雾霾负样本。我在训练到120轮时往训练集里额外补充了300张雾霾、云层、蒸汽的图片作为负样本重新跑完了剩余训练。这个操作很有价值最终把误检率降低了约40%。4.4 模型导出与ONNX转换训练完成后导出ONNX格式便于后续部署python export.py --weights runs/train/exp/weights/best.pt --include onnx --opset 11这里要注意opset版本。如果你的部署端是OpenVINO或者NCNNopset 11兼容性最好。如果选太高版本某些算子可能在推理引擎里不支持导致转换报错。导出后用ONNX Runtime验证一下输出确认输入输出节点名称符合预期再接入业务代码。5. 常见问题与排查技巧实录5.1 训练loss不下降怎么办这是最常见的问题。loss不下降大概有三个原因数据集标注有误框的位置和类别对不上。排查方法是把标注框画回原图肉眼检查。YOLOv5自带的val.py在验证时会生成带标签框的图片直接看这些结果就能发现标注问题。学习率设置不合理。YOLOv5默认学习率是0.01如果你在微调时用了更小的数据集可能需要降低到0.001。我一般先打印初始loss值如果第一轮loss就在0.2以上说明学习率偏大。数据增强导致样本过于扭曲。Mosaic增强有时候会把四张图切得只剩下很小的目标区域模型很难学到有效特征。如果发现这种问题可以把mosaic增强概率从1.0调到0.5。5.2 推理时误报率过高怎么排查烟雾检测误报主要来自白色或灰色物体云、雾、白色卡车、蒸汽管道排气。我的排查流程分三步。首先看检测框的置信度分布。如果很多误报框的置信度集中在0.3-0.5之间而真正烟雾目标通常都能达到0.7以上那把conf_thres从0.25提高到0.45就能过滤掉一大半误报。其次检查误报目标的位置。如果误报总是出现在画面固定区域比如某个白色建筑转角可以做区域遮罩只检测感兴趣区域内的目标。最后补充负样本重新训练。把现场的固定误报截图存下来标注为背景加入训练集迭代一版模型。5.3 边框抖动严重且框不完整这种情况通常发生在烟雾浓度较低、透明度较高的时候。模型输出的框会在连续的几帧里跳来跳去有时候只框住烟雾的一部分。解决方法不是改模型而是在后处理阶段加帧间滤波连续五帧的检测框中心点与尺寸变化都小于某个阈值时才认为目标稳定。如果这五帧里有一帧没检测到就重新累积计数。另外可以把IoU的NMS阈值从默认的0.45调低到0.3减少重叠框之间的互相抑制。5.4 训练好的模型在边缘设备上太慢如果你要把模型部署到Jetson Nano或者树莓派上需要做三件事第一把输入尺寸从640降到416推理速度能提升约40%精度损失在可接受范围内第二使用TensorRTNVIDIA平台或NCNNARM平台做模型加速第三把浮点模型量化成FP16或INT8。INT8量化可能会让mAP下降3-5个百分点但对于烟雾这种特征明显的目标影响不大。6. 项目扩展思路从检测到预警系统的完整落地训练好的YOLOv5烟雾检测模型只是第一步实际工程中还要把它接进完整的预警流程。我在这套模型基础上做了几个扩展一是将检测结果通过MQTT推送到后端服务器后端结合视频流时间戳和摄像头编号生成报警记录二是增加了报警去重机制同一摄像头在30秒内最多只推送一次报警避免短信轰炸三是加入彩色烟雾的适配通过额外的图像分类分支判断烟雾颜色为后续灭火决策提供参考。在部署摄像头点位时也有个容易被忽略的点烟雾检测的准确率与摄像机安装角度关系很大。仰拍角度过高天空和云层占画面比例大误报率显著上升俯拍角度过低烟雾刚产生时容易被遮挡。实测下来摄像头俯视角度在15-25度水平线的下倾角时既能看清地面火源又能捕捉到上升的烟雾误报率最低。我在项目中统一按这个标准调整了摄像头安装位置效果立竿见影。另外如果你在实验室环境测试模型时表现很好一到现场就频繁误报大概率是现场存在训练集中从未出现过的干扰物。比如工厂里的白色蒸汽、雾霾天气的灰白天空、夜晚的白色灯光。这些情况建议收集现场视频截取包含干扰物的帧补充进数据集的负样本里重新训练。这比调整阈值有效得多。根据我个人的实战体会烟雾检测这个方向真正费时间的不是搭模型而是整理数据和调整误报。如果你拿到的数据集中图片质量参差不齐先花时间清洗掉模糊、重复、目标过小的图片效果比盲目增加训练轮数要好得多。模型能跑通只是开始能把误报率压到现场可接受的水平才是真正有价值的工作。希望这篇文章能帮你把烟雾检测项目跑起来也欢迎你在实际操作中积累更多经验让这套方案在更多场景里发挥作用。本文还有配套的精品资源点击获取