YOLO火灾火焰检测数据集:5000张真实场景图与三种标注格式实战

发布时间:2026/8/27 5:36:43
YOLO火灾火焰检测数据集:5000张真实场景图与三种标注格式实战 简介目标检测是计算机视觉领域的核心任务之一在智慧消防、工业安全等场景中火焰与烟雾的实时识别至关重要。实际工程中算法模型已较为成熟真正制约项目落地的往往是高质量训练数据的获取与处理。一套结构清晰、格式统一的标注数据集能够显著降低数据清洗和格式转换的时间成本让开发者专注于模型训练与调优。本文以火灾火焰目标检测为切入点介绍包含5000张真实场景图片的数据资源涵盖室内、室外、森林、夜间等多元环境并提供VOC、COCO、YOLO三种主流标签格式。同时结合数据集划分脚本与YOLO训练教程分享坐标转换、数据泄露规避、训练参数调优等工程实操经验帮助从事目标检测或安全巡检的开发者快速构建高精度火灾检测模型。 做火灾检测项目或者做安全巡检的朋友应该都对“数据”这两个字又爱又恨。火焰目标检测这个方向算法模型其实早就很成熟了YOLOv5、YOLOv8随便拿一个出来精度都不差真正卡脖子的反而是数据。网上的火焰数据集要么几百张图片撑死要么都是打火机、蜡烛这种近景特写要么干脆就是网上随便抓的图标签格式还五花八门。我之前做过一个厂区火焰报警项目光整理数据、统一格式就花了小半个月那滋味是真难受。所以当我整理完这套YOLO火灾火焰目标检测数据集的时候就想把它做成一份“拿到就能用”的资源。5000张真实场景图片覆盖室内、室外、森林、夜间等常见火灾场景所有图片都做了人工标注并且一份数据给了三份标签——VOC、COCO、YOLO三种主流格式全都有另外还附带了数据集划分脚本和一份从零开始的训练教程。不管你是刚入门目标检测的新手还是已经在做工业视觉、智慧消防项目的从业者这套资源都能帮你省掉大量数据处理时间直接进入模型训练和调优环节。我先把话放这儿这份资源的价值不在于那5000张图而在于“格式齐全、开箱即用”这八个字。接下来我把数据集的构成、三种标签的差异、划分脚本的使用方法以及训练环节的关键步骤和踩坑经验全部拆开揉碎了讲一遍。1. 数据集整体设计与内容拆解1.1 5000张图片的数据构成与场景覆盖先聊数据本身。这套数据集一共5000张图片全部是真实场景拍摄或采集的火灾相关画面不是合成图也不是渲染图。这些图片按场景维度大致可以分成几类室内火灾办公楼、住宅、厂房、室外火灾垃圾堆放、车辆起火、森林火灾植被燃烧、工业火灾化工装置、油罐还有一部分夜间低光照条件下的火灾画面。为什么要刻意覆盖这些场景因为火焰检测模型最怕的就是场景单一。你要是只在白天室外场景上训练模型到了夜间室内环境检测精度直接断崖式下跌这在工业项目里是致命的。图片尺寸方面数据集里的图片大多在800到2000像素之间都是常规相机或者监控摄像头拍出来的分辨率没有做过多的裁剪和缩放。这样做的考虑是让模型在训练时能适应不同分辨率的输入训练时通过ultralytics自带的imgsz参数统一缩放即可。这种“保留原始尺寸”的做法对模型泛化能力是有帮助的因为真实部署时摄像头传来的画面分辨率是不可控的模型如果只在固定尺寸上训练遇到其他分辨率容易掉点。1.2 标注类别与标注标准标注类别我设置了两类fire火焰和smoke烟雾。可能有人会问只检测火焰不行吗为什么还要标烟雾这个我从实际项目经验来说火灾在初期阶段往往火焰不明显烟雾才是最早出现的信号。如果模型只认火焰等火焰烧起来再报警可能已经错过了最佳扑救时间。所以同时标注火焰和烟雾能让模型学会“有烟雾也可能是火情”的判别能力这在消防场景里特别实用。标注标准上所有目标框都按外接矩形进行标注框要能完整包住火焰或烟雾的主体区域适当留一点边界余量避免框太紧导致部分火焰超出边界。这个细节看似不起眼但对训练效果影响很大特别是火焰这种形状动态变化的目标框如果贴得太死训练时正样本的特征会变得不稳定。围绕这5000张图我做两轮去重处理。第一轮是感知哈希去重剔除完全相同的图片第二轮是人工抽检去掉那些标注质量差、遮挡严重、画面模糊的样本。训练数据里如果混入大量脏数据模型收敛都会成问题。这一套流程下来数据集的整体质量是有保证的实测下来可以节省很多数据清洗的精力。2. 三种标签格式的深度解析2.1 VOC格式xml标注文件详解VOC格式是目标检测领域历史最悠久的标注格式之一来自PASCAL VOC挑战赛。它的特点是一张图片对应一个XML文件文件里用annotation作为根节点里面记录了图片路径、尺寸以及每一个目标对象的具体信息。下面是一段典型的结构annotation folderimages/folder filenamefire_001.jpg/filename size width1280/width height720/height depth3/depth /size object namefire/name bndbox xmin320/xmin ymin150/ymin xmax780/xmax ymax620/ymax /bndbox /object /annotationVOC格式在数据可视化、标注工具兼容性方面有天然优势很多老牌标注工具如LabelImg默认输出的就是VOC格式。在转换和调试阶段用VOC格式做可视化检查是最方便的。另外如果你用了MMDetection这类框架VOC格式也可以直接支持省去再转一道格式的麻烦。2.2 COCO格式json标注文件详解COCO格式是由Microsoft COCO数据集推广开来的标注格式一个数据集对应一个大的JSON文件。文件顶层包含info、licenses、images、annotations、categories五个字段。其中images数组里每个元素包含图片的id、文件名、宽度、高度annotations数组里每个元素包含标注目标的id、所属图片id、类别id、bbox坐标[x, y, width, height]像素坐标格式、面积areacategories数组则定义了类别id和类别名的映射关系。COCO bbox坐标是[x, y, width, height]x和y是目标左上角的像素坐标width和height是目标的像素宽度和高度。COCO格式的好处是通用性强Detectron2、MMDetection、PaddleDetection这些主流框架全都支持也是学术界论文里最常用的格式。不过COCO格式对新手不太友好一个文件里所有信息都压在一起结构层级多手写容易出错。训练时如果要用COCO格式数据建议直接通过框架内置的转换工具读取不要自己手搓解析逻辑。2.3 YOLO格式txt标注文件详解YOLO格式是Darknet和Ultralytics系列的默认格式也是最简洁的一种一张图片对应一个txt文件每行是一个目标格式为class_id x_center y_center width height。注意这里的x_center、y_center、width、height都是归一化坐标值在0到1之间。比如图像尺寸是1280x720某个火焰目标的中心点像素坐标是(550, 385)宽高是(460, 470)归一化后就是0 0.4297 0.5347 0.3594 0.6528其中0是类别idfire后面四个数就是归一化后的中心点x、中心点y、宽度、高度。这种格式的最大优势是存储紧凑、读取快训练时不需要额外解析复杂结构而且归一化坐标不受图像尺寸变化影响适配不同分辨率的输入。三种格式放在一起对比最关键的就是坐标系差异。VOC是“左上角x、左上角y、右下角x、右下角y”的像素坐标COCO是“左上角x、左上角y、宽度、高度”的像素坐标YOLO是“中心点x、中心点y、宽度、高度”的归一化坐标。格式文件类型坐标含义是否归一化VOCXMLxmin, ymin, xmax, ymax否像素值COCOJSONx, y, width, height否像素值YOLOTXTx_center, y_center, width, height是0~1我补一个我自己踩过的坑在做格式转换时坐标系的转换是最容易出错的。尤其是VOC转YOLO需要先将像素坐标归一化而且计算过程中四舍五入会带来精度损失如果图片尺寸特别大这种损失可能达到几个像素。用转换脚本处理完之后一定要抽样可视化验证一下不能直接拿去做训练。这个数据集里附带的标签我全部做过校验坐标都在图像边界内没有越界框、空框和类别id越界的情况。3. 数据集划分脚本实操要点3.1 划分比例与划分原则数据集的划分直接影响训练结果的可靠性。这套资源附带的是标准7:2:1划分脚本即70%训练集、20%验证集、10%测试集。这个比例在很多目标检测项目里是够用的如果数据量小可以考虑8:1:1数据量大且各类别分布均衡6:2:2也常见。但有一点要记住测试集一旦确定整个调参过程中最好别去碰它只在最后评估时用一次否则模型会在无形中对测试集过拟合。划分时有一个特别容易踩的坑——数据泄露。如果同一个场景的连续帧图片同时被分到训练集和验证集模型在验证集上的表现会虚高因为模型已经“见过”了类似场景。我在划分脚本里加入了基于文件名前缀的分组逻辑确保同一监控视角的连续帧尽量进同一个集合避免跨集合造成的数据泄露。3.2 划分脚本的实现思路简单来说脚本要干三件事读取全部图片文件名、按比例随机分配三个集合、生成对应的目录结构和复制文件。这里给出一段核心逻辑你们拿到数据集里的脚本后可以对照着改import os import random import shutil random.seed(42) image_dir images train_ratio, val_ratio 0.7, 0.2 test_ratio 0.1 all_images [f for f in os.listdir(image_dir) if f.endswith(.jpg)] random.shuffle(all_images) n_train int(len(all_images) * train_ratio) n_val int(len(all_images) * val_ratio) n_test len(all_images) - n_train - n_val splits { train: all_images[:n_train], val: all_images[n_train:n_train n_val], test: all_images[n_train n_val:] } for split, images in splits.items(): os.makedirs(fdataset/images/{split}, exist_okTrue) os.makedirs(fdataset/labels/{split}, exist_okTrue) for img in images: shutil.copy(fimages/{img}, fdataset/images/{split}/{img}) label_file flabels/{os.path.splitext(img)[0]}.txt if os.path.exists(label_file): shutil.copy(label_file, fdataset/labels/{split}/{label_file})这里有个细节值得注意random.seed(42)必须固定种子否则每次跑脚本划分结果都不一样复现实验会变得很困难。固定种子后无论跑多少遍训练集、验证集、测试集的划分都是一样的后续别人复现你的工作也更容易。我建议你们用之后把划分结果文件也保存一份方便随时回溯。提示有些人的做法是在脚本里不复制文件而是生成一个包含文件名列表的txt文件。这种方式其实更推荐因为图片文件不用重复存储而且换模型框架时只需改一下路径格式。但Ultralytics官方更建议直接用目录结构所以我在数据集里保留的是目录方式。4. YOLO训练教程核心环节4.1 环境准备与依赖安装训练环境我推荐直接用ultralytics库这是目前最主流的YOLO训练工具支持YOLOv5、YOLOv8、YOLOv9、YOLOv10、YOLO11等多个版本。安装也很简单pip install ultralytics如果是GPU用户建议先确认CUDA版本再安装对应版本的PyTorch否则会出现torch.cuda.is_available()返回False的问题白白浪费时间。快速检测环境是否正常的命令python -c import torch; print(torch.__version__, torch.cuda.is_available())如果输出是True说明GPU环境可用可以直接开始训练如果是False要么是PyTorch版本和CUDA不匹配要么是机器上根本没有可用的显卡。我自己一般建议新手先装CPU版跑通整个流程再上GPU训练这样能减少变量排查问题更快。4.2 数据配置文件的编写使用ultralytics训练时数据配置文件是一个YAML文件里面定义了训练数据路径、验证数据路径和类别信息。这份数据集配套的yaml大体长这样path: /your/path/to/dataset train: images/train val: images/val test: images/test nc: 2 names: [fire, smoke]注意path是数据集的根目录train、val、test是相对路径不用写绝对路径前缀。names的顺序必须和txt标签里的class_id一一对应顺序错了模型学习的内容就完全乱了。类别数量nc和names列表长度保持一致这个不用我说大家也应该知道但实际项目中真有人填错过。4.3 训练参数选择与启动训练命令和参数是这份教程里最有价值的部分。以YOLOv8s为例启动训练yolo train datafire_data.yaml modelyolov8s.pt epochs100 imgsz640 batch16 device0几个关键参数的选择逻辑我展开说一下这对实际项目很重要model传coco预训练权重的路径比如yolov8n.pt、yolov8s.pt、yolov8m.pt。用coco预训练权重做初始化比从零训练收敛快得多精度也更高这是为什么热词里总有人问“coco预训练权重”的答案。epochs火焰检测任务一般100轮足够。如果你发现训练到50轮时验证集mAP还在明显上升可以适当延长到150轮如果损失早就平稳了继续训练反而会过拟合。batch显存是硬约束。8G显存建议batch816G显存可以batch16。如果batch太小比如2、4BatchNorm的统计量就不稳定训练容易震荡。实在想用大batch又显存不够可以开启梯度累积。imgsz输入图像尺寸。640是速度和精度的均衡点。如果你想追求更高精度可以试试960部署到边缘设备则建议用480或320推理速度会快不少。我在训练这套数据集时用的命令是yolo train datafire_data.yaml modelyolov8m.pt epochs120 imgsz640 batch16 device0用yolov8m而不是yolov8s是因为火灾检测项目对召回率要求较高稍微大一点的模型可以带来更好的特征表达。训练过程中你可以通过tensorboard查看loss曲线ultralytics会自动记录训练日志不需要额外配置。4.4 训练结果评估与模型导出训练完成后ultralytics会在runs/detect/train目录下生成一系列结果文件包括results.png损失曲线和mAP曲线汇总图、confusion_matrix.png混淆矩阵、val_batch*_pred.jpg验证集预测可视化以及weights/best.pt和weights/last.pt两个权重文件。看训练结果不要只看loss关键要看验证集上的mAP50和mAP50-95。火灾火焰检测场景下mAP50一般能做到0.85以上就算不错了因为火焰和烟雾的边界本身比较模糊框不可能标得特别精确。如果发现mAP50-95偏低可以尝试调高imgsz或者增加数据增强策略。模型导出用一行命令yolo export modelbest.pt formatonnx导出ONNX格式是为了方便部署后续可以继续转TensorRT或OpenVINO跑在GPU或CPU上。部署到边缘设备时我建议再做一次量化INT8量化之后模型体积和推理延迟都能大幅下降精度损失在可接受范围内。5. 常见问题与排查技巧实录5.1 loss不下降到底怎么排查很多朋友第一次训练时看到loss不降就直接慌了其实先冷静排查大部分问题都能定位。按优先级排序第一步确认标签解析正确。训练日志里如果显示instances数量不合理比如每张图的平均目标数量只有零点几那说明很多标签没被正确读取大概率是路径配错或者txt格式不对。第二步检查学习率和batch。默认学习率是0.01如果batch很小学习率需要相应调低。我之前用batch4训练时loss震荡得厉害把lr改成0.005后明显稳定。第三步看数据增强是否过强。ultralytics默认开启Mosaic、MixUp等增强策略如果数据本身就难识别增强过头会让loss下不去。可以通过关闭augment或降低增强强度来对比实验。我自己的经验是loss不降80%是数据问题只有20%是超参问题。建议先可视化几批训练数据确认标签框和目标内容对得上再去调参数。5.2 标签格式转换后训练报错的坑如果你拿到的不是这套三格式齐全的标签而是需要自己转换最容易遇到的报错是“标签越界”和“class id超出范围”。这两个问题的根源基本都在坐标变换没处理干净坐标在归一化时如果除以的宽高和实际图片不符数值就会超出0到1的范围。小目标经过四舍五入后中心点坐标可能变成0或1训练时Anchor匹配就会出问题。类别id如果从1开始编号而YOLO要求从0开始就会导致index越界。我建议用脚本做转换之后写几行代码快速核验import os label_dir labels/train img_sizes {(1280, 720): 0} # 实际项目中应从图片信息读取 for f in os.listdir(label_dir): with open(os.path.join(label_dir, f)) as fp: for line in fp: parts line.strip().split() cls int(parts[0]) vals list(map(float, parts[1:])) assert 0 cls 2, fclass id out of range: {f} assert all(0 v 1 for v in vals), fcoords out of range: {f}这个小脚本跑一遍大部分标签格式问题都能暴露出来。5.3 显存不足与训练速度优化显存不足是目标检测训练里最常遇到的硬件问题。遇到CUDA out of memory优先做以下调整降低batch size比如从16降到8。降低imgsz把640改成512。启用梯度累积让小的batch累积出大的有效batch size。关闭部分数据增强减少训练时的显存占用。ultralytics里梯度累积是在参数训练时自动支持的不用额外安装工具。比如batch8、nbs64时模型会累积8步再进行一次梯度更新等价于用batch64的效果但显存占用和batch8一样。训练速度方面如果你的GPU不太行建议在不影响精度的情况下用混合精度训练。ultralytics默认就开启了AMP无需额外设置。如果是CPU训练那基本只能佛系跑着玩了一个epoch可能要几十分钟建议直接租云GPU或者用免费的Colab环境跑通流程。6. 这个数据集的后续扩展思路最后再分享一点我的个人体会。数据集拿到手不要只当“一次性资源”它能扩展的地方其实不少。比如你可以把自己采集的厂区、园区监控截图补充进去每类补个几百张模型的场景适应能力会有明显提升。另外如果你之后想做火焰的实时检测可以试试将这套模型蒸馏到YOLOv5n或YOLO11n这种轻量级模型上精度损失不大但推理速度提升非常可观。我在实际项目中就遇到过一类问题模型在数据集上效果很好但部署到现场之后由于摄像头视角高、画面里火焰目标很小漏检率一下子高了很多。后来我的解决方法是把训练时imgsz调高到960同时额外采集了一批小目标样本加入训练集才把漏检问题压下来。这也是为什么我一再强调数据场景覆盖的重要性——模型的泛化能力基本取决于训练数据的多样性光靠调参是补不回来的。如果你在跑训练的时候遇到其他问题欢迎对照这份数据集的教程逐步排查。做目标检测就是这样前期数据处理越细致后期训练和部署就越省心。本文还有配套的精品资源点击获取