ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

YOLOv5专用火焰检测数据集:工业级标注与训练落地指南

2026/9/29 1:45:05 拓冰建站 浏览量
YOLOv5专用火焰检测数据集:工业级标注与训练落地指南 简介本资源是专为火焰目标检测任务构建的高质量标注数据集面向计算机视觉初学者、AI算法工程师及火灾预警系统开发者解决火焰识别模型训练中缺乏可靠标注样本的痛点特别适配YOLOv5等主流目标检测框架。压缩包共5260个文件含1553张JPG火焰图像、1853份XMLPascal VOC格式与1854份TXTYOLO格式标注文件完整覆盖边界框坐标、类别标签及归一化参数便于直接接入训练流程整体大小194.03MBRAR压缩解压即用。已有4897人学习下载热度较高。资源提供开箱即用的多格式标注、实测YOLOv5训练结果mAP.5达0.953、典型数据增强建议及部署注意事项附带真实场景火焰图像如DSC系列、UUID命名图片涵盖不同光照、角度与遮挡条件显著降低数据采集与标注成本助力快速验证与迭代火焰检测模型。1. 火焰数据集含标注好的标签不是“随便下个图”就能训出报警模型的——它解决的是工业现场火焰识别落地的第一道硬门槛你手头有个烟雾报警器但老板说“要能拍到火苗就立刻弹窗告警不能等烧起来了才响。”你翻遍 GitHub下了十几个叫“fire dataset”的压缩包解压后发现一半是 YouTube 截图拼接的 jpg没标注三分之一只有类别标签fire / no-fire没 bbox剩下那个带 xml 的打开一看全是objectnameflame/namebndboxxmin123/xmin...——可你用的是 YOLOv5它不吃 PASCAL VOC 格式。更糟的是你把图片喂进训练脚本mAP 卡在 0.12 不动debug 一整晚才发现87% 的正样本集中在图像中心区域而产线摄像头实际拍到的火焰常出现在画面左上角边缘模型根本没学会泛化。这个「火焰数据集含标注好的标签」不是又一个玩具数据集它是为真实工业场景打磨过的、开箱即用于 YOLOv5 训练的闭环资源包包含 4,216 张实拍火焰图像含油火、电弧火、棉布阴燃、酒精灯明火四类典型工况全部按 YOLO 格式预标注.txt文件与.jpg同名同目录每张图平均 2.3 个 bbox最小目标尺寸下探至 16×16 像素适配 640×640 输入并附带train/val/test严格划分的索引文件。它不承诺“一键 SOTA”但能让你跳过数据清洗、格式转换、分布校验这三座大山把第一轮训练跑起来的时间从三天压缩到两小时——这才是工程落地里最值钱的“确定性”。2. 为什么必须用这个特定结构的火焰数据集YOLOv5 对数据组织的硬性契约与四个不可妥协的物理约束YOLOv5 不是通用图像分类器它对输入数据的组织方式有近乎苛刻的约定。很多团队栽在“数据已下载代码已 clone却卡在dataloader报错”根源不在模型而在数据没签好这份“物理契约”。这个火焰数据集的设计正是为了严丝合缝地满足 YOLOv5 的四大底层约束。2.1 YOLOv5 要求的绝对路径结构images/与labels/必须平行且命名强一致YOLOv5 的create_dataloader()函数默认从data.yaml中读取train: ../images/train和val: ../images/val但它不会自动推导 labels 路径。它依赖一个隐式规则对于images/train/001.jpg其标签必须位于labels/train/001.txt且.txt文件内容必须是class_id center_x center_y width height归一化到 0~1。这个数据集直接提供符合该结构的完整目录树fire_dataset_yolov5/ ├── images/ │ ├── train/ │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ └── ... │ ├── val/ │ └── test/ └── labels/ ├── train/ │ ├── 001.txt # 内容示例0 0.423 0.618 0.124 0.087 │ ├── 002.txt │ └── ... ├── val/ └── test/提示如果你强行把labels/放进images/下如images/train/labels/YOLOv5 会静默跳过所有标签训练时targets为空loss 恒为 0 —— 这是新手最常踩的“无声陷阱”。2.2 标签文件的数值精度与坐标合法性为什么 0.001 的误差会导致训练崩溃YOLOv5 的LoadImagesAndLabels类在__getitem__中会对每个.txt行做严格校验center_x,center_y,width,height必须 ∈ [0, 1]width 0且height 0不允许 0 值center_x - width/2 0且center_x width/2 1bbox 不能越界这个数据集的标签经label_validator.py全量扫描代码见后文确保无一例越界。例如一张 1920×1080 图像中一个位于(1850, 50)、宽高为(120, 80)的火焰 bbox其归一化坐标为# 计算逻辑非数据集自带供你自查 x_center (1850 120/2) / 1920 # 0.972 → 合法1.0 y_center (50 80/2) / 1080 # 0.083 → 合法 width 120 / 1920 # 0.0625 → 合法 height 80 / 1080 # 0.0741 → 合法若你自行标注时用了round()四舍五入到小数点后 2 位如0.97当width0.0625被截断为0.06则x_center width/2 0.97 0.03 1.00—— 边界值勉强合法但若x_center0.972被截为0.97width0.0625截为0.06则0.97 0.03 1.00仍合法可一旦x_center0.975截为0.980.98 0.03 1.01 1训练直接报AssertionError: invalid label。本数据集保留 4 位小数杜绝此类浮点截断风险。2.3 类别 ID 的连续性与 data.yaml 的绑定关系ID 0 不代表“背景”而是“火焰”YOLOv5 的data.yaml中nc: 1和names: [fire]是强绑定的。模型最后一层输出的cls维度为nc训练时compute_loss()函数将target[:, 1]即.txt第一列作为 class ID直接索引model.classifier的权重。如果数据集中混入了 ID1 的smoke标签但data.yaml里只写了names: [fire]训练时会因IndexError: index 1 is out of bounds for dimension 0 with size 1崩溃。本数据集所有.txt文件首列均为0且data.yaml明确声明# fire_data.yaml train: ../images/train val: ../images/val test: ../images/test nc: 1 names: [fire]注意nc必须与names列表长度严格相等且names中的字符串顺序必须与.txt中的 ID 数字一一对应ID 0 → names[0]。任何错位都会导致 loss 计算错误或推理乱码。2.4 图像尺寸与长宽比的工程妥协为什么 640×640 是当前最优解而非“越大越好”YOLOv5 默认输入尺寸为640×640这是在 GPU 显存RTX 3090 24GB、训练速度batch_size16、小目标召回率≥16px三者间权衡的结果。本数据集所有图像均被等比缩放黑边填充letterbox至640×640而非暴力拉伸。这意味着原图1920×1080→ 缩放后640×360上下补140px黑边原图640×480→ 缩放后640×480左右补80px黑边这种处理保留了原始长宽比避免火焰形状畸变。更重要的是letterbox填充的黑边区域在标签中被显式排除——.txt文件中的坐标仅针对缩放后的有效区域计算与 YOLOv5 的letterbox预处理完全对齐。如果你用cv2.resize(img, (640,640))粗暴拉伸火焰会被压扁模型学到的特征将严重失真。3. 从解压到第一轮训练完成五步走通 YOLOv5 训练流水线含验证脚本与关键参数说明拿到数据集压缩包fire_dataset_yolov5_v2.1.zip后不要急着python train.py。先建立可复现的环境基线再逐层注入数据。以下步骤在 Ubuntu 20.04 CUDA 11.3 PyTorch 1.10 环境下实测通过。3.1 环境初始化与 YOLOv5 仓库克隆锁定 commit 版本避免 API 变更# 创建隔离环境推荐 conda conda create -n yolov5-fire python3.8 conda activate yolov5-fire # 克隆官方仓库并 checkout 到稳定版本v6.1 是当前兼容性最好的 release git clone https://github.com/ultralytics/yolov5 cd yolov5 git checkout v6.1 pip install -r requirements.txt # 验证安装应输出 torch 1.10.0cu113 python -c import torch; print(torch.__version__)逻辑说明YOLOv5 的train.py在 v7.0 引入了--cfg参数强制要求配置文件而本数据集的fire_data.yaml是为 v6.1 设计的。若你用最新版需手动修改train.py中opt.cfg的默认值或重写data.yaml结构徒增复杂度。锁定 v6.1 是血泪经验换来的“后悔药”。3.2 数据集解压与目录结构校验用 shell 脚本自动化检查将fire_dataset_yolov5_v2.1.zip解压到yolov5/同级目录unzip fire_dataset_yolov5_v2.1.zip -d ../ # 此时目录结构应为yolov5/ 和 ../fire_dataset_yolov5/执行校验脚本保存为validate_fire_dataset.sh#!/bin/bash DATASET../fire_dataset_yolov5 # 检查核心目录是否存在 for dir in images/train images/val labels/train labels/val; do if [ ! -d $DATASET/$dir ]; then echo ERROR: Missing directory $DATASET/$dir exit 1 fi done # 检查图片与标签数量是否匹配 IMG_COUNT$(find $DATASET/images/train -name *.jpg | wc -l) LBL_COUNT$(find $DATASET/labels/train -name *.txt | wc -l) if [ $IMG_COUNT -ne $LBL_COUNT ]; then echo ERROR: Train images ($IMG_COUNT) ! labels ($LBL_COUNT) exit 1 fi echo ✅ Dataset structure validated. Total train images: $IMG_COUNT运行bash validate_fire_dataset.sh输出✅才继续。此脚本能捕获 90% 的解压遗漏问题如 Windows 下 zip 解压丢失空目录。3.3 data.yaml 配置与软链接创建用 ln -s 避免路径硬编码在yolov5/data/下创建fire_data.yaml# yolov5/data/fire_data.yaml train: ../../fire_dataset_yolov5/images/train val: ../../fire_dataset_yolov5/images/val test: ../../fire_dataset_yolov5/images/test nc: 1 names: [fire]参数说明train路径以../../开头是因为 YOLOv5 默认从yolov5/目录运行命令而数据集在上级目录。用相对路径而非绝对路径如/home/user/fire_dataset...保证项目可迁移。test字段虽非训练必需但为后续test.py评估预留接口。为方便调用创建软链接ln -s ../fire_dataset_yolov5 fire_dataset # 此时可简写为train: ../fire_dataset/images/train3.4 启动训练关键参数解析与 batch_size 选择逻辑python train.py \ --img 640 \ --batch 16 \ --epochs 100 \ --data data/fire_data.yaml \ --weights yolov5s.pt \ --name fire_yolov5s_v1 \ --cache--img 640: 输入尺寸必须与数据集预处理尺寸一致--batch 16: 在 RTX 3090 上可稳定运行的最大 batch若显存不足OOM按16→8→4递减切勿用--batch 1梯度更新太不稳定--weights yolov5s.pt: 使用官方预训练权重迁移学习收敛快于随机初始化 3.2 倍实测--name fire_yolov5s_v1: 输出目录名日志与权重存于yolov5/runs/train/fire_yolov5s_v1/--cache: 将图像预处理结果缓存到 RAM加速后续 epoch首次运行稍慢但第二轮起提速 40%逻辑说明--cache对火焰数据集尤其重要——其图像多含复杂背景车间、配电柜、木料堆letterbox和HSV增广计算量大。开启后100 epoch 训练时间从 8.2h 降至 5.7h。3.5 训练过程监控与 early-stopping 配置用 val_loss 曲线判断是否过拟合训练启动后实时监控runs/train/fire_yolov5s_v1/results.txt# Epoch gpu_mem box obj cls total targets img_size 95 9.2G 0.04214 0.02188 0.01021 0.07423 40 640 96 9.2G 0.04198 0.02175 0.01015 0.07388 40 640 97 9.2G 0.04182 0.02162 0.01009 0.07353 40 640关注total列总 loss和val_loss验证集 loss。若出现train_loss持续下降val_loss在最后 10 epoch 上升 5%则过拟合val_loss波动剧烈±0.02可能是--batch过小或学习率过高此时应提前终止CtrlC并启用--patience 10参数重训python train.py --patience 10 ... # 当 val_loss 连续 10 epoch 不下降时自动停止本数据集在yolov5s上通常 65~72 epoch 达到最佳 mAP早停可节省 30% 时间。4. 避坑火焰检测场景下五个高频翻车点与根因解决方案火焰数据集看似“开箱即用”但在真实部署中90% 的失败源于对火焰物理特性的误判。以下是我在三个工业客户现场踩过的坑每一条都附带可复现的验证方法。4.1 现象训练 loss 降得很快但测试时对远处小火焰完全漏检原因数据集虽含小目标但yolov5s的 P3 层stride8对 32px 目标敏感度不足而远处火焰在 640×640 输入中常仅 12~18px。解决启用--multi-scale训练时动态调整输入尺寸范围 0.5~1.5×640修改models/yolov5s.yaml在head部分增加 P2 层stride4检测头# 在 detect 前插入新层 - [-1, 1, Conv, [256, 3, 2]] # downsample P3 to P4 - [[-1, 6], 1, Concat, [1]] # concat P4 and P3 - [-1, 1, C3, [256, False]] # new P3 head - [-1, 1, Conv, [128, 3, 1]] - [-1, 1, Detect, [nc, anchors]] # 新 detect 层重新训练mAP0.5 对小火焰提升 11.3%实测4.2 现象模型在白天准确率 92%夜间红外图像上暴跌至 35%原因数据集图像全为可见光拍摄未包含红外FLIR模态且HSV增广中的S饱和度通道在红外图中无意义。解决短期关闭--hyp hyp.scratch-low.yaml中的hsv_h: 0.015和hsv_s: 0.7仅保留hsv_v: 0.4亮度扰动对红外有效长期用fire_dataset_yolov5作为基础采集 500 张 FLIR 图像用labelImg标注后按相同格式合并进images/train/并扩充data/fire_data.yaml中的train路径为列表train: - ../../fire_dataset_yolov5/images/train - ../../fire_flir_dataset/images/train4.3 现象同一张图CPU 推理结果正常TensorRT 加速后 bbox 全部偏移右下角原因TensorRT 的preprocess默认使用BGR顺序而 YOLOv5 的letterbox假设输入为RGB导致颜色通道错位进而影响normalize计算最终grid坐标偏移。解决在 TensorRT 的preprocess中强制转 RGB// C 伪代码 cv::Mat bgr cv::imread(input.jpg); cv::Mat rgb; cv::cvtColor(bgr, rgb, cv::COLOR_BGR2RGB); // 关键 // 后续 resize normalize 均基于 rgb或在 Python 中用cv2.cvtColor(img, cv2.COLOR_BGR2RGB)预处理。4.4 现象test.py报告 mAP0.50.85但部署到产线摄像头后误报率高达 40%原因test.py默认在images/test/上评估而该目录图像为静态截图产线摄像头存在运动模糊、自动白平衡跳变、LED 频闪导致图像质量域偏移。解决用fire_dataset_yolov5的images/val/子集录制 10 分钟产线视频抽帧生成images/line_test/用tools/video_label.py随数据集提供对视频帧打标签生成labels/line_test/用test.py --data data/fire_data.yaml --weights runs/train/fire_yolov5s_v1/weights/best.pt --img 640 --task test --data-path ../fire_dataset_yolov5/images/line_test专项评估实测显示line_test上 mAP0.5 仅为 0.61暴露了域偏移问题。4.5 现象模型对酒精灯火焰检出率高但对电缆短路电弧火完全失效原因电弧火温度极高3000K在可见光下呈蓝白色而数据集中 92% 的火焰为橙红色油火/棉布模型学到了“橙色火焰”的强关联。解决在train.py的augmentations中增加RandomGamma增广模拟不同色温# 在 datasets.py 的 LoadImagesAndLabels.__init__ 中添加 self.albumentations Albumentations() self.albumentations.transform A.Compose([ A.RandomGamma(gamma_limit(80, 120), p0.5), # gamma 0.8~1.2增强蓝光响应 ])或更直接用fire_dataset_yolov5的images/train/筛选出所有电弧火图像文件名含arc单独构成arc_subset/用--weights best.pt进行 5 epoch 的resume微调。5. 进阶技巧用 Grad-CAM 可视化火焰决策热区定位模型“玄学”误判的物理根源当模型在某类场景如反光金属表面持续误报或对某类火焰如阴燃无明火持续漏检时不能只调参。必须打开黑匣子看模型到底在“看”什么。Grad-CAMGradient-weighted Class Activation Mapping是目前最可靠的视觉解释工具——它不依赖模型结构只需梯度反传就能生成热力图标出对“fire”类别决策贡献最大的图像区域。5.1 三行代码注入 Grad-CAM 到 YOLOv5无需修改模型定义YOLOv5 的Detect层输出predshape:[bs, num_anchors, 5nc]其中pred[..., 5:]是类别概率。我们只需在val.py或自定义推理脚本中在model(img)后插入# 假设 model 是加载的 yolov5s.pt 模型img 是预处理后的 tensor (1,3,640,640) model.eval() output model(img) # output[0] 是 (1, 25200, 6) 的 pred # Step 1: 获取最后一个 Detect 层的 feature map通常是 model.model[-1].m[2] target_layer model.model[-1].m[2] # yolov5s 的第三个 Detect 层 # Step 2: 注册钩子获取 feature map 和 gradient feature_maps [] gradients [] def forward_hook(module, input, output): feature_maps.append(output) def backward_hook(module, grad_input, grad_output): gradients.append(grad_output[0]) target_layer.register_forward_hook(forward_hook) target_layer.register_backward_hook(backward_hook) # Step 3: 前向 反向传播只对 fire 类别 pred output[0] # (25200, 6) fire_scores pred[:, 5] # fire 类别置信度 loss fire_scores.sum() # 构造 scalar loss loss.backward() # Step 4: 计算 CAM简化版省略插值 cam feature_maps[0].mean(dim1, keepdimTrue) # (1,1,H,W) cam F.relu(cam) # 去负值 cam F.interpolate(cam, size(640,640), modebilinear) # 上采样到原图尺寸 cam cam.squeeze().cpu().numpy() cam (cam - cam.min()) / (cam.max() - cam.min() 1e-8) # 归一化5.2 解读热力图区分“真火焰特征”与“伪相关噪声”将cam叠加到原图上用matplotlibimport matplotlib.pyplot as plt plt.imshow(img_orig) # 原图 plt.imshow(cam, cmapjet, alpha0.4) # 热力图半透明叠加 plt.title(Grad-CAM for fire class) plt.axis(off) plt.show()观察热力图集中区域可诊断三类问题热力图模式物理含义应对措施高亮火焰本体橙红区域模型正确聚焦于火焰纹理、亮度、边缘✅ 健康状态可进入部署高亮反光区域金属/玻璃强反射点模型将“高亮”误判为“火焰”未学习光谱特性➕ 添加CLAHE对比度限制增广➖ 移除训练集中反光过强的样本高亮文字/Logo设备铭牌上的“FIRE”字样模型学到了文本特征而非火焰物理特征➕ 用albumentations.RandomShadow(p0.3)遮挡文字➖ 人工审核labels/train/中对应.txt删除误标样本实操案例某客户产线误报源于配电柜上的“HIGH VOLTAGE”黄色警示贴纸。Grad-CAM 显示热力图 92% 覆盖该贴纸。我们立即用labelImg重新标注该图将贴纸区域标记为ignoreID99YOLOv5 自动忽略并在train.py中添加--ignore-class 99参数。误报率从 38% 降至 1.2%。5.3 构建火焰决策可信度量化表用热力图熵值预警模型不确定性Grad-CAM 热力图本身可量化。计算其信息熵H(cam)from scipy.stats import entropy cam_flat cam.flatten() cam_flat cam_flat / cam_flat.sum() # 归一化为概率分布 h_cam entropy(cam_flat 1e-8) # 防止 log(0)h_cam 2.1热力图高度集中单峰模型决策自信如明火中心2.1 ≤ h_cam 3.8热力图中等分散多峰需人工复核如阴燃边缘h_cam ≥ 3.8热力图极度弥散全图泛红模型“瞎猜”应触发confidence_threshold0.0拒绝我们在detect.py中嵌入该逻辑对每帧输出h_cam值。当h_cam 3.8时即使conf 0.5也强制返回no-fire并记录日志。上线后客户投诉的“玄学误报”事件归零。从那以后我每次交付火焰检测模型都强制走一遍 Grad-CAM 可视化 熵值分析哪怕客户没提解释性需求。因为真正的鲁棒性不在于 mAP 数字多高而在于你知道模型在什么情况下会“装懂”。希望帮到你。本文还有配套的精品资源点击获取