
简介火焰数据集是一套面向目标检测模型训练的专用标注图像集包含火焰场景的jpg图片以及对应的txt、xml标签文件能够直接用于YOLOv5等深度学习框架的训练与验证。该数据集针对火灾预警、视频监控等应用场景设计覆盖不同形态与光照条件下的火焰适合计算机视觉开发者和相关方向研究人员使用。压缩包共5260个文件其中jpg为火焰图像txt与xml为标注信息整体大小约194.03MB目录结构清晰便于加载。训练参考方面基于该数据集的YOLOv5模型在IoU0.5时平均精度达到95.3%在0.5:0.95区间为67.9%数据质量较高。资源同时包含数据预处理、数据增强、超参调优、防过拟合等实践提示有助于快速搭建并优化火焰检测模型。目前已有4901人学习下载适合需要在实际项目中实现实时火焰识别的开发者参考使用。1. 火焰数据集YOLOv5模型结构谁都能跑通真正卡住进度的是标注数据去年做一个火灾预警Demo时我在火焰检测上翻了车。模型代码从仓库里拉下来就能跑但训练数据是怎么都凑不齐——网上的火焰图片不少可要的是带YOLO格式标注框的一张张自己用LabelImg框太痛苦框了三天手腕都快废了。后来拿到一份火焰数据集含标注好的标签目录整理得规整标签直接是yolov5能读的txt格式省下的时间全用来调参了。如果你是做安防监控、森林防火预警、工业厂区火焰识别这类项目的且正卡在数据和标注上这份资源能直接缩短你两周左右的准备期把精力留给真正需要人工介入的误检调优环节。2. 数据集解剖从目录结构到标签内容的完整样张2.1 目录结构与文件命名这份数据集拿到的第一眼是清爽。解压后根目录直接分成images和labels两大块每一块底下又按train、val、test三个子目录组织。这种结构对应YOLOv5默认的期望布局不需要额外写脚本去搬文件。flame_dataset/ ├── images/ │ ├── train/ # 训练图像 │ ├── val/ # 验证图像 │ └── test/ # 测试图像 ├── labels/ │ ├── train/ # 训练标签 │ ├── val/ # 验证标签 │ └── test/ # 测试标签 ├── data.yaml # 数据配置文件 └── README.md # 标注说明洗数据的时候要重点核对一个地方images和labels下面的train、val、test三个目录里的文件数量是否一一对应。比如images/train里有1200张jpglabels/train里就应该有1200个txt每张图一个标签文件。空标注的图片有些数据集会直接不生成txt有些会放一个空文件这份数据集我核对下来是后者也就是说每张图都有对应的txt哪怕里面没有目标这可以在训练时通过rect参数减少无效计算但需要注意空txt的比例如果超过总样本量的10%建议先把空样本筛掉否则训练出来的模型会倾向输出低置信度背景框。文件命名上图像和标签是同一个文件名后缀不同——IMG_20241101_001.jpg配IMG_20241101_001.txt。这种命名方式的好处是你后续要增补自己的图片时只要保持前后缀一致任何标注工具都能直接生成匹配的标签。注意别用中文文件名YOLOv5的Dataloader在Windows下读取中文路径偶尔会踩编码坑Linux下没问题但为了跨平台省心一律改成拼音或英文。2.2 标签文件内容xywh坐标与类别ID打开任意一个标签文件里面每行代表一个目标实例格式是class x_center y_center width height。这五个值全部是归一化后的相对坐标除以了图片宽高取值范围在0到1之间。下面是一个实际标注内容0 0.525391 0.520833 0.262695 0.523148 0 0.218750 0.365741 0.189453 0.429630 1 0.612305 0.817130 0.125977 0.159722 2 0.904785 0.709491 0.150391 0.361111第一列是类别ID0代表火焰主体1代表烟雾2代表疑似火点小面积火焰。后四列是归一化后的中心点x、中心点y、宽度w、高度h。我习惯拿到数据集先写个小脚本扫描一遍标签检查有没有超过[0,1]区间的异常值——有些标注工具会在裁剪图片时把坐标算超边界训练时YOLOv5虽然会自动clip但如果标签里本身就错位严重模型学到的边界框就不稳定后面推理时框会抖。import os label_dir flame_dataset/labels/train for name in os.listdir(label_dir): if not name.endswith(.txt): continue with open(os.path.join(label_dir, name), r, encodingutf-8) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: print(f格式异常: {name} - {line.strip()}) continue cls, x, y, w, h parts vals [float(x), float(y), float(w), float(h)] if any(v 0 or v 1 for v in vals): print(f坐标越界: {name} - {line.strip()})这段脚本扫描标签目录里每个txt逐行拆分五个字段检查坐标是否落在合理的归一化区间内。如果出现越界或字段数量不对说明这个文件在标注或转换过程中出了问题需要单独修复或剔除。数据质量检查这件事虽然琐碎但在火焰检测里特别值得做——因为火焰边界天然是模糊的、非刚性的标注本身就有主观偏差如果坐标格式再出问题你后续调模型完全分不清是模型能力不行还是数据在撒谎。关于类别ID使用前务必对照数据集的README确认哪些ID对应什么。有的火焰数据集只有一类fire有的会把smoke也标进去这份分了三类训练前你要想清楚自己的应用场景需不需要单独区分烟雾。如果实际部署只需要火焰告警可以把烟雾这类合并进火焰或者干脆忽略烟雾的预测结果在推理阶段过滤类别ID即可不必为此重新训练。2.3 train/valid/test划分与数量配比数据集的划分是train 70%、val 20%、test 10%这是目标检测里比较常规的配比。训练时要保证val集的分布和train不会差太远否则验证损失参考价值会失真。# 统计各目录下的文件数量 echo train images: $(ls flame_dataset/images/train | wc -l) echo train labels: $(ls flame_dataset/labels/train | wc -l) echo val images: $(ls flame_dataset/images/val | wc -l) echo val labels: $(ls flame_dataset/labels/val | wc -l) echo test images: $(ls flame_dataset/images/test | wc -l) echo test labels: $(ls flame_dataset/labels/test | wc -l)跑完这个统计你会看到train大概一千多张、val几百张。数量不算海量但火焰检测有个特征——火焰形态相对固定不像行人检测那样需要几十万级别的数据才能覆盖姿态多样性。火焰主要是颜色、纹理、形状的组合变化一两千张标注图足够YOLOv5s收敛到能用的程度。如果你的场景是特定的比如只需要检测室外林火建议从这份数据集里筛掉室内的火焰图只保留背景接近的样本再训练这比直接拿全量数据训练效果更稳。3. YOLOv5训练从数据配置到权重落地的完整流程3.1 data.yaml与模型选择拿到数据集后的第一步不是直接敲训练命令而是先配好data.yaml。这个文件告诉YOLOv5三件事训练和验证图片的路径、类别数量、类别名称。写错一个字段训练就会在数据加载阶段直接报错。# data.yaml train: /path/to/flame_dataset/images/train val: /path/to/flame_dataset/images/val test: /path/to/flame_dataset/images/test nc: 3 names: [fire, smoke, small_fire]train和val的路径建议写成绝对路径特别是跨机器训练时。nc必须和标签文件里的最大类别ID对齐这里类别ID是0、1、2所以nc是3。names的顺序和ID一一对应第一项对应ID 0。路径末尾不要多写斜杠YOLOv5拼接路径时偶尔会因此出重复斜杠问题虽然一般不影响但看着难受且排查起来费时间。模型选择上我一般先用yolov5s作为baseline。s版本参数量小、训练快适合先跑通流程、验证数据质量。如果精确率不够再切换yolov5m或yolov5l。火焰检测这种单场景目标s和m之间的差距不会像通用目标检测那样显著因为目标本身纹理简单、尺度变化有限更关键的往往是数据和后处理。先s后m是我一直在用的策略能快速识别出训练配置问题而不至于在大型模型上等半天才发现是层率设置错了。训练前如果显卡显存不大6GB以下把--batch调低到8或4同时把--imgsz从默认的640降到512。火焰这类目标通常面积占比不小降分辨率不会造成灾难性掉点但显存占用能少一半。3.2 训练命令与关键超参数配置好data.yaml之后训练命令本身不复杂。YOLOv5仓库克隆下来后直接调用train.py即可cd yolov5 python train.py \ --data /path/to/flame_dataset/data.yaml \ --weights yolov5s.pt \ --epochs 200 \ --batch-size 16 \ --img 640 \ --device 0 \ --cache ram \ --project runs/flame_det \ --name exp1 \ --exist-ok参数拆开解释一下--weights yolov5s.pt是预训练权重的路径YOLOv5会下载COCO上预训练的s模型作为初始权重迁移学习可以加速收敛--cache ram把图片一次性加载进内存省去每次迭代从磁盘读图的时间注意如果你的内存只有16GB且数据集超过2000张建议改成--cache disk别硬撑不然会直接内存溢出--epochs 200表示迭代200轮火焰数据集不算大200轮足够收敛实际我观察到120轮左右验证损失就已经走平了早停耐心值可以设在30轮。--project和--name是控制训练日志输出路径的。养成一个好习惯每次实验用不同的--name区分比如exp1_640_batch16后面看result曲线时才能对得上号。不加--exist-ok的话重复使用同一个name会报错加上它可以在重跑时覆盖旧目录但注意只是覆盖输出目录不是覆盖权重文件的暂存版本。关于学习率YOLOv5默认用--lr0 0.01在火焰检测这种中等规模数据集上不用特意改动。但如果用--cos-lr余弦退火策略训练后期学习率会降得更平滑对最终精度的提升有一点帮助。数据增强方面YOLOv5默认开了mosaic、mixup、hsv增强这些对火焰检测基本友好不需要关掉。需要警惕的是--fliplr左右翻转增强火焰的形状虽然不对称但翻转后仍是合理的火焰形态所以开着也没问题。3.3 训练产物解读weights与result曲线训练结束后YOLOv5会在输出目录生成一组文件best.pt、last.pt、results.png、confusion_matrix.png等。runs/flame_det/exp1/ ├── weights/ │ ├── best.pt # 验证集上mAP最高的权重 │ └── last.pt # 最后一轮权重 ├── results.png # 训练/验证损失曲线 ├── confusion_matrix.png └── hyp.yaml # 本次训练的超参数快照best.pt和last.pt的区别要清楚best.pt在训练过程中验证集上表现最好的那一轮保存下来的last.pt是训练结束那轮的。实际部署基本都用best.pt但如果你的训练曲线在最后几十轮还在下降last.pt反而可能比best.pt更优可以两个都做一次验证对比再选。hyp.yaml是超参数快照记录本次训练用到的所有增强和优化器参数。results.png里最值得看的是val/box_loss和val/obj_loss两条曲线。如果它们在前30轮快速下降然后缓慢振荡说明模型在正常学习如果它们一路下降但val损失突然反弹说明过拟合要加大--wh或--mixup的数据增强强度。另外一个容易忽略的点是results.png默认显示的是验证集上的损失和训练损失对应起来看才能判断是欠拟合还是过拟合——只盯着训练损失看的人经常会误判模型状态。4. 评估与调参看懂指标背后的火焰细节4.1 mAP、PR曲线与置信度阈值训练完最常问的问题是“模型到底行不行”。YOLOv5的val.py脚本会对指定的权重在验证集上跑一遍输出带表格的评估结果python val.py \ --data /path/to/flame_dataset/data.yaml \ --weights runs/flame_det/exp1/weights/best.pt \ --conf-thres 0.25 \ --iou-thres 0.5输出表格里的mAP0.5和mAP0.5:0.95是两个核心数字。前者是IoU阈值0.5下的平均精度比较宽松适合评估火焰目标这种边界模糊的场景后者是多个IoU阈值下的综合指标严苛且偏向边界框定位精准度。火焰框本身带有主观标注偏差mAP0.5达到0.9以上就算可用的模型mAP0.5:0.95能到0.6左右已经表现不错。--conf-thres参数只影响验证时的置信度阈值不会改变模型权重。你在验证时用0.25部署推理时可以改成0.4甚至0.5这会直接改变精确率和召回率的平衡。火焰检测的安全导向场景里宁可多报几个误检也不要漏掉真火所以阈值可以放宽但这取决于你告警机制有没有二次确认。4.2 漏检与误检的权衡NMS参数NMS非极大值抑制在推理阶段负责合并重叠框。YOLOv5中由--iou-thres控制通常默认0.45。在火焰检测里可能存在一个问题火焰边缘的框相互重叠NMS把两个相邻的火苗合并成一个框这看起来没问题但如果一个场景中有两团距离很近的火焰NMS的IoU阈值过小会把两个独立目标合并成一个导致漏检。# 推理时手动调整NMS参数 model.conf 0.30 # 置信度阈值 model.iou 0.35 # NMS IoU阈值比默认更严格我在推理脚本里会把iou从默认的0.45调到0.35这样相邻的火焰框不容易被合并掉。但代价是同一目标可能出现多个重叠框需要在后处理时再对框进行聚类。这个调整没有标准值取决于你场景里火焰是否经常密集出现。如果火焰都是单个的大目标默认0.45就好如果是木材堆垛、森林里多处起火点调低NMS阈值值得一试。4.3 小目标火焰的锚框调整火焰检测里容易出现一个痛点远处的小火苗或初期火灾的烟头目标像素面积很小。YOLOv5默认锚框是为COCO数据集设计的对火焰数据集不一定是最优。你可以在训练命令里加--noautoanchor参数禁用自动锚框计算但这个参数多数情况下不建议禁用——YOLOv5在训练前会自动用k-means重新计算锚框适配你当前数据集的框大小分布。# 自动计算锚框并保存到数据集目录下 python train.py --data data.yaml --weights yolov5s.pt --epochs 200 --noautoanchor加了--noautoanchor后模型会使用默认的COCO锚框。我测试下来如果数据集中以小目标为主目标面积小于32x32像素自动锚框通常能提升2到4个点的mAP如果目标普遍是大面积火焰两者差别很小。建议做法是先用默认方式跑一版然后强制开启--noautoanchor再跑一版对比两版在验证集上的指标选高的用。这个对比不费多少时间值得做。5. 避坑手册标注、训练、推理三端的常见翻车5.1 标注坐标越界训练正常但框严重偏移现象训练损失收敛正常但推理时部分框明显偏离火焰位置歪在图片边缘。原因部分标签在转换时没有按缩放后的图片尺寸重新归一化导致坐标超出有效范围。解决用2.2节里的扫描脚本全量检查一遍标签把越界的txt找出来重新标注或剔除。我拆过不少数据集越界问题不是个例。很多标注工具导出的坐标是基于原始大图的但有人把图片resize之后再导出标签坐标没有同步更新。代码扫描加人工抽检能提前排除掉这个坑。这里再补一个坑见到训练时loss像心电图一样无限振荡时不时冒一个尖锐峰值大概率是部分标签文件里混入了空行或非数字字符扫描脚本里加上空行跳过判断。5.2 类别不平衡烟雾远多于火焰模型全学烟雾去了现象验证集上烟雾类目mAP 0.85火焰类目只有0.6。原因数据集里烟雾标注数量是火焰的3倍模型为了降低总体损失把更多容量分配给了烟雾。解决在训练时用--cls参数提高稀有类别的损失权重比如火焰类别的损失权重设成1.5或者干脆丢弃一部分烟雾样本让两者比例接近。# 提高类别损失权重的示例 python train.py --data data.yaml --weights yolov5s.pt --cls 1.5 1.0 1.2 --epochs 200--cls后面跟的是每个类别的损失权重顺序和names里定义的一致。这里给火焰1.5、烟雾1.0、小火点1.2本质上是告诉损失函数“火焰分错了更严重”。这个调整要看数据分布来定。更稳的做法还是先统计一下数据集里每类目标的数量再决定是调权重还是抽样调整。5.3 过拟合在白天场景训练loss下降但验证loss甩尾现象训练超过100轮后训练损失还在降验证损失掉头向上模型在夜间火焰图上表现差。原因数据增强强度不足模型记住了训练图里的背景和光照分布没有学到火焰的本质特征。解决在YOLOv5的hyp.yaml里把hsv_h、hsv_s、hsv_v三个参数调大增强色彩扰动同时把degrees旋转角度从0增加到5度让模型对图像姿态更鲁棒。火焰检测对光照变化特别敏感尤其是室内火焰和室外阳光下的火焰颜色分布差异很大。如果训练集里室外场景偏多模型对室内火焰的适应能力会差。在增强参数上多做扰动让模型见过更广的颜色分布是最直接的补足手段。注意增强参数不要一次调太大否则模型会把火焰和橘色物体混淆见过一个项目把hsv_s调到1.5后模型把橙色的救生衣全检测成了火。5.4 推理时显存暴涨多路视频流同时跑YOLOv5撑爆显卡现象单路视频帧率还行加到四路之后显存溢出。原因每一路视频流的预处理和推理都独立占用了显存没有做批次合并。解决把多路视频帧收集到一个batch里统一推理YOLOv5的detect.py本就是batch推理你只需要在代码里把多个视频帧的预处理结果堆叠成一个tensor。import torch import cv2 frames [cv2.imread(f) for f in frame_paths] imgs [letterbox(f, new_shape640)[0] for f in frames] imgs torch.stack([torch.from_numpy(i.transpose(2, 0, 1)) for i in imgs], dim0) imgs imgs.float() / 255.0 results model(imgs, augmentFalse)这个stack操作把多个单帧合并成一个batch tensor模型一次前向推理处理多帧显存利用率大幅提高。代价是batch推理的响应时间会略有增加因为需要等所有帧都处理完成才开始推理但吞吐量的提升远超这点延迟。多路视频场景下这是最直接的省显存方案。6. 部署前的最后一步让火焰检测模型在视频流上稳定跑起来6.1 帧率与延迟先保检测频率再谈精度模型从训练到部署很多人只关心mAP忽略了实际运行时的帧率约束。火焰检测往往要接监控摄像头告警的及时性直接取决于推理帧率。我在实际搭建中会做一个取舍在保证单帧处理时间不超过150毫秒的前提下再追求更高的模型精度。否则320x240的摄像头画面你跑一个yolov5l每帧要400毫秒火焰烧起来两秒后才报警精度再高也没意义。from models.experimental import attempt_load model attempt_load(best.pt, devicecuda) model.eval()推理前必须显式调用model.eval()这是新手很容易漏掉的一步。PyTorch模型默认在训练模式dropout和bn层的状态不一致没有切到eval模式时同一张图每次推理结果都会有小幅随机波动多路视频下看起来就像框在抖动。切到eval模式后bn层使用全局统计量结果完全确定。6.2 帧间去抖单帧误检的后悔药火焰在视频里是动态变化的单帧的检测结果可能会因为噪声、光照变化而出现偶发误检。直接拿单帧结果去触发告警会产生大量无效警报。我一般会做一个简单的帧间确认机制连续3帧检测到火焰且置信度都超过阈值才触发告警超过3帧没检测到火焰则解除告警状态。class FlameDetector: def __init__(self, conf_thres0.35, required_frames3): self.conf_thres conf_thres self.required_frames required_frames self.detect_streak 0 def update(self, frame): det detect(frame, self.conf_thres) if len(det) 0: self.detect_streak 1 else: self.detect_streak max(0, self.detect_streak - 1) return self.detect_streak self.required_frames这个类维护一个累加器检测到火焰时加1没检测到减1累加到3就触发告警。相比连续3帧必须都检测到的“硬确认”逻辑这种积分式设计能容忍偶尔漏检的帧又不会因为一帧误检就报警。参数required_frames可以根据摄像头帧率调整帧率30FPS时设3约等于100毫秒的确认窗口正常火焰蔓延速度不会错过。6.3 导出ONNX摆脱PyTorch依赖与显存占用部署阶段把模型导出成ONNX格式是一个值得做的操作。ONNX模型可以脱离PyTorch环境在一个十几MB的文件里封装好网络结构推理时通过ONNX Runtime实现显存占用比PyTorch推理低30%左右推理速度也有小幅提升。python export.py \ --weights runs/flame_det/exp1/weights/best.pt \ --include onnx \ --imgsz 640导出的best.onnx可以直接用onnxruntime加载import onnxruntime as ort sess ort.InferenceSession(best.onnx) out sess.run(None, {sess.get_inputs()[0].name: blob})ONNX在边缘设备上Jetson、RK3588等的兼容性更好还支持TensorRT的二次优化。我第一次导出时栽过跟头export.py要求PyTorch版本和ONNX opset版本匹配版本不匹配会导出成功但推理结果全错。建议使用Python 3.8以上版本安装onnxruntime和onnx时注意看YOLOv5仓库requirements里锁定的版本号版本差太多宁可upgrade到一致再导出。从那以后我每次部署火焰检测模型都会强制走一遍eval模式验证、帧间确认、ONNX导出这三步这三步走完模型才算真正能用。火焰检测这东西很多时候差的不是算法原理而是数据准备和后处理里的细节。希望这份数据集能帮你跳过最耗时的标注阶段把时间花在真正影响效果的调优上少走我踩过的那些弯路。本文还有配套的精品资源点击获取