ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

森林火灾检测数据集实战:362张VOC+YOLO双格式,从零跑通yolov8训练

森林火灾检测数据集实战:362张VOC+YOLO双格式,从零跑通yolov8训练 简介本资源为森林火灾检测数据集面向从事目标检测算法训练与验证的开发者、学生及科研人员可用于火灾场景下的火焰识别模型训练与效果评估。数据集采用Pascal VOC与YOLO双格式标注包含jpg图片及对应的xml、txt标注文件标注类别为fire共1929个矩形框使用labelImg工具完成标注标注准确合理。压缩包共1088个文件其中362张jpg图片、362个xml文件、364个txt文件包体约37.17MB目录结构清晰便于直接接入主流检测框架。目前已有817人学习下载适合需要快速获取火灾检测训练样本、验证模型性能或开展相关课程实验的读者使用。需注意本数据集不对训练所得模型或权重文件的精度作任何保证仅提供标注数据本身。1. 森林火灾检测数据集362 张 VOCYOLO 双格式小样本检测到底能不能打森林火灾检测这个方向真正卡住大多数人的从来不是模型结构而是数据。你搜遍全网能找到的公开火焰数据集要么是几千张的大合集、标注质量参差要么是纯图片没有标注、拿到手还得自己画框。这份 362 张、1 类别、VOC 与 YOLO 双格式的森林火灾检测数据集定位很明确它不是用来刷 SOTA 的而是给做课程设计、快速验证检测流程、跑通 yolov8训练自己的数据集 全链路的人一个干净起点。362 张听起来少但森林火灾这个场景本身类别单一就一个 fire 类标注一致性反而比多类别数据集好控制。适合谁适合手上有 yolov5训练自己的数据集 或 yolov8 训练需求、想先跑通「数据加载→训练→推理→看混淆矩阵」闭环的人也适合拿它做数据增强策略对比实验。不适合指望靠它训出工业级火灾预警模型的人——样本量和场景覆盖度决定了它的天花板。2. VOC 与 YOLO 双格式拆解目录结构、标注差异与选型理由2.1 两种格式到底差在哪为什么值得同时保留VOC 格式和 YOLO 格式的核心差异在标注文件的组织方式和坐标表达。VOC 用独立的 XML 文件描述每张图的标注坐标是绝对像素值xmin、ymin、xmax、ymax一个目标一个object节点YOLO 用与图片同名的 txt 文件每行一个目标格式是class_id x_center y_center width height全部归一化到 0~1 之间。这两种格式没有谁更高级只有场景适配问题。VOC 的优势在于可读性强、工具链成熟。LabelImg 默认就导出 VOC很多老一代检测框架比如早期版本的 MMDetection、部分 TensorFlow 检测 API直接吃 VOC。你想手动检查标注对不对打开 XML 一眼就能看出框的绝对位置是否合理。YOLO 格式的优势在于训练时读取效率高、解析逻辑简单Ultralytics 系的 yolov5、yolov8、yolo11 全部默认吃 YOLO 格式不需要额外转换脚本。而且归一化坐标在图像缩放、马赛克增强时不需要反复换算减少出错概率。这份数据集同时给两套格式实际价值在于你可以用 VOC 做标注复核和可视化验证用 YOLO 直接喂训练。常见做法是先用 VOC 的 XML 跑一遍可视化脚本把框画到原图上肉眼过一遍确认没有漏标、错标再转成 YOLO 格式进训练。如果只给 YOLO 格式归一化坐标肉眼很难判断对错如果只给 VOC训练前还得自己写转换脚本多一道工序就多一个翻车点。2.2 目录结构与文件对应关系拿到压缩包解压后典型目录结构是这样的不同打包方式可能略有差异以实际为准forest_fire_dataset/ ├── JPEGImages/ # 原始图片362 张 │ ├── fire_0001.jpg │ ├── fire_0002.jpg │ └── ... ├── Annotations/ # VOC 格式 XML 标注 │ ├── fire_0001.xml │ ├── fire_0002.xml │ └── ... ├── labels/ # YOLO 格式 txt 标注 │ ├── fire_0001.txt │ ├── fire_0002.txt │ └── ... ├── ImageSets/ │ └── Main/ │ ├── train.txt # 训练集图片名列表 │ ├── val.txt # 验证集图片名列表 │ └── trainval.txt # 全部图片名列表 └── classes.txt # 类别名只有一行fire关键对应关系JPEGImages/fire_0001.jpg对应Annotations/fire_0001.xml和labels/fire_0001.txt。三个文件的文件名主干必须一致这是后续训练能正确匹配图片和标注的前提。ImageSets/Main/下的 txt 文件只存文件名不带扩展名每行一个用来划分训练验证集。注意有些打包版本可能没有预划分 train/val需要自己按 8:2 或 7:3 切分。切分时注意同一场景的连续帧不要跨集否则验证集精度会虚高。2.3 标注格式验证用脚本确认 XML 和 txt 是否对齐在进训练之前我一般会跑一个对齐检查脚本确认每张图都有对应的 XML 和 txt且标注数量一致。这个步骤能提前暴露文件缺失、命名不一致、标注漏转等问题。import os import xml.etree.ElementTree as ET img_dir forest_fire_dataset/JPEGImages xml_dir forest_fire_dataset/Annotations txt_dir forest_fire_dataset/labels img_names set(os.path.splitext(f)[0] for f in os.listdir(img_dir) if f.endswith(.jpg)) xml_names set(os.path.splitext(f)[0] for f in os.listdir(xml_dir) if f.endswith(.xml)) txt_names set(os.path.splitext(f)[0] for f in os.listdir(txt_dir) if f.endswith(.txt)) print(f图片数: {len(img_names)}, XML数: {len(xml_names)}, TXT数: {len(txt_names)}) print(f缺XML的图片: {img_names - xml_names}) print(f缺TXT的图片: {img_names - txt_names}) print(f多余XML: {xml_names - img_names}) print(f多余TXT: {txt_names - img_names}) # 逐张比对标注目标数量 mismatch [] for name in sorted(img_names xml_names txt_names): tree ET.parse(os.path.join(xml_dir, name .xml)) xml_objs len(tree.getroot().findall(object)) with open(os.path.join(txt_dir, name .txt)) as f: txt_lines len([l for l in f.readlines() if l.strip()]) if xml_objs ! txt_lines: mismatch.append((name, xml_objs, txt_lines)) print(f标注数量不一致的图片: {mismatch[:10]}) # 只打印前10条逻辑说明先做集合差集运算快速定位文件层面的缺失或多余。然后逐张解析 XML 统计object节点数同时统计对应 txt 的非空行数两者不一致就记录下来。参数方面img_dir、xml_dir、txt_dir按实际解压路径改。如果输出里mismatch为空、差集也为空说明数据完整性没问题可以进下一步。3. 从零跑通 yolov8 训练环境配置、数据 YAML 与训练参数3.1 Anaconda 环境配置与 ultralytics 安装yolo环境配置 是新手翻车最集中的环节。我一般用 Anaconda 建独立环境避免和系统 Python 打架。yolov8 对 PyTorch 版本有要求截至我写这篇时的稳定组合是 Python 3.10 PyTorch 2.1 CUDA 11.8 或 12.1。如果你没有 NVIDIA 显卡CPU 也能跑但 362 张图训练时间会从几分钟拉到几十分钟。conda create -n fire_yolo python3.10 -y conda activate fire_yolo # 安装 PyTorch按你的 CUDA 版本选对应命令 # CUDA 11.8 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 如果只有 CPU # pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu # 安装 ultralytics pip install ultralytics # 验证 yolo checksyolo checks会输出环境概览重点看三行Python 版本、PyTorch 版本、CUDA 是否可用。如果 CUDA 显示不可用但你确实有显卡大概率是 PyTorch 版本和驱动不匹配重装对应 CUDA 版本的 torch 即可。这一步没有玄学就是版本对齐问题。3.2 数据集 YAML 配置与路径写法ultralytics 系训练不直接读 VOC需要把数据集组织成它认识的 YOLO 目录结构然后写一个 YAML 描述文件。假设你把数据整理成如下结构fire_dataset/ ├── images/ │ ├── train/ # 训练图片 │ └── val/ # 验证图片 ├── labels/ │ ├── train/ # 训练标注 txt │ └── val/ # 验证标注 txt └── fire.yamlfire.yaml内容path: /absolute/path/to/fire_dataset # 数据集根目录建议写绝对路径 train: images/train # 相对 path 的训练图片目录 val: images/val # 相对 path 的验证图片目录 nc: 1 # 类别数本数据集只有 fire 一类 names: 0: fire # 类别名索引从 0 开始参数说明path写绝对路径最稳相对路径在不同工作目录下启动训练容易找不到文件。nc必须和names的条目数一致写错了训练时分类头维度不对报错信息不一定直观。names的 key 从 0 开始和 txt 标注里的class_id对应。本数据集只有 fire 一类所以nc: 1、names: {0: fire}。注意如果你的 YOLO txt 标注里 class_id 不是 0 而是 1训练时会被当成第二类导致类别数对不上。转换脚本里要确认从 0 开始编号。3.3 启动训练与关键参数解读数据 YAML 写好、目录整理好之后训练命令就一行yolo detect train \ data/absolute/path/to/fire_dataset/fire.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/fire \ nameexp1逐参数说明modelyolov8n.pt用 nano 版预训练权重362 张图这个量级用 n 版足够用 l 版反而容易过拟合。epochs100配合patience20意思是 20 轮验证指标不提升就早停避免无效训练。imgsz640是输入分辨率森林火灾图片如果原图分辨率很高可以试 640 或 512显存不够就降 batch。batch16在 8GB 显存上跑 640 分辨率基本安全显存小就降到 8 或 4。lr00.01是初始学习率小数据集不建议设太大0.01 是 ultralytics 默认值通常够用。训练启动后重点看输出里的mAP50和mAP50-95。362 张图、单类别如果标注质量过关mAP50 跑到 0.8 以上是正常预期。如果训练 loss 一直不降先回去查标注格式如果验证 mAP 远低于训练 mAP说明过拟合减少 epochs 或加数据增强。3.4 推理验证与置信度门限调整训练完拿验证集或新图跑推理yolo detect predict \ modelruns/fire/exp1/weights/best.pt \ source/path/to/test_images \ conf0.25 \ saveTrueconf0.25是置信度门限低于这个值的检测框不输出。森林火灾场景下漏检比误检代价大我一般会把 conf 调到 0.15~0.2 先看召回再根据误检情况往上收。如果发现大量误检把夕阳、灯光当成火把 conf 提到 0.4 以上同时考虑补充负样本。yolo 检测 调整置信度门限 这个操作没有固定最优值取决于你的应用对漏检和误检的容忍度。4. 避坑与排查小样本森林火灾数据集训练的五个血泪坑4.1 训练 loss 为 nan 或不下降现象启动训练后 box_loss 或 cls_loss 显示 nan或者连续几十轮几乎不变。原因通常有三个标注文件里有坐标越界归一化后超出 0~1、图片路径有中文或空格导致读取异常、学习率设得过大。解决先跑 2.3 节的对齐脚本确认标注完整性再用脚本检查 txt 里每行坐标是否都在 0~1 之间有越界的直接修正或剔除。路径问题就把数据集挪到纯英文无空格目录下。学习率从 0.01 降到 0.001 试一轮。4.2 验证集 mAP 虚高但实际推理效果差现象训练日志里 mAP50 到 0.95但拿新图推理时漏检严重。原因训练集和验证集划分时同一场景的连续帧被分到了两边验证集图片和训练集高度相似指标虚高。解决重新划分数据集按场景或按视频来源分组确保同一组图片只出现在训练集或验证集之一。362 张图如果来自少数几个视频截帧这个问题尤其突出。4.3 混淆矩阵总合不唯一现象训练完看混淆矩阵发现 fire 类的数值加起来对不上总样本数。原因YOLO 的混淆矩阵统计的是检测框级别的匹配结果一个 GT 可能匹配多个预测框或者背景被误判为 fire 后计入。这不是 bug是统计口径问题。解决关注对角线数值和整体趋势即可不用纠结总合。如果想看更干净的统计用验证集单独跑推理脚本自己按 IoU 阈值匹配后统计。4.4 显存溢出CUDA out of memory现象训练启动几秒后报 CUDA out of memory。原因batch 太大、imgsz 太高、或者同时开了其他占显存的程序。解决按顺序降 batch16→8→4、降 imgsz640→512→416。如果降到 batch4 还爆检查是不是模型选大了换成 yolov8n。另外 ultralytics 默认会开 AMP 混合精度如果显卡不支持 AMP 反而可能出问题加ampFalse关掉试试。4.5 数据增强把火「增强没了」现象训练时开了默认增强结果模型对小火苗检测很差。原因YOLO 默认的 mosaic、mixup 增强在小目标、单类别场景下可能把火焰区域裁掉或混合到难以辨认。解决小数据集训练时适当关掉激进增强在训练命令里加mosaic0.5降低 mosaic 概率或mixup0.0。先跑一轮默认增强看效果如果验证集火焰召回低再逐步关增强对比。5. 小样本提效技巧用预训练权重分层学习率把 362 张图榨干362 张图在目标检测里属于小样本硬训很容易过拟合。我自己的习惯是两条腿走路一是用预训练权重做迁移学习二是分层设置学习率。yolov8n.pt 本身就是在 COCO 上训过的backbone 已经学到了通用特征微调时不需要从头学。具体做法是在训练命令里显式控制学习率策略yolo detect train \ data/absolute/path/to/fire_dataset/fire.yaml \ modelyolov8n.pt \ epochs150 \ imgsz640 \ batch8 \ lr00.001 \ lrf0.01 \ warmup_epochs5 \ cos_lrTrue \ freeze10 \ projectruns/fire \ nameexp_finetune这里几个参数值得展开。lr00.001比默认的 0.01 小一个量级小数据集微调时更稳。lrf0.01是最终学习率因子配合cos_lrTrue做余弦退火学习率从 0.001 平滑降到 0.00001。warmup_epochs5让前 5 轮学习率从极小值线性升到 lr0避免一开始就大梯度破坏预训练权重。freeze10冻结 backbone 前 10 层只训检测头和后几层进一步降低过拟合风险。等这一轮跑完看 mAP如果还有提升空间再解冻全部层用更小的学习率跑一轮。验证方法上我一般会做两组对比一组用默认参数从头训一组用上面的微调参数看验证集 mAP50 和实际推理漏检率。多数情况下微调组在 50 轮左右就能超过从头训 100 轮的效果。另外记得把训练完的best.pt和last.pt都留着best 用于推理last 用于继续训练。从那以后我每次拿到小样本数据集都强制先跑一轮冻结 backbone 的微调再决定要不要解冻全训。这个习惯帮我省了不少无效训练时间。希望帮到你。本文还有配套的精品资源点击获取
返回列表