简介:面向农业智能监测与计算机视觉算法训练场景的谷物害虫目标检测数据集,可供农业AI开发者、科研人员及目标检测入门学习使用。数据集主要覆盖谷物存储环境中的单一害虫类别,共包含687张真实农业场景图片,全部采用YOLO格式标注,配套边界框坐标与类别标签,适用于YOLOv5、YOLOv8等主流框架直接加载训练。压缩包总计1376个文件,包含687个jpg图像、687个txt标注文件、1个yaml配置文件及1个docx说明文档,整体大小约22.76MB,结构清晰便于快速开展模型训练或验证,依托真实仓储环境图像,可有效提升模型在复杂背景下的泛化能力。目前已有232人学习下载。该数据集精准聚焦单一目标类别,降低建模复杂度,兼顾实际应用落地,有助于开发粮食仓储环节的自动化害虫监测方案,并为相关农业AI课题提供数据基准。
1. 谷物害虫目标检测数据集:从一份 zip 开始的储粮监控之路
“谷物害虫目标检测数据集.zip”这个标题,对做过农业视觉的人来说很有吸引力。粮食仓储里最头痛的就是害虫监测:翻粮筛虫费人力,还不能实时掌握虫口密度。基于图像的目标检测正好能把这个过程自动化,但落地第一个卡脖子的东西从来不是模型,而是数据。这个 zip 里通常装的是谷物害虫的现场图像和对应的标注文件,能做玉米象、赤拟谷盗、谷蠹这类仓储害虫的识别训练。和常见的鸟类目标检测数据集、车辆检测数据集 BDD100K 这类单一背景的数据不同,谷物害虫数据集的难点恰恰在“粮堆背景太像了”,虫子小、分布密、遮挡多,模型很容易学到背景噪声而不是虫体特征。这篇文章我从拿到 zip 开始讲,按“拆包 → 校验 → 清洗 → 转格式 → 训练验证”的路径走一遍,把每一步的判断依据和踩过的坑都摊开来说。
2. 拆开 zip 先别急着训练:先搞清数据集内部结构
2.1 常见标注格式:XML、JSON、txt 是三套完全不同的体系
谷物害虫数据集在打包时,标注格式并没有统一标准。市面上能见到的无非三种:VOC 系列用的 XML 标注、COCO 系列用的 JSON 标注,以及 YOLO 系列直接使用的 txt 标注。XML 是 PASCAL VOC 留下的老格式,一个图像文件对应一个同名 XML 文件,里面用<bndbox>标签记录目标的左上角和右下角坐标。JSON 是 COCO 的格式,把所有图像的标注集中到一个大的 annotations.json 文件里,按images、annotations、categories三个字段组织。txt 则是 YOLO 系列的原生格式,每张图一个 txt,每行内容依次是“类别ID x_center y_center width height”,坐标使用归一化数值,范围在 0 到 1 之间。
拆包后第一件事就是看格式,不要凭感觉选处理脚本。打开任意一个图像文件,看同目录下有没有同名 XML;如果没有,去根目录找有没有 json 文件;如果这两者都没有但有一堆 txt,那基本就是 YOLO 格式。这里要区别一点:COCO 格式虽然后续的模型框架都支持,但它的 JSON 结构嵌套深,解析起来比 XML 麻烦,尤其当你只需要把标注转成 YOLO 训练格式时,XML 反而是最好处理的中间格式。CCPD 数据集(中国车牌检测)用的也是 VOC 风格的 XML,处理逻辑可以直接借鉴。
| 格式 | 文件载体 | 坐标表达 | 适用框架 | 转换难度 |
|---|---|---|---|---|
| VOC XML | 每图一个 XML | 左上角(xmin, ymin)、右下角(xmax, ymax),像素值 | Faster R-CNN、SSD、YOLO | 低 |
| COCO JSON | 单一 JSON 文件 | 多边形或多段折线,或 bbox 四点 | Detectron2、MMDetection、YOLO | 中 |
| YOLO txt | 每图一个 txt | 中心点(x_center, y_center)和宽高,归一化 | YOLO 全系 | 低 |
2.2 谷物害虫的类别体系:先看清有哪些类别,数量差距有多大
另外一个拆包后必须做的事,是把所有标注里的类别名列出来统计一遍。谷物害虫常见的有玉米象、米象、赤拟谷盗、谷蠹、锈赤扁谷盗、锯谷盗、麦蛾、印度谷螟等。不同数据集对类别的命名方式可能完全不一样,有的用中文名,有的用拉丁学名简写,有的干脆叫pest1、pest2。归类层级也不统一,有的把玉米象和米象分开成两类,有的合并成“象甲类”。这个差异直接影响后续训练的类别数和你对模型能力的评估。
我一般会在解压后写一个脚本扫描所有 XML 文件,抽取<name>标签的内容做去重统计,得到一份“实际出现过的类别名集合”。如果发现同一种虫有两三种写法,就需要做类别归一化,建立别名映射表,把它们统一到同一个类名下。这一步别嫌麻烦,类别体系不统一,后面的类别映射表和损失函数都会出问题。另一种情况更麻烦:数据集只有一种害虫类别,比如全是赤拟谷盗。这种单类别数据训练出来的模型无法区分不同害虫,只能当“有虫/无虫”分类器用。
2.3 解压后第一件事:建立文件台账,确认图像和标注一一对应
拿到 zip 解压后,我不急着看细节图,而是先跑一个统计脚本,把图像文件和标注文件的数量、格式、分布情况整体摸一遍。这个步骤看似笨重,但它能快速暴露数据集的硬伤。比如 JPEG 有 5000 张但 XML 只有 4800 个,或者某些样例没有对应标注,这些都是解压后需要优先确认的基础信息。
#!/bin/bash # 统计 zip 解压目录下的图像与标注文件数量 # 用法: bash inventory.sh /path/to/unzipped_dataset DIR=$1 echo "== 图像文件统计 ==" find "$DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | wc -l echo "== VOC 标注统计 ==" find "$DIR" -type f -iname "*.xml" | wc -l echo "== COCO 标注统计 ==" find "$DIR" -type f -iname "*.json" | wc -l echo "== YOLO 标注统计 ==" find "$DIR" -type f -iname "*.txt" | wc -l echo "== 目录大小 ==" du -sh "$DIR"这个脚本的输出能直观告诉我们格式组合:如果图像数远大于标注数,说明有一部分图没有标注,后续要么删除、要么补标;如果有 COCO 的 JSON 同时又有 XML,需要确认是否重复标注。参数说明很简单,-iname做的是大小写不敏感匹配,因为有的数据集图片后缀是大写的.JPG;wc -l统计的是行数,也就是文件个数。du 看体积是确认这份 zip 是否被完整解压,如果解压后体积异常小,大概率压缩包本身就是残缺的。检查完数量关系再进入下一步,否则后面的格式转换会带着错漏一路跑到训练。
3. 数据校验与图像清洗:脏标注比没有标注更难处理
3.1 图像完整性检查:解码失败、纯黑图和 EXIF 旋转
很多人拿到图像数据集后的第一步是把所有图片直接送去训练,但我建议先做一个图像解码层检查。原因很简单:爬取或打包过程中,图像文件可能在传输中被截断,导致格式完好但无法解码;也有的图像本身是灰度图,很多检测模型虽然支持,但灰度图特征表达有限;还有一类是 EXIF 旋转信息导致的图像方向错位,预览软件会自动纠正,但模型训练时读取的是原始像素,可能出现人眼看到的是正向、模型读到的是旋转 90 度的图。
我常用的检查脚本基于 OpenCV,逐张读取图像并捕获异常:
import cv2 import os from pathlib import Path img_dir = Path("data/images") for p in sorted(img_dir.glob("*.jpg")): try: img = cv2.imread(str(p)) if img is None: print(f"[FAIL] 无法解码: {p.name}") continue h, w, c = img.shape if h < 100 or w < 100: print(f"[WARN] 过小图像: {p.name} {w}x{h}") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) if gray.std() < 5: print(f"[WARN] 疑似纯色图: {p.name} std={gray.std():.2f}") except Exception as e: print(f"[ERROR] {p.name}: {e}")这段代码做了三层判断:cv2.imread返回None说明文件打不开或已损坏,直接记下来;图像尺寸小于 100 像素大概率是小图放大或截图碎片,对目标检测意义不大;最后转灰度计算标准差,如果标准差低于 5,说明整张图几乎是一个颜色,这种图送入训练只会让模型学到无意义的地板噪声。参数std < 5这个阈值我调过很多次,谷物仓储场景的图大多带光照不均匀,正常图的标准差通常都在 15 以上,低于 5 的基本就是坏图。EXIF 旋转问题在 Python 侧的常见做法是用PIL.ImageOps.exif_transpose先校正方向,再转回 OpenCV 数组。
3.2 标注文件可解析性校验:XML 没有闭合标签、坐标越界、目标为空
图像能解码只是第一步,更关键的是标注可解析。XML 文件常见的问题包括:标签没闭合导致解析中断、<xmin>大于<xmax>、坐标超过图像宽高、<name>为空字符串等。这些问题不会在训练启动时报错,而是会以“loss 不下降”或“精度极低”的形式回馈给你,排查时非常痛苦。
写一个统一点校验脚本是值得投入的:
import xml.etree.ElementTree as ET from pathlib import Path xml_dir = Path("data/annotations") img_dir = Path("data/images") for xml_path in sorted(xml_dir.glob("*.xml")): try: tree = ET.parse(xml_path) root = tree.getroot() # 对应图像是否存在 img_name = root.findtext("filename") if not (img_dir / img_name).exists(): print(f"[ERROR] 缺图: {xml_path.name} -> {img_name}") # 解析每个目标 for obj in root.findall("object"): name = obj.findtext("name") bndbox = obj.find("bndbox") xmin = int(bndbox.findtext("xmin")) ymin = int(bndbox.findtext("ymin")) xmax = int(bndbox.findtext("xmax")) ymax = int(bndbox.findtext("ymax")) if not name or name.strip() == "": print(f"[ERROR] 空类别名: {xml_path.name}") if xmin >= xmax or ymin >= ymax: print(f"[ERROR] 坐标倒置: {xml_path.name} {xmin},{ymin}-{xmax},{ymax}") except ET.ParseError as e: print(f"[ERROR] XML解析失败: {xml_path.name} {e}")这里要说明一个我踩过的坑:root.findtext("filename")拿到的文件名可能带路径前缀,比如images/001.jpg,而img_dir / img_name直接拼路径会产生嵌套目录,导致判断出错。稳妥做法是用Path(img_name).name取纯文件名再拼接。坐标越界的检查也很重要,YOLO 格式要求坐标归一化后在 0~1 之间,如果 VOC 里出现 xmax 大于图像宽度,转 YOLO 后就会产生超过边界的框,训练时模型会尝试预测超出图像区域的物体,严重影响收敛。
3.3 重复图像检查:同一张图换个文件名出现两次,等于数据泄露
重复图像是数据集中最隐蔽的问题,因为肉眼通常看不出。有的数据集收集时从不同渠道拿到了同一来源的图,换个文件名就放进去了;还有的是同一场景在短时间内连续拍摄,背景几乎一致、虫的位置略有变化,这种叫“伪独立样本”。前者直接污染训练集和验证集,导致指标虚高;后者略微弱化模型泛化能力,危害小一些但也要处理。
我常用的方案是计算图像的感知哈希(pHash),把每张图压缩成 64 位哈希值,然后两两比较汉明距离。距离小于 10 的图基本可以判定为同一张或高度相似:
import cv2 import numpy as np from pathlib import Path from itertools import combinations def phash(image, hash_size=8): resized = cv2.resize(image, (hash_size * 4, hash_size * 4)) gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY) dct = cv2.dct(np.float32(gray)) # 取左上角 8x8 低频系数,去掉直流分量后二值化 lowfreq = dct[:hash_size, :hash_size] mean = lowfreq[1:, 1:].mean() return (lowfreq[1:, 1:] > mean).flatten() hashes = {} img_dir = Path("data/images") for p in img_dir.glob("*.jpg"): img = cv2.imread(str(p)) if img is None: continue h = phash(img) key = h.tobytes() if key in hashes: print(f"[DUP] {hashes[key]} 与 {p.name} 重复或高度相似") else: hashes[key] = p.name代码里hash_size=8表示生成 64 位哈希(8x8 的 DCT 低频系数)。这个粒度对检测场景够用,能容忍轻微的亮度变化和缩放,但对裁剪后的小图也可能误判为重复,需要结合图像尺寸过滤。如果数据集里检测目标本身就很小,比如害虫只占图像的 2%,pHash 之间距离可能偏大,此时可以适当放宽阈值,比如汉明距离小于 8 就算重复。另外要提醒一下:cv2.dct要求输入是浮点数组,np.float32(gray)不能省,否则会报类型错误。
4. 转换成 YOLO 训练格式:转换脚本与四个边界坑
4.1 VOC 转 YOLO 的核心换算:像素坐标转归一化坐标
如果数据集给的是 VOC XML 格式,而你想用 YOLOv8 训练,那么必须把 XML 里的像素坐标转换成归一化坐标,这是训练能否跑通的第一关。核心公式很简单:目标的中心点横坐标(xmin + xmax) / 2除以图像宽度,中心点纵坐标(ymin + ymax) / 2除以图像高度,宽度(xmax - xmin)除以图像宽度,高度(ymax - ymin)除以图像高度。四个值全在 0 到 1 之间,每行写入一个目标。
import xml.etree.ElementTree as ET from pathlib import Path import cv2 xml_dir = Path("data/annotations") img_dir = Path("data/images") out_txt_dir = Path("data/labels") out_txt_dir.mkdir(parents=True, exist_ok=True) # 类别名到 id 的映射,按需修改 CATEGORY_MAP = { "sitophilus_oryzae": 0, "tribolium_castaneum": 1, "rhizopertha_dominica": 2, "cryptolestes_ferrugineus": 3, } for xml_path in sorted(xml_dir.glob("*.xml")): tree = ET.parse(xml_path) root = tree.getroot() img_name = Path(root.findtext("filename")).name img_path = img_dir / img_name img = cv2.imread(str(img_path)) if img is None: continue h, w = img.shape[:2] lines = [] for obj in root.findall("object"): name = obj.findtext("name") if name not in CATEGORY_MAP: print(f"[SKIP] 未映射类别: {xml_path.name} -> {name}") continue bndbox = obj.find("bndbox") xmin = max(0, int(float(bndbox.findtext("xmin")))) ymin = max(0, int(float(bndbox.findtext("ymin")))) xmax = min(w, int(float(bndbox.findtext("xmax")))) ymax = min(h, int(float(bndbox.findtext("ymax")))) if xmin >= xmax or ymin >= ymax: continue x_center = (xmin + xmax) / 2.0 / w y_center = (ymin + ymax) / 2.0 / h box_w = (xmax - xmin) / w box_h = (ymax - ymin) / h lines.append(f"{CATEGORY_MAP[name]} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}") if lines: txt_path = out_txt_dir / (xml_path.stem + ".txt") txt_path.write_text("\n".join(lines), encoding="utf-8")这个脚本的关键动作有两个:一是用图像的实际宽高img.shape[:2]做归一化分母,而不是用 XML 里记录的 size 字段,因为实际图像尺寸和元数据不一致的情况太多了;二是对越界坐标做了裁剪(xmin强制不小于 0,xmax强制不大于宽度),防止后续训练加载时报负值或超界错误。float()包裹findtext是因为有的标注工具把坐标写成小数,直接int()会截断出错。输出的 txt 文件名与 XML 同名,这样 YOLO 系列训练工具会自动匹配同目录下的图像和标签。
4.2 类别映射表的坑:同名不同写法和“脏类别”处理
VOC 转 YOLO 最容易翻车的不是坐标换算,而是类别映射。比如某个数据集把玉米象标成maize_weevil,另一个标成Sitophilus zeamais,如果映射表里只有其中一个,另一个类别会被整行跳过,导致该目标永远无法被模型学习。处理方法是先跑第 2 章的统计脚本拿到全部类别名,然后逐一确认是正常类别、同义词还是噪声标注。同义词要映射到同一个 ID,噪声标注比如“dirt”“shadow”这类不是虫的目标,直接丢弃效果更好。
另外建议留一个“未映射类别”的打印输出,而不是静默跳过。我第一次转换时就在迭代完所有 XML 后才发现有 200 多个目标因为类别名映射不上而被丢弃,而检测模型对这个小众类别毫无感知,训练出的模型部署后完全认不出谷蠹。所以转换脚本中print(f"[SKIP] 未映射类别: ...")这一行不是摆设,它是你了解数据真实类别分布的窗口。
4.3 训练集/验证集划分:随机划分和按场景划分差距很大
坐标转换完,还要把图像和标签同步拆成训练集和验证集。最简单的做法是random.shuffle后按 8:2 比例切,但这里有个隐含问题:如果同一场景的连续帧被同时分到训练集和验证集,验证指标会虚高,因为验证集里出现的“新图”本质上和训练集样本非常相似。谷物害虫拍摄往往是一筐粮多角度拍多张,连续帧之间的差异极小,随机划分极容易造成泄露。
cd data # 生成 train.txt / val.txt,内容为图像绝对路径 find $(pwd)/images -name "*.jpg" | shuf -n 1000 > /tmp/val_images.txt find $(pwd)/images -name "*.jpg" | sort > /tmp/all_images.txt grep -vFf /tmp/val_images.txt /tmp/all_images.txt > train.txt cat /tmp/val_images.txt > val.txt wc -l train.txt val.txtshuf -n 1000先从全部图像中随机抽出 1000 张作为验证候选;grep -vFf是把这些候选从总列表中排除,得到训练集。这个做法比按比例随机切片好在对大列表更稳定,不会因为意外排序导致验证集全部集中在某个子目录。但要提醒:这种划分依然属于随机划分,对同一场景多帧没有约束力。更严格的方案是人工按拍摄文件夹切分,确保同一来源的图像不会同时出现在训练集和验证集里。如果数据集本身没有目录信息,退而求其次的做法是把按 pHash 聚类后的相似图整体划到同一侧,这个可以参照第 3.3 节的哈希结果。
5. 数据集实战避坑:5 条显微镜级别才能看见的血泪经验
5.1 zip 解压损坏:不是所有解压工具都会校验 CRC
拿到“谷物害虫目标检测数据集.zip”后解压报错的情况并不少见。现象是用 Windows 自带解压或某些压缩软件解压到一半提示“文件损坏”,但图像文件已经在目录里生成了,看起来好像能用。实际上一旦压缩包内某个文件的 CRC 校验失败,这个文件可能只解压出一部分字节,图像文件可能后半段全是空白。解决方法是换用 7-Zip 并启用“保留损坏文件”模式解压全部内容,然后跑一遍第 3 章的图像完整性校验。如果源头 zip 包本身损坏,缺的文件无法恢复,只能换渠道重新获取。另外解压时的目标路径不要包含中文,部分版本的标注文件读取工具对中文路径处理不完善,会出现找不到文件或写入乱码的玄学错误。
5.2 图像分辨率参差不齐,小目标被 resize 抹掉
谷物害虫检测的天然难点是目标小。很多数据集里的图是三等分的粮堆特写,单只虫只有 20×20 像素甚至更小。YOLOv8 训练时会默认把输入图像 resize 到 640×640,如果原图是 1920×1080,一只 20 像素宽的虫子在 resize 后会缩到 6~7 像素,几乎不可辨认。现象是训练时 loss 正常下降,但 mAP50 始终在 30% 以下徘徊。排查方式是把图像按原分辨率裁剪成小块(比如把 1920×1080 裁成 4 张 640×640 的小图)再训练,同时把imgsz参数调高到 1280,虽然显存占用翻倍,但目标不再被压缩到不可辨认。对于分辨率差异大的数据集,建议在预处理时统一“最长边不超过 1280,最短边不低于 320”的缩放策略,而不是简单固定到某个尺寸。
5.3 类别不均衡严重,模型变成单类检测器
谷物害虫数据集的类别分布经常是长尾的:赤拟谷盗占了 70%,谷蠹只有 3%。模型训练时会倾向于把所有目标都预测成多数类,因为这样整体 loss 更小。现象是多数类的 mAP 很高,少数类的 mAP 几乎为 0。解决思路有三个方向:一是给少数类分配更高的 loss 权重,YOLOv8 的class_weights参数可以手动指定;二是做离线增强,只对少数类的样本做水平翻转、亮度扰动、随机裁剪增强,凑够和多数类接近的数量;三是在后处理阶段把置信度阈值按类别分开,少数类用较低阈值以减少漏检。最不建议的是直接对少数类图像做重复复制,这会造成过拟合,加多少个 epoch 都没用。
5.4 验证集和训练集划分重复导致指标虚高
这种情况最隐蔽:训练完 mAP50 显示 95%,一部署到真实粮库摄像头里直接翻车,检测框乱飞。原因在于验证集里有大量与训练集重复或近重复的图像。特别是某些数据集把同一批图像既放进了 train 文件夹又放进了 val 文件夹,如果解压后直接按默认目录划分,模型等于在“开卷考试”。排查方式很简单:在训练完成后随机抽 50 张验证集图像,用训练好的模型做预测并可视化,人工看检测效果是否真的与 mAP 数据匹配。如果十张图里有三张检测明显异常但 mAP 依然很高,基本可以断定是划分泄露。解决做法是按目录粒度划分:同一个拍摄批次的所有图像全部进训练集或全部进验证集,杜绝同场景跨集合。
5.5 标注文件里的框不贴虫体,模型学到的是“框内平均颜色”
标注框的质量直接影响模型上限。谷物害虫数据集里常出现两类糙框:一种是把两只紧挨的虫框在一起,另一种是框把虫体周围的一圈谷粒也圈进去了。前者让模型学习时 loss 震荡,后者让模型把谷粒纹理当成害虫特征。现象是训练和验证的 loss 都降得很低,但测试时对没有谷粒的背景上误检率高。解决这个问题的唯一可靠路径是人工抽样复核标注。随机抽 100 张图,把标注框画在原图上,逐一检查框是否贴合虫体边缘,框边缘和虫体外轮廓之间有没有超过 5 像素的空白。这个检查看起来很原始,但它能把数据质量从“能跑”提升到“可信”的层级,是做目标检测数据集不可省略的一步。
6. 用 YOLOv8 快速验证这份数据集值不值得用
拿到并清洗完这份数据集后,最重要的问题变成了:它到底能不能用?与其纠结理论分析,不如直接训练一个小模型,让它用结果说话。我一般会用 YOLOv8n 来做快速验证,因为它的参数量最小(约 3.2M),训练速度快,能在 10 到 20 分钟内给出第一轮指标。训练命令如下:
yolo detect train data=data.yaml model=yolov8n.pt epochs=50 imgsz=640 batch=16 patience=10data.yaml的内容需要指定 train/val 路径和类别列表,格式如下:
path: /path/to/dataset train: train.txt val: val.txt names: 0: sitophilus_oryzae 1: tribolium_castaneum 2: rhizopertha_dominica 3: cryptolestes_ferrugineus训练结束后,重点看三个指标:mAP50 是否大于 0.6,这个值代表“允许框位置有一定误差时也能命中目标”;mAP50-95 是否大于 0.3,这个值严格得多,要求框位置和大小都足够准;以及训练集和验证集的 loss 曲线是否同步下降,如果训练 loss 持续下降而验证 loss 停滞甚至在后期上扬,说明数据量不够或标注噪声大。对于谷物害虫这种小目标场景,mAP50-95 低不全是坏消息,小目标的 IoU 天然难算准,关键还是看 mAP50 和实际抽帧可视化。
我的个人习惯是训练完随机挑 30 张未参与训练的图像做推理,把置信度阈值调到 0.2,看模型能在图上检出多少虫,错检有多少。这一步比任何指标都直观。如果模型把谷粒边缘当虫框出来,说明标注边界质量有问题,回到第 5.5 节复核标注;如果只检出一半的虫而另一半完全没有响应,大概率是数据量不足,需要再补充现场图像或进行针对性数据增强。这份数据集到底值不值得投入时间,判断标准只有一个:能不能在你的测试场景下稳定检出目标,并且处理一个批次图像的时间满足部署需求。如果第一轮 YOLOv8n 验证结果就已经惨不忍睹,说明数据集质量或者场景复杂度有问题,换更大模型只会把问题隐藏得更深。
最后分享一个我自己的教训:早期做棉花害虫检测时,我拿到数据集后直接跑训练,mAP50 报了 82%,满心欢喜地部署到棉田监控里,结果一个下午就发现对棉铃虫的漏检率超过 40%。后来排查了半天,问题就出在标注框不贴虫体、验证集划分重复这两个坑上。从那以后,我养成了“先验数据、后跑模型”的工作习惯,无论数据集来自哪里,都要先花半天时间做校验和清洗,这样训练的时间和算力才浪费不到哪里去。这套方法对于谷物害虫目标检测数据集同样适用,希望帮到你。
本文还有配套的精品资源,点击获取