资讯动态

YOLOv5火焰烟雾检测实战:从数据集处理到模型部署全流程解析

发布时间:2026/9/8 19:36:00 来源:尧图企业网站定制
简介面向智能安防、森林防火及工业场景的算法开发者提供基于YOLOv5的火焰和烟雾检测完整资源。包内包含1923张jpg图像和1916个txt标注样本涵盖住宅、工业园区、森林、加油站等典型环境可满足真实场景下的模型训练与验证需求另有27个yaml配置、24个Python脚本、3个预训练pt权重及Dockerfile等配合install.docx安装说明方便快速搭建环境与启动训练。整个压缩包共2000个文件约135.91MB目录清晰适合作为目标检测实战入门或课题参考。目前已有12849人学习下载内容对具备基础PyTorch知识、希望从数据处理到推理部署整体走通的读者尤为友好。通过复现该工程能掌握YOLOv5数据标注格式、训练参数调整、评估与预测脚本的使用并可基于自带权重直接开展烟雾火焰识别实验。 最近拿到一份 YOLOv5 火焰和烟雾检测的源码和数据集压缩包刚好我最近也在帮工厂做安全巡检项目把这两件事放在一起实际跑了一遍。这份资源对于正在做毕设、课设或者想在安防场景落地的朋友来说确实比较实用属于那种“拿来就能跑”的项目类型。不过解压之后你会发现里面的目录结构、训练脚本、标注文件如果你不熟悉 YOLOv5 的套路一头雾水是很正常的。这篇内容我就从拿到压缩包开始按照实际操作的顺序把数据集处理、训练调参、模型导出、部署推理这些环节完整拆一遍顺便把我在火焰和烟雾这类特殊目标上踩过的坑都整理出来。无论你手里是不是同一份资源只要做的是 YOLOv5 火灾检测方向这份经验都能直接参考。1. 项目全景YOLOv5 火焰烟雾检测到底在做什么先把这个项目的本质说清楚。YOLOv5 火焰和烟雾检测简单讲就是用目标检测模型从图像或视频流中实时定位火焰和烟雾的位置并输出类别置信度。和传统的感烟感温传感器相比视觉方案的核心优势在于响应速度快、覆盖范围广、能提供位置信息适合仓库、森林、工厂、隧道等大空间场景。但代价也很直接——模型的训练和部署依赖数据质量和算力资源。我之所以建议优先用 YOLOv5 而不是 YOLOv8 或者更新的架构来做这类项目主要有三个原因一是 YOLOv5 的用户基数大遇到任何报错几乎都能搜到解决方案二是它对硬件要求相对友好一张 8GB 显存的消费级显卡就能完成训练三是官方仓库的导出功能非常完善训练好的模型可以导出 ONNX、TensorRT、OpenCV DNN 等格式部署链路很成熟。1.1 为什么火焰和烟雾是目标检测里的“硬骨头”火焰和烟雾不像行人、车辆那样有固定的边缘轮廓。火焰的形态时刻在变化颜色从橙红到亮黄都有而烟雾更是半透明、边界模糊还会随着气流拉伸变形。这就导致同一个类别的特征方差非常大。我实测过同一份数据集仅仅因为标注框的松紧程度不同mAP 就能差出 10 个百分点。所以这类项目真正考验的不是模型结构本身而是数据处理和标注的细致程度。另外火焰和烟雾在视觉上有天然的相关性但未必总是同时出现。初期火灾可能只有烟雾没有明火阴燃阶段可能长时间只冒烟反过来一些高温作业产生的火花也可能被误判为火焰。因此标签类的设计也很关键我建议直接把“火焰”和“烟雾”作为两个独立的类别分别训练而不是合并成一个“火灾”类这样后续系统报警策略才能灵活配置比如只有当烟雾和火焰同时出现时提高报警等级。1.2 压缩包里的东西通常应该怎么组织一份结构完整的 YOLOv5 火焰烟雾项目包正常情况下应该包含这些内容yolov5 官方源码目录、火焰和烟雾的图片数据集JPEG/PNG、标注文件YOLO 的 txt 格式或 XML 格式、训练脚本、训练好的权重文件.pt以及一份如何使用的说明文档。我解压后第一步就是先核对目录结构确认标注文件格式和图片文件是否一一对应。这里有个很常见的坑——很多分享出来的数据集图片是直接从网上下载的命名很乱标注文件和图片对不上是常有的事。所以我强烈建议先自己写一个简单的 Python 脚本检查每张图片是否都有对应的 txt 标注文件以及标注内容是否在正常的坐标范围内。这个检查只要花五分钟但能避免你后面训练到一半才发现 loss 异常、检测结果全是框错位置的问题。2. 数据集结构、标注规范与预处理细节火焰烟雾检测的效果天花板八成由数据集决定了模型结构反而是次要因素。如果你的压缩包里自带数据集那先别急着训练先花时间把数据集吃透。2.1 标注格式与目录结构的约定在 YOLOv5 框架里数据集的标准目录结构是这样的dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/每张图片对应一个同名 txt 文件每一行的格式是类别ID 归一化中心x 归一化中心y 归一化宽度 归一化高度。类别ID从0开始计数归一化坐标用像素值除以图片宽高得到。拿到包之后我建议你用下面这段代码检查一遍标注质量import os img_dir dataset/images/train label_dir dataset/labels/train for img_name in os.listdir(img_dir): stem os.path.splitext(img_name)[0] label_path os.path.join(label_dir, stem .txt) if not os.path.exists(label_path): print(f缺少标注: {img_name}) continue with open(label_path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: print(f格式错误: {img_name} - {line.strip()}) continue x_center, y_center, w, h map(float, parts[1:]) if not (0 x_center 1 and 0 y_center 1 and w 1 and h 1): print(f坐标越界: {img_name} - {line.strip()})这种检查看似基础但真能筛出不少问题。见过有的包里面坐标是像素值没归一化模型能train但效果非常差这个小脚本能帮你提前发现。2.2 火焰和烟雾标注的实操讲究标注是这类项目里最需要经验的部分。火焰我建议标注核心燃烧区域不需要把全部火苗都圈进去因为火焰外焰变化很快框得太大反而引入大量背景干扰。烟雾则要标注相对集中的区域那些飘散很淡的薄雾如果只有零星像素宁可漏掉也别框进去否则模型学到的就是“任何白色半透明区域”都算烟雾的坏习惯误检率会飙升。另一个经验是在目标边缘留出一点余量。目标检测模型在做边界框回归时不会像分割模型那样精确到像素级所以标注框略微比目标实际的可见区域宽出 2%~3% 时训练收敛更稳。但这个方法不要用过头框太大会让不同目标之间互相重叠损失函数在分配正负样本时会混乱。2.3 数据划分和负样本扩充策略官方推荐的划分比例是训练集 : 验证集 9 : 1 或者 8 : 2。如果数据量本身不大我强烈建议别一股脑全投进去训练因为火焰和烟雾的形态变化太大了必须留出足够多样性的验证集来观察模型是不是过拟合了。还有一个很多人忽略的点是负样本。所谓负样本就是完全不包含火焰和烟雾的正常图片比如蓝天、白云、夕阳、红色的车、暖色调室内装修。这些图片放进训练集里可以显著降低误检率。我见过实际部署中模型把橙色灯光当火焰、把白色蒸汽当烟雾的惨案——本质上就是训练时负样本太少了。在自己的项目里我一般会加入 10%~15% 的负样本效果立竿见影。数据量方面如果只有几百张图片还远远不够。火焰和烟雾检测项目最低建议 1500~3000 张图片每类目标至少要有 500 个以上的实例。如果压缩包里的数据不够考虑用数据增强来扩充——尤其是对亮度、饱和度做大幅扰动因为火灾现场的火焰亮度、烟雾颜色受光线影响非常大。3. 环境搭建与训练全流程实操环境部分是很多新手卡住的地方。YOLOv5 对 PyTorch 版本有一定要求不同版本的 CUDA 兼容性也不同建议严格按照官方 README 里写的依赖列表来安装。3.1 依赖环境的快速配置方法如果你用的是 NVIDIA 显卡推荐用官方推荐的 conda 创建虚拟环境来操作conda create -n yolov5 python3.8 conda activate yolov5 cd yolov5 pip install -r requirements.txtPyTorch 的安装建议单独处理直接去 PyTorch 官网根据自己的 CUDA 版本复制对应命令安装。我自己就用过一条命令出错导致后面各种 OSError再往深里讲一些博主发的包依赖版本比较老如果有版本冲突的报错先检查是不是 Python 版本太高了。火焰烟雾检测项目里PyTorch 1.8 ~ 2.0 这个区间都是兼容的不要太新也不必太旧。3.2 配置文件和模型结构如何调整拿到压缩包之后核心的配置文件有两个。第一个是数据集配置文件.yaml。它决定了训练时模型读取哪些图片和标签# fire_smoke.yaml train: dataset/images/train val: dataset/images/val nc: 2 names: [fire, smoke]注意nc必须和你的标注类别数量一致names的顺序也必须和标注文件里的类别ID对应。如果你把 fire 写成类别0、smoke 写成类别1那标签文件里类别ID为0的都对应fire这个顺序千万别搞反了。第二个是模型配置文件如 yolov5s.yaml。修改nc为2即可其他结构参数保持默认就好。这里我给一个建议如果你的检测目标以小目标为主比如远处的烟雾可以考虑用 yolov5s.yaml 做基础把 anchor 尺寸调小一些。火焰烟雾在画面里往往只占很小区域anchor 太大时小目标容易漏检。3.3 训练启动与关键参数调优在终端里执行训练推荐先做冻结主干网络的迁移学习python train.py --data fire_smoke.yaml --cfg yolov5s.yaml --weights yolov5s.pt --epochs 100 --batch-size 16 --img 640 --device 0对于火焰烟雾这个场景有几个参数特别值得说明--img建议 640 而不是 1280。虽然更大分辨率对小目标检测有利但显存消耗会翻倍且火焰和烟雾这类目标的边缘特征不像人脸那样需要极高细节。--batch-size显卡显存不够时优先降 batch-size而不是降分辨率。我自己的经验是 batch-size 低于 8 时训练结果会明显变差。--epochs100 个 epoch 起步。火焰烟雾这类类间方差大的目标训练收敛比车辆检测慢只训几十个 epoch 效果一般。超参数文件 hyp.scratch.yaml 里的mosaic增强不要关掉mixup建议保持默认0.0到0.1左右因为烟雾的透明特性如果混合太强反而破坏目标特征。从第 50 个 epoch 开始建议把训练分成两个阶段前 50 个 epoch 冻结主干网络backbone训练后面 50 个 epoch 解冻所有层。解冻办法是把训练命令换一下python train.py --data fire_smoke.yaml --cfg yolov5s.yaml --weights runs/train/exp/weights/last.pt --epochs 100 --finetune这样既能加快收敛又能让最后的特征提取更贴合火焰烟雾的数据分布。3.4 训练过程中的指标怎么看我训练时会重点盯住三个指标mAP0.5、mAP0.5:0.95和val/obj_loss。火焰烟雾场景下mAP0.5达到 0.8 以上就算不错了mAP0.5:0.95不用太纠结因为目标边界本身就不清晰。如果发现训练 loss 下降但验证集 mAP 不升反降那就是过拟合了。处理办法是增加数据增强的强度、增加负样本数量或者提前结束训练用best.pt而不是last.pt来做推理测试。4. 模型导出与部署落地的关键手法训练好之后通常要部署到实际环境里可能是本地摄像头、边缘设备或者服务器上。YOLOv5 的官方仓库提供了一条龙导出能力但实际用下来有几个细节非常影响部署效果。4.1 模型导出PyTorch 权重怎么转 ONNX转 ONNX 是部署到 Jetson、树莓派、OpenCV DNN 的常用方式python export.py --weights runs/train/exp/weights/best.pt --include onnx --opset 11这里有个容易忽略的问题--opset的版本。如果你是部署到老版本的 ONNXRuntime 或者某些边缘设备上opset 太高会导致算子不支持。建议先用--opset 11如果遇到算子报错再逐步降低。导出成功后用 ONNXRuntime 快速推理一张测试图确认输出节点的 shape 是(1, 25200, 7)这类格式其中 7 对应 cx、cy、w、h、objectness、4 个类别得分里的前两个。如果 shape 不对检查导出命令是否正确。4.2 摄像头实时推理的落地要点如果要做实时视频流建议直接用 OpenCV DNN 加载 ONNX 模型省掉一堆深度学习框架依赖import cv2 import numpy as np net cv2.dnn.readNetFromONNX(best.onnx) cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: break blob cv2.dnn.blobFromImage(frame, 1/255.0, (640, 640), (0, 0, 0), swapRBTrue) net.setInput(blob) outputs net.forward() # 后续 NMS 处理 cv2.imshow(fire detection, frame) if cv2.waitKey(1) 0xFF ord(q): break这段代码的 NMS 后处理部分需要自己实现YOLOv5 的 NMS 已经从模型里拆出来了输出的是未过滤的预测框。实在不想写后处理的话也可以直接用官方仓库的detect.py对接摄像头但那样性能不如裸推理好。4.3 置信度阈值和后处理策略的调优不同类别的置信度阈值不要一刀切。火焰的颜色特征明显置信度阈值可以设得高一些例如 0.45烟雾边界模糊经常被模型以较低置信度输出阈值设成 0.25 左右更合适。这个细节在标准目标检测里很少有人提但在火灾检测场景里非常关键——烟雾的漏报比误报严重得多。我建议在推理脚本里单独为每个类别设置阈值fire_thres 0.45 smoke_thres 0.25 if class_id 0 and conf fire_thres: # 报警逻辑 elif class_id 1 and conf smoke_thres: # 报警逻辑NMS 的 IoU 阈值建议设为 0.35~0.4 之间比默认的 0.45 小一些因为火焰烟雾经常密集连片IoU 阈值太大会把相近目标合并成一个框。5. 训练和部署中的常见问题与调试经验凡是做过目标检测训练的人应该都明白跑通一次不是结束各种奇怪的问题反而在后面的调试阶段扎堆出现。我把自己实际遇到的几个高频问题整理成一个速查表方便你直接对照排查。5.1 高频问题速查表问题现象可能原因处理办法训练时 loss 一开始就很低且不下降标签和类别不匹配模型在学恒定输出检查 label 文件类别ID和 YAML 的 names 顺序mAP0.5 在 0.6 左右上不去数据量不足或目标形态过于多样增加负样本和数据增强强度检查是否有标注错误把夕阳当火焰、把白墙当烟雾负样本太少网络过拟合加入大量无目标正常场景图重新训练小目标烟雾检测不到输入分辨率低或 anchor 尺寸不合适提高--img到 960显存够的话自定 anchor 尺寸摄像头推理 FPS 很低没有用 batch inference或者模型太大换 yolov5s 或 yolov5n 模型开启 TensorRT 加速训练过程中显存不足batch-size 过大或图片分辨率太高降低 batch-size保持 640 分辨率5.2 我踩过的一个典型错误负样本缺失导致误检我有一次给某个仓库做烟雾检测训练集里全是浓烟或淡烟的照片没有加入任何晴天、傍晚、阴天的负样本。模型在训练集上的 mAP 到了 0.9 以上非常好看。但一接到户外摄像头画面系统疯狂报警——把云、雾、甚至远处建筑外墙的浅色涂料都识别成了烟雾。后来我把负样本扩充到训练集的 15%并且专门选了带白色建筑物、天空、蒸汽等易混淆场景的图片后误检率立刻降到了可接受的范围。这件事让我意识到火焰烟雾检测项目的评估标准里误检率和漏检率同样重要而这两项指标主要受数据影响而非模型结构。5.3 关于合理设定报警策略的补充在实际部署中完全依靠单帧目标检测结果来触发报警很容易造成误报。因为火焰和烟雾的特性摄像头的某一帧可能因为反光、飞虫等产生误判。我自己做这套系统时会在报警逻辑里加一个“多帧确认”机制——连续 3 到 5 帧都检测到目标才会触发报警。这个机制不要写在模型推理里而是在业务逻辑层处理可以用一个简单计数器来实现。做视觉火焰烟雾检测一年下来我的体会是这类项目真正的核心竞争力不在模型结构而在数据质量、阈值策略和业务逻辑的配合。YOLOv5 本身只是一个开放的框架能否在真实场景里发挥价值取决于你怎么围绕它做数据加工和规则设计。这份源码加数据集的压缩包可以帮你跑通整个流程但要想让它落地建议还是严格按照自己实际场景去采集和标注数据再把报警策略调好。另外再分享一个小技巧训练完成后除了跑 mAP 指标一定要挑几段真实视频做完整推理测试观察连续帧的检测稳定性——模型在单张图片上表现好不代表在视频流里也一样可靠。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价