资讯动态

农业害虫目标检测数据集实战:从格式转换到避坑指南

发布时间:2026/10/20 13:59:58 来源:尧图企业网站定制
简介农业害虫目标检测数据集提供378张农田监控图像按训练集333张、验证集29张、测试集16张划分覆盖蚜虫、粘虫成虫/幼虫、黑切虫成虫/幼虫5类高危害害虫并全部采用YOLO格式标注归一化边界框与类别索引。数据集面向智能农业监测系统开发、农作物保护应用研发、农业AI学术研究及农林院校数字化教学尤其适合无人机航拍识别、移动端农事APP中的害虫自动检测与预警。压缩包共758个文件主要包含378个jpg原始图像与一一对应的378个txt标注文件另附1个yaml配置和1个docx说明文档整体仅18.11MB轻量易下载。目前已有483人学习下载。资源真实采样自田间监控环境保留复杂背景下的成虫与幼虫多样姿态可提升模型野外部署鲁棒性除目标检测外还能扩展用于害虫分类、虫口计数等衍生任务为精准施药决策和虫情预警提供直接数据支撑。1. 农业害虫目标检测数据集 22.zip不拆开就动手训练的人第一晚必翻车第一次拿到这份压缩包的人多数会直接解压、丢进训练脚本、开跑。然后大概率在第二晚开始怀疑人生mAP 看着还行可视化出来满屏框都打在叶片上害虫反而被漏掉。这个标题拆开就两件事——一份农业害虫的检测数据加一个编号。但数据集这类东西真正值钱的不是里面多少张图而是你拆包之后有没有能力把它变成能训的格式、能信的指标。这篇文章写给带着实际任务的从业者你要么有检测需求但没有数据要么手里有数据但被格式和标注质量卡住。看完你能在两个小时左右把这份数据跑出第一批框并且知道哪些数字可以信、哪些数字是假象。2. 拆包先拆目录摸清标注格式、标签体系与数据陷阱数据集压缩包的内核无非两样图片和标注。把这两样盘清楚之前任何训练脚本都先不要碰。整个第 2 章的目标就是干一件事用最少的命令判断这份数据是“拿到就能训”还是“需要先做外科手术”。2.1 只用三条命令十分钟摸清这份数据集的骨相拿到 zip 先解压到一个干净目录然后按顺序跑三条命令。我一般不会去看数据集的说明文档——文档经常描述的是整理时的理想状态真实内容和它有出入命令输出才是真相。unzip 农业害虫目标检测数据集22.zip -d agri22 cd agri22 # 先看两级目录形状 find . -maxdepth 2 -type d | sort # 再看标注文件类型和数量 find . -type f \( -name *.xml -o -name *.txt -o -name *.json \) | awk -F. {print $NF} | sort | uniq -c # 最后看图片数量 find . -type f \( -name *.jpg -o -name *.jpeg -o -name *.png \) | wc -l第一条命令输出目录层级能在十秒内判断数据组织方式。常见做法里VOC 风格的数据会长这样Annotations/、JPEGImages/、ImageSets/Main/三兄弟YOLO 风格则是images/和labels/并列。如果你看到的布局不属于这两者比如 XML 和 JPG 混在同一层那就要做好写定制解析脚本的准备。第二条命令统计标注文件类型。这一看能看出大问题——如果同时出现.xml和.txt目录里还散落着几个.json说明这份数据不是一次性标注的很可能是多次整理、不同工具导出后合包的产物。混存格式本身不是灾难灾难是你在不知情的情况下只解析了其中一种训练时才发现图片和标注对不上。第三条命令的图片数量要和标注数量做一次粗略对账。图片数量远大于标注数量通常意味着有大量背景图或未标注图标注数量接近图片数量的两倍说明单张图平均有约两个目标。农业害虫场景下这是合理范围如果平均每个标注文件有几十个框要多留一个心眼——可能是把虫卵、虫粪也框进去了。2.2 XML 标注里必看的三个字段决定你的转换成本如果这份数据是 VOC 风格的 XML 标注先别急着写转换脚本打开一个 XML 看这三个字段。这是所有后续工作的原点。annotation folderJPEGImages/folder filename000123.jpg/filename size width1920/width height1080/height depth3/depth /size object nameHelicoverpa_armigera/name difficult0/difficult bndbox xmin126/xmin ymin88/ymin xmax412/xmax ymax355/ymax /bndbox /object /annotation第一个是filename。它必须和JPEGImages里的实际文件名逐字对应。别以为这是废话——带中文文件名、带空格的文件名、000123和123混用的场景我见过太多次。文件名对不上后期按filename找图时就会静默失败。第二个是size里的宽高。这里有个经典陷阱某些标注工具的导出分辨率写的是相机原图参数但压缩包里的图是批量缩小过的两者不一致的后果是坐标整体偏移。不要无条件相信 XML 里的size转换脚本里应该用读取图片得到真实尺寸做分母。第三个是object块里的name、difficult和bndbox。difficult为 1 的目标通常建议在训练时跳过否则会把标注者本人都不确定的信息当硬标签喂给模型。# 快速盘出这份数据的所有类别名和数量 grep -h name -r Annotations | sort | uniq -c | sort -rn这条命令输出每个类别名和对应框数。它同时承担两个任务一是确认标签体系里有没有中文名、拼写错误、同一害虫两种写法这类脏数据二是给你一个实打实的类别分布表为后面的数据清洗提供依据。看到某个类别框数只有几十个就要在训练前对它单独做决策——是合并成一个大类还是干脆放弃这个类别。2.3 标签体系先盘清有多少类、少不少负样本农业害虫检测数据和通用目标检测数据有一个关键差异类别粒度往往非常细。同一个目下的近缘物种外观差异可能只在翅膀纹理或体长比例上。这意味着标签体系的合理程度直接决定模型训练的天花板。拿到类别清单后我会按三个维度过一遍。第一类别数量是否可控。训练样本总量固定的情况下类别从 5 个扩到 15 个每个类平均样本量掉到原来的三分之一AP 下滑几乎是必然的。第二是否存在非检测目标类别。有的数据集里会混入“幼虫蜕”“虫粪”“被咬叶片”这类辅助标签它们对农业估损有研究价值但如果你要做的是害虫个体检测这些类别要么删掉要么单独训练一个辅助模型。第三有没有负样本图。负样本指没有任何标注框的农田背景图它们是压误检最便宜的手段。很多数据集打包时会把负样本图过滤掉训练出来模型在田间漏检率不高但误检率会高到没法用罪魁祸首就是缺负样本。3. 把 VOC 标注转成 YOLO 格式转换脚本与四个边界坑无论这份数据原始是 XML 还是 JSON最终大概率要统一到 YOLO 的 txt 格式才能喂进主流训练管线。转换这一步看起来是体力活实际是整条链路里翻车率最高的环节。坐标差一点、类别编号错一位模型都能训但训出来的东西没法看。3.1 解析 XML 生成归一化 txt 的骨架脚本下面这段脚本做的是标准动作遍历Annotations/下所有 XML解析出每个目标的类别和框坐标写入 YOLO 格式的标注文件。它同时处理了文件名配对和分辨率校准两个问题。import os import glob import xml.etree.ElementTree as ET from PIL import Image # 类别清单顺序即 YOLO class_id来源是 2.2 里 grep 出的结果 # 先人工核对拼写再把类别名按你期望的 id 顺序写死 CLASSES [Helicoverpa_armigera, Aphis, Bemisia_tabaci, Tetranychus] def convert_voc_to_yolo(xml_path, out_dir): tree ET.parse(xml_path) root tree.getroot() filename os.path.splitext(root.findtext(filename))[0] # 用 PIL 读真实图片尺寸不信任 XML 里的 size 字段 xml_dir os.path.dirname(xml_path) img_candidates [ os.path.join(xml_dir, filename .jpg), os.path.join(xml_dir, .., JPEGImages, filename .jpg), os.path.join(xml_dir, .., images, filename .jpg), ] img_path next((p for p in img_candidates if os.path.exists(p)), None) if img_path is None: print(f[skip] 找不到图片: {filename}) return with Image.open(img_path) as im: w, h im.size lines [] for obj in root.findall(object): name obj.findtext(name) if name not in CLASSES: print(f[warn] 未知类别 {name} 在 {xml_path}已忽略) continue cls_id CLASSES.index(name) # difficult1 的目标标注者本身没把握训练时跳过更稳 difficult int(obj.findtext(difficult) or 0) if difficult: continue bbox obj.find(bndbox) xmin float(bbox.findtext(xmin)) ymin float(bbox.findtext(ymin)) xmax float(bbox.findtext(xmax)) ymax float(bbox.findtext(ymax)) # YOLO 格式中心点 x、中心点 y、宽、高全部除以图宽高做归一化 x_center (xmin xmax) / 2.0 / w y_center (ymin ymax) / 2.0 / h box_w (xmax - xmin) / w box_h (ymax - ymin) / h # 越界坐标截断到 0~1防止后续训练读取时报错 x_center min(max(x_center, 0.0), 1.0) y_center min(max(y_center, 0.0), 1.0) box_w min(max(box_w, 0.0), 1.0) box_h min(max(box_h, 0.0), 1.0) lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}) out_path os.path.join(out_dir, filename .txt) with open(out_path, w) as f: f.write(\n.join(lines)) print(f[ok] {filename}.txt 写入 {len(lines)} 个目标) if __name__ __main__: os.makedirs(yolo_labels, exist_okTrue) for xml_file in glob.glob(Annotations/*.xml): convert_voc_to_yolo(xml_file, yolo_labels)脚本的核心逻辑有三处。第一img_candidates的路径探测顺序解决了 XML 和图片不在同一目录的问题这是 VOC 数据最常见的整理差异。第二用PIL读图取真实宽高绕开 XML 里size字段可能存在的错误——这个坑如果不避开所有框都会按错误分辨率整体偏移。第三difficult被跳过了避免把标注者自己都拿不准的目标当作训练标签。参数上CLASSES列表的顺序就是类别编号一旦训练开始就不能再改否则已生成的 txt 全部错位。.6f格式化保留 6 位小数对坐标精度够用不要用str()直接拼接浮点数那会产生0.12000000000000001这类脏字符串后面做数据统计时容易出妖蛾子。3.2 归一化坐标的计算规则错一处全盘皆错YOLO 格式和 VOC 格式的核心差异不是文件后缀而是坐标系的表达方式。VOC 用绝对像素的xmin/ymin/xmax/ymaxYOLO 用相对图片宽高的中心点加宽高。初学者最常见的错误是忘了除以宽高直接把像素值写进 txt模型训练出来框的位置全偏。正确公式是x_center (xmin xmax) / 2 / image_width y_center (ymin ymax) / 2 / image_height box_width (xmax - xmin) / image_width box_height (ymax - ymin) / image_height这里有两个容易错的地方。一是分母是image_width和image_height各自对应不是两个都除以width。二是分母必须来自图片文件本身而不是标注 XML 里的size字段、更不是某个训练配置里的标准输入尺寸比如 640。有人先把图缩放到 640 再除以 640如果原始 XML 坐标是 1920 分辨率下的绝对值算出来的结果相当于做了一次无意义的缩放框的位置仍然是对的——因为分子分母同比例缩了——但一旦训练代码内部再做 letterbox 缩放偏差就会叠加出来。另一个常见误区是笼统地以为“把数值压到 0 到 1 之间就完事了”。归一化的本质是坐标表达从物理像素转为相对比例x_center越界到 1.2 说明标注框本来就超出了图片边界直接截断到 1.0 比留着越界值更安全。我在脚本里用了min(max(...))截断同时建议你打印出被截断的文件名——这类文件通常是标注质量问题值得单独复查。3.3 转换完的三件套校验空文件、越界、类别编号转换脚本跑完后不要急着开训练。先花三分钟跑三组检查这三组命令能拦住九成以上的格式事故。# 1. 空标签文件图片存在但没有写入任何目标 find yolo_labels -name *.txt -size 0 -print # 2. 越界检查中心点不在 0~1或框超出图片范围 awk {if ($20 || $21 || $30 || $31 || $2$4/21 || $2-$4/20) print FILENAME, $0} yolo_labels/*.txt # 3. 类别编号越界编号必须小于类别总数这里是 4 awk {if ($1 0 || $1 4) print FILENAME, $0} yolo_labels/*.txt第一组命令找空标签文件。图片数量对得上、但 txt 全空说明 XML 解析时name没匹配上你的CLASSES列表或者是difficult被全部跳过。第二组命令里$2$4/2是x_center box_width/2也就是框的右边界必须小于等于 1同理$2-$4/2是左边界必须大于等于 0。第三组命令检查class_id是否超出你定义的类别范围编号越界会在训练时直接报维度错误。三组检查全部通过后还有一个可视化抽查。随便选 20 张图用 OpenCV 把 txt 里的框画回图片上肉眼看一遍框有没有贴住害虫。这一步是整条流水线里最值得花的十分钟——坐标数值全对不代表语义正确框偏移但数值合法的情况只有肉眼看图才能发现。4. 训练前数据清洗先看统计再动手小目标与不均衡分开治格式转换解决的是“能不能训”数据清洗解决的是“训出来能不能用”。很多人在这一步直接跳到训练把清洗当成可有可无的环节。实际上对于农业害虫这类长尾分布极其严重的数据清洗比选模型的影响大得多。4.1 用十五行脚本生成类别与目标尺寸统计表先看分布再决定动作。下面这段脚本读取刚才生成的 YOLO txt输出每个类别的框数量和小目标占比目标是给后续决策提供一张客观的表格。import glob from collections import Counter # 统计口径说明归一化面积计算小目标比例 stats Counter() small_counter Counter() total_box 0 for label_path in glob.glob(yolo_labels/*.txt): with open(label_path) as f: for line in f: parts line.strip().split() if len(parts) ! 5: # YOLO 每行固定 5 个字段多一个少一个都是脏数据 print(f[warn] 字段异常: {label_path}: {line.strip()}) continue cls_id int(parts[0]) bw float(parts[3]) bh float(parts[4]) area bw * bh stats[cls_id] 1 total_box 1 # 用 640 训练分辨率折算小于 32x32 像素的目标记为 small if area (32 / 640) ** 2: small_counter[cls_id] 1 print(f总框数: {total_box}) for cls_id in sorted(stats.keys()): cnt stats[cls_id] small_ratio small_counter[cls_id] / cnt * 100 print(f类别 {cls_id}: {cnt} 框, 小目标占比 {small_ratio:.1f}%)脚本逻辑很简单逐行解析 txt按类别累加框数按归一化面积判断是否属于小目标。(32 / 640) ** 2的含义是如果训练时把图片缩放到 640面积小于 32×32 像素的目标会被缩成一团色块此时卷积网络的底层特征图经过 32 倍下采样后这个目标只剩一个像素级的响应几乎不可能被检测到。输出结果后你会看到两种典型场景。第一种某类总框数很少、小目标占比还高。这种类别基本属于“标注者都很难找全”的情况拿它做检测任务的上限很低训练前就要和管理者确认——是接受低 AP还是先扩充该类别的样本。第二种总框数很多但小目标占比超过 60%。这种情况模型 AP 会被小目标拉低解决方案不是加数据而是改训练策略——用更高分辨率训练、加切图步骤这些在 4.2 展开。4.2 小目标场景的裁剪策略切图不是无脑切当数据集里有大量高分辨率大图、目标又偏小时直接丢进训练管线会让模型在小目标上的表现非常差。常见做法是切图把原始大图切成若干 patch用 patch 作为训练输入。切图参数直接决定小目标的保留效果。我一般这样设置参数以原始图 1920×1080、目标多数小于 64×64 的场景为例参数推荐值说明patch 尺寸640×640与训练输入分辨率保持一致避免二次缩放滑动步长512相邻 patch 重叠 128px跨边界的实例只少被切一半丢弃阈值实例与 patch 交集面积占实例面积 30% 则丢弃防止只露一个边角的框干扰训练重复保留交集面积占实例面积 50% 时允许该实例出现在多个 patch 中增加该实例的可见样本数切图时最容易犯的错是无脑按STRIDE PATCH_SIZE切重叠率为 0。大目标恰好卡在 patch 边界时被切成两半、两侧都不到 50% 面积最后这两个残缺样本的框都被丢弃相当于白白丢了一批数据。我用STRIDE 512而非640就是为了让重叠区域兜住边界目标。切完之后注意patch 数量膨胀训练轮数和批次大小要相应调整一般按“原图数 × 平均每张 patch 数”来估算总样本量学习率可以沿用原来的但轮数适当减半否则总迭代次数过大会过拟合。同时要记得推理阶段也要用同样的切图窗口。如果训练用 640 的 patch推理时却把整张 1920 大图直接缩放后送进去模型看到的目标尺度和训练时分布不一致AP 会掉得毫无头绪。4.3 类不均衡的第一反应不该是重采样农业害虫数据天生不均衡某种蚜虫占了一半框某种蛾子只有二三十个框。看到不均衡就立刻上过采样或重采样是新手最常犯的错——因为重采样解决的是“数量不均衡”农业数据真正的难点是“小目标多”和“相似类难分”这两者靠增加重复样本根本解决不了。判断要不要干预看两个数字多数类和少数类的框数比以及少数类的绝对数量。框数比在 10 以内且少数类有 500 个框以上时我建议先不处理按原始分布训练只看各类 AP 的差距再定后续方案。框数比超过 20 且少数类不足 100 个框时单纯过采样少数类等于把它反复复制模型很快就把这几百个框背下来验证集一换就崩。更可靠的做法是少数类数据增强Mosaic 把少数类目标拼到不同背景上、Copy-Paste 把少数类目标贴到多数类场景里这样每张增强图都是语义上新的样本而不是像素级复制。另一个常被忽略的做法是不动样本分布改用损失函数加权让分类头在反向传播时对少数类给更高权重。它的好处是训练效率高、不增样本坏处是对极端不均衡效果有限更适合作为重采样的补充而非替代。5. 农业害虫检测避坑指南模型反复翻车的 5 个真实原因格式转好、数据洗过训练出来的模型仍然可能表现得让人摸不着头脑。这一章不讨论理论只讲我在这条路上反复踩过的五个具体坑按现象、原因、解决三层来写每条都能直接照对着排查。5.1 棉铃虫被整片叶片当成“正样本”误检全部集中在背景纹理上现象验证集 mAP 不低但可视化时发现叶片边缘、叶脉交叉处、甚至土壤背景上全是置信度 0.3 左右的框真正的棉铃虫反而只有一半被框住。原因有两层。第一层是数据层面标注时只框了害虫但正样本框里不可避免包含了叶脉纹理模型学到了“叶脉纹理 害虫”的捷径。第二层是训练数据里没有足够的纯背景负样本模型没有见过“没有害虫的叶片长什么样”任何跟害虫体色接近的纹理都触发了检测头。这两层叠加误检就成了显性特征。解决先给训练集加一批无标注负样本图比例按正样本图的 10%~20% 来同时在训练参数里把background类单独留出来。更直接的手段是调高置信度阈值到 0.35 起步配合 NMS 后再滤一遍低分框。如果负样本图不好找就把训练集里没有框的 patch 直接裁出来当负样本这是成本最低的补法。5.2 训练集 mAP 好看下地就崩跨域差异被严重低估现象在测试集上 AP 到 0.7满怀信心把模型带去大田试用当天就发现漏检率翻倍同一个虫种在不同光照角度下不是漏检就是把旁边的瓢虫也框进来。原因这份数据里的图大多在统一采集条件下拍摄——同一种相机、相似角度、均匀光照。训练集和测试集都来自这个分布模型学到的是“这个采集条件下的害虫”而不是“害虫”这个概念。田间的光照、露水、叶片遮挡、泥土颜色都会让特征分布发生偏移模型自然失效。解决训练阶段把增强强度拉大。HSV增广的饱和度扰动范围加大到 ±50%亮度扰动加大到 ±40%让模型在训练时就见过不同光照下的样本。其次是引入随机旋转、透视变换和 Cutout——随机遮挡能迫使模型学害虫本身的结构特征而不是环境纹理。条件允许的话单独采 200 张现场图做二次微调是性价比最高的方案不需要重新标注全部数据只要标注这些现场图即可。5.3 密集的蚜虫群一个都框不出来小目标与特征下采样冲突现象单只的大个害虫检测正常但一片叶片上密密麻麻一百来只蚜虫时模型一个框都出不来或者只框出两三只就停了。原因这是小目标检测的典型病灶。训练输入缩放到 640 时单只蚜虫可能只有 8×8 像素经过检测头第一层 32 倍下采样后特征图上只剩 0.25 个像素——目标信息在主干网络的前几层就已经被洗没了。另一个附加因素是 NMS密集目标天然互相重叠两个相邻蚜虫框的 IoU 超过 0.5 就会互相抑制后出分的那个被压没。解决优先做两件事。一是训练分辨率提到 960 或 1280小目标像素面积按分辨率平方倍增这一项往往比换模型更直接。二是启用模型的高分辨率特征层把浅层输出步长 8 或 16 的特征直接接入检测头。如果这两步做完还不够就用 4.2 的切图方案把原图切成 640 patch 再训练和推理相当于把大图的目标物理放大后再检测这是目前处理密集小目标最稳的路线。5.4 标签文件混入空白坐标训练 loss 突然 NaN现象训练前几个 epoch 表现正常某个 epoch 开始loss nan之后所有指标归零。回滚到上一个 checkpoint 又能跑几轮然后再次出现。原因训练集的 txt 里有脏数据常见两类的来源。一类是标注软件导出时bndbox字段为空XML 转 txt 时读到了None转成0.0另一类是 CSV 编辑时把空值写成了\N或直接空了一行YOLO 训练时读到空行或者字段数不足的短行某些实现会把这些nan或0坐标直接算进损失里。训练集文件多时根本找不到是哪一张图的问题。解决转换脚本里对每个坐标字段统一做一次防御检查——任何解析结果不是有效数字、或任何一个坐标值为None/空串/nan时跳过这个目标并打印文件名。不要用0兜底填充那会把一个普通背景当目标训练污染更隐蔽。另外在训练代码的数据加载器里加一个断言每行必须能按[class_id, x, y, w, h]拆出五个浮点数。训练启动时多做一次全量遍历而不是等跑崩了再排查。这一条虽然花不了五分钟但能省掉一整天追 nan 的时间。5.5 随机划分会让验证集指标“虚高”同株害虫穿越到两边现象用train_test_split随机按 8:2 划分数据训练出来的模型验证集 mAP 高得离谱但单独采一小块新数据回来一测AP 掉回正常水平然后开始困惑为什么验证指标和实际效果对不上。原因农业采集很多时候是对同一株作物连续拍多张照片这几张图内容高度相似。随机划分时同一株作物的相邻帧很可能分别进了训练集和验证集——训练时模型已经看到过同一株对象的微变种验证集等于是在测“近记忆”而不是“泛化能力”。这属于数据泄漏里最隐蔽的一种不改变模型但彻底污染了评估结论。解决划分数据时用sample_id作为分组依据而不是按图片文件直接随机分。先看文件名有没有编号前缀或拍摄批次信息把属于同一次采集的图片归到同一组然后做分组划分。代码上可以用sklearn的GroupShuffleSplit按组切分保证同组样本要么全在训练集、要么全在验证集。没有现成的sample_id时就按文件名前缀、拍摄时间批量段做近似分组。数据划分看似是流水线里最不起眼的一步但恰恰是决定验证指标可信度的核心环节。6. 训练完别急着收工用 4 个方法验证数据集能用的底线模型训完、指标也出了数字别急着写报告。先做下面四件事把“数据能用”这句话落到实处。第一看一眼各类别的 AP 分布而不是只报总 mAP。如果有个别类 AP 只有 0.1总 mAP 可能还被其他类拉在 0.6 以上这种平均数的“幸存者偏差”会让你误判整份数据的质量。按类输出 AP能直接定位到具体类别的问题。第二做一次严格的分组交叉验证。按第 5.5 的方式把数据按采集批次分成若干折逐折做训练验证。如果各折指标波动超过 5 个点说明数据分布不均匀单次划分的实验结论不可信波动在 2 个点以内才能说模型和数据集都稳定。这个过程可能要多训几次模型但它能在你拿数据去对接业务方之前提前把不可信的结论筛掉。第三人工抽查可视化 100 张预测图按“正确检测”“漏检”“误检”三堆分。在这个过程中数一数漏检是不是集中出现在密集小目标上误检是不是集中在叶片纹理背景上如果漏检和误检高度集中说明模型的天花板其实还没摸到——瓶颈在数据标注质量或采集方式上不在网络结构上。第四用“人工先验”校准预期。随机抽 50 张图自己按标注规范标一遍再和数据集原始标注去比对。如果人眼都分不清的两个近缘物种原始标注里也大量互相标错那模型在这个类上 AP 低属于“标注噪声决定的自然上限”这不是模型的锅而是数据集给的约束。做这个比对时记得先隐藏类别标签避免先入为主。我第一次拿到农业类数据包时一上来就开训晚上看到 mAP 高得吓人还以为自己捡到了宝第二天可视化才看清满屏误检。后来养成“先统计、再转换、后校验、最后小模型探路”的习惯翻车率才真正降下来。数据集决定模型的上限模型只是在逼近这个上限而已。希望你这次也能少走几趟弯路希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑