☰
IP102数据集清洗与YOLO害虫检测实战:从75k到4.4k的模型优化全记录
2026/10/14 14:32:13 网站建设 项目流程

做农业植保项目的时候,客户问了一个很基础的问题:“你们这个害虫检测模型,到底是用什么数据集训练的?”当时我直接报了IP102这个名字,但随后补了一句“不过真正拿来训练之前,我把它狠狠清洗了一遍”。这不是谦虚,而是实话。IP102确实是目前农作物害虫检测领域绕不开的学术基准数据集,但如果你把原始数据直接喂给YOLO,第一轮训练出来的模型大概率会让你怀疑人生。

这篇文章就是我复盘整个过程的记录:从IP102原始数据出发,清洗出4400张可用的YOLO格式子集,完成训练、调参,最终把模型部署到田间场景的完整链路。文章里会涉及数据筛选逻辑、标注格式转换、YOLO训练踩坑和损失曲线解读,以及从测试集mAP到真实农田之间的差距。无论是正在做智慧农业方向的开发者,还是想拿真实数据练手目标检测的朋友,这篇都值得你花时间读完。

1. IP102数据集到底长什么样:一个基准数据集和工业落地的差距

1.1 102个类别背后的作物版图

IP102是2019年发表在CVPR上的一个大规模昆虫害虫检测基准数据集,全称很长,但核心信息就几个:102个害虫类别,超过75,000张标注了边界框的图像,覆盖了水稻、玉米、小麦、棉花、蔬菜等几大类主要农作物上的常见害虫。

你可能觉得102类很多,实际上农业植保领域需要识别的害虫远不止这个数,但IP102的价值在于它把田间最常见的那些害虫都收进来了。以我后来实际用到的几个类别为例:水稻上的二化螟、稻飞虱,玉米上的玉米螟、粘虫,棉花上的棉铃虫、蚜虫,麦类上的麦蚜、吸浆虫,这些都是在农业生产中会造成明显经济损失的种类。有了这个底子,做智慧农业监测系统至少不用从零开始攒数据。

但这里有个关键认知要同步一下:IP102的设计初衷是作为学术基准,不是工业数据包。这意味着它关注的更多是“类别全不全”“样本够不够支撑模型对比”,而不是“生产环境里能不能直接用”。一句话总结就是:这是一个很好的起点,但绝不是开箱即用的终点。

1.2 图像来源和分辨率两极分化

IP102的图像来源主要是网络爬取加一部分田间拍摄。网络爬取意味着什么?意味着图像背景极其多样,有人工摆拍的干净白底图,有农户随手拍的田间照片,还有各种图像质量层次不齐的监控截图。这种多样性对训练泛化能力有帮助,但也带来一个头疼的问题:分辨率两极分化。

我清洗这批数据时统计过,原始图像最短边从几百像素到三千多像素都有,同一类害虫在不同图片里的尺度差异可以大到几十倍。有的图里害虫占了画面一半,有的图里害虫区域只有十几个像素,肉眼能看到就不错了,更别说让模型学。如果你不做任何预处理直接把所有图缩放到统一尺寸,小目标基本等于白给。

还有一个容易被忽略的问题:部分图像存在重复或高度相似的情况。网络爬虫的数据经常从同一个来源抓取多张几乎一样的图,这些样本如果同时进入训练集和验证集,会虚高你的mAP指标,让你误以为模型很强,实际一上田就现原形。所以去重这一步看着不起眼,却直接关系到评估指标的可信度。

1.3 标注框质量:不是每个框都紧贴目标

IP102的bbox标注整体质量在学术数据集里算中等偏上,但离“可以直接训练YOLO”还有距离。我遇到最多的三种情况:

第一,部分标注框不是紧贴害虫轮廓,而是把整片受害区域都框进去了。比如稻飞虱危害会导致叶片发黄,有的标注框直接把黄化区域全包进去,害虫本身只占框的一小块。YOLO的训练逻辑里,模型会学习框内的特征来代表这个目标,如果框内大部分是叶片背景,模型学到的东西就偏了,推理时很容易把相似的叶片区域误判为害虫。

第二,遮挡和模糊样本不少。田间拍摄经常有叶片遮挡、虫体被部分挡住的情况,这种样本对训练模型的鲁棒性有帮助,但如果模糊到连标注者都只能凭经验画框,那它对模型的贡献就是噪声。

第三,类别不均衡比想象中严重。IP102号称每类平均七百多张,但实际上是部分常见害虫有上千张,稀有类别可能只有两百张不到。你拿原始分布去训练,模型天然偏向样本多的类,个别冷门害虫的识别率会低得没法看。

2. 从75,000张砍到4,400张:我的数据筛选逻辑与清洗流程

2.1 自动筛选:清晰度、曝光和目标可见度

我一开始也想过“全量训练”,毕竟75,000多张数据不用白不用,但实验跑下来,mAP没提上去,训练时间倒是翻了几倍。冷静下来重新想:这个项目要的是田间部署能用的模型,不是刷榜模型,那我需要的是高质量、高一致性的数据,而不是一堆噪声。

于是我的清洗流程从自动筛选开始。第一步是清晰度过滤,核心指标是拉普拉斯方差。简单解释一下:拉普拉斯算子能提取图像的边缘信息,方差越大说明边缘越锐利,图像越清晰;方差越小说明边缘信息越少,大概率是模糊图。我以归一化到640分辨率的图来计算,把方差低于经验阈值的图全部挑出来人工复核,确定是模糊图的直接剔除。

第二步是曝光过滤,用图像的灰度直方图做判断。过曝和过暗的图,害虫本身的纹理和颜色细节都会丢失,对训练分类分支特别不友好。过曝的图高光区域一片白,暗部细节在过暗的图里直接消失,这类样本留着只会在训练时提供错误的纹理特征,不如删掉。

第三部是目标可见度过滤,这一步比较关键。我用了一个粗糙的半自动方案:先用一个在COCO上预训练的YOLOv8n模型,对每张图的目标区域做粗检测,只记录那些标注框内目标置信度极低或者框面积占整图比例过小的样本,再人工抽查。这里要说明,COCO预训练模型并不认识农作物害虫,但它能提取通用物体特征,如果一张图里连“像一个物体”的特征都提不出来,那这个标注框大概率有问题。

这一轮筛选下来,剩下的图大约只有原始数据的三分之一,但质量肉眼可见地提高了。

2.2 去重、尺寸归一化和人工复核

自动筛选之后是去重。我用的方法比较朴素:对每张图计算感知哈希,两两比对汉明距离,距离小于阈值的判定为重复图或近似图,只保留其中一张。这里有一个细节:IP102里有些图是多张相似但拍摄时间不同的序列帧,这种不算严格重复,保留下来反而能增加视角多样性。所以阈值设置不能太激进,宁可多留一些,也不要误删有效样本。

尺寸归一化也是不可跳过的一步。YOLO训练时对输入分辨率有固定要求,我最终统一缩放到长边不超过1280像素,短边不低于640像素。原始数据里有不少超大图,直接缩到640会丢失小目标细节,但全用1280又太耗显存。我采用了一个折中方案:训练时用640和1280双尺度混用,推理时用1280为主。这个后面会展开细说。

最后是人工抽检。自动筛选只能过滤掉“一眼假”的坏样本,但标注框不准这种问题必须靠人眼来判断。我的做法是:把每张图连同标注框画出来,按类别分组批量浏览,每类随机抽20%复核。重点看两类问题:一是标注框是否紧贴目标,二是是否有明显的标错类别。这个过程很费时间,但比起模型训练完才发现数据问题再返工,这一步的成本完全可以接受。

2.3 为什么4400张就够用了:迁移学习和数据增强的底气

清洗完剩下的数据,按最终统计是4,400张左右,覆盖了IP102里96个有效类别,每类保留30到60张不等。你可能觉得这个数量太少,但实测下来完全撑得起一个可用模型,关键在于两点:迁移学习和数据增强。

先说迁移学习。我加载的预训练权重是COCO上训练好的YOLOv8s。COCO数据集包含80类日常物体,模型在这么大规模的数据上学到的通用特征提取能力是完全可以复用的。害虫检测和通用物体检测共享大量的底层视觉特征,比如边缘、纹理、颜色分布、局部形状,这些在预训练阶段已经学好了。我们需要微调的只是高层语义,也就是“这个纹理组合对应哪个害虫类别”。这就是为什么哪怕只有4,400张,模型也能较快收敛。

再说数据增强。YOLO自带的增强策略在训练时会实时生成大量变体样本:Mosaic拼接把四张图拼成一张,让模型在更丰富的背景上学习目标;HSV色彩扰动会让模型对光照和颜色变化更鲁棒;随机翻转、缩放、平移扩充了目标的尺度和位置多样性。这些增强手段叠加下来,等效训练样本量被放大了几十倍,模型看到的其实是各种变换后的数据分布,而不仅仅是原始的4,400张图。

当然,4,400张能撑起一个项目的前提,是后续还要持续做数据闭环。这个我在最后一节会细讲。

3. 把IP102转成YOLO能吃的格式:目录结构、标注转换和类别映射里的细节

3.1 边角坐标转YOLO中心点格式:公式和脚本

IP102原始标注提供的是边界框的左上角和右下角坐标,也就是(x1, y1, x2, y2)的边角格式。YOLO要求的是归一化后的中心点格式,也就是(x_center, y_center, width, height),所有值都除以图像宽高归一化到0到1之间。两者之间转换不复杂,但容易出低级错误。

这是我在项目里用的转换脚本核心部分:

def convert_bbox(size, box): """ Convert (x1, y1, x2, y2) to YOLO format (x_center, y_center, w, h) normalized. size: (width, height) box: (x1, y1, x2, y2) """ dw = 1.0 / size[0] dh = 1.0 / size[1] x_center = (box[0] + box[2]) / 2.0 y_center = (box[1] + box[3]) / 2.0 w = box[2] - box[0] h = box[3] - box[1] return (x_center * dw, y_center * dh, w * dw, h * dh)

有几个细节大家写脚本时一定要注意。首先是坐标系的统一:PIL读图、OpenCV读图、IP102官方脚本读图,坐标原点和通道顺序都可能不一样。我最早踩过一次坑,用PIL读图但坐标是OpenCV格式的,结果训练时标注框全部发生了镜像平移,模型死活学不对。建议转换前统一用OpenCV或者统一用PIL,不要混用。

其次是边界检查。有些标注框会超出图像边界,比如x2比图像宽度还大一点,转换后归一化坐标会大于1,YOLO训练时解析会报错。写转换脚本时记得加一个clip操作,把坐标限制在0到1之间。至于那些超出严重、比如框出图像范围超过10%的样本,我建议直接删掉,因为这个标注框本身就有问题。

3.2 分层抽样划分训练集和验证集

数据集划分看起来是个小步骤,实际对评估结果影响非常大。我见过不少人直接全局随机划分,结果某些类别全部进了训练集,验证集里根本没有这个类别,最后模型评估时这一类直接不参与计算,mAP虚高。这绝对是评估流程里最常见的坑之一。

我的做法是按类别分层抽样。具体来说:先按类别ID把数据分组,每个类别内部用8:2比例随机划分训练集和验证集,保证每一类都在两个集合中有足够样本。如果某些类别数量特别少,比如只有30张,那训练集和验证集可以稍微调整为7:3,但至少要保证验证集里有5张以上,否则评估结果的波动会很大。

划分完之后,目录结构按YOLO的标准来组织:

pest_data/ ├── images/ │ ├── train/ │ ├── val/ ├── labels/ │ ├── train/ │ ├── val/ └── data.yaml

images和labels两个目录下的文件名要保持完全一致,只是后缀不同。图片是jpg,标注是txt,这个对应关系一旦错位,训练时要么报错找不到标注,要么静默匹配到别人的标注,这两种情况我都见过。

3.3 data.yaml和类别ID的对齐陷阱

data.yaml是YOLO训练时的配置文件,内容很简单:

train: pest_data/images/train val: pest_data/images/val nc: 96 names: ['Acyrthosiphon pisum', 'Aelia sibirica', ...]

nc是类别总数,names是所有类别的名称列表,顺序必须和标注txt第一列的类别ID严格对应。这个对应关系是训练流程里隐藏最深的地雷。

我举个例子:IP102的类别索引号是官方钦定的,从0到101。但我在清洗数据时删掉了一些类别,新的类别ID必须重新编号压缩到0到95。如果base数据集文件里的类别ID没有同步更新,或者data.yaml里names的顺序和实际ID对不上,模型训练时就会把类别A的图片对到类别B的标签上,mAP直接归零。

我当时处理这个问题的方法是:用脚本构建一个类别映射表,把原始类别名和原始ID、新ID对应起来,然后统一重写所有标注文件。写完后再拉一批样本做可视化检查,逐个确认类别标记正确。这一步虽然繁琐,但值得做一次,否则后面所有训练成果都是建立在错误的地基上。

4. 第一次跑YOLO训练就翻车:损失不降、mAP为0的排查全过程

4.1 第一轮的配置和预期

数据准备妥当之后,我开始跑第一轮正式训练。配置用的是YOLOv8s,加载COCO预训练权重yolov8s.pt,输入分辨率640,batch size 16,初始学习率0.01,训练200个epoch,其他参数保持默认。按一般经验,这个配置在常规检测数据集上,几十个epoch就能看到收敛趋势。

第一轮的前30个epoch,各条loss曲线确实都在下降,看起来一切正常。但到了40个epoch左右,train的box_loss和cls_loss开始出现一种诡异的震荡,不涨不跌,就卡在一个水平线上抖动,验证集的mAP也始终在0.3以下徘徊。我当时第一反应是学习率策略问题,但反复调整之后发现事情没那么简单。

4.2 翻车现场一:标注框太小,模型根本学不到特征

我重新把训练数据拉出来检查,发现一个之前忽略的事实:这批清洗后的数据里,有相当一部分图的害虫目标区域非常小。平均框面积占整图比例连0.1%都不到,换句话说,一张640x640的图里,目标可能只有不到20x20像素。

这种数据直接扔给YOLO训练会出现两个问题。一个是feature map分辨率不够:YOLOv8对640输入会做多层下采样,最小的检测头在20x20的feature map上工作,一个20x20像素的害虫,下采样后可能就剩一个点的响应,模型根本没法在这个尺度上学习完整的形状特征。另一个是loss函数对小目标的惩罚非常大:目标面积越小,回归框的IoU对像素偏移越敏感,几个像素的偏差就会导致box_loss剧烈波动。

解决思路有两条,我都实测过。第一条是把训练分辨率提高到1280,让目标在feature map上占据更多像素,代价是显存占用翻倍、训练速度下降,如果卡不够好甚至跑不动。第二条是做一个简单的目标裁切增强:在训练前把目标区域连同周围一定比例的上下文裁出来,放大后再和其他图拼进Mosaic。这种方法对小目标类别效果立竿见影,但对部署阶段的推理要求更高——你训练时用的是裁剪图,推理时也必须做类似的切片处理。我最后选择了两者结合:训练时用1280分辨率,推理时也用1280并配合切片。

4.3 翻车现场二:验证集mAP全程为0的真相

小目标问题解决之后,模型总算能收敛了,但新的问题又冒了出来:验证集mAP在训练全程始终是0,训练集loss正常下降,训练集mAP在稳步上升,验证集却死都不涨。这种“训练集正常、验证集归零”的诡异现象,基本可以断定是数据划分或者标签映射出了问题。

我花了半天排查,最后定位到根因:数据划分脚本里有一行写错了,导致验证集里有一部分图片的标注文件是空的。YOLO在计算验证集指标时,类别ID从0到95都要有统计,而空标注文件意味着这一张图没有任何目标,模型输出的预测框不管置信度多高,都因为没有对齐的真实框而被判为误检,于是验证集准确率和召回率双双塌方。

这行错误其实很容易发现——只要在划分完数据后跑一个检查脚本,统计每个目录下的标注框数量分布,如果发现某个类在验证集没有标注文件,或者某个类在训练集中只有一两张,就应该立刻定位到问题。但当时我图省事跳过了这个检查,结果浪费了整整一天的训练时间。教训就是:数据验证步骤一个都不能省。

4.4 排查三步法:先看数据、再看预测、最后调参数

这一轮折腾下来,我总结了一套排查经验,分享给大家。当你的YOLO训练出现异常时,按这个顺序排查,比自己盲目调参高效得多。

第一步,先看数据。把训练集和验证集的图片连同标注框画出来,肉眼检查。重点看标注框是否紧贴目标、是否错位、是否有空标注、类别ID是否对应正确。这一步能过滤掉90%以上的低级错误。

第二步,再看预测。用当前权重跑几张验证集图片,把预测框画出来。如果模型一个框都画不出来,大概率是数据问题;如果画出来但类别不对,大概率是类别映射问题;如果框的位置大致对但置信度很低,大概率是目标尺度问题。

第三步,最后调参数。数据和预测都没问题的情况下,再看loss曲线和学习率策略。很多人在第一步就跳过去直接调参数,结果调了半天发现是数据标注错了,白白浪费时间。

5. 读懂YOLO的损失曲线,才知道模型到底在学什么

5.1 YOLOv8的三种loss分别管什么

YOLOv8的损失函数由三部分组成,训练日志里分别显示为box_loss、cls_loss和dfl_loss。很多人只看一个total loss,看不懂模型到底哪里学得好、哪里学得差,其实把三个分量拆开看,信息量大得多。

box_loss负责边界框的回归,衡量模型预测框和真实框之间的位置和尺寸差异。它关注的是“框得准不准”。cls_loss负责分类,衡量模型给目标打标签的置信度对不对,关注的是“认得出是哪一类”。dfl_loss是分布焦点损失,用于优化边界框的分布预测,它帮助模型在边框回归时对边界附近的误差更敏感,对小目标的框回归也挺重要。这三个loss一起下降,才是健康的训练过程。

如果你在训练日志里看到box_loss降得很快、cls_loss却一直挂在高位,说明模型已经知道目标在哪里,但对目标到底是什么类别还拿不准。这时候优先考虑是不是类别样本不均衡,或者不同类别之间的外观特征过于相似。反之,如果cls_loss正常下降但box_loss震荡,大概率是标注框本身不够准,L2损失对标注噪声敏感,框的标注有偏差,训练自然学不稳。

5.2 正常曲线、过拟合曲线和不收敛曲线长什么样

我拿自己这批数据跑了几组对照,把典型曲线形态整理成表格,方便大家对照自己的训练日志。

曲线类型box_loss趋势cls_loss趋势验证集mAP原因推断建议动作
健康收敛平稳下降后趋缓同步下降后趋缓缓慢上升并稳定数据和配置正常保持不动
过拟合训练持续下降,验证集回升同上训练集高,验证集峰值后退化数据量不足或增强过弱增强数据增强、加正则、提前停止
欠拟合全阶段缓慢下降下降不明显一直在低位模型容量不够或学习率太低换大模型或调大学习率
不收敛震荡剧烈或有明显上升段震荡持续几乎为0数据标注问题或学习率爆炸先检查数据,再调学习率

有一个细节值得注意:如果训练集的loss下降得很漂亮,但验证集mAP从某个epoch开始明显下滑,经典的过拟合现象,最有效的应对是提前停止训练并配合更强的数据增强。我实际把Mosaic概率调高、HSV扰动范围调大之后,过拟合程度明显缓解。

5.3 类别不均衡:三种解法实测对比

IP102的类别不均衡问题在我这个4,400张子集里依然存在。有些类别60张,有些类别才30张,如果不做任何处理,训练时模型对样本多的类别严重偏向。我实测了三种方案,效果差异还挺大。

方案一是给稀有类别加训练权重。具体实现可以在数据加载时对每个样本根据其类别的逆频率来设定采样权重,类别越少采样概率越高。这个方案实现简单,训练过程稳定,缺点是稀有类别重复出现容易在局部过拟合,要知道同一个样本多采几次不会凭空增加信息量。

方案二是对稀有类别做标签级增强。我的做法是:从原始大图中把包含稀有类别目标的区域裁剪出来,配合一定比例的上下文,缩放到合适尺寸后随机拼接回其他训练图里。这样相当于在数据层面给稀有类别制造了更多“出现场景”,模型有更多机会学习它的特征。这个方案效果明显好于方案一,我的几个稀有类别识别率提升了将近8个百分点。

方案三是对稀有类别使用更强的数据增强。因为我发现稀有类别的图有不少是同一个来源的相似图,增强强度不够的话,模型很容易记住这些特定背景。通过提高HSV扰动强度加上随机的Cutout,让模型对背景变化更敏感度低一些。但这个方案提升幅度没有方案二明显,我最终保留的是方案二和方案三的组合。

6. 从测试集mAP到田间实拍:智慧农业落地的最后一公里

6.1 测试集mAP 0.72,到了田间为什么还是漏检

经过前面的清洗、调参和训练调优,模型在验证集上的mAP@0.5达到了0.72,mAP@0.5:0.95约为0.45。这个指标放在学术论文里算不上惊艳,但对一个面向大田场景的监测项目来说,已经达到可以外部测试的基准了。然后我带着模型去了趟现场,结果一盆冷水浇下来。

田间实拍的漏检率比测试集高出一大截,原因归结起来就是一句话:测试集和田间数据的分布不一样。IP102里有相当比例的图像是网络搜图或人工近距离拍摄,画面干净、目标居中、光线均匀。但田间监测设备的画面通常是俯拍,远近不一、光线随天气变化、叶片层层叠叠互相遮挡,害虫在画面里的呈现方式和训练数据差异非常大。

我自己统计了一下,田间场景漏检的样本里,超过一半是小目标和遮挡目标。小目标不用说,前面训练的坑已经讲过了,虽然调整了分辨率,但田间远距离目标比训练集里的小目标还要小。遮挡目标更麻烦,虫体被叶片挡住一半,模型的特征提取能力再强,也只能看到残缺信息。这时候什么最好的数据增强都比不过把真实场景的数据收回来。

6.2 小目标问题怎么解:提高分辨率加切片推理

针对小目标漏检,我第二次迭代的方案是双管齐下:第一,推理分辨率从640提高到1280;第二,引入切片推理的思路,把大图切成多个640的小块,逐块检测,最后合并结果做NMS。

切片推理说起来不复杂:把一张大田照片按固定步长切成小块,有重叠的区域,每块独立跑模型检测,把检测结果映射回原图坐标,重叠部分用NMS去重合并。这样一来,原本在1280整图下只有十几个像素的小目标,切到640的小块里可能就有几十个像素,模型能捕捉到的细节多了,检测率自然就上去了。

这个方案对mAP的提升是实打实的,小目标的召回率涨了将近15个百分点。代价也很明显:推理耗时翻倍。在Jetson AGX Orin上,单次1280整图推理大约耗时20毫秒,如果切成4到6块,总耗时大概率要翻到40到60毫秒,这还不包括重叠区域的重复计算。如果产品对实时性要求高、比如要做视频流的实时监测,这个方案就要慎重了,需要做好算力规划和帧率预算。

6.3 在AGX Orin上部署:ONNX导出和TensorRT的版本坑

部署阶段我选的目标平台是Jetson AGX Orin,这是边缘设备里算力比较充裕的选项,做农业大棚或大田的边缘侧推理都够用。导出和加速流程是:先把PyTorch权重导出为ONNX,再用TensorRT构建engine,FP16精度。

导出命令很标准:

yolo export model=best.pt format=onnx imgsz=1280

然后用TensorRT的命令行工具构建engine:

trtexec --onnx=best.onnx --saveEngine=best.engine --fp16

这里有个特别容易踩的坑:TensorRT版本和ONNX opset版本不兼容。ONNX导出时默认的opset版本可能比你板子上TensorRT支持的版本高,构建engine时直接报错或者静默生成错误结果。我的建议是导出的ONNX用opset=12,兼容性最稳。另外,Jetson上刷的JetPack版本决定了TensorRT版本,JetPack 5.x对应的是TensorRT 8.x,导出和构建时务必保证这个链条是匹配的,否则后面推理结果各种诡异。

实测在FP16精度下,yolov8s的engine在640分辨率输入时能跑到45 FPS左右,1280分辨率降到30 FPS出头,切片推理的话就只有个位数到十几帧了。如果你的场景允许离线分析,这个性能完全够用。如果要实时视频流,我建议优先保证帧率,小目标问题交给后续的数据迭代和模型结构调整来解决。

6.4 数据闭环:4400张不是终点,是起点

最后的最后,我要强调一个观点:这4400张清洗后的数据集绝对不是一个项目的终态,而是整个数据闭环的起点。模型部署到田间之后,每拍回来一张图,都可能是对训练集的补充。漏检的图要回收,误检的图要回收,天气变化带来的新光照条件要回收,作物不同生长阶段的背景也要回收。

我目前的做法是:定期从现场服务器把检测置信度低于阈值的图片、以及置信度很高但识别结果明显错误的图片拉回来,人工标注后增量训练。这个闭环跑起来之后,模型的表现会持续提升,比一次性把数据堆满再去训练要高效得多。

从我个人的实操体会来说,做农业AI和做通用目标检测最大的不同,就是真实世界的数据变化太多了。你不可能在项目启动时就把所有情况都预料到。与其追求一开始就搞一个完美的数据集,不如把数据回收和增量训练的流程建好,让模型在使用中成长。

如果你手头正好也在做类似的数据清洗或者YOLO训练项目,我的建议很简单:先把数据可视化检查做扎实了,再谈训练调参。数据地基建得稳,后续一切都会顺很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询