尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

yolov11火灾烟雾检测数据集:从训练到部署的完整实践

yolov11火灾烟雾检测数据集:从训练到部署的完整实践 简介数据集包含3600张已标注火灾烟雾图片面向使用YOLO系列算法的目标检测开发者旨在提升火灾烟雾识别精度与实时检测能力。图片覆盖不同场景、光照条件、烟雾密度和火灾阶段适合训练和评估基于YOLOv3/v4/v5/v8/v11等版本的检测模型。压缩包共2000个文件以XML标注文件为主另有4个TXT文件提供train/val/trainval/test划分信息整体大小244.77MB便于直接组织训练流程。已有203人学习使用。借助该数据集开发者可完成数据预处理、模型训练与评估等环节节省自建数据与手工标注成本为公共安全、工业及住宅场景的自动火灾监控系统提供可用训练材料。 做安防算法落地这些年我越来越确信一件事火灾烟雾数据集的质量直接决定 yolov11 这类检测模型在实际预警场景里的上限。火灾最可怕的地方在于烟雾往往比明火早出现几十秒甚至几分钟而这几分钟就是逃生的黄金窗口。好在监控摄像头已经把覆盖率铺得很广用视觉模型做烟雾识别几乎是成本最低的覆盖方案。这次我整理了一份已经标注好的 yolov11 火灾烟雾数据集共 3600 张图片正好用一篇文章把从数据体检、训练配置到部署落地的完整链路说透给正在做消防预警、安防监控和视觉检测的朋友提供一个可以直接上手的参考。1. 火灾烟雾检测为什么是预警系统的第一道哨兵1.1 烟雾比明火早出现预警窗口期全在这几十秒火灾发展通常经历初期、发展、猛烈、熄灭四个阶段。初期阶段明火还没起来但材料受热分解已经产生大量烟羽这是视觉检测能抓到的第一个可靠信号。温感和烟感探测器是点状部署一个探测器只能覆盖几平方米而一台摄像头能看到几十上百平方米的范围这就是视觉烟雾检测在消防预警里的核心价值。做消防项目的同行都知道预警系统宁可误报十次不愿漏报一次因为漏报一次整个系统就失去了存在的意义。火灾初期的烟羽特征在不同材料之间差异很大木质材料、电线短路、锂电池起火前期释放的烟雾浓度和颜色都不太一样。但共同点是烟雾一定是第一个被摄像头捕捉到的异常。我接触过不少消防报警项目客户反馈几乎都是等看到明火再报警基本已经晚了所以早期烟雾识别是整个预警系统里最值得投入的部分这也是为什么火灾烟雾检测不是锦上添花而是刚需功能。1.2 烟雾检测为什么比火焰检测难做火焰的特征极其鲜明高亮、橙黄、形态相对规则普通分类模型就能做得不错。烟雾恰恰相反它没有锐利边界颜色从白到黑都有形态随气流不断变化还经常半透明地贴在背景上。同一个烟羽顺光拍是一大团逆光拍几乎透明。再叠加真实监控环境里的干扰源雾天、霾天、厨房蒸汽、水汽、工业烟囱、路边烧烤的烟都会让模型误报。夜间摄像头切换到红外模式后画面变成灰度图烟雾和暗部的对比度大幅下降漏检率会明显上升。这些问题不是改网络结构就能解决的核心靠训练数据的多样性3600张图片覆盖的场景越广最终模型的泛化能力才越有保障。2. 这份3600张已标注数据集先搞清楚你手里有什么2.1 YOLO标注格式与目录结构这份数据集的定位是直接面向 yolov11 训练所以标注采用了目标检测里最通用的 YOLO 格式。解压后的目录结构如下fire_smoke_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/images 和 labels 里同名的 .jpg 和 .txt 一一对应。每个 txt 文件里一行代表一个标注目标格式是class_id x_center y_center width height四个坐标值全部是归一化坐标也就是除以原图宽高后的结果范围在 0 到 1 之间。比如一行0 0.512300 0.418200 0.236500 0.312800表示类别 id 为 0目标框中心位于图片横向 51.23%、纵向 41.82% 的位置框宽占整张图宽度的 23.65%框高占 31.28%。这种格式是 ultralytics 原生支持的拿到手不需要做任何转换直接就能开训。标注类别我是按两类处理的fire 和 smoke分别对应火焰和烟雾。2.2 上手第一件事先做标签体检我见过太多人拿到数据集就急着开训结果训练到一半发现标签有越界、空标注、坐标顺序错误浪费了大量时间。所以拿到数据集后的第一步应该写脚本做一次全量体检。一个基础的统计脚本长这样import os from collections import Counter label_dirs [labels/train, labels/val, labels/test] total_class_counter Counter() empty_files [] invalid_files [] for label_dir in label_dirs: for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue path os.path.join(label_dir, fname) with open(path, r) as f: lines f.readlines() if len(lines) 0: empty_files.append(fname) continue for line in lines: parts line.strip().split() if len(parts) ! 5: invalid_files.append(fname) break cls_id int(parts[0]) coords [float(x) for x in parts[1:]] if any(c 0 or c 1 for c in coords): invalid_files.append(fname) break total_class_counter[cls_id] 1 print(类别统计:, dict(total_class_counter)) print(空标注文件数:, len(empty_files)) print(异常文件数:, len(invalid_files))这个脚本会输出三组关键信息每个类别有多少个目标框、有多少空标注文件、有多少坐标越界文件。空标注和越界不一定必须删除但至少要心里有数。比如空标注文件对应的是确实没有目标的背景图那它作为负样本是有价值的不要直接丢弃越界坐标则要定位到具体文件检查是标注错误还是边界框本身就跨出了画面如果是标注错误训练前要修复。2.3 画框回看标注质量唯一可靠的验证方式统计脚本能发现格式问题但发现不了语义问题。比如某个框只框住了一半烟雾或者把烟雾边界画得过大甚至类别标反格式检查都看不出来。最可靠的办法是把标注框画回原图抽样肉眼检查。画框脚本如下import cv2 import os img_dir images/val label_dir labels/val save_dir visual_check os.makedirs(save_dir, exist_okTrue) colors {0: (0, 0, 255), 1: (0, 165, 255)} # fire红色, smoke橙色 names {0: fire, 1: smoke} for fname in os.listdir(img_dir): if not fname.endswith((.jpg, .png, .jpeg)): continue img cv2.imread(os.path.join(img_dir, fname)) h, w img.shape[:2] label_path os.path.join(label_dir, fname.rsplit(., 1)[0] .txt) if not os.path.exists(label_path): continue with open(label_path, r) as f: lines f.readlines() for line in lines: data line.strip().split() cls_id int(data[0]) x_center, y_center, bw, bh map(float, data[1:]) x1 int((x_center - bw / 2) * w) y1 int((y_center - bh / 2) * h) x2 int((x_center bw / 2) * w) y2 int((y_center bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), colors[cls_id], 2) cv2.putText(img, names[cls_id], (x1, max(0, y1 - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, colors[cls_id], 2) cv2.imwrite(os.path.join(save_dir, fname), img) print(可视化结果已保存到, save_dir)建议把 3600 张全部生成一遍然后快速翻阅。重点看四本文还有配套的精品资源点击获取
返回列表