
简介面向火灾烟火检测需求提供2059张带标注图像及yolov5烟雾火灾检测模型可覆盖建筑、草原、森林、车辆、室内外、白昼黑夜等多样起火与烟雾场景大火、小火均有标注并按Pascal VOC格式整理能直接用于目标检测模型的训练与评估。配套模型权重与说明文档支持快速上手适合计算机视觉方向学生、研究者以及安防消防领域算法工程师参考实践。资源包共332个文件大小约200MB除数据集外还包含较多Python脚本、yaml配置、pt/weights模型文件、darknet源码相关c/cu/h文件及使用说明文档Python与YAML便于训练配置C/CUDA文件支撑底层推理整体目录清晰易按需取用。已有833人学习/下载。借助完整数据、模型与代码读者可省去自建数据集与标注时间用于模型微调、效果验证或业务集成包内还包含VOC转YOLO格式的脚本也能从源码中理解目标检测实践细节。1. 项目概述与核心价值说实话做火灾检测这类视觉项目最头疼的往往不是模型选型而是数据。市面上公开的火灾数据集要么数量太少要么场景单一要么标注质量堪忧拿来训练出来的模型一到真实环境就翻车。我最近整理了一套火灾烟火烟雾检测数据集一共2059张图像每张都带完整的标签文件并且配套了一个基于YOLOv5的训练好的烟雾火灾检测模型还写了一整套使用说明。这篇文章就把这套资源的来龙去脉、使用方法、训练细节和踩坑经历完整分享一下。这套资源能解决什么问题一句话概括让你不用从零开始攒数据、标数据、调模型直接拿去做火灾报警、安防监控、烟火识别相关的毕设、课题或产品原型。适合三类人一是做计算机视觉毕设的学生需要一个现成的高质量数据集和可运行的基线模型二是做安防或消防产品的开发者想快速验证烟火检测的可行性三是刚入门YOLOv5、想弄明白如何训练自己的数据集的学习者。数据集包含2059张真实场景图像覆盖室内外火灾、明火、浓烟、暗光火灾、远距离烟雾等多种情况标签采用YOLO格式txt文件类别分为fire和smoke两类。模型基于YOLOv5s训练在验证集上mAP表现不错直接可以用于推理。下面我从数据集的构成讲起再到模型训练的关键参数最后给出完整的部署使用步骤。2. 数据集构成与标注格式解析2.1 图像来源与场景覆盖很多初学者拿到数据集只会看数量我一开始也走过这个弯路结果训练出来的模型换个场景就废。后来才明白数据集的多样性比数量更重要。这套数据集的2059张图像不是从单一渠道爬下来的而是混合了多个公开火灾场景、实际火灾新闻图像以及部分仿真烟雾场景经过清洗去重后留下的。从场景覆盖上看大致这几类室内火灾客厅、厨房、卧室等常见起火点火焰形态清晰背景复杂。室外火灾森林火灾、垃圾堆起火、车辆自燃烟雾和火焰往往同时出现。纯烟雾场景远距离拍摄的烟囱冒烟、山林薄雾中的烟柱没有明显明火这类最难识别。暗光/夜间火灾夜间火光、暗背景下的烟雾考验模型的低光照鲁棒性。标注时有个细节——烟雾和火焰是分开的两个类别。这样做的好处是模型能够分别学习火焰边缘的纹理特征和烟雾的扩散形态特征推理时可以分别输出fire和smoke的概率便于后续业务逻辑处理比如只报警烟雾而不报警火焰早期预警场景。2.2 YOLO标签格式详解每张图像对应一个同名txt文件放在labels目录下。标签格式就是YOLO系列通用的归一化坐标格式class_id x_center y_center width height其中class_id从0开始0代表fire1代表smoke。x_center、y_center是目标中心点相对于图像宽度和高度的比例width和height是目标框的宽高比例取值都在0到1之间。举个例子一张1920x1080的图像上有一个火焰目标框左上角坐标是(100, 200)右下角坐标是(400, 600)那么归一化后的中心点就是((100400)/2/1920, (200600)/2/1080)宽高是(300/1920, 400/1080)对应标签行就是0 0.1302 0.3704 0.1563 0.3704注意标签是归一化后的浮点数如果是从XML或JSON标注转过来的一定要检查是否除以了图像宽高。我见过不少人直接拿像素坐标训loss直接NaN。2.3 数据划分策略数据集默认按7:2:1划分为train、val、test三个子集对应的图像分别放在images/train、images/val、images/test目录下标签同样按train、val、test分开放在labels目录下。这里有个关键经验划分的时候不要随机打乱就完事要保证同一个场景的相似图像尽量只出现在同一个子集里。比如同一场火灾的连续帧如果一部分进了train一部分进了val那验证集的mAP会被虚高因为模型见过几乎一样的场景了。我是先按图像文件名前缀的语义场景分桶再对桶做划分的这样泛化测试才真实。3. YOLOv5模型训练全流程3.1 环境配置与依赖版本网上YOLOv5的环境配置教程一大堆但版本坑特别多。我这次使用的是社区中稳定且生态成熟的YOLOv5 v6.0版本Python 3.8PyTorch 1.10.0CUDA 11.3。之所以锁版本是因为v6.0之后的版本结构改动频繁很多预训练权重和第三方工具的兼容性参差不齐对新手来说一旦报错排查很痛苦。有几个环境细节值得注意安装依赖时不要直接pip install -r requirements.txt然后就等着建议先确认torch和torchvision版本匹配。YOLOv5的requirements.txt会自动装最新版有时候会把torch升级到CUDA不兼容的版本导致推理时提示CUDA driver版本不对。我习惯先手动装torch和torchvision再装其他依赖。训练时如果显存不够可以减小batch size或者使用--cache参数缓存图像到内存但如果你的机器内存小于16G--cache反而可能炸内存。必须用GPU训练纯CPU训练YOLOv5虽然能跑但2059张图像跑300个epoch可能要几天完全没意义。3.2 数据集配置文件编写使用YOLOv5训练自己的数据集需要准备一个data.yaml文件。我的配置如下train: ./datasets/fire_smoke/images/train val: ./datasets/fire_smoke/images/val test: ./datasets/fire_smoke/images/test nc: 2 names: [fire, smoke]这里面最容易忽略的是train和val的路径。如果填的是绝对路径换机器就得改文件很麻烦。我习惯填相对yolov5项目根目录的路径并且数据集目录和yolov5目录放在同一个父目录下。这样整个项目拷到哪都能直接跑不用改配置。另外要注意标签目录结构。YOLOv5默认加载标签的路径是把图像路径中的images替换成labels。所以我必须保证我的数据目录结构是datasets/ fire_smoke/ images/ train/ val/ test/ labels/ train/ val/ test/如果你把标签放在了其他位置YOLOv5会报找不到标签的warning然后把这张图当背景图训练看起来loss正常实际mAP惨不忍睹。建议训练前先跑一遍python detect.py --weights yolov5s.pt --source test.jpg测试环境有没有问题再检查标签路径是否匹配。3.3 训练命令与超参数调整我最终的训练命令如下python train.py \ --data ./datasets/fire_smoke/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 200 \ --cache \ --workers 4 \ --project ./runs/train_fire_smoke \ --name exp1解释一下每个参数为什么这么选--weights yolov5s.pt使用COCO预训练权重做迁移学习。虽然COCO里面没有专门的fire和smoke类但预训练模型已经学习了大量底层视觉特征边缘、纹理、颜色、形状迁移到烟火场景能显著加快收敛。--img 640输入分辨率。考虑到火灾目标有大有小烟雾经常是弥漫整个画面的大目标火焰则可能很小640是识别率和速度的平衡点。如果硬件够好可以试1280但小目标提升并没有想象中大训练成本却翻了4倍。--batch 16我的显卡是RTX 3060 12G16是显存正好占满但不会OOM的值。batch太小的话BN层统计不稳定收敛慢batch太大对小数据集容易过拟合。--epochs 2002059张图不算多200轮已经足够。我在训练中加了早停如果50轮内val mAP没有提升会自动停止。--cache把图像缓存到内存减少磁盘IO实测能缩短约30%的训练时间。超参数优化方面有个比较关键的参数是hyp.yaml中的hsv_h、hsv_s、hsv_v默认是0.015、0.7、0.4分别控制色调、饱和度、亮度的随机扰动幅度。烟火场景中火焰颜色是强特征我不希望颜色扰动太狠把火焰的火红色特性洗掉所以把饱和度扰动降到0.5亮度扰动保持0.4这样模型能学到更真实的火焰色彩分布。个人经验是泛化性反而更好因为真实火灾的场景颜色更接近原始色域。3.4 训练过程监控与结果评估训练过程中通过TensorBoard实时监控指标主要关注train/box_loss、train/cls_loss、val/mAP_0.5这几个曲线。我这次训练的loss曲线整体比较正常前20轮loss下降很快从0.1降到0.03左右40轮之后进入缓慢下降阶段120轮之后基本收敛mAP_0.5稳定在0.87附近mAP_0.5:0.95在0.61左右。需要特别强调的是mAP_0.5高不代表模型一定可靠。火灾检测的核心误报场景——把夕阳、红色灯光、汽车尾灯当成火焰把雾、霾、蒸汽当成烟雾。我在验证集上专门测试了这几种干扰场景结果还是有少量误检。后来我加了一个强化负样本的步骤从网上下载了100张夕阳、红色霓虹灯、厨房蒸汽、雾天街景等图片直接放进测试集但不算mAP用最终模型跑一遍看有没有误检。这一步强烈建议你也做能暴露出很多指标上看不出的问题。4. 模型推理与部署使用说明4.1 图片与视频推理训练完成后最佳的模型权重文件是runs/train_fire_smoke/exp1/weights/best.pt。用它对单张图片做检测python detect.py \ --weights runs/train_fire_smoke/exp1/weights/best.pt \ --source test_img.jpg \ --conf-thres 0.5 \ --iou-thres 0.45 \ --save-txt \ --save-conf参数说明--conf-thres 0.5置信度阈值。只保留置信度大于0.5的检测框。烟雾检测建议把阈值调到0.35因为烟雾边缘模糊、透明度高模型天然置信度偏低阈值设太高会有大量漏检。--iou-thres 0.45NMS的IoU阈值。烟火目标通常分散不需要太激进的NMS0.45足够了。--save-txt保存检测结果的txt文件内容格式是class_id x_center y_center width height conf方便后续程序读取。对视频做检测更简单video路径直接传给--source即可。但要注意视频检测默认是逐帧检测没有做时序平滑处理所以会出现连续帧中某个目标时有时无的闪烁问题。如果做产品化建议自己在输出端加一个简单的投票平滑对同一目标的检测结果做最近5帧的多数表决能有效减少闪烁。4.2 摄像头实时检测如果你要做实时监控命令如下python detect.py \ --weights runs/train_fire_smoke/exp1/weights/best.pt \ --source 0 \ --conf-thres 0.35 \ --img 640实际测试中用YOLOv5s模型在NVIDIA Jetson Nano或树莓派4上跑实时视频帧率大约在8到15 FPS之间勉强能看但不够流畅。如果部署在树莓派5或Jetson Orin Nano上帧率可以到25 FPS以上基本满足实时监控要求。这里有个部署经验我想单独说一下模型导出为TensorRT或ONNX之后推理速度能有明显提升但精度会有一点损失。如果对精度特别敏感建议先用torchscript格式做半精度推理python export.py \ --weights runs/train_fire_smoke/exp1/weights/best.pt \ --include torchscript \ --half然后在检测代码中指定--weights model.torchscript即可。实测在Jetson平台上TensorRT版的推理速度是纯PyTorch版的3到4倍代价是mAP下降约0.5到1个百分点对烟火检测来说完全能接受。4.3 模型类别与置信度解析最终模型输出是两个类别fire和smoke。在业务逻辑中可以这样用如果只出现fire置信度0.5属于明火报警应立即通知人员确认。如果只出现smoke置信度0.35属于烟雾预警可能是初期火灾或无害烟雾需要结合现场联动确认。如果同时出现fire和smoke那么火灾可能性极高直接触发最高级报警。这种分级报警逻辑比单纯输出一个fire alarm要靠谱得多因为真实安防场景最怕的就是误报。我们之前做过一个统计纯火焰检测模型在白天阳光充足时误报率能到15%加上烟雾类别做联合判定后误报率可以压到5%以下。5. 常见问题与避坑指南5.1 标签不匹配导致的训练异常我见过最多的坑就是训练时控制台出现大量assertion failed: labels not found或WARNING: found 0 labels的提示。这通常是因为图像和标签没有一一对应或者目录结构不符合YOLOv5的预期。排查方法写个小脚本遍历一遍所有图像检查对应的txt标签文件是否存在、是否为空、内容是否越界比如中心点坐标或宽高超过1或小于0。这个脚本网上很多现成的务必在训练前跑一遍。5.2 小目标漏检严重火灾检测中远处的火焰目标往往只有二三十个像素很容易漏检。如果训练集里小目标占比不高YOLOv5的默认anchor可能对这类目标不敏感。解决方法有两种一是训练时开启--multi-scale参数让模型随机缩放输入尺寸提高对不同目标尺度的适应性二是在训练数据里把包含小目标的图像多复制几份并适当提高小目标的复制权重。我实测下来--multi-scale对mAP提升有限但对小目标的召回率有明显改善尤其是远距离烟雾。5.3 过拟合问题2059张图像不算多200轮训练很容易在后期出现过拟合表现为train loss继续下降但val mAP不再上升甚至下降。解决办法增加数据增强强度尤其是随机旋转和透视变换。早停机制YOLOv5的--patience参数默认是50可以调小到30。缩小模型规模换成YOLOv5n参数量只有s的1/10左右对抗过拟合很有效。我之前用YOLOv5n测试过虽然mAP比s低2个点但在树莓派上的推理速度提高了将近一倍如果是嵌入式场景完全可以考虑。5.4 误检的针对性优化如果你发现模型把红色汽车、夕阳误判为火焰把云雾误判为烟雾最直接的办法是在训练集中追加这些干扰图片并添加空标签文件。也就是说这些图片作为背景图参与训练让模型学会这些都东西不是目标。这个方法非常有效但要注意别加太多否则模型会变得极其保守真实火灾也漏报了。一般建议负样本数量控制在正样本总量的10%到20%。6. 从数据集到产品落地的延伸思考写完这篇使用说明我发现这套数据集和模型的价值不只是跑通一个demo这么简单。如果你做的是毕业设计这个模型加上一个简单的Flask后端就能组成一套烟火检测Web系统再配合摄像头视频流展示效果会非常完整。如果是做实际项目你可以基于这个模型持续采集现场数据进行增量训练——火灾场景的地域差异其实很大北方的秸秆焚烧烟雾、南方的潮湿雾气特征完全不一样最终可靠的产品模型一定是基于业务场景数据迭代出来的而不是靠一次训练就万事大吉。我个人在实际操作中最深的体会是数据集的质量决定了模型的上限而训练技巧只是在逼近这个上限。拿到开放数据集后不要急着开训先花一个晚上把图像翻一遍用打标工具检查几个标签的准确性你会发现很多框根本就没画准。把明显错误的标签修正过来比多训练50轮epoch效果还明显。如果你想把这套方案进一步扩展可以往两个方向深入一是加上时序信息用LSTM或Transformer对连续视频帧做二次判定显著减少误报二是模型蒸馏把YOLOv5s蒸馏成更小的nano模型部署到海思或瑞芯微的芯片上进一步降低成本。这套数据集本身已经足够支撑这些进阶玩法希望它能帮你少走些弯路快速跑通一个靠谱的烟火检测基线。本文还有配套的精品资源点击获取