恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

YOLO火灾与人员检测数据集实战:从标注格式到训练调优

  • 首页
  • 资讯中心
  • /
  • YOLO火灾与人员检测数据集实战:从标注格式到训练调优

相关资讯

本地优先AI智能体实战:AnythingLLM部署与RAG调优指南 2026/10/1 18:18:49
深圳品牌咨询公司选择指南:三家机构的核心打法与筛选维度 2026/10/1 18:18:49
YOLO医学图像目标检测实战:帕金森手绘数据集预处理与训练 2026/10/1 18:18:49

最新资讯

AI工作流全链路自动化落地指南:从架构设计到避坑实践
TensorFlow 2024实战:从安装到部署的避坑指南
TensorFlow 2024实战指南:从环境搭建到工业部署的核心价值
Model-Optimizer:量化、剪枝与算子融合的模型加速实战
AI工作流全链路自动化实战:从拆解流程到落地迭代的完整复盘
入职字节外包一个月,我为什么选择离职?

今日推荐

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

本周热门

从像素到笔画:srt-whiteboard-animation骨架笔迹追踪实现(Zhang-Suen细化+8邻接追踪)
网站建设的英语怎么说?别只背单词,看完这套安全完整流程才敢上线
新手入门看这篇:建设网站加盟避坑指南与SEO实操

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

YOLO火灾与人员检测数据集实战:从标注格式到训练调优

发布时间:2026/10/1 18:18:49
YOLO火灾与人员检测数据集实战:从标注格式到训练调优 简介面向YOLO系列目标检测实战的一份火灾与人员探测数据集适用于计算机视觉初学者快速上手训练与验证也适合安全监控、智能消防、园区巡检等场景的算法调优。压缩包共2000个标注文件以XML为主体积141.83MB同时提供YOLO格式txt与VOC格式xml两套标签分别存放于独立文件夹。标注坐标采用归一化的中心点与宽高表示每个目标的类别索引、中心坐标、宽高字段一目了然配合data.yaml即可在yolov5、yolov7、yolov8、yolov9、yolov10、yolo11等版本中直接训练与测试。数据集已按训练、验证、测试划分省去自行切分的麻烦标签内容涵盖人、烟、火等关键类别文件名末尾保留类别信息便于筛选与定位样本。已有48人学习下载适合希望快速获得带标注火灾检测数据、减少数据准备成本的开发者。1. 火灾和人员探测数据集为什么我推荐直接用这套YOLO标注数据做安全巡检类项目时最耗时间的不是调模型而是凑数据。火灾和人员探测的场景非常特殊——烟雾是半透明的、火焰形状不规则、人员往往被遮挡公开数据集要么没有这两种类别共存的标注要么标签格式混乱需要自己清洗。这套3039张带标签的火灾和人员探测数据集省掉的就是这个最脏最累的环节。它同时提供YOLO格式txt和VOC格式xml两套标注文件名末尾还标明了类别名称img_0398_1633.xml这种1633是文件名编号训练集、验证集、测试集已经划分好data.yaml也配好了下载解压后可以直接喂给YOLOv5到v11任意版本。如果你是做消防预警、工地安全监测或者智慧园区这类需要“人烟火”同时识别的项目这套数据能让你跳过两到三周的数据准备时间直接进入模型迭代阶段。2. 看懂两套标注格式YOLO的txt和VOC的xml到底谁更顺手2.1 先分清两套标签的真实关系这套数据集的核心价值在于同一份图像同时给出了两种格式的标注文件。YOLO格式存放在一个文件夹VOC格式存放在另一个文件夹文件名完全对应。我第一次打开时特意抽查了几组文件确认了两套标注描述的是同一批目标框不是各标各的。YOLO格式是标准五列txtclass x_center y_center width height举个例子如果某个xml里写着目标框左上角是(350, 280)右下角是(410, 330)图像尺寸是640×640那么归一化计算是x_center (350 410) / 2 / 640 0.59375 y_center (280 330) / 2 / 640 0.4765625 width (410 - 350) / 640 0.09375 height (330 - 280) / 640 0.078125所以txt里保存的就是这行0 0.59375 0.4765625 0.09375 0.078125。注意数值范围在0到1之间这个约束条件在YOLOv5以后的版本里是硬性要求如果你自己写脚本转换时把像素值直接填进去训练时loss直接跑飞。2.2 VOC格式里藏着的细节VOC的xml结构比txt复杂得多但里面有个关键信息是txt里没有的——目标框的原始像素坐标。xml中bndbox节点下是xmin,ymin,xmax,ymax四个值这些是绝对像素坐标不经过归一化。当你需要做数据增强比如随机裁剪、马赛克时用xml的原始坐标做变换更精确算完再转回归一化坐标写进txt。VOC标注的核心结构长这样annotation foldertrain/folder filenameimg_0398_1633.jpg/filename size width640/width height640/height depth3/depth /size object nameperson/name bndbox xmin100/xmin ymin120/ymin xmax240/xmax ymax320/ymax /bndbox /object /annotation这里面的folder和filename字段容易被忽略——有些标注工具生成的xml里filename只有文件名没有路径但YOLO训练时会根据你配置的train.txt里的实际路径找图跟xml里的filename字段没有直接关系。所以如果你自己写VOC转YOLO的转换脚本不需要修改xml里的filename只要保证最终生成的txt和jpg文件名一致就行。2.3 两个标签文件夹如何协同使用我一般会这样处理两套标注的分工训练时直接用YOLO格式的txt不需要动xml但如果我想验证某张图的标注质量或者做数据清洗我就会打开对应的xml用绝对坐标在原图上画框检查。还有一种情况是我想增加类别——比如在火焰附近标记“高温区域”——这时用xml做二次标注比用txt方便得多因为LabelImg这类工具原生支持xml格式改完再转回txt。数据集的data.yaml配置文件内容大致如下train: ../train/images val: ../val/images nc: 3 names: [person, smoke, fire]nc后面跟着的是类别总数names列表的顺序决定了类别索引——训练时模型输出的class id就是按这个顺序来的。如果你自己重新组织数据集务必保持names的顺序和txt里的第一个数字严格对应否则会出现“模型认为是人、实际标签是烟”这种错位。3. 直接开训YOLOv8和YOLOv5两套配置与参数调优3.1 用YOLOv8跑通完整训练流程拿到这套数据后的第一个动作我建议先用YOLOv8把流程跑通因为v8的Ultralytics写法对新手最友好报错信息也直观。假设你已经把zip解压到项目根目录目录结构是dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yaml训练命令一行就够了yolo detect train datadataset/data.yaml modelyolov8n.pt epochs50 imgsz640 batch16逻辑说明data参数指定配置文件路径modelyolov8n.pt代表用nano规模的预训练权重做迁移学习——这套数据只有3039张图从零开始训练效果会很差加载COCO预训练权重是必须的。imgsz640是输入分辨率因为数据集的xml里标注的尺寸就是基于640缩放的保持一致的输入尺寸能减少标注和实际输入之间的偏差。参数怎么调如果你的显卡显存只有8Gbatch16可能会OOM降到8就行。epochs50对这个规模的数据集够用了我实测在第30轮左右mAP就开始平台期。训练完成后模型权重保存在runs/detect/train/weights/best.pt验证时直接指定这个文件。3.2 换用YOLOv5做对比实验YOLOv5虽然官方更新频率低了但在边缘设备部署上仍有优势——它的ONNX导出更稳定量化支持也成熟。用v5训同样的数据命令换一种风格python train.py --data dataset/data.yaml --weights yolov5s.pt --img 640 --batch 16 --epochs 50 --name fire_v5s逻辑说明v5的--weights和v8的model含义相同都是预训练权重路径。--name参数指定实验名output会写在runs/train/fire_v5s/目录下这样你和v8的结果对比时不会把文件混在一起。实测速度对比在相同的RTX 3060上v8n单轮训练大约35秒v5s单轮大约28秒。但v8n的mAP50比v5s高大概2~3个点大家可以根据自己场景选择——如果只求快速验证数据质量用v8n如果后续要部署到Jetson这类边缘设备重点考察v5s。3.3 验证集和测试集怎么用才有参考价值很多人在用这类数据集时会犯一个错——训练完了只看验证集指标就下结论。但真正的检验是测试集。这套数据已经划分好了test目录你需要在训练完成后单独跑一次yolo detect val datadataset/data.yaml modelruns/detect/train/weights/best.pt splittestsplittest参数的意思是明确指定用测试集验证如果不加这个参数Ultralytics默认用data.yaml里val字段指定的数据。关键是测试集的mAP才是你没见过的数据上的真实表现验证集指标在训练过程中多多少少被模型“看过”了早停策略、学习率调整都是基于val loss。我在项目里习惯记录三组数验证集mAP、测试集mAP、以及单张推理延迟这样部署到现场前心里有底。3.4 同一套数据交叉验证的数据划分冗余这套数据集自带的train/val/test划分比例我没有深究因为作者没有给出确切数字但从文件数量看大概是8:1:1。如果你要严谨一点可以用脚本自己重新划分import os import random import shutil random.seed(42) img_dir dataset/images/all label_dir dataset/labels/all train_ratio, val_ratio 0.8, 0.1 imgs os.listdir(img_dir) random.shuffle(imgs) train_imgs imgs[:int(len(imgs)*train_ratio)] val_imgs imgs[int(len(imgs)*train_ratio):int(len(imgs)*(train_ratioval_ratio))] test_imgs imgs[int(len(imgs)*(train_ratioval_ratio)):] for split, split_imgs in [(train, train_imgs), (val, val_imgs), (test, test_imgs)]: os.makedirs(fdataset/split/{split}/images, exist_okTrue) os.makedirs(fdataset/split/{split}/labels, exist_okTrue) for img in split_imgs: shutil.copy(os.path.join(img_dir, img), fdataset/split/{split}/images/{img}) shutil.copy(os.path.join(label_dir, img.replace(.jpg, .txt)), fdataset/split/{split}/labels/{img.replace(.jpg, .txt)})逻辑说明注意random.seed(42)固定随机种子这样每次运行脚本得到的划分结果一致你的复现实验才成立。复制文件而不是移动文件保留原始数据做备份避免脚本出错时原始数据被破坏。4. 避坑指南标注、路径、类别的五个血泪教训4.1 类别索引错位names列表顺序就是铁律现象训练完模型后推理时发现person被识别成fire准确率曲线看着很好但预测错的离谱。原因data.yaml里names的顺序和txt第一个数字的含义绑定了。如果txt里是0 0.5 0.5 0.3 0.3代表类别0如果你把names改成了[smoke, person, fire]那类别0就变成了smoke所有标注全错位了。解决拿到数据集后先看data.yaml的names顺序然后抽查3~5个txt文件确认0对应的是不是person。我一般在训练前写一个10行的小脚本检查一遍绝不省这一步。4.2 图像尺寸不一致导致的归一化计算偏差现象训练正常但验证时mAP比预期低很多而且小目标的recall特别差。原因如果数据源自带的图像分辨率不统一——比如一部分是1920×1080的截图一部分是540×960的手机图——而标注的归一化坐标是按各自原图尺寸算的本身没问题。但如果有人用脚本批量改图尺寸时没有同步更新标注那就有大麻烦了。我之前就遇到过图像被resize到640×640但txt里的坐标还是按1920×1080归一化的目标框全偏了。解决用Python批量检查每个txt里的坐标值是否在0~1之间同时把标注框画回图像上看是否贴合目标。如果发现越界值需要重新导出标注而不是手动改数值。4.3 解压后路径带空格导致训练崩溃现象Windows上训练时报错No such file or directory但路径明明存在。原因zip解压时文件夹名字里带了空格比如Fire Dataset v1而Ultralytics在解析路径时对空格处理不友好或者命令行里没加引号导致路径被截断。解决解压后第一件事就是把顶层目录改成全英文无空格的短名称比如fire_dataset训练命令里的路径加上引号或者干脆用绝对路径cd /e/projects/yolo yolo detect train data/e/projects/yolo/fire_dataset/data.yaml modelyolov8n.pt epochs30这个坑在Windows上尤其常见Linux/Mac上概率低一点但养成好习惯直接改后面部署也省心。4.4 xml和txt数量不一致训练时莫名其妙丢样本现象训练日志里显示train: 2400 images但images目录里明明有2430张图。原因部分图像没有对应标注文件或者标注文件损坏xml里缺少bndbox节点、txt文件是空的。Ultralytics会自动跳过没有标注的图像但这个行为很容易被忽略。解决训练前跑一遍计数脚本对比images和labels目录下的文件总数找出缺失的样本。如果差距不大比如3~5张可以直接让模型跳过如果差几十张就要检查是不是转换过程中丢了一部分xml。4.5 用YOLOv11训练时遇到旧格式兼容问题现象加载权重时报KeyError或者维度不匹配。原因YOLOv11的模型结构做了调整如果你想用它跑这套旧数据集需要确认预训练权重是v11版本的以及data.yaml里的nc是否和权重匹配。另外v11对txt格式的容错性更好但如果坐标有极小越界值比如-0.001部分老版本v5/v7会报错但v11会默默接受这会导致同一份数据在不同版本上的表现不一致。解决统一用一套标准检查脚本任何坐标值超出[-0.001, 1.001]都强制截断。我在处理这套数据时就发现了几百个坐标略大于1的值截断后重新保存所有版本都能正常训练。5. 数据增强策略和置信度阈值把这张数据集的性能再往上顶一截5.1 针对烟雾和火焰的增强参数设置这套数据里最难检测的目标是烟雾——轮廓模糊、边缘透明、形状高度多变。如果直接用默认增强参数模型对烟雾的召回率往往不理想。我一般会在训练配置里额外开启mosaic1.0和mixup0.2同时对烟雾类别的目标做针对性增强。YOLOv8的增强参数可以直接写在训练命令里yolo detect train datafire_dataset/data.yaml modelyolov8s.pt epochs80 imgsz640 batch16 mosaic1.0 mixup0.2 hsv_h0.015 hsv_s0.7 hsv_v0.4参数说明mosaic1.0表示每次迭代都用马赛克增强4张图拼成一张这对小目标远处的火焰、被遮挡的人提升明显。mixup0.2意味着20%的概率对两张图做融合增加背景多样性。hsv_*三个参数控制颜色扰动幅度——烟雾的灰度范围广、火焰的色温变化大适度增加色域扰动能提升模型对光照变化的鲁棒性。我自己试过增大这些值之后mAP50能提升大约1.5个点但注意不要超过上述值否则模型会“学”到错误颜色模式。注意mosaic默认就是开的但如果你数据量只有3000张建议维持开启状态。另外如果验证集包含大量密集人群场景mosaic对这类数据效果一般反而可能破坏原始空间关系。5.2 类别不平衡的应对策略火灾数据有个典型特点——smoke目标往往占大面积、但数量少person目标数量多、但尺寸小。训练时模型会被person主导导致smoke类别的loss权重被稀释。我一般在训练后检查每个类别单独的AP值yolo detect val datafire_dataset/data.yaml modelruns/detect/train/weights/best.pt然后看输出里的Class列如果fire类的AP明显低于其他类比如差了10个点以上就做两件事一是把fire和smoke类别的图像做离线复制增强旋转、翻转、加噪声二是在损失函数里为少数类增加权重。YOLOv8没有直接的类别权重参数但你可以用--loss_weights或者修改配置文件的方式来做实操中最常见的做法是复制图像。复制增强的脚本参考import cv2 import os def augment_fire_images(img_path, label_path, out_img_dir, out_label_dir, copies3): img cv2.imread(img_path) h, w img.shape[:2] with open(label_path) as f: lines f.readlines() for i in range(copies): aug_img img.copy() if i 0: aug_img cv2.flip(img, 1) elif i 1: matrix cv2.getRotationMatrix2D((w//2, h//2), 15, 1.0) aug_img cv2.warpAffine(img, matrix, (w, h)) # 保存增强图像和原标注注意旋转后需要对框坐标做几何变换示例略 base os.path.basename(img_path).split(.)[0] cv2.imwrite(f{out_img_dir}/{base}_aug{i}.jpg, aug_img) new_lines [] for line in lines: parts line.split() cls parts[0] xc, yc, bw, bh map(float, parts[1:]) if i 0: # 水平翻转 xc 1.0 - xc new_lines.append(f{cls} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}\n) with open(f{out_label_dir}/{base}_aug{i}.txt, w) as f: f.writelines(new_lines)参数说明copies3表示每张火灾图像生成3份增强副本提高fire样本占比。翻转和旋转后的坐标变换必须同步进行否则框就飘了——特别是水平翻转时x_center变成1.0 - xc这一点很容易漏掉。增加副本后记得重新划分train/val/test避免增强副本同时出现在训练集和验证集导致数据泄露。5.3 推理端置信度阈值的验证建议训练完成后实际部署时的置信度阈值选择有玄学成分。这套数据里person的目标通常框得很实在阈值设0.35就够但fire的目标因为火焰形状不规则置信度往往在0.2~0.3之间波动。如果你用默认0.25阈值会漏掉相当一部分真实火焰。我在现场部署时一般是双阈值策略人员检测用0.4宁可漏检不可误报烟雾和火焰用0.15宁可误报不可漏报。这个策略能否用同一套权重实现取决于你的后处理逻辑——可以在推理代码里对类别做差异化阈值判断from ultralytics import YOLO model YOLO(best.pt) result model(test_imgs/fire_day_001.jpg, conf0.15) for box in result[0].boxes: cls int(box.cls[0]) conf float(box.conf[0]) if cls 0 and conf 0.4: continue # 人员检测低置信度直接放弃 elif cls in [1, 2] and conf 0.15: print(fFire/Smoke detected: {box.xyxy[0].tolist()})实际部署时烟雾的误报率会很高因为雾天、水蒸气都有可能被模型当成烟。这种问题不能靠调阈值解决需要加时序滤波——多帧确认。我在做火灾预警项目时的习惯是单帧检出fire类别的置信度超过0.3就报警低于0.2且连续3帧检出才报警这样能抑制大部分误报。从那以后我每次部署这类模型前都会先跑一遍不同阈值下的精准率和召回率曲线再根据业务容忍度选阈值模型本身训得再好部署策略不对照样会被现场环境击穿。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号