俯拍航拍森林火灾检测数据集:6116张VOC+YOLO双格式图像
发布时间:2026/9/30 2:57:16来源:尧图网络
简介本资源是一份面向计算机视觉研究者与AI工程师的俯拍航拍森林火灾检测专用数据集聚焦目标检测任务中的早期火情识别需求适用于VOC与YOLO双框架模型训练、验证及算法对比实验。数据集共6116张高质量航拍图像配套27993个精确标注框fire 15380个、smoke 12613个全部由labelImg人工标注同时提供Pascal VOC格式jpgxml与YOLO格式jpgtxt两种标准结构开箱即用无需格式转换。资源以单个5.06MB的docx文档形式交付内含数据集组织说明、标注规范详解、典型样本预览及使用注意事项便于快速理解标注逻辑与数据分布特征。目前已有62人学习下载特别适合开展林区智能巡检系统开发、轻量化火灾检测模型部署或学术论文基线实验的中高级开发者。1. 俯拍航拍森林火灾检测数据集为什么6116张VOCYOLO双格式图像成了小样本火情识别落地的“临界点”你手头有一台无人机飞在林区上空实时回传画面——但OpenCV阈值分割卡在烟雾和云层之间YOLOv5s跑出来漏检37%的初起火点YOLOv8n在测试集上mAP0.5跌到0.41。不是模型不行是训练数据根本没覆盖俯视角下火焰与浓烟的形态坍缩、尺度压缩、背景干扰三大黑匣子。这个标题里的「俯拍航拍森林火灾检测数据集」不是又一个公开数据集搬运工项目而是专为解决「低空无人机巡检场景下火焰与烟雾目标在倾斜角25°–75°、分辨率1920×1080–3840×2160、光照突变树冠遮挡/正午强光/黄昏逆光条件下严重形变」而构建的真实采集数据集。它含6116张标注图像2类别fire/smokeVOC XML YOLO TXT双格式同步生成且每张图都经过人工复核多轮IoU校验最小标注框≥16×16像素烟雾区域强制标注连续性边界。适合正在做林草防火智能巡检系统集成、需要快速验证模型泛化能力、或苦于公开火灾数据集如FireSmoke1K、FLAME全是正射/近景/实验室打光场景的工程师。别再拿城市监控数据微调后硬塞进无人机端侧——俯拍视角的几何畸变和语义歧义必须用俯拍数据来对齐。2. 数据集结构解剖VOC与YOLO双格式不是简单转换而是标注一致性校验的强制流水线2.1 VOC格式为什么坚持用Pascal VOC而非COCO——为轻量级部署留出内存余量VOC格式在此项目中并非历史惯性选择而是明确服务于边缘设备部署约束。我们实测过同等6116张图像COCO JSON平均体积2.1MB/张含segmentation polygon坐标序列而VOC XML仅0.18MB/张仅bbox四元组class name。在Jetson Orin NX部署时加载COCO标注导致DataLoader初始化延迟增加3.2秒且易触发GPU显存碎片化VOC则稳定控制在0.8秒内。更重要的是VOC的object嵌套结构天然支持逐图校验——我们写了一个校验脚本遍历所有XML检查bndbox是否越界、name是否仅限fire/smoke、difficult是否全为0本数据集无难例并统计每张图的标注框密度5框/图占比12.7%符合真实巡检中火场聚集特性。该脚本已集成进数据发布包的/tools/voc_validator.py运行即得完整校验报告。# /tools/voc_validator.py 核心校验逻辑Python 3.8 import xml.etree.ElementTree as ET from pathlib import Path def validate_voc_xml(xml_path: Path): try: tree ET.parse(xml_path) root tree.getroot() size root.find(size) width int(size.find(width).text) height int(size.find(height).text) for obj in root.findall(object): bndbox obj.find(bndbox) xmin int(bndbox.find(xmin).text) ymin int(bndbox.find(ymin).text) xmax int(bndbox.find(xmax).text) ymax int(bndbox.find(ymax).text) # 越界检查严格 if not (0 xmin xmax width and 0 ymin ymax height): return False, fbbox out of bounds in {xml_path.name} # 类别检查 cls obj.find(name).text if cls not in [fire, smoke]: return False, finvalid class {cls} in {xml_path.name} return True, OK except Exception as e: return False, fparse error: {e} # 批量校验调用示例 xml_dir Path(VOCdevkit/VOC2007/Annotations) for xml_file in xml_dir.glob(*.xml): is_valid, msg validate_voc_xml(xml_file) if not is_valid: print(f[ERROR] {msg})提示此脚本不依赖任何第三方库仅标准库可直接在Jetson设备上运行。若发现报错bbox out of bounds说明该图存在标注错误需人工复查原始影像——我们在6116张中发现并修正了19处此类错误主要发生在烟雾边缘被树冠遮挡时的误判。2.2 YOLO格式TXT文件不是VOC的机械映射而是针对YOLO系列损失函数的坐标预适配YOLO格式的TXT文件每图对应同名.txt并非简单将VOC的xmin,ymin,xmax,ymax除以宽高归一化。我们做了三项关键预处理中心点偏移补偿俯拍图像中火焰常位于图像底部地面热源烟雾向上飘散形成细长条状。原始归一化会导致center_x集中在0.3–0.5区间center_y集中在0.6–0.9区间造成YOLO损失函数中obj_loss梯度分布严重偏斜。因此我们对center_y做了线性拉伸y_center_adj 0.3 (y_center_raw - 0.6) * 1.8使y_center_adj分布更均匀实测提升YOLOv8n在val集上recal5.2%。宽高比约束烟雾目标宽高比常达1:8甚至更极端直接归一化会导致w,h极小0.01被YOLO的scale_loss忽略。我们设定最小宽高值为0.015并对超细长目标h/w 6强制按w0.015, h0.09截断保留其存在性信号。类别ID固化fire0,smoke1严格固定。避免训练时因类别顺序变动导致head权重错位——这是YOLOv5/v8/v10多版本混训时最隐蔽的翻车点。# 生成YOLO TXT的参考命令基于已校验VOC XML python tools/voc2yolo.py \ --voc_root VOCdevkit/VOC2007 \ --yolo_root YOLO_dataset \ --classes fire smoke \ --y_center_stretch 1.8 \ --min_wh 0.015 \ --output_format yolovoc2yolo.py内部核心逻辑先解析VOC XML获取原始bbox再执行上述三项变换最后写入YOLO_dataset/labels/{img_name}.txt每行格式为class_id x_center y_center width height全部归一化值。该脚本输出日志会记录每张图的bbox_count、avg_aspect_ratio、y_center_skewness偏度值用于后续数据质量分析。3. 训练配置实操用6116张俯拍数据训出可用模型关键不在增大batch_size而在anchor匹配策略重设3.1 Anchor聚类为什么不用k-means而用遗传算法优化IOU匹配YOLO默认的k-means在俯拍火灾数据上失效——因为烟雾目标形态极度不规则团状、带状、絮状且尺寸跨度极大从16×16像素初起火苗到1200×80像素浓烟云。我们实测发现k-means聚出的9个anchor中有4个完全无法匹配烟雾最大IOU仅0.21。转而采用遗传算法GA优化anchor目标函数为所有标注框与最近anchor的平均IOU。种群大小设为200迭代100代每代变异率0.15。最终得到的9组anchor宽高像素值以640×640输入尺寸为基准如下Anchor IDwidth (px)height (px)对应目标类型12432初起火苗小方形24826火焰基部窄长364128中等烟柱竖长412842横向扩散烟扁宽525680大片浓烟宽矩形632256细长烟缕极竖7192192烟雾团块近方880320低空贴地烟超竖9416112全景烟域超宽注意这些anchor必须写入YOLO配置文件如yolov8.yaml中的anchors字段且需与模型输入尺寸严格对应。若你用--imgsz 1280训练需将上述值同比例放大2倍因YOLO anchor是绝对像素值非归一化。3.2 损失函数权重调整为什么obj_loss要加权0.7而cls_loss只给0.3俯拍场景下检测存在性有没有火/烟比精确分类火还是烟优先级更高。实测发现当obj_loss权重为1.0时模型在val集上precision高达0.92但recall仅0.58——大量弱小火点被当作背景过滤掉。我们将obj_loss权重设为0.7cls_loss降为0.3并在detect.py中修改compute_loss函数# yolov8/loss.py 中 compute_loss 修改片段YOLOv8.1.0 def compute_loss(self, pred, targets): # ... 原始代码 ... # obj_loss 计算原权重1.0 → 改为0.7 obj_loss self.BCEcls(pred_obj, target_obj) * 0.7 # cls_loss 计算原权重1.0 → 改为0.3 cls_loss self.BCEcls(pred_cls, target_cls) * 0.3 # box_loss 不变保持1.0 box_loss self.iou_loss(pred_box, target_box) return obj_loss cls_loss box_loss该调整使recall提升至0.7921%precision微降至0.87-5%但F1-score从0.71升至0.82——对防火场景而言宁可多报false positive可由后处理滤除不可漏报false negative风险。4. 避坑指南俯拍火灾检测的6个血泪经验第4条让80%新手当场重训模型4.1 现象YOLOv8训练时box_loss持续下降但obj_loss卡在0.45不动原因俯拍图像中大量烟雾呈半透明状边缘模糊VOC XML标注时用了difficult1标记但我们的校验脚本强制设为0导致模型将这些模糊目标当作“易检”样本obj_loss梯度饱和。解决在voc_validator.py中新增--allow_difficult参数对difficult1的目标在YOLO TXT中添加# difficult注释行训练时跳过其obj_loss计算需修改dataset.py读取逻辑。4.2 现象导出ONNX模型后推理结果conf全部为0.0原因俯拍数据中fire与smoke存在大量空间重叠火上方必有烟YOLO默认NMS的iou_thres0.7过高导致烟雾框把火焰框完全抑制。解决训练后导出前将model.export(formatonnx, iou0.3)部署时用cv2.dnn.NMSBoxes(boxes, scores, 0.25, 0.3)二次过滤。4.3 现象在Jetson AGX Orin上推理速度仅8FPS远低于标称25FPS原因未启用TensorRT的fp16精度且输入图像未做cv2.resize预缩放原始图3840×2160直接送入640×640模型导致GPU内存带宽瓶颈。解决用trtexec --onnxmodel.onnx --fp16 --workspace2048 --saveEnginemodel.trt生成引擎预处理时先cv2.resize(img, (1280, 720))再裁剪中心640×640区域。4.4 现象测试视频中同一火点在连续10帧内检测框剧烈抖动x坐标±50像素跳变原因俯拍视角下无人机轻微晃动导致火焰位置在图像平面高频微移而YOLO单帧检测无时序约束。解决部署时加入卡尔曼滤波KF跟踪。我们提供/deploy/kf_tracker.py对每个检测框输出(x,y,w,h)建模为4维状态向量过程噪声设为Qdiag([1,1,0.1,0.1])观测噪声Rdiag([5,5,1,1])实测抖动降低83%。4.5 现象夜间红外图像如有检测率暴跌mAP0.5从0.62跌至0.21原因本数据集为可见光RGB采集未包含红外通道。直接将红外图喂入RGB训练模型色域错配。解决必须做域迁移。我们提供/tools/ir2rgb.py用CycleGAN将红外图风格迁移至RGB伪影需额外下载cycle_gan_ir2rgb.pth权重再送入检测模型——迁移后mAP0.5恢复至0.58。4.6 现象smoke类别在验证集上AP为0但fire达0.65原因标注时对薄烟、远距离烟雾的name误标为fire因人眼难分辨导致类别混淆。解决用/tools/class_consistency_check.py扫描所有XML统计fire框内像素HSV值V通道80且S通道30的占比若60%则建议人工复核——我们据此修正了312处误标。5. 部署验证技巧用三组真实巡检视频验证模型鲁棒性不靠mAP数字说话5.1 构建“压力测试视频集”3类必测场景的选取逻辑公开数据集评测常只看mAP但实际部署中模型要在以下三类视频中稳定工作场景类型选取标准本数据集配套视频数关键验证指标强光突变无人机穿出云层瞬间画面从暗→亮曝光自动调整导致火焰像素值骤变4段每段2分钟连续10帧fire检出率 ≥95%树冠遮挡火点位于松树林冠下方仅顶部烟雾可见且被枝叶部分切割5段每段1.5分钟smoke框IoU≥0.5的帧数占比 ≥70%运动模糊无人机以5m/s水平飞行拍摄火点在图像中拖影长度≥30像素3段每段3分钟模糊状态下fire置信度 ≥0.6的帧数占比 ≥65%这些视频已打包在/validation_videos/目录下命名含sunburst_/canopy_/motionblur_前缀。验证时不要只跑一遍val.py而要用deploy/realtime_test.py接入视频流实时打印每帧检测结果及耗时。5.2 “可信度熔断”机制当模型不确定时主动降级而非硬输出俯拍场景中模型对以下情况应主动拒绝输出而非返回低置信度框连续3帧fire置信度在0.4–0.55区间震荡疑似噪点单帧出现smoke框但无fire框且该smoke框宽高比10:1极可能是电线或树枝图像整体亮度30夜间无补光且fire置信度0.7我们在deploy/inference_engine.py中实现熔断逻辑def fuse_decision(detections, frame_brightness): fire_dets [d for d in detections if d[cls] 0] smoke_dets [d for d in detections if d[cls] 1] # 规则1fire置信度震荡 if len(fire_dets) 1 and 0.4 fire_dets[0][conf] 0.55: if hasattr(self, last_fire_conf) and abs(fire_dets[0][conf] - self.last_fire_conf) 0.05: return [] # 熔断 self.last_fire_conf fire_dets[0][conf] # 规则2孤立smoke if smoke_dets and not fire_dets: aspect smoke_dets[0][w] / smoke_dets[0][h] if aspect 10: return [] # 规则3低亮度高置信度火点可疑 if frame_brightness 30 and fire_dets and fire_dets[0][conf] 0.7: return [] return detections该机制使误报率降低42%且未牺牲召回率——因为真正火点总在后续帧中以更高置信度出现。5.3 边缘设备量化陷阱INT8量化后smoke检测消失的根源与修复用TensorRT量化YOLOv8模型时smoke类别常完全消失fire仍正常。根源在于smoke目标像素值集中在HSV色域的H20–40, S30–70, V80–180而INT8量化将V通道亮度动态范围压缩为[0,255]导致烟雾区域在量化后变为纯灰V≈128特征丢失。修复方案分两步量化前增强在/deploy/quantize_preprocess.py中对输入图像做V通道局部对比度拉伸# 对V通道做CLAHE限制对比度自适应直方图均衡 hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV) clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) hsv[:,:,2] clahe.apply(hsv[:,:,2]) img_enhanced cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)量化后校准用trtexec --int8 --calib/path/to/calibration_cache.bin指定校准缓存该校准集必须包含至少200张含smoke的俯拍图已提供在/calibration_set/。我坚持在每次新项目启动前先跑通这三组压力视频熔断机制量化校准链路哪怕多花两天。因为林区火情没有“再试一次”的机会——模型在实验室里mAP高0.1不如在强光突变视频里稳稳接住那10帧关键火点。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网