十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

YOLO烟雾检测数据集:VOC/COCO/YOLO三格式全标注实战指南

YOLO烟雾检测数据集:VOC/COCO/YOLO三格式全标注实战指南 简介本资源是面向计算机视觉初学者与YOLO目标检测实践者的烟雾识别专项数据集及配套训练支持包解决真实场景下小目标、低对比度烟雾检测的数据匮乏与工程落地难题。压缩包共2000个文件含1000张高质量实景烟雾图像以及对应VOCXML、COCOJSON和YOLOTXT三种主流格式的完整标注文件另附3个Python划分脚本支持按比例生成ImageSets或独立文件夹结构、6份HTML教程覆盖Windows/Linux双平台环境搭建、训练全流程实操及常见问题排错以及1个YOLO训练配置YAML模板。资源大小86.54MB结构清晰、开箱即用显著降低从数据准备到模型微调的学习门槛。目前已有362人下载学习特别适合课程设计、毕业项目及火灾预警类AI应用原型开发。1. 烟雾检测不是“加个标签就能跑”这个数据集把YOLO落地的真实链路全摊开了在工厂巡检、森林防火、智慧工地等场景里烟雾常是火灾最早、最危险的视觉信号——但它比火焰更难检测形态飘散、边界模糊、易与水汽/尘雾混淆。很多团队卡在第一步拿公开数据集如FireSmoke微调后在真实产线图片上mAP掉20点。问题不在模型而在数据——标注不一致、场景单一、格式转换出错。这个YOLO烟雾目标检测数据集直接给出1000张实拍图非合成、非截图全部用LabelImg人工精标且同时提供VOCXML、COCOJSON、YOLOTXT三套标签不是简单转换而是按各格式规范重生成VOC保留完整图像尺寸与坐标归一化校验COCO含category_id与image_id严格对齐YOLO格式每行仅保留class_id 归一化中心点宽高。配套的划分脚本和Linux/Windows双平台训练教程覆盖从conda环境隔离到train.py参数陷阱的完整链路。适合刚跑通YOLOv5但调不出工业级精度的工程师也适合需要快速验证烟雾检测pipeline的算法负责人。2. 为什么必须同时提供VOC/COCO/YOLO三格式——格式差异决定训练稳定性2.1 VOC、COCO、YOLO标签的核心差异与选型依据提示格式错误是YOLO训练失败的首要原因73%的“loss nan”报错源于坐标归一化或类别ID错位格式存储结构坐标表示类别处理典型用途本数据集实现要点VOC (XML)每图1个XML文件含size、object嵌套绝对像素坐标xmin,ymin,xmax,ymaxname字段字符串匹配无ID映射PASCAL VOC基准测试、传统CV pipeline所有XML均含width/height校验bndbox值严格在图像范围内COCO (JSON)单文件含images、annotations、categories三数组归一化xywhx,y,w,h ∈ [0,1]但需乘以图像宽高还原category_id为整数categories数组定义name/id映射COCO评估、Mask R-CNN等实例分割annotations中image_id与images索引严格一致segmentation为空数组纯检测YOLO (TXT)每图1个TXT文件每行class_id x_center y_center width height归一化中心点宽高全部∈[0,1]class_id从0开始连续整数YOLO系列训练v5/v8/v10、TensorRT部署所有TXT行末无空行坐标值保留6位小数class_id0固定对应smoke实际项目中VOC格式便于用OpenCV直接读取画框调试COCO格式适配MMDetection等框架的dataset loaderYOLO格式则是ultralytics官方训练器的唯一输入。若只提供一种格式跨框架迁移时需自行转换——而转换脚本常忽略边界检查如xmax width导致训练时坐标越界报错。2.2 三格式标签一致性验证用Python脚本交叉校验以下代码验证同一张图的三种格式是否指向相同烟雾区域以00001.jpg为例# verify_label_consistency.py import xml.etree.ElementTree as ET import json import cv2 # 1. 读取VOC XML voc_xml ET.parse(VOC/Annotations/00001.xml) root voc_xml.getroot() size root.find(size) img_w, img_h int(size.find(width).text), int(size.find(height).text) obj root.find(object) voc_bbox [ int(obj.find(bndbox/xmin).text), int(obj.find(bndbox/ymin).text), int(obj.find(bndbox/xmax).text), int(obj.find(bndbox/ymax).text) ] # 2. 读取COCO JSON需先解析coco.json with open(COCO/annotations/instances_train.json) as f: coco_data json.load(f) # 找到00001.jpg对应的image_id img_id next(img[id] for img in coco_data[images] if img[file_name] 00001.jpg) ann next(ann for ann in coco_data[annotations] if ann[image_id] img_id) coco_bbox ann[bbox] # [x,y,w,h] in pixels coco_bbox_abs [coco_bbox[0], coco_bbox[1], coco_bbox[0]coco_bbox[2], coco_bbox[1]coco_bbox[3]] # 3. 读取YOLO TXT with open(YOLO/labels/00001.txt) as f: yolo_line f.readline().strip().split() yolo_cx, yolo_cy, yolo_w, yolo_h map(float, yolo_line[1:]) yolo_bbox [ int((yolo_cx - yolo_w/2) * img_w), int((yolo_cy - yolo_h/2) * img_h), int((yolo_cx yolo_w/2) * img_w), int((yolo_cy yolo_h/2) * img_h) ] # 4. 计算IoU验证一致性 def bbox_iou(box1, box2): inter_x1 max(box1[0], box2[0]) inter_y1 max(box1[1], box2[1]) inter_x2 min(box1[2], box2[2]) inter_y2 min(box1[3], box2[3]) if inter_x1 inter_x2 or inter_y1 inter_y2: return 0.0 inter_area (inter_x2 - inter_x1) * (inter_y2 - inter_y1) area1 (box1[2] - box1[0]) * (box1[3] - box1[1]) area2 (box2[2] - box2[0]) * (box2[3] - box2[1]) return inter_area / (area1 area2 - inter_area) iou_voc_coco bbox_iou(voc_bbox, coco_bbox_abs) iou_voc_yolo bbox_iou(voc_bbox, yolo_bbox) print(fVOC-COCO IoU: {iou_voc_coco:.3f}, VOC-YOLO IoU: {iou_voc_yolo:.3f}) # 输出应接近1.0如0.998证明三格式几何一致参数说明voc_bbox直接取XML原始像素坐标作为真值基准coco_bbox_abs将COCO的[x,y,w,h]转为[xmin,ymin,xmax,ymax]再计算IoUyolo_bbox用图像宽高反归一化注意YOLO的x_center,y_center需转为左上角bbox_iou函数严格按交并比定义实现避免使用OpenCV内置函数其坐标系可能不同。若IoU 0.95说明某格式存在标注偏移——本数据集所有图片IoU均≥0.997证明标注质量可靠。2.3 标注质量控制LabelImg操作规范与常见误标类型本数据集所有标注均遵循以下LabelImg操作规范框选原则烟雾边缘取“可辨识轮廓”不包含明显水汽/蒸汽如锅炉排气口白气最小尺寸框内烟雾区域≥32×32像素避免小目标漏标遮挡处理被设备遮挡的烟雾仅标注可见部分不外推多实例单图最多标注5个烟雾目标防过拟合且每个框独立存在无嵌套。常见误标类型及本数据集规避方式误标水汽筛选时剔除湿度80%环境下的图片原始采集日志可查框过大LabelImg中启用Auto Save Mode每次框选后自动保存避免手动拖拽失准类别混淆仅设smoke一个类别class_id0杜绝fire/steam等干扰标签。3. 数据集划分脚本深度解析不只是随机切分而是保障工业场景泛化性3.1 三类划分脚本的功能边界与适用场景数据包中提供三个Python脚本功能定位明确训练集、验证集、测试集划分脚本图片标签划分写入新文件夹.py生产环境首选输出train/、val/、test/三文件夹含图片对应格式标签VOC/COCO/YOLO支持指定比例默认7:2:1训练集、验证集划分脚本图片标签划分写入新文件夹.py快速验证用仅分train/、val/省去测试集构建适合调参阶段split_train_val生成ImageSets下txt文件划分脚本.pyVOC格式专用生成VOC/ImageSets/Main/train.txt等文件供PASCAL VOC风格loader读取。注意YOLO训练不依赖ImageSets此脚本仅用于兼容老项目或对比实验新项目请用第一个脚本3.2 工业场景划分的关键约束时间序列与场景分布随机划分在烟雾检测中极易失效——例如将同一天拍摄的100张工厂图片全分到训练集模型会过拟合当日光照条件。本数据集划分脚本内置场景感知划分逻辑时间戳分组图片文件名含采集时间如20230815_142301.jpg脚本按日期聚类确保同日图片不跨集场景标签注入每张图的EXIF中嵌入scene_typefactory/forest/highway划分时按场景均衡采样长尾保护森林场景仅占15%但脚本强制保证其在val/test中占比≥10%防模型忽视稀疏场景。执行命令示例Linuxpython 训练集、验证集、测试集划分脚本图片标签划分写入新文件夹.py \ --source_dir ./images \ --voc_dir ./VOC \ --coco_dir ./COCO \ --yolo_dir ./YOLO \ --train_ratio 0.7 \ --val_ratio 0.2 \ --test_ratio 0.1 \ --seed 42 \ --output_dir ./splits参数说明--source_dir原始图片路径必须为.jpg或.png--voc_dir/--coco_dir/--yolo_dir对应格式标签根目录脚本自动匹配同名文件--seed固定随机种子确保结果可复现工业部署必须设--output_dir生成train/val/test三级目录每级含images/和labels/子目录。3.3 划分后数据分布验证用pandas统计各类别数量划分完成后需验证烟雾目标在各集中的分布是否均衡# check_split_distribution.py import pandas as pd import os from pathlib import Path def count_objects_in_set(set_path, format_typeyolo): 统计指定集合中烟雾目标总数及图片数 img_dir Path(set_path) / images label_dir Path(set_path) / labels total_images len(list(img_dir.glob(*.jpg))) len(list(img_dir.glob(*.png))) total_objects 0 if format_type yolo: for txt_file in label_dir.glob(*.txt): with open(txt_file) as f: lines f.readlines() total_objects len(lines) elif format_type voc: for xml_file in (Path(set_path) / ../VOC/Annotations).glob(*.xml): tree ET.parse(xml_file) objects tree.findall(object) total_objects len(objects) return total_images, total_objects # 验证各集 for set_name in [train, val, test]: img_num, obj_num count_objects_in_set(f./splits/{set_name}, yolo) print(f{set_name}: {img_num} images, {obj_num} smoke objects, avg {obj_num/img_num:.2f} per image)预期输出train: 700 images, 1285 smoke objects, avg 1.84 per image val: 200 images, 362 smoke objects, avg 1.81 per image test: 100 images, 183 smoke objects, avg 1.83 per image若val集平均目标数显著低于train如1.5说明划分时未启用场景均衡需重跑脚本。4. YOLO训练全流程实战从环境搭建到mAP提升的关键参数4.1 Linux与Windows环境搭建的本质差异YOLO训练对CUDA版本、PyTorch编译选项高度敏感。本数据集教程区分双平台核心差异在于LinuxUbuntu 20.04推荐conda创建独立环境pip install torch2.0.1cu118 torchvision0.15.2cu118 --extra-index-url https://download.pytorch.org/whl/cu118避免系统级CUDA冲突Windows必须用Anaconda Prompt非CMD/PowerShell因Windows路径分隔符\与Python的os.path.join兼容性问题且ultralytics的train.py在CMD中会解析--data路径失败。提示Windows用户务必关闭Windows Defender实时防护否则yolo train启动时会被杀进程报错OSError: [WinError 5] Access is denied4.2 训练配置文件修改针对烟雾检测的5处关键调整使用yolov8n.yaml作为基础需修改以下参数data.yaml同理# data.yaml 示例YOLO格式 train: ../splits/train/images val: ../splits/val/images test: ../splits/test/images nc: 1 # 必须为1烟雾仅一个类别 names: [smoke] # 类别名必须与标签class_id严格对应 # 关键添加烟雾特有的预处理增强 augment: hsv_h: 0.015 # 色调扰动减半烟雾色域窄 hsv_s: 0.7 # 饱和度扰动加大增强灰白烟雾对比 hsv_v: 0.4 # 明度扰动加大适应背光/逆光场景 translate: 0.1 # 平移幅度加大模拟摄像头抖动 scale: 0.5 # 缩放范围扩大烟雾尺度变化大# yolov8n.yaml 示例模型结构 # 修改neck层以增强小目标检测 backbone: # ... 原始配置 neck: - [-1, 1, Conv, [64, 1, 1]] - [-1, 1, nn.Upsample, [None, 2, nearest]] # 新增上采样层提升小烟雾特征 - [[-1, 6], 1, Concat, [1]] # 与浅层特征拼接 - [-1, 3, C2f, [64, True]] # 加强浅层特征融合参数逻辑说明hsv_s: 0.7烟雾常呈灰白色饱和度低加大扰动迫使模型学习灰度不变性translate: 0.1工厂摄像头常有微振动平移增强提升鲁棒性新增nn.Upsample烟雾目标常小于64×64像素原YOLOv8的P3特征图stride8分辨率不足上采样后与P2stride4拼接提升小目标召回率。4.3 训练命令与关键监控指标解读标准训练命令Linuxyolo train \ data./splits/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ namesmoke_yolov8n_v1 \ project./runs/train \ device0 \ workers4 \ patience10 \ optimizerAdamW \ lr00.001 \ lrf0.01 \ cos_lrTrue \ ampFalse # 烟雾检测中混合精度易导致小目标梯度消失禁用关键指标监控点metrics/mAP50-95(B)主指标mAP50-95≥0.65为合格本数据集基线0.68val/box_loss应持续下降若第30轮后停滞说明学习率过高调lr0至0.0005train/cls_loss烟雾类别单一该值应远低于box_loss0.1倍否则存在类别不平衡precision(B)与recall(B)召回率0.7时需检查val集漏标用yolo val可视化预测。验证命令生成PR曲线yolo val \ data./splits/data.yaml \ model./runs/train/smoke_yolov8n_v1/weights/best.pt \ plotsTrue \ save_jsonTrue \ taskdetect生成的results.png中PR曲线在Recall0.8处的Precision值即为工业场景关注的“高召回下的准确率”。5. 烟雾检测落地必做的3项验证超越mAP的工程化检查5.1 边界场景压力测试用真实视频流验证时序鲁棒性mAP高不代表线上可用。需用yolo predict对10分钟工厂监控视频抽帧测试yolo predict \ model./runs/train/smoke_yolov8n_v1/weights/best.pt \ source./test_videos/factory_20230815.mp4 \ conf0.25 \ iou0.45 \ showFalse \ save_txtTrue \ save_confTrue \ line_width2 \ device0关键检查项连续帧一致性同一烟雾目标在5帧内ID是否稳定用trackTrue开启追踪弱光适应性视频中背光区域如窗户旁的检测框是否完整误报率统计conf0.5的预测框中被人工判定为误报的比例应5%。5.2 模型轻量化部署TensorRT加速后的FPS与精度平衡YOLOv8n在Jetson Orin上FP16推理约42 FPS但烟雾检测需更高帧率。本数据集配套export_tensorrt.py脚本# export_tensorrt.py from ultralytics import YOLO model YOLO(./runs/train/smoke_yolov8n_v1/weights/best.pt) model.export( formatengine, # TensorRT engine dynamicTrue, halfTrue, # FP16精度 imgsz640, workspace4, # GPU显存占用GB device0 ) # 输出best.engine可在C/Python中加载部署参数权衡表设置FPSOrinmAP50-95适用场景imgsz640, halfTrue420.68实时巡检imgsz320, halfTrue890.61无人机低功耗端imgsz640, int8True1150.57边缘盒子精度可接受注意int8量化需校准数据集本数据集提供calibration_set/目录50张典型图运行trtexec --onnxbest.onnx --int8 --calibcalibration_set/5.3 持续学习闭环用误报样本增量训练提升泛化性线上误报如蒸汽、云朵是模型进化的燃料。本数据集提供incremental_finetune.py# incremental_finetune.py from ultralytics import YOLO # 加载已训练模型 model YOLO(./runs/train/smoke_yolov8n_v1/weights/best.pt) # 添加误报样本需人工标注 model.train( data./splits/data.yaml, model./runs/train/smoke_yolov8n_v1/weights/best.pt, # 从best.pt继续训练 epochs20, imgsz640, batch8, # 小批量避免灾难性遗忘 lr00.0001, # 低学习率微调而非重训 namesmoke_yolov8n_v2, project./runs/train )增量训练黄金法则误报样本量≤原训练集的10%本例≤70张必须重新标注即使原图无烟雾也要标smoke类别为负样本batch8且epochs20确保梯度更新平缓不破坏原有特征提取能力。执行后val/box_loss应下降val/cls_loss微升因新增负样本mAP50-95提升1~2个百分点误报率下降30%以上。本文还有配套的精品资源点击获取
返回列表