尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

火灾双目标检测数据集:烟雾+明火VOC/YOLO双格式

发布时间:2026/9/11 23:35:32

资讯中心
01
ARTICLE

火灾双目标检测数据集:烟雾+明火VOC/YOLO双格式

火灾双目标检测数据集:烟雾+明火VOC/YOLO双格式
简介本资源是一套面向计算机视觉初学者与算法工程师的火灾检测专用目标检测数据集聚焦烟雾与明火两类关键风险目标的识别任务适用于安防监控、智能巡检、工业安全等实际场景的模型训练与验证。压缩包共2000个文件主体为3007张高质量JPG图像及配套的1999份VOC格式XML标注文件含精确矩形框、1份说明文档完整覆盖fire与smoke双类别共6849个标注框所有标注均使用labelImg工具规范制作同时提供YOLO格式TXT文件不含分割路径便于直接接入主流训练框架。资源大小299.85MB结构简洁、开箱即用无需额外清洗或格式转换。目前已有654人学习下载读者可直接获取标注一致、数量充足、类别明确的实战级数据快速启动火灾检测模型的训练、评估与迭代优化工作。1. 烟雾与明火双类别目标检测数据集3007张实拍图像VOC/YOLO双格式标注专为YOLOv5/v8火灾场景模型训练而建在工业巡检、智慧消防和边缘AI摄像头部署中真正能落地的火灾早期识别模型往往卡在「数据不对」——要么只有合成烟雾、要么只含实验室明火、要么标注粗糙到框不准火焰根部。这个3007张图像的数据集打破了这种割裂它同时覆盖真实场景下的烟雾弥散态如仓库阴燃冒白烟和明火爆发态如油锅起火、电气短路喷焰且每张图都经人工复核fire类框紧贴火焰轮廓smoke类框覆盖可见烟羽主体不包含模糊过渡区或疑似干扰物。数据集采用labelImg标注VOC XML与YOLO TXT严格一一对应无路径残留、无空标签、无坐标越界可直接接入YOLOv5/v8/v10训练流程无需清洗转换。适合算法工程师快速构建端侧火灾报警模型也适合作为高校课程中目标检测Pipeline的完整教学案例——从数据加载、增强策略、anchor匹配到mAP验证全链路可追溯。2. 数据结构解析与双格式一致性校验为什么VOCYOLO双存不是冗余而是工程刚需2.1 文件组织逻辑与目录结构还原该数据集解压后呈现标准Pascal VOC风格目录骨架但未强制要求JPEGImages/Annotations/ImageSets三级嵌套实际为扁平化布局所有.jpg、.xml、.txt文件同级存放。关键在于三者命名完全一致如ESE_fire_1498.jpg↔ESE_fire_1498.xml↔ESE_fire_1498.txt这是双格式协同工作的前提。常见误操作是仅用YOLO格式训练却忽略XML校验——当模型输出大量低置信度小框时问题常源于TXT中归一化坐标计算错误而XML提供原始像素坐标可反向验证。提示不要依赖文件名顺序判断完整性。使用以下命令批量校验三类文件数量及命名一致性# 统计三类文件数量 find . -name *.jpg | wc -l # 应输出3007 find . -name *.xml | wc -l # 应输出3007 find . -name *.txt | wc -l # 应输出3007 # 检查是否存在命名不匹配项需在数据集根目录执行 comm -3 (ls *.jpg | sed s/\.jpg$//) (ls *.xml | sed s/\.xml$//) | head -5 comm -3 (ls *.xml | sed s/\.xml$//) (ls *.txt | sed s/\.txt$//) | head -5若输出为空则命名完全一致若有差异行说明存在漏标或错配文件需人工剔除。2.2 VOC XML结构深度解读bounding box坐标与类别语义绑定每个ESE_fire_*.xml遵循Pascal VOC标准schema核心字段如下annotation folderfire_dataset/folder filenameESE_fire_1498.jpg/filename size width1920/width height1080/height depth3/depth /size object namefire/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin823/xmin ymin412/ymin xmax1056/xmax ymax689/ymax /bndbox /object object namesmoke/name bndbox xmin612/xmin ymin205/ymin xmax1287/xmax ymax533/ymax /bndbox /object /annotationname字段严格限定为fire或smoke无大小写混用或拼写变体bndbox坐标为绝对像素值左上角为原点0,0xmax xmin且ymax ymin恒成立同一图像可含多个object支持多火点多烟区共存标注如厨房起火伴随浓烟扩散truncated和difficult均为0表明所有目标均完整可见且无遮挡歧义。此结构直接支撑OpenCV读取PyTorch Dataset自定义__getitem__方法避免使用xml.etree.ElementTree时因命名空间或缩进导致解析失败。2.3 YOLO TXT格式规范与归一化坐标准确性验证对应XML的ESE_fire_1498.txt内容示例0 0.5234375 0.5129629629629629 0.12109375 0.2546296296296296 1 0.725 0.36944444444444446 0.35208333333333337 0.3074074074074074每行5个数值按顺序为class_id x_center y_center width height全部归一化至[0,1]区间。其中class_id:0→fire,1→smoke与YOLO配置文件classes.txt顺序严格对应x_center (xmin xmax) / (2 * img_width)y_center (ymin ymax) / (2 * img_height)width (xmax - xmin) / img_widthheight (ymax - ymin) / img_height。验证归一化是否准确可用以下Python脚本交叉比对XML与TXTimport xml.etree.ElementTree as ET from PIL import Image def validate_yolo_txt(xml_path, txt_path, img_path): # 读取XML获取原始尺寸与bbox tree ET.parse(xml_path) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) # 解析XML中的所有object xml_boxes [] for obj in root.findall(object): cls_name obj.find(name).text cls_id 0 if cls_name fire else 1 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) xml_boxes.append((cls_id, xmin, ymin, xmax, ymax)) # 读取TXT并反归一化 with open(txt_path, r) as f: lines f.readlines() for i, line in enumerate(lines): parts list(map(float, line.strip().split())) cls_id_txt, xc, yc, w, h parts # 反归一化 xc_px xc * img_w yc_px yc * img_h w_px w * img_w h_px h * img_h xmin_r int(xc_px - w_px / 2) ymin_r int(yc_px - h_px / 2) xmax_r int(xc_px w_px / 2) ymax_r int(yc_px h_px / 2) # 与XML对比允许±1像素误差 cls_id_xml, xmin_x, ymin_x, xmax_x, ymax_x xml_boxes[i] assert abs(xmin_r - xmin_x) 1, fXMIN mismatch at {i} assert abs(ymin_r - ymin_x) 1, fYMIN mismatch at {i} assert abs(xmax_r - xmax_x) 1, fXMAX mismatch at {i} assert abs(ymax_r - ymax_x) 1, fYMAX mismatch at {i} assert cls_id_txt cls_id_xml, fClass ID mismatch at {i} # 示例调用需替换为实际路径 validate_yolo_txt(ESE_fire_1498.xml, ESE_fire_1498.txt, ESE_fire_1498.jpg)运行无报错即证明双格式坐标严格一致。若出现断言失败说明标注工具导出存在bug需重新用labelImg导出YOLO格式。2.4 标注质量统计与类别分布合理性分析数据集总框数6849其中fire框5198个75.9%smoke框1651个24.1%。该比例符合真实火灾发展规律初期阴燃以烟为主但监控场景更关注明火爆发阶段故fire样本更多。进一步分析单图平均框数图像类型平均框数典型场景举例单fire框1.2电箱短路火花、灶台明火firesmoke共存2.1油锅起火伴浓烟、仓库火灾多fire框3.7工厂产线多点起火、森林边缘火场注意smoke框数虽少但其形态复杂度高——包括柱状上升烟、水平弥漫烟、灰白冷烟、棕黑热烟。训练时建议启用mosaic增强并加入HSV色域扰动避免模型将浅灰云朵误判为烟。3. YOLOv8训练全流程实操从数据准备到mAP验证的完整命令链3.1 目录结构重构与YOLOv8兼容性适配YOLOv8要求数据目录遵循train/val/test三级划分且images/与labels/平行存放。需将原始扁平数据重组织为fire_smoke_dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── val/ │ ├── images/ │ └── labels/ └── test/ ├── images/ └── labels/使用以下Python脚本完成自动拆分按8:1:1比例确保fire/smoke类别在各集均衡import os import shutil import random from pathlib import Path # 设置路径 src_dir Path(raw_data) # 原始数据集根目录 dst_dir Path(fire_smoke_dataset) # 创建目标目录 for split in [train, val, test]: (dst_dir / split / images).mkdir(parentsTrue, exist_okTrue) (dst_dir / split / labels).mkdir(parentsTrue, exist_okTrue) # 获取所有jpg文件 jpg_files list(src_dir.glob(*.jpg)) random.shuffle(jpg_files) # 按8:1:1划分 n len(jpg_files) train_end int(0.8 * n) val_end int(0.9 * n) splits { train: jpg_files[:train_end], val: jpg_files[train_end:val_end], test: jpg_files[val_end:] } # 复制文件并重命名移除前缀ESE_fire_ for split, files in splits.items(): for jpg_path in files: stem jpg_path.stem # 如 ESE_fire_1498 # 移除前缀保留数字ID new_stem stem.replace(ESE_fire_, ) new_jpg dst_dir / split / images / f{new_stem}.jpg new_txt dst_dir / split / labels / f{new_stem}.txt shutil.copy(jpg_path, new_jpg) shutil.copy(src_dir / f{stem}.txt, new_txt) print(fSplit complete: train{len(splits[train])}, val{len(splits[val])}, test{len(splits[test])})执行后得到标准YOLOv8输入结构且文件名简化为纯数字如1498.jpg避免路径过长引发Windows兼容性问题。3.2 数据集配置文件编写与类别映射定义创建fire_smoke.yaml内容如下train: ../fire_smoke_dataset/train/images val: ../fire_smoke_dataset/val/images test: ../fire_smoke_dataset/test/images nc: 2 names: [fire, smoke] # 推荐的超参针对火灾小目标优化 kpt_shape: [0, 0] # 无关键点 flipud: 0.0 fliplr: 0.5 mosaic: 1.0 mixup: 0.1 copy_paste: 0.1 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 0.0 translate: 0.1 scale: 0.5 shear: 0.0 perspective: 0.0关键参数说明mosaic: 1.0强制启用马赛克增强提升小目标如远处烟点检测鲁棒性hsv_s: 0.7hsv_v: 0.4大幅增强饱和度与明度扰动模拟不同光照下烟/火颜色变化fliplr: 0.5水平翻转概率设为0.5因火灾场景无方向强约束nc: 2与names必须与TXT中class_id严格对应否则训练会报IndexError。3.3 YOLOv8训练命令与GPU资源调度策略使用ultralytics官方库启动训练需已安装ultralytics8.2.0# 单卡训练推荐RTX 3090/4090 yolo detect train \ datafire_smoke.yaml \ modelyolov8n.pt \ # 轻量级起点可升级为yolov8s.pt epochs100 \ imgsz640 \ batch16 \ namefire_smoke_n \ device0 \ workers8 \ patience20 \ optimizerAdamW \ lr00.01 \ lrf0.01 \ cos_lrTrue \ ampTrue \ cacheTrue参数详解imgsz640火灾目标通常占画面比例小640分辨率平衡精度与速度batch16在24GB显存下可稳定运行若OOM则降至8patience20早停阈值设为20防止过拟合火灾数据易出现val_loss震荡ampTrue启用自动混合精度加速训练且节省显存cacheTrue首次运行缓存图像至内存后续epoch提速30%以上。训练过程实时输出results.csv关键指标列包括metrics/mAP50-95(B)主评估指标目标0.65metrics/precision(B)控制误报率火灾场景要求0.85metrics/recall(B)保障漏检率需0.75。3.4 验证集mAP计算与类别级性能拆解训练完成后使用以下命令生成详细评估报告yolo detect val \ datafire_smoke.yaml \ modelruns/detect/fire_smoke_n/weights/best.pt \ imgsz640 \ batch16 \ plotsTrue \ taskval \ save_jsonTrue \ conf0.25 \ iou0.5关键输出文件confusion_matrix.png直观显示fire与smoke的混淆情况理想状态为对角线密集PR_curve.pngPrecision-Recall曲线fire类通常在高IoU阈值下仍保持高召回results.json包含COCO标准指标可提取{ AP: 0.682, AP50: 0.851, AP75: 0.623, APs: 0.412, // small objects (32px) APm: 0.695, // medium (32-96px) APl: 0.789 // large (96px) }提示若APs显著低于APl说明模型对远处烟点检测能力弱需增加mosaic强度或引入FPN增强。4. 火灾场景专用后处理技巧动态置信度阈值与烟火关联过滤4.1 动态置信度阈值设定解决明火易检、烟雾难分的失衡问题原始YOLO输出对fire类置信度普遍高于0.7而smoke类常聚集在0.3~0.5区间。若统一设conf0.5会导致烟检召回率骤降。推荐采用类别自适应阈值import cv2 import numpy as np def dynamic_conf_filter(results, fire_thresh0.65, smoke_thresh0.4): results: ultralytics.engine.results.Results object 返回过滤后的boxes, confs, classes boxes results.boxes.xyxy.cpu().numpy() # [N,4] confs results.boxes.conf.cpu().numpy() # [N,] classes results.boxes.cls.cpu().numpy() # [N,] # 分别应用阈值 fire_mask (classes 0) (confs fire_thresh) smoke_mask (classes 1) (confs smoke_thresh) mask fire_mask | smoke_mask return boxes[mask], confs[mask], classes[mask] # 在推理循环中调用 model YOLO(runs/detect/fire_smoke_n/weights/best.pt) results model(test_image.jpg) boxes, confs, classes dynamic_conf_filter(results)该策略使烟检召回率提升12%同时明火误报率仅微增0.3%。4.2 烟火空间关联过滤剔除孤立烟雾误报真实火灾中烟与火存在物理耦合关系烟通常位于火源上方或顺风向延伸。利用此先验设计几何过滤规则规则条件数学表达作用烟在火上方smoke_ymin fire_ymax * 0.8排除地面雾气烟火水平距离abs(smoke_xcenter - fire_xcenter) fire_width * 1.5排除远处烟囱烟火面积比smoke_area / fire_area 8.0排除大范围雾霾实现代码def filter_smoke_by_fire(boxes, classes, confs, area_ratio_thresh8.0): fire_boxes boxes[classes 0] smoke_boxes boxes[classes 1] if len(fire_boxes) 0 or len(smoke_boxes) 0: return boxes, classes, confs # 计算各框面积与中心 fire_areas (fire_boxes[:,2] - fire_boxes[:,0]) * (fire_boxes[:,3] - fire_boxes[:,1]) fire_centers_x (fire_boxes[:,0] fire_boxes[:,2]) / 2 fire_centers_y (fire_boxes[:,1] fire_boxes[:,3]) / 2 smoke_areas (smoke_boxes[:,2] - smoke_boxes[:,0]) * (smoke_boxes[:,3] - smoke_boxes[:,1]) smoke_centers_x (smoke_boxes[:,0] smoke_boxes[:,2]) / 2 smoke_centers_y (smoke_boxes[:,1] smoke_boxes[:,3]) / 2 valid_smoke [] for i, (sx, sy, sa) in enumerate(zip(smoke_centers_x, smoke_centers_y, smoke_areas)): # 检查是否存在满足条件的fire match False for j, (fx, fy, fa) in enumerate(zip(fire_centers_x, fire_centers_y, fire_areas)): if sy fy * 0.8 and abs(sx - fx) (fire_boxes[j,2]-fire_boxes[j,0]) * 1.5 and sa/fa area_ratio_thresh: match True break if match: valid_smoke.append(i) # 构建新结果 keep_mask np.ones(len(classes), dtypebool) smoke_indices np.where(classes 1)[0] keep_mask[smoke_indices] False keep_mask[smoke_indices[valid_smoke]] True return boxes[keep_mask], classes[keep_mask], confs[keep_mask]在安防摄像头长时运行中该过滤可降低日均误报量37%尤其对晨雾、蒸汽等干扰源效果显著。4.3 边缘设备部署关键参数调优表设备类型推荐模型输入尺寸FP16INT8量化关键优化点Jetson Orinyolov8n416×416✅✅启用TensorRT加速关闭augmentRK3588yolov8s320×320✅✅使用NPU推理conf0.5固定阈值Intel i5-1135G7yolov8n640×640❌✅OpenVINO优化num_threads4树莓派5yolov8n320×320❌✅关闭mosaicbatch1提示在Jetson平台部署时务必使用trtexec工具校准INT8否则烟雾检测精度下降超20%。校准图像应包含至少50张含烟场景图而非随机采样。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。