新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于YOLOv8的田间焚烧灰烬残留检测:221张图小样本训练与VOC转YOLO全流程

发布时间:2026/9/26 14:03:46来源:尧图网络
基于YOLOv8的田间焚烧灰烬残留检测:221张图小样本训练与VOC转YOLO全流程
简介这份资源面向从事目标检测、智慧农业与秸秆禁烧监测的开发者与研究者提供田间农作物焚烧场景的标注数据集覆盖火、烟雾、灰烬三类目标可用于训练烟火识别、焚烧行为检测等模型。压缩包共665个文件包含221张jpg原图、221个VOC格式xml标注和223个txt文件含YOLO格式标签整体约16.33MB图片清晰且未做数据增强标签均为矩形框其中灰烬275框、火143框、烟雾170框合计588个标注框可直接用于YOLO与VOC双格式训练流程。目前已有152人学习下载。数据集来自网页爬取后人工标注场景贴近农村田间实际适合作为小样本检测任务的基线数据帮助读者快速验证模型在烟火与灰烬识别上的表现并可按需扩充或调整标签体系。1. 221 张灰烬图能训出什么田间焚烧残留检测的数据集底子田里烧完秸秆、杂草之后留下的灰烬在可见光图像里就是一片低对比度的暗斑跟湿土、阴影、深色地膜极易混淆。我拿到的这个数据集标题写得很直白221 张图、3 个标签、同时给 YOLO 和 VOC 两套标注格式。它解决的不是能不能检测火这种问题而是焚烧事后的残留识别——灰烬堆、焚烧痕迹、未燃尽残茬这三类目标。适合谁用做农业遥感落地、环保巡查无人机、秸秆禁烧事后核查的团队以及想拿一个小而脏的真实数据集练 YOLO 全流程的人。221 张这个量级注定它不是拿来刷 SOTA 的而是拿来验证这条技术路线在你们场景里到底跑不跑得通的。先把这个预期立住后面所有参数和坑才有意义。这个数据集的真实价值在于小样本 双格式 真实田间背景三件事叠在一起。小样本逼你把数据增强和迁移学习做扎实双格式让你能在 YOLO 和两阶段检测器之间快速横跳做对比真实田间背景则意味着光照、土壤湿度、拍摄角度全都不受控。我一般会先花半小时把 221 张图全部翻一遍统计每类目标的框数分布再决定后面训练策略。这一步不做后面调参全是玄学。2. 拆开压缩包先看什么VOC 与 YOLO 双格式的结构差异2.1 两套标注格式到底差在哪VOC 格式的核心是每张图对应一个 XML 文件里面用object节点描述每个目标包含name、bndbox四个坐标xmin、ymin、xmax、ymax坐标是绝对像素值。YOLO 格式则是每张图一个 txt每行一个目标格式是class_id cx cy w h后四个都是归一化到 0~1 的相对值且 cx、cy 是框中心点。这个差异决定了你转换时最容易翻车的地方归一化除的是原图宽高一旦某张图尺寸记录错了框就会整体偏移。我拿到这个数据集第一件事是确认目录结构。常见做法是 VOC 放在Annotations/XML和JPEGImages/原图YOLO 放在images/和labels/。先跑一遍文件数核对# 统计各目录文件数确认 221 张是否对齐 echo 原图:; ls JPEGImages/ | wc -l echo VOC标注:; ls Annotations/ | wc -l echo YOLO图像:; ls images/ | wc -l echo YOLO标签:; ls labels/ | wc -l四个数字必须一致或 YOLO 图像与 VOC 原图指向同一批。只要有一个对不上说明有图漏标或漏拷这种脏数据直接进训练会让 loss 曲线出现莫名其妙的尖刺。参数上没什么可调的这一步就是纯核对。2.2 三个标签的类别映射必须锁死3 个标签意味着类别索引只有 0、1、2。VOC 里是字符串类别名YOLO 里是整数 id两者必须建立一张固定映射表。我一般会写一个脚本从所有 XML 里扫出全部name去重确认真的只有 3 类而不是标注时手滑打出了第 4 种拼写。import os, glob from xml.etree import ElementTree as ET names set() for xml in glob.glob(Annotations/*.xml): root ET.parse(xml).getroot() for obj in root.findall(object): names.add(obj.find(name).text.strip()) print(实际类别:, sorted(names)) # 期望只有 3 个 # 固定映射顺序一旦定下就不能改 classes sorted(names) name2id {n: i for i, n in enumerate(classes)} print(name2id)逻辑说明遍历所有 XML把name收进集合去重。如果打印出来是 3 个说明标注干净如果冒出 4 个以上多半是灰烬和灰烬堆这种同义不同写得先人工统一。name2id一旦生成就写进classes.txt训练、推理、可视化全程共用这一份避免训练时 id0 是灰烬、推理时 id0 变成残茬这种低级事故。3. 从 VOC 转 YOLO转换脚本与四个边界坑3.1 转换脚本怎么写才不出错虽然数据集号称双格式但实际用的时候我仍然会自己转一遍因为别人给的 YOLO 标签未必和你的类别顺序一致。转换的核心就是读 XML、算归一化中心点和宽高、写 txt。import os, glob from xml.etree import ElementTree as ET from PIL import Image name2id {ash: 0, burn_mark: 1, stubble: 2} # 按你实际类别改 os.makedirs(labels, exist_okTrue) for xml in glob.glob(Annotations/*.xml): root ET.parse(xml).getroot() img_name root.find(filename).text img_path os.path.join(JPEGImages, img_name) w, h Image.open(img_path).size # 用真实图像尺寸别信 XML 里的 size lines [] for obj in root.findall(object): cls obj.find(name).text.strip() if cls not in name2id: continue bb obj.find(bndbox) xmin float(bb.find(xmin).text) ymin float(bb.find(ymin).text) xmax float(bb.find(xmax).text) ymax float(bb.find(ymax).text) # 裁剪越界坐标防止出现负值或超过1 xmin, xmax max(0, xmin), min(w, xmax) ymin, ymax max(0, ymin), min(h, ymax) cx (xmin xmax) / 2 / w cy (ymin ymax) / 2 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{name2id[cls]} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) with open(flabels/{os.path.splitext(img_name)[0]}.txt, w) as f: f.write(\n.join(lines))逻辑说明关键点是用 PIL 读真实图像尺寸而不是 XML 里size节点写的宽高。很多标注工具导出的 size 是旧的图被裁过之后 size 没更新直接拿它归一化框会整体错位。坐标裁剪那两行是后悔药防止标注时框拖出边界导致归一化后出现负数或大于 1 的值YOLO 训练时这类值会直接报错或产生 NaN。3.2 四个必须检查的边界坑第一个坑空标签文件。某张图确实没有目标转换后 txt 是空的这本身合法但有些训练脚本会把空文件当损坏数据跳过导致这张图被静默丢弃。第二个坑文件名带空格或中文YOLO 的 dataloader 在某些环境下会读不到。第三个坑宽高为 0 的退化框xmin 等于 xmax 时 bw0训练时 IoU 计算会出问题。第四个坑类别顺序不一致前面已经强调过。# 快速体检找出空标签、退化框、异常坐标 for f in labels/*.txt; do [ -s $f ] || echo 空标签: $f awk {if($40 || $50) print 退化框:, FILENAME, $0} $f done这段体检脚本我每次转换完必跑。空标签要人工确认是真没目标还是漏标退化框直接删掉那一行坐标超出 [0,1] 的说明裁剪逻辑没生效回头查图像尺寸。221 张图跑一遍不到十秒能省下后面几小时的排查。4. 221 张图怎么训YOLOv8 配置与增强参数4.1 环境与最小训练命令221 张属于典型小样本我一般用 YOLOv8n 或 YOLOv8s 起步预训练权重必须加载否则从零训基本学不出东西。环境上Anaconda 建个干净环境装 ultralytics 即可CUDA 版本按你显卡来V100 和消费级卡都能跑。conda create -n ash python3.10 -y conda activate ash pip install ultralytics # 最小训练命令 yolo detect train dataash.yaml modelyolov8n.pt epochs150 imgsz640 batch16ash.yaml里写清train、val路径、nc: 3和names列表。imgsz640是默认如果原图分辨率远大于 640灰烬这种小目标会被缩没可以考虑imgsz960但显存要够。batch16在 221 张图上意味着一个 epoch 只有约 14 个 iteration所以epochs要给到 150 以上否则模型根本没看够数据。4.2 小样本下增强参数怎么设小样本的核心矛盾是增强太弱容易过拟合增强太强会把灰烬这种低对比度目标彻底糊掉。我一般会关掉或调低几个激进增强。参数默认我的建议原因mosaic1.00.5四图拼接对低对比度目标干扰大hsv_v0.40.3亮度抖动太强灰烬和阴影更难分degrees0.05.0田间拍摄有轻微旋转小幅够用fliplr0.50.5左右翻转安全保留mixup0.00.0小样本上 mixup 收益不稳定先关yolo detect train dataash.yaml modelyolov8n.pt epochs150 imgsz640 \ mosaic0.5 hsv_v0.3 degrees5.0 mixup0.0参数说明mosaic0.5表示一半概率做四图拼接降低后模型更容易看到完整单图上下文。hsv_v控制亮度扰动幅度灰烬本身就是暗目标扰动过强会让它和湿土混在一起。degrees5.0给一点旋转不变性。这些值不是标准答案是我在类似低对比度农业数据上反复试出来的起点你可以在验证集 mAP 上做小范围网格。4.3 训练过程盯什么指标221 张图验证集可能只有 40 多张mAP 波动会很大别被单个 epoch 的数字带偏。我一般盯三件事train/box_loss是否稳定下降、metrics/mAP50是否在 100 epoch 后趋于平台、以及验证集预测可视化里有没有把阴影误检成灰烬。如果 mAP50 卡在 0.3 以下不动先别调模型回去查标签质量——小样本上标签错误的影响被放大得特别明显。5. 避坑与排查小样本灰烬检测的五个血泪记录5.1 现象mAP 一直上不去loss 却降得很好原因训练集和验证集分布不一致比如验证集全是阴天图训练集全是晴天图。221 张图如果按顺序切分很容易出现这种偏斜。解决切分前先按拍摄时间或光照条件分层或者干脆用随机种子多切几次取平均别用默认的前 80% 后 20%。5.2 现象模型把阴影全检成灰烬原因灰烬和阴影在灰度上高度重叠模型学到的是暗这个特征而不是灰烬的纹理。解决在增强里加入更强的色彩抖动hsv_h、hsv_s调高逼模型关注纹理同时检查标签里有没有把大片阴影误标成灰烬这种脏标签会直接教坏模型。5.3 现象训练报错 negative coordinates 或直接 NaN原因VOC 转 YOLO 时没做坐标裁剪框超出图像边界归一化后出现负值或大于 1。解决回到 3.1 的转换脚本确认max(0, xmin)和min(w, xmax)那两行生效然后重跑体检脚本。5.4 现象推理时框位置整体偏移原因转换时用了 XML 里的size而不是真实图像尺寸两者不一致。解决统一用 PIL 或 OpenCV 读图取尺寸永远不信标注文件里的 size 字段。5.5 现象某个类别几乎检不出来原因3 个标签的样本数严重不均衡比如灰烬 200 个框、残茬只有 15 个框。解决先统计每类框数对稀有类做针对性过采样或者用copy_paste增强把稀有类贴到其他图上。如果某类框数少于 30基本可以判定这个数据集训不出可用的该类检测器得先补数据。6. 把 221 张用到极致交叉验证与推理阈值微调小样本数据集最忌讳的就是训一次看个 mAP 就完事。我一般会做 5 折交叉验证把 221 张分成 5 份轮流做验证这样得到的 mAP 才有统计意义而不是某一次随机切分的运气。做法上写个脚本生成 5 份ash_fold{i}.yaml每份的 train/val 路径不同然后循环训练。for i in 0 1 2 3 4; do yolo detect train dataash_fold$i.yaml modelyolov8n.pt epochs150 imgsz640 namefold$i done跑完 5 折把每折的metrics/mAP50拉出来看均值和方差。如果方差超过 0.1说明数据分布太不均匀得回头做分层切分。这个流程比单次训练多花 5 倍时间但对 221 张这种量级是判断这条路到底行不行最靠谱的方式。推理阶段的阈值微调同样关键。灰烬检测里置信度门限调高会漏掉暗弱目标调低会引入大量阴影误检。我一般会在验证集上扫一遍 0.1 到 0.5 的阈值画一条 precision-recall 曲线取 F1 最高的点。from ultralytics import YOLO model YOLO(runs/detect/fold0/weights/best.pt) for conf in [0.1, 0.2, 0.25, 0.3, 0.4, 0.5]: m model.val(dataash_fold0.yaml, confconf) print(conf, m.box.map50, m.box.mp, m.box.mr)逻辑说明conf是推理置信度门限map50是 IoU0.5 下的平均精度mp、mr是平均精确率和召回率。灰烬这种目标我通常会把门限设在 F1 峰值略偏召回的一侧宁可多检几个可疑区域让人工复核也别漏掉真正的焚烧点。这个取舍取决于你的下游是自动执法还是人工核查没有统一答案。最后说个我自己的习惯每次拿到新的小样本数据集我都会先只用 20 张图训一个极简模型看它能不能在训练集上过拟合到 mAP 接近 1.0。如果连过拟合都做不到说明数据或流程有硬伤这时候调任何超参都是浪费时间。221 张不算多但足够你把从格式转换、增强配置到交叉验证的整条链路走通一遍这套流程搬到烟草病虫害、鸟类识别这类同样小样本的农业检测任务上基本可以直接复用。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

从零搭建一个简单的MCP Server:FastMCP + UV + stdio 本地实践 2026/9/26 16:51:07

从零搭建一个简单的MCP Server:FastMCP + UV + stdio 本地实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Python 连 MySQL 查询报 AttributeError: ‘Connection‘ object has no attribute ‘curson‘:用 TaoToken 统一 Key 排 2026/9/26 16:51:07

Python 连 MySQL 查询报 AttributeError: ‘Connection‘ object has no attribute ‘curson‘:用 TaoToken 统一 Key 排

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
codex cli 常用快捷键与指令速查:TaoToken 统一 Key 配置与验证 2026/9/26 16:51:00

codex cli 常用快捷键与指令速查:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
从OpenClaw、Palantir、SpaceX看颠覆式创新的四个层次(3):用TaoToken统一Key打通AI工具链配置 2026/9/26 16:51:00

从OpenClaw、Palantir、SpaceX看颠覆式创新的四个层次(3):用TaoToken统一Key打通AI工具链配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
GitHub开源项目日报 · 2026年8月5日 · AI编码代理技能包风靡开源榜:TaoToken统一Key接入配置实战 2026/9/26 16:51:00

GitHub开源项目日报 · 2026年8月5日 · AI编码代理技能包风靡开源榜:TaoToken统一Key接入配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
深入解析MCP:从Function Call到Prompt,一篇文章讲透原理与实践并配好TaoToken 2026/9/26 16:50:54

深入解析MCP:从Function Call到Prompt,一篇文章讲透原理与实践并配好TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉