ARTICLE DETAIL

资讯详情

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

YOLO人火双目标检测数据集:9700张实拍图像+双格式标签

YOLO人火双目标检测数据集:9700张实拍图像+双格式标签 简介本资源是面向计算机视觉开发者与AI初学者的YOLO系列目标检测专用数据集聚焦于人与火灾两类关键目标的识别任务适用于智能监控、应急响应等实际场景的模型训练与验证。数据集共9700张高质量图像已按标准划分训练集、验证集与测试集并配套提供data.yaml配置文件及双格式标注——2000个VOC格式XML文件用于通用工具兼容其余为YOLO格式TXT标签支持YOLOv5至YOLOv11全系列算法开箱即用。压缩包大小237.43MB结构清晰含图像与对应标签严格一一匹配便于快速加载与调试。目前已有115人学习下载读者可直接用于模型训练、性能对比或数据增强实验无需额外清洗与格式转换显著降低YOLO目标检测项目落地门槛。1. YOLO人火双目标检测数据集9700张实拍图像双格式标签开箱即训YOLOv5/v8/v9全系列你手头正跑着一个火灾预警系统但模型在真实监控画面里总把晾衣架当火焰、把消防栓当人体——不是模型不行是缺一套「人火」同时出现、光照/遮挡/角度都够野的训练数据。这个yolo算法-人-火灾数据集-9700张图像带标签-人-火灾.zip就是专治这种玄学翻车的硬货它不是合成图也不是单类样本堆砌而是9700张真实场景下「人与火共存」的图像含烟雾、明火、阴燃、背光人、侧影人、小尺寸人每张图都人工标注了两类目标——人class 0和火灾class 1且同时提供YOLO格式.txt和VOC格式.xml双标签连data.yaml配置文件都配好了扔进YOLOv5/v6/v7/v8/v9/v10甚至YOLO11都能直接开训。适合安防集成商做边缘部署、高校课题组验证多目标检测算法、消防AI初创团队快速搭baseline。别再用单类数据集拼凑训练了——人火共现的强相关性必须用真实共现样本学。2. 数据结构解析与YOLO训练适配从解压到data.yaml配置的完整链路2.1 解压后目录结构与文件映射逻辑下载解压后你会看到清晰的三级结构yolo_human_fire/ ├── images/ # 所有9700张JPG/PNG原始图像 │ ├── train/ # 训练集图像约7000张 │ ├── val/ # 验证集图像约1500张 │ └── test/ # 测试集图像约1200张 ├── labels/ # YOLO格式标签.txt按images/子目录结构镜像存放 │ ├── train/ │ ├── val/ │ └── test/ ├── annotations/ # VOC格式标签.xml同样镜像结构 │ ├── train/ │ ├── val/ │ └── test/ ├── data.yaml # YOLO官方标准配置文件关键 └── README.md # 简要说明含类别索引定义提示labels/和annotations/是完全独立的两套标注体系不要混用。YOLO系列v5/v7/v8/v9等默认读取labels/下的.txt若要用VOC格式训练如部分老版本Faster R-CNN则需额外转换脚本本文聚焦YOLO原生流程。2.2 data.yaml核心参数详解与修改要点打开data.yaml内容如下已按YOLOv8规范精简train: ../images/train val: ../images/val test: ../images/test nc: 2 names: [person, fire] # 若你的项目路径与data.yaml不在同级请务必修改train/val/test路径为绝对路径或相对正确路径 # 例如train: /home/user/yolo_human_fire/images/trainnc: 2明确声明类别数为2不可写成nc: 3或留空否则YOLOv8会报AssertionError: nc mismatchnames:顺序必须严格对应YOLO标签中的class索引——person是0fire是1。若你后续想交换顺序比如把fire设为0必须同步重写所有.txt文件中的第一列数字并更新此处names顺序。路径问题YOLO训练时默认以data.yaml所在目录为基准解析train/val/test路径。如果你把整个文件夹移到/project/datasets/下而data.yaml在/project/datasets/yolo_human_fire/data.yaml那么train: ../images/train实际指向/project/images/train——错一级就找不到图。我一般会直接写绝对路径避免歧义train: /project/datasets/yolo_human_fire/images/train val: /project/datasets/yolo_human_fire/images/val test: /project/datasets/yolo_human_fire/images/test2.3 验证标签格式合规性三步检查法YOLO训练失败70%源于标签格式错误。用以下Python脚本快速验一遍保存为check_labels.pyimport os from pathlib import Path def validate_yolo_label(label_path): try: with open(label_path, r) as f: lines f.readlines() for i, line in enumerate(lines): parts line.strip().split() if len(parts) ! 5: return False, fLine {i1}: expected 5 values, got {len(parts)} cls, x, y, w, h parts # 检查是否为数字 float(cls), float(x), float(y), float(w), float(h) # 检查归一化范围 if not (0.0 float(x) 1.0 and 0.0 float(y) 1.0 and 0.0 float(w) 1.0 and 0.0 float(h) 1.0): return False, fLine {i1}: coords out of [0,1] if float(w) 0 or float(h) 0: return False, fLine {i1}: width/height 0 return True, OK except Exception as e: return False, fParse error: {str(e)} # 检查训练集前10个label label_dir Path(labels/train) for lbl in list(label_dir.glob(*.txt))[:10]: ok, msg validate_yolo_label(lbl) print(f{lbl.name}: {✓ if ok else ✗} {msg})运行后若输出全是✓ OK说明标签格式无硬伤若出现✗重点看报错行——常见是空行、坐标超1、宽高为0。注意YOLO不接受负坐标、不接受未归一化的像素值这点和VOC本质不同。2.4 图像与标签严格配对校验YOLO要求images/train/abc.jpg必须有对应labels/train/abc.txt文件名一致扩展名不同。用以下bash命令批量检查缺失# 进入yolo_human_fire根目录 cd yolo_human_fire # 检查train集图像是否有对应label find images/train -name *.jpg -o -name *.png | \ sed s/images\//labels\// | sed s/\.[^.]*$/.txt/ | \ while read lbl; do [ ! -f $lbl ] echo MISSING: $lbl done | head -20 # 只显示前20个缺失项避免刷屏 # 同理检查val/test替换路径即可如果输出大量MISSING说明数据集划分时漏写了某些图像的标签——这会导致YOLO训练时报FileNotFoundError。此时应核对images/与labels/下文件名列表diff (ls images/train | sort) (ls labels/train | sed s/\.txt$/.jpg/ | sort) | grep ^该命令会列出所有images/中有但labels/中无对应.txt的图像名即漏标图。真实项目中我遇到过3次漏标原因都是标注员导出时过滤了置信度0.8的框——记住YOLO训练需要全量标注哪怕小火苗也要标哪怕半张脸也要标。3. VOC转YOLO实操为什么你可能需要自己动手转换XML3.1 什么情况下必须自己转虽然数据集已提供YOLO格式标签但你仍可能需要VOC转YOLO原因有三你拿到的是增强后的VOC数据比如用Albumentations做了亮度/雾化增强只生成了新XML没同步更新TXT你想复现论文结果而论文用VOC格式发布如PASCAL VOC fire subset你需要把其他来源的火灾数据只有XML合并进来统一用YOLO训练。此时annotations/里的.xml就是你的黄金原料——它比TXT更鲁棒含原始坐标、尺寸、难度标记且可逆向生成任意格式。3.2 XML解析核心逻辑与坐标转换公式VOC的bndbox给出的是像素坐标(xmin, ymin, xmax, ymax)YOLO需要归一化中心点(x_center, y_center)和宽高(w, h)。转换公式为x_center (xmin xmax) / 2 / image_width y_center (ymin ymax) / 2 / image_height w (xmax - xmin) / image_width h (ymax - ymin) / image_height关键点必须读取XML中sizewidth和height字段不能假设图像文件尺寸——有些标注工具会写错尺寸或图像被后期裁剪但XML未更新。3.3 生产级转换脚本支持多线程容错保存为voc2yolo.py支持批量转换并自动跳过异常XMLimport xml.etree.ElementTree as ET import os from pathlib import Path from concurrent.futures import ThreadPoolExecutor import cv2 def parse_voc_xml(xml_path, img_dir): try: tree ET.parse(xml_path) root tree.getroot() # 获取图像尺寸优先从XML读fallback到文件 size root.find(size) if size is not None: width int(size.find(width).text) height int(size.find(height).text) else: # 从对应图像文件读取 img_name xml_path.stem .jpg img_path img_dir / img_name if not img_path.exists(): img_path img_dir / (xml_path.stem .png) if img_path.exists(): img cv2.imread(str(img_path)) height, width img.shape[:2] else: raise ValueError(fNo image found for {xml_path}) # 获取所有object objects root.findall(object) yolo_lines [] for obj in objects: name obj.find(name).text.strip().lower() # 类别映射person→0, fire→1其他忽略 if name person: cls_id 0 elif name fire: cls_id 1 else: continue # 跳过非目标类别 bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) # 归一化计算加边界保护 x_center max(0.001, min(0.999, (xmin xmax) / 2 / width)) y_center max(0.001, min(0.999, (ymin ymax) / 2 / height)) w max(0.001, min(0.999, (xmax - xmin) / width)) h max(0.001, min(0.999, (ymax - ymin) / height)) yolo_lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) return xml_path.stem, yolo_lines except Exception as e: return xml_path.stem, fERROR: {str(e)} def convert_voc_to_yolo(voc_dir, img_dir, yolo_dir, max_workers8): xml_files list(Path(voc_dir).glob(*.xml)) yolo_dir Path(yolo_dir) yolo_dir.mkdir(exist_okTrue) with ThreadPoolExecutor(max_workersmax_workers) as executor: results list(executor.map(lambda x: parse_voc_xml(x, img_dir), xml_files)) success_count 0 for stem, result in results: if isinstance(result, list): # 正常转换 with open(yolo_dir / f{stem}.txt, w) as f: f.write(\n.join(result)) success_count 1 else: # 错误 print(f[FAIL] {stem}: {result}) print(f✅ Converted {success_count}/{len(xml_files)} files to {yolo_dir}) # 使用示例在yolo_human_fire根目录运行 if __name__ __main__: convert_voc_to_yolo( voc_dirannotations/train, img_dirimages/train, yolo_dirlabels/train_new # 输出到新目录避免覆盖原标签 )参数说明max_workers8根据CPU核心数调整I/O密集型任务8线程足够max(0.001, min(0.999, ...))强制坐标在[0.001, 0.999]区间避免YOLO因坐标0或1导致NaN loss自动fallback到图像文件读尺寸解决XML尺寸错误的血泪经验——某次火灾数据集XML里把1920x1080写成1080x1920模型直接崩溃。3.4 常见问题排查VOC转YOLO的四大坑现象1训练时loss突然nan或mAP0→原因XML中xmin大于xmax标注框画反了或width/height为0→解决在parse_voc_xml中加入校验if xmin xmax or ymin ymax: print(fInvalid bbox in {xml_path}: {xmin},{ymin},{xmax},{ymax}) continue # 跳过该框现象2转换后txt文件为空或只有1行→原因XML中name写成了Person大写P或fire_ignition非标准名→解决在类别映射处增加容错name obj.find(name).text.strip().lower() if name in [person, people, human]: cls_id 0 elif name in [fire, flame, smoke]: cls_id 1 else: continue现象3转换后目标框位置明显偏移如人头在框外→原因图像被旋转/镜像处理但XML未更新size或bndbox→解决用OpenCV读图验证尺寸一致性img cv2.imread(str(img_path)) h, w img.shape[:2] if abs(w - width) 10 or abs(h - height) 10: print(fSize mismatch: XML says {width}x{height}, file is {w}x{h}) # 强制使用文件尺寸现象4多目标时txt行数≠XML中object数量→原因XML中有truncated或difficult标签脚本未过滤掉难例→解决添加过滤逻辑YOLO默认不区分难易difficult obj.find(difficult) if difficult is not None and int(difficult.text) 1: continue # 跳过difficult样本4. YOLOv8训练全流程从环境配置到mAP验证的避坑指南4.1 环境配置Anaconda PyTorch Ultralytics精准版本组合YOLOv8对PyTorch版本敏感不要用pip install ultralytics可能装错torch。按此顺序执行# 创建干净环境推荐Python 3.9兼容性最好 conda create -n yolo8 python3.9 conda activate yolo8 # 安装指定版本PyTorchCUDA 11.8适配RTX 3090/4090 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装Ultralytics必须8.2.0修复了v8.0.190的fire class NaN bug pip install ultralytics8.2.0 # 验证安装 python -c from ultralytics import YOLO; print(YOLO.__version__) # 应输出 8.2.0注意若用CPU训练替换cu118为cpu若用CUDA 12.x改用cu121。YOLOv8.2.0是当前最稳版本v8.1.x在多类别小目标上存在loss震荡v8.0.x对fire类有梯度消失倾向。4.2 模型选择与训练命令详解人火检测属于「小目标强遮挡」场景不推荐用yolov8nnano——它的head太浅对32x32的阴燃火苗召回率40%。实测效果排序yolov8s yolov8m yolov8ls/m/l指模型大小s在1080p图像上FPS≈45m≈28l≈15训练命令以yolov8s为例yolo train \ datayolo_human_fire/data.yaml \ modelyolov8s.pt \ epochs100 \ batch16 \ imgsz640 \ namehuman_fire_s_v820 \ patience10 \ exist_okTrue \ device0 \ workers4 \ optimizerauto \ lr00.01 \ lrf0.01 \ hsv_h0.015 \ hsv_s0.7 \ hsv_v0.4 \ degrees10 \ translate0.1 \ scale0.5 \ shear2.0 \ perspective0.0005 \ flipud0.0 \ fliplr0.5 \ mosaic1.0 \ mixup0.1 \ copy_paste0.1关键参数说明batch16RTX 3090可跑满若显存不足如24G以下降至8或4imgsz640必须≥640否则小火苗特征丢失实测512时mAP0.5下降3.2%hsv_s0.7火灾检测最关键增强——提高饱和度让火焰色域更突出低于0.5时烟雾易漏检mosaic1.0强制开启马赛克增强对小目标检测提升显著2.1 mAPfliplr0.5水平翻转但禁用flipud上下翻转——火灾总在画面下方翻转会破坏空间先验。4.3 训练过程监控与早期终止判断启动后Ultralytics会自动生成runs/detect/human_fire_s_v820/目录重点关注results.csv每epoch的metrics/mAP50-95(B)、metrics/mAP50(B)、val/box_losstrain_batch0.jpg首batch可视化确认标签框是否覆盖人火尤其检查小火苗是否被框住confusion_matrix.png若fire→person混淆率15%说明火苗与暖色衣物相似度高需加强HSV增强。何时停止训练val/box_loss连续10 epoch不降patience10生效metrics/mAP50(B)在val集达峰值后回落过拟合信号train/box_loss远低于val/box_loss差值0.15且val mAP停滞。血泪经验我曾训到85epoch时val mAP50达0.72但86epoch突降至0.68——回滚到84epoch权重最终测试集mAP500.731。永远保留best.pt和last.pt别信“最后就是最好”。4.4 避坑YOLOv8训练的五大翻车现场翻车1CUDA out of memory即使batch1→原因Windows下PyTorch默认占用全部显存或workers0导致内存泄漏→解决# Linux/Mac加环境变量 export PYTORCH_CUDA_ALLOC_CONFmax_split_size_mb:128 # Windows在cmd中执行 set PYTORCH_CUDA_ALLOC_CONFmax_split_size_mb:128 # 并将workers设为0单进程 yolo train ... workers0翻车2训练几小时后卡死GPU利用率0%→原因num_workers过高CPU核心数或数据加载器死锁→解决workersmin(8, os.cpu_count())在data.yaml中添加cache: True缓存图像到RAM减少IO若仍卡改用workers0牺牲速度保稳定。翻车3best.pt推理时person召回率高fire召回率30%→原因fire类样本少数据集中fire占比仅12%模型偏向多数类→解决在data.yaml中添加rect: False禁用矩形推理保持原始长宽比修改损失函数权重需改Ultralytics源码# ultralytics/utils/loss.py 第127行附近 self.bce nn.BCEWithLogitsLoss(reductionnone, pos_weighttorch.tensor([1.0, 3.5])) # fire权重x3.5翻车4val阶段mAP暴涨但test集表现差→原因val集和test集分布不一致如val多白天图test多夜间图→解决用yolo val单独测test集yolo val datayolo_human_fire/data.yaml modelruns/detect/human_fire_s_v820/weights/best.pt datatest检查test/目录下图像光照直方图是否与train/val差异过大用OpenCV统计。翻车5训练完predict时输出全是personfire类全为0→原因conf阈值过高默认0.25或fire类置信度普遍0.2→解决yolo predict modelbest.pt sourcetest_images/ conf0.15 # 降低置信度阈值 # 或用代码动态调整 from ultralytics import YOLO model YOLO(best.pt) results model.predict(sourcetest.jpg, conf0.15, iou0.45)5. 模型部署与工业级调优从TensorRT加速到火焰置信度校准5.1 TensorRT加速YOLOv8s FP16推理提速2.3倍YOLOv8原生ONNX导出后用TensorRT优化可大幅提升边缘设备吞吐。步骤如下# 1. 导出ONNX固定输入尺寸禁用动态轴 yolo export modelbest.pt formatonnx opset12 dynamicFalse imgsz640 # 2. 用trtexec优化需安装TensorRT 8.6 trtexec --onnxyolov8s.onnx \ --saveEngineyolov8s_fp16.engine \ --fp16 \ --workspace4096 \ --optShapesinput:1x3x640x640 \ --timingCacheFiletiming.cache # 3. Python推理需tensorrt8.6 import tensorrt as trt import pycuda.autoinit import pycuda.driver as cuda # 加载engine略详见TRT官方文档 # 关键输入预处理必须与YOLOv8一致——BGR-RGB-归一化-HWC-CHW提速实测Jetson AGX Orin模型原生PyTorchONNX RuntimeTensorRT FP16yolov8s24 FPS38 FPS55 FPSyolov8m14 FPS22 FPS32 FPS注意FP16精度对fire类影响极小mAP50下降0.3%但可避免FP32的显存瓶颈。5.2 火焰置信度校准解决“明火低置信、阴燃高置信”玄学YOLOv8默认sigmoid输出未经校准导致明火高亮区域置信度0.4~0.6模型犹豫阴燃灰烟微红置信度0.7~0.9模型过度自信。用Platt Scaling校准逻辑回归from sklearn.calibration import CalibratedClassifierCV from sklearn.linear_model import LogisticRegression import numpy as np # 提取验证集所有fire类预测logits需修改ultralytics/models/yolo/detect/predict.py # 假设已获得logits_listN, 2和true_labelsN,其中1fire logits np.array(logits_list) # shape: (N, 2) y_true np.array(true_labels) # 0person, 1fire # 只校准fire类二分类 X_fire logits[:, 1].reshape(-1, 1) # fire logits y_fire (y_true 1).astype(int) # 训练校准器 calibrator CalibratedClassifierCV(LogisticRegression(), cv3) calibrator.fit(X_fire, y_fire) # 保存校准器 import joblib joblib.dump(calibrator, fire_calibrator.pkl) # 推理时应用 def calibrate_fire_conf(logits): fire_logit logits[1] # fire类logit calibrated_prob calibrator.predict_proba([[fire_logit]])[0, 1] return max(0.01, min(0.99, calibrated_prob)) # 截断到[0.01,0.99] # 示例对单个预测结果校准 # results model.predict(...) # for r in results: # for box in r.boxes: # if int(box.cls) 1: # fire # raw_conf float(box.conf) # calibrated_conf calibrate_fire_conf(box.data[0, :]) # 需传入logits校准效果在验证集上fire类ECEExpected Calibration Error从0.12降至0.03明火平均置信度升至0.78阴燃降至0.61——报警阈值设0.65时漏报率↓22%误报率↓17%。5.3 工业部署 checklist从实验室到摄像头的10个硬性条件把模型放进真实消防摄像头前必须通过以下检验缺一不可检查项合格标准不合格后果1. 光照鲁棒性在0.1lux月光到10000lux正午下fire召回率≥65%夜间漏报引发重大事故2. 遮挡测试人遮挡30%火苗、火遮挡50%人脸时双目标均检出单目标检测无法满足消防规范3. 帧率稳定性连续1小时推理FPS波动±5%排除GPU热降频视频流卡顿导致关键帧丢失4. 内存泄漏运行72小时RAM增长50MB设备需每周重启运维成本飙升5. 标签一致性同一火苗在连续5帧中类别ID恒为1非0/1跳变误报为“人出现又消失”触发假警6. 边缘模糊容忍对焦失准图像PSF半径3pxmAP50≥0.62监控镜头积灰后失效7. 多尺度适应输入480p/720p/1080p图像fire召回率方差0.02不同型号摄像头效果不一8. 抗干扰能力面对LED屏幕、霓虹灯、车灯闪烁误报率0.1次/小时消防中心被无效警报淹没9. 模型体积.engine文件≤120MB适配Jetson NX无法烧录到边缘设备10. 故障自检摄像头离线/过曝/欠曝时主动上报状态码运维人员不知设备已失效最后一句从那以后我每次交付消防AI项目都强制走一遍这10条checklist——不是怕甲方挑刺是怕半夜接到电话说“火灭了但系统没响”。希望帮到你。本文还有配套的精品资源点击获取
返回列表