
做农业害虫检测项目最头疼的往往不是模型而是数据。这句话我复盘了好几个项目才真正认同。田间地头的害虫种类少说上百种YOLO常用的COCO预训练权重里一个农业害虫的类别都没有直接拿通用目标检测模型去数虫子结果基本是灾难。后来我花了一个多月整理了一套3200张的农业害虫检测数据集专门服务智慧农业场景包括虫情测报、植保无人机识别和田间定点监测。这套数据集的采集、标注和YOLO训练流程我想完整拆出来分享给同样被虫子数据折磨的朋友。1. 为什么害虫检测需要专属数据集通用模型和真实田间的差距1.1 通用目标检测数据集为什么不够用YOLO系列最常用的预训练权重基本是在COCO数据集上完成的COCO有80个类别覆盖人、车、猫、狗、杯子、椅子这些日常物体但唯独没有“稻飞虱”“棉铃虫”“草地贪夜蛾”这类农业害虫。用COCO预训练模型做迁移学习底层卷积核确实学到了边缘、纹理、形状这些通用特征但目标类别和特征分布和田间场景差得太远。你可以把预训练模型理解成一个看过很多“城市街头”的实习生突然让他去水稻田里找稻飞虱他连“这东西长什么样”都没概念自然找不到重点。更关键的是目标尺度。COCO数据集里的大多数目标在整张图中占比不小很多标注框甚至超过图像的20%。可农业害虫呢一只蚜虫可能只有十几个像素稻飞虱也不过几十个像素。YOLO模型通常通过多次下采样提取特征小目标经过深层卷积后非常容易被过滤掉。如果你只是在COCO预训练权重上微调不针对小目标调整输入分辨率或网络结构训练出来的模型很可能是“睁眼瞎”。另外通用数据集的标注习惯和农业场景也不同。COCO里对遮挡目标的容忍度较高而害虫检测往往需要精确计数一个叶子上密密麻麻挤着几十只蚜虫漏标一只都会让计数偏差很大。这种密集小目标的标注规范在通用数据集中根本找不到答案。1.2 智慧农业场景的特殊挑战智慧农业里的害虫检测不是简简单单在实验室里拍几张照片就行。田间环境的光照、背景、姿态都比普通检测任务复杂得多。我整理数据集时特意保留了这些“麻烦场景”因为只有让模型在麻烦里长大田间部署才不会翻车。首先是光照变化。晴天强光下叶片反光严重虫子表面高光过曝阴天漫射光虽然柔和但对比度低虫体和背景融为一体清晨和傍晚是害虫活动高峰期光线偏暗很多图像需要补光。其次背景极其杂乱。土壤、枯叶、水面、稻秆、杂草颜色和昆虫体色很接近。比如稻飞虱的黄褐色和枯叶几乎一模一样光靠颜色区分根本不可能。还有遮挡问题害虫藏在叶片背面相机拍不到叶片相互遮挡虫体只露一半虫口密度大时虫子压着虫子单张图像里几百上千个实例。我见过有人拿网上的风景图、实验室白底图训练害虫模型检测效果在演示时看着不错一到田间就原形毕露。原因很简单白底图里没有田间噪声模型学到的是“干净背景上的虫子”不是“复杂环境中的虫子”。所以数据集的场景多样性比绝对数量更重要。1.3 3200张这个规模意味着什么很多朋友问我为什么不是800张或者直接上2万张其实3200张是我权衡标注成本、训练效果和项目周期之后得到的经验值。先说为什么不能太少。YOLO是数据驱动模型单类别实例太少很容易过拟合。比如只有200张图片模型可能把“叶片纹理”当成害虫特征换个田块就失效。3200张能覆盖不同光照、不同作物、不同虫态每个类别平均几百张图每张图又有多个实例相当于模型见到了几百甚至几千个独立样本。这个数量足以让YOLO学到害虫的结构特征又不至于让标注成本失控。再说为什么不必一味追求大。标注一张密集害虫图快则三分钟慢则十几分钟。3200张图按平均每张五分钟算一个人全职标注也要两百多个小时差不多一个多月。如果扩到两三万张标注周期翻几倍项目早黄了。而且智慧农业的特点是“场景持续变化”今年地里主要是蚜虫明年可能迁飞来草贪数据集需要持续迭代。与其憋一个大而全的静态数据集不如做一个“够用、可扩展”的种子数据集后面靠数据闭环持续补充。所以3200张这个规模对智慧农业害虫检测来说是一个特别务实的起点。2. 3200张数据集是怎么构成的类别分布、图像规格和标注格式2.1 数据来源和采集设备这套数据集里的图像来源不是单一途径而是三种典型场景的混合。第一种是虫情测报灯自动拍照在固定监测点安装设备夜晚开灯诱集害虫相机定时拍摄。这类图像分辨率稳定、背景单一通常为白板或黑布虫子姿态多样但可能存在重叠、掉漆、反光等测报灯特有的问题。第二种是手持设备田间拍摄用手机或微距相机贴近叶片、茎秆、稻丛拍虫子的自然发生状态。这类图像背景复杂、景深变化大最考验模型的泛化能力。第三种是植保无人机或田间监测塔俯拍主要面向水稻、小麦等大田作物的冠层为害状以及大面积暴发时的虫口密度估计目标更小尺度变化更大。采集设备不必追求顶级。我常用的是普通手机加微距镜头画质够用便携性强。固点测报灯配备的是工业相机三百万像素以上夜间补光用白光或红外。无人机则用可见光相机飞行高度控制在3到5米太低了覆盖面积不够太高了虫子根本看不清。2.2 类别设计按作物场景而不是按昆虫学分类设计类别时有一个很重要的思路不要照搬昆虫学分类而是按你实际要检测的场景来定。比如“鳞翅目幼虫”在昆虫学里可能是一个很大的类群但田间的棉铃虫和草地贪夜蛾危害不同防治方式也不同分开检测才有农业价值。我整理的数据集以“水稻棉花玉米”三类常见大田作物为主选了几个出现频率高、经济危害大的害虫作为检测对象稻飞虱、蚜虫、二化螟、棉铃虫、草地贪夜蛾。其中稻飞虱是水稻上的明星害虫数量暴发时能造成“虱烧”蚜虫在棉花、玉米上都常见二化螟和草地贪夜蛾都是钻蛀性害虫幼虫在茎秆或果穗里检测难度更大。每个类别的图像数量参考类别拉丁文简称典型作物图像数量约实例密集度稻飞虱Nilaparvata lugens水稻600高蚜虫Aphididae棉花、玉米550很高二化螟Chilo suppressalis水稻520中棉铃虫Helicoverpa armigera棉花、玉米480中草地贪夜蛾Spodoptera frugiperda玉米420中高这里数字不是绝对精确因为数据集迭代后会有增删但整体比例反映了一个原则常见害虫给够样本但不要给某一类太多导致模型偏向。如果一类图像数量是另一类的十倍训练出来的模型会在多数类上很准少数类几乎全漏。2.3 标注规范和YOLO格式细节YOLO的标签格式非常简单一张图像对应一个同名txt文件每一行代表一个目标格式为class_id x_center y_center width height四个坐标值都是归一化到0到1的浮点数图像左上角为原点右下角为(1,1)。这里有几个细节容易踩坑。第一类别ID从0开始。第二坐标归一化是用像素坐标除以图像宽和高注意是宽除以宽、高除以高不能搞反。第三txt文件和图像文件必须同名比如IMG_001.jpg对应IMG_001.txt否则YOLO读不到。标注规范上我给自己定了几条硬性规则边界框要紧密包裹虫体主体可以包含触角、足但不要包含一大片背景。遮挡超过70%的目标可以不标但同一张图里如果有一个虫头露在外面能数出来就要标。虫体粘连时框与框之间允许轻微重叠但不要用一个大框把一堆虫子框进去。对于只有十几个像素的小目标框稍微大一点可以接受但不要超过目标实际尺寸的1.5倍。如果一张图里虫子实在太多标注时宁可分多次也不要漏标。标注工具我用过LabelImg、CVAT和X-AnyLabeling。LabelImg适合单机小批量界面简洁导出YOLO格式很直接CVAT支持多人协同、帧标注适合团队批量标注X-AnyLabeling集成了SAM等分割模型可以半自动标注密集目标能大大提高效率。如果标注员本身对虫体不太熟我会先给一批示例图让他们知道“该框哪里、框多大”。2.4 数据划分与目录结构数据集的划分我建议按 8:1:1 分成train/val/test也可以7:2:1。但有一个原则容易被忽略同一时间、同一地点、同一镜头连续拍的多张图像必须全部归到同一个集合里。如果训练集和验证集里出现了几乎相同背景的图验证结果会虚高等部署到新田块直接现原形。典型的目录结构长这样agricultural_pests/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamlimages和labels目录要保持严格对应。划分时建议用脚本随机分配不要手动拖文件否则容易漏掉同名txt。我的简单划分脚本思路是先拿到所有图像文件名按比例随机切分然后对应移动jpg和txt文件。这里提醒一句先分集合再生成标签列表不要让train和val共享任何一张图像。3. 从零构建自己的农业害虫数据集采集、清洗、标注、质检全流程3.1 图像采集比想象中难的是“有效信息密度”很多人觉得拍照谁不会但真正去田间拍一圈就会发现拍回来的图要么虫子太小要么全是虚的能用的没几张。这里有个概念叫“有效信息密度”即一张图里有多少个可以准确标注的目标。如果一张图只有一只芝麻大的虫子剩下全是叶片那张图对训练的贡献非常有限。要提高有效信息密度拍摄时可以注意几点尽量靠近目标让虫体占图像长边的1/20以上。如果一张640像素的图里目标只有5像素即使勉强标出来模型也学不到什么。用最高分辨率拍摄但不要无脑大。长边最好不要超过4096像素否则单张图处理慢显存占用也高标注还费眼。我一般控制在1920到3000像素之间。选择不同时段拍让模型至少见过顺光、侧光、逆光和阴影下的虫子。固定监测点拍照要设计好相机角度尽量均匀布置光源避免大面积反光。拍完立刻在相册里标记地点和作物类型方便以后回溯。如果早期样本不够还可以利用虫情测报灯的诱虫盘把虫子平铺在白板上拍摄。虽然背景单一但胜在虫子姿态清晰适合作为模型的“启蒙数据”。等模型在这种简单场景下能稳定检测了再混入复杂田间图继续训练效果会比全部一上来就用复杂图好一些。3.2 清洗模糊、重复和坏图不能留数据清洗是很多人偷懒的一步但我想说这一步省了后面训练时全是坑。清洗的原则很简单肉眼都看不清的目标模型更不可能看清。我清洗时会按以下顺序过一遍删除严重模糊、失焦的图。判断方法是把图像放大到100%看虫子的触角或足还能不能辨认。删除过曝或欠曝严重的图。高光区域一片惨白或者暗部全是死黑的图模型只会学到噪声。删除目标占比过小且数量极少的图。比如一张图里只有两三个3像素大小的虫子这种图对训练基本没有增益。用感知哈希算法找相似图连续连拍的重复图像只保留一张避免数据冗余导致过拟合。清洗后我会记录每张被删图像的原因不是为了写报告而是为了发现采集环节的系统性问题。如果大量图片因为模糊被删说明快门速度太慢或手持不稳就要调整拍摄参数。3.3 标注工具选择与密集场景的标注策略标注是整套流程里最耗时的环节。工具选择上我个人的经验是工具适用场景优势不足LabelImg个人小批量界面简洁YOLO格式导出直接单机单人不适合协同CVAT团队多人协同支持在线标注、多人分工、标签校验需要部署服务有一定学习成本X-AnyLabeling半自动标注集成分割模型密集场景辅助效率高需要显卡推理标注框可能需要手工微调密集场景是标注里最让人崩溃的。一株麦蚜可能几百上千头如果全靠手点一天标不完几张。我的策略是“先粗后细”先用半自动工具生成一批候选框再人工调框和补漏。对于特别密集的区域宁可多花时间把每只虫子都框出来也不要为了赶进度把一群虫子框成一个框。因为目标检测的输出是矩形框一个框里套十只虫子模型训练时会被这些错误标注严重干扰。如果在某些图像上实在无法逐只标注我会建议直接删除该图而不是“大概标一下”。密集场景的错误标注比漏标更可怕漏标只是少一个正样本错标等于把模型往错误方向带。3.4 质检比标注更关键的一步标注完成后绝对不能直接开训必须做质检。我通常做两层质检第一层是机器校验。写脚本检查每一个txt文件确保每行有5个数字、类别ID不超过nc-1、坐标值都在0到1之间、width和height大于0。这种脚本很简单随手就能写import os label_dir labels/train for file in os.listdir(label_dir): if not file.endswith(.txt): continue with open(os.path.join(label_dir, file), r) as f: lines f.readlines() for i, line in enumerate(lines, 1): parts line.strip().split() if len(parts) ! 5: print(f{file} 第{i}行格式错误) continue cid, cx, cy, w, h [float(p) for p in parts] if not (0 cx 1 and 0 cy 1 and w 0 and h 0): print(f{file} 第{i}行坐标越界或尺寸异常)第二层是人工抽检。按5%到10%的比例随机抽取图像把标注框可视化出来看看框是不是贴合目标、有没有明显的漏标或错标。这个步骤不能省因为机器只能查格式查不了语义。我自己遇到过最典型的质检事故一个标注员把所有“飞虱”都标成了“蚜虫”机器校验完全正常人工抽检才发现类别张冠李戴。如果直接拿去训练模型学到的是“所有小虫子都叫蚜虫”后面就别想精准识别了。4. 用YOLO训练害虫检测模型从环境配置到第一行命令4.1 在PyCharm里安装YOLO少走我当初的弯路很多新手最先卡在“怎么把YOLO装上”。我见过有人直接在全局Python环境里pip install ultralytics然后因为版本冲突搞得系统库崩掉。所以强烈建议用虚拟环境。我自己习惯用Anaconda创建独立环境然后在PyCharm里配置解释器。具体步骤conda create -n yolo python3.9 conda activate yolo pip install ultralytics如果你的机器有NVIDIA显卡建议顺手装好对应版本的PyTorch。装PyTorch要注意CUDA版本匹配可以先nvidia-smi看驱动支持的CUDA版本再选择对应的pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121。如果只想先跑通流程用CPU版本也能训练只是慢很多。装完ultralytics后验证一下yolo predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg能正常输出检测结果说明环境没问题。在PyCharm里File Settings Project Python Interpreter选择刚才创建的环境即可。很多人装完了代码还是报错找不到yolo十有八九是解释器没切过来。这里特别提醒不要在新项目目录里手动下载一堆YOLO源码。ultralytics这个包本身就把训练、验证、导出、推理全封装好了直接调用命令行或Python接口就行。自己折腾源码版反而容易因为依赖缺失陷入无底洞。4.2 组织数据与编写data.yaml训练前要准备好自己的数据配置文件。在数据集根目录下写一个data.yaml内容是path: /home/yourname/agricultural_pests train: images/train val: images/val test: images/test nc: 5 names: 0: rice_planthopper 1: aphid 2: striped_stem_borer 3: cotton_bollworm 4: fall_armyworm注意几点path是数据集根目录的绝对路径下面填的train和val是相对路径不要写错层级。nc是类别数names里的类别顺序必须和标注txt里的class_id一一对应。如果标注时用的是中文类别名建议在这里统一改成英文或拼音避免某些环境出现编码问题。写完data.yaml后我通常先用这张图验证一下数据能不能被正确加载python -c from ultralytics.data import YOLODataset; dYOLODataset(data.yaml); print(len(d))能打印出训练集数量就没问题。如果报标签错误多半是txt与jpg没对应上回去查目录结构。4.3 训练命令与关键参数选择Ultralytics训练入口很简单yolo detect train datadata.yaml modelyolov8s.pt epochs150 imgsz640 batch16 device0说说参数选择背后的思路。model我建议先用yolov8s.pt或yolov8m.ptn版本太轻量害虫小目标表现容易拉胯l和x版本训练慢、部署难性价比不高。如果你的GPU显存只有8Gyolov8s在640分辨率下batch设16可能要调低到8。imgsz很关键。默认640对一般目标够用但害虫这么小的目标我会直接上1280。增大输入分辨率等于让模型“离近点看”对小目标特别有效。代价是显存和训练时间增加网卡的话可以先640跑一个baseline再用1280微调。epochs我一般给150到300配合patience2020轮没提升就早停。训练不是越久越好many epochs容易过拟合。观察验证集mAP曲线如果连续20轮不涨直接让它停。batch按显存来可以先nvidia-smi看显存8G卡建议4到816G卡可以1632G卡可以32。在某些卡上batch太大反而可能震荡不一定越大越好。训练开跑后建议盯住results.csv文件或者终端里输出的每个epoch指标。常见指标是metrics/mAP50(B)和metrics/mAP50-95(B)。mAP50是IoU阈值0.5下的平均精度对害虫这类小目标更直观mAP50-95是把IoU从0.5到0.95按步长0.05取平均更严格也更能反映框的精细程度。如果mAP50还行但mAP50-95低说明框不够准有偏移需要检查标注质量或调整损失权重。4.4 训练结果怎么解读训练结束后会在runs/detect/train/目录下生成一堆文件。先看results.png里面有损失曲线和指标曲线。损失应该逐步下降然后平稳如果验证损失在后期反弹就是过拟合了应该回退到最低点对应的epoch。模型最好选best.pt不是last.pt。再看confusion_matrix.png和PR_curve.png。混淆矩阵里如果某个类别的召回率特别低漏检多说明该类样本不足或场景太复杂。PR曲线右上角越凸越好如果某类曲线明显凹陷建议回到数据处理环节补样本。最后用验证集做一次预测直接把可视化图拉出来看看。我会随机挑二十张验证图把预测结果画出来人工判断漏检和误检。这一步比任何数值都直观数值再高图上一塌糊涂也不行。5. 害虫检测特有的训练难题小目标、密集遮挡与样本不平衡5.1 小目标YOLO的默认感受野不友好YOLOv8对640x640的输入特征图通常下采样到80x80、40x40、20x20三个尺度。20x20的特征图对应原图32倍下采样一个32x32像素的小目标在20x20特征图上可能只占一个点信息基本丢了。所以小目标恰恰是YOLO最不擅长处理的。我训练害虫数据时踩过最大的坑就是“明明标得很仔细但小目标几乎全漏”。后来总结出几个有效策略第一个提高输入分辨率。把imgsz从640提到1280等于让模型在更高分辨率下提取特征很多小目标在P3层浅层特征图还能留下信息表现为mAP显著提升。缺点是显存和推理时间翻倍。第二个是“切片推理”。在推理时先把原图切成若干有重叠的块每块放大后分别检测然后把结果合并。这种方法不用改训练关系效果立竿见影。开源的SAHI库就是干这个的。但要注意切片重叠率我一般用20%重叠避免目标被切成两半造成漏检。第三个是换用支持额外小目标检测层的模型结构比如YOLOv8-P2版本网络会在输入4倍下采样就输出一个特征图专门捕获小目标。代价是计算量增大但收获也很明显。我个人经验是先试imgsz1280成本最低不够再上SAHI还是不够再考虑P2结构。别一上来就上重型模型容易把部署问题搞复杂。5.2 密集遮挡NMS和标注一致性的双重考验密集害虫场景比如一团蚜虫里的目标是互相贴合、甚至重叠的。训练时模型会产出大量候选框后处理阶段非极大值抑制NMS会把重叠度高的框合并如果两个真实目标挨得太近NMS可能会误杀掉其中一个。应对密集场景有几个方向训练时标注框必须尽量贴合真实的单个目标不要随意扩大否则两个目标框的重叠度会异常高NMS更难区分。推理时适当调低conf置信度阈值比如从0.25降到0.1有助于召回密集区域里置信度偏低的真目标。调高NMS的IoU阈值比如从默认的0.45调到0.6或0.7让NMS不那么“激进”保留更多相邻框。使用加权框融合WBF代替普通NMSWBF不是删除重叠框而是把所有框加权平均在密集目标上通常能提升召回。我遇到过有趣的现象在密集叶片图上模型预测出的框往往比标注框略大因为相邻虫体产生的特征互相融合。如果标注框太紧模型反而学不到稳定的边缘信息。所以密集场景的标注规范要前后一致要么都贴体要么都稍微留一点边不能一会儿紧一会儿松。5.3 样本不平衡mAP上好看田里照样翻车一旦某个类别的样本数远多于其他类别整体mAP可能被多数类拉高看起来模型很能打但实际上少数类可能一个都检测不出来。比如稻飞虱600张、草地贪夜蛾只有420张差距不算特别大但如果一个3000张一个100张那就麻烦了。解决样本不平衡我按优先级尝试过采样少数类在训练时把少数类样本重复几遍。最简单的方法是在数据集中复制少数类图像但要注意只有少数类图不是把标签复制了事。做针对性的数据增强对少数类执行更强的色彩抖动、随机裁剪、旋转等操作增加它的有效变化。设置损失权重ultralytics支持在loss中按类别加权可以给少数类更高权重让模型更“关心”他们。训练后单独看每个类别的AP值。不要只盯着整体mAP要逐类看F1曲线。我常用的一个习惯是训练结束把results.csv里每个类别的mAP拉出来对比如果某类低于整体20个百分点就回数据池里找这个类别的漏检图、难例图继续补充。多数情况下补数据比调参更有效。6. 模型落地到田间边缘设备ONNX、TensorRT与推理功耗6.1 从PyTorch权重导出ONNX或TensorRT训练完的best.pt是PyTorch格式不能直接跑在边缘设备上。最常见的做法是先导出ONNX再根据设备转换成TensorRT engine。Ultralytics导出命令非常简单yolo export modelbest.pt formatonnx opset12导出后在同目录下会生成best.onnx。ONNX是开放格式很多推理引擎都支持。它的优点是不依赖特定版本的PyTorch和torchvision只要有一个ONNX Runtime就能跑。缺点是在GPU上速度可能不如TensorRT快。如果你部署在Jetson系列设备上我建议直接导出TensorRT engineyolo export modelbest.pt formatengine device0TensorRT会自动做层融合、精度校准推理速度比ONNX快不少。但TensorRT引擎跟显卡型号和TensorRT版本强相关在A设备上导出的engine拿到B设备可能跑不了需要重新导出。我用Jetson Orin开发时还遇到过一个问题设备里的PyTorch版本和开发机不一致直接导出的engine可能会出现输出尺寸错配。后来我干脆在Jetson上重新导出一次问题就没了。所以导出这种事尽量在目标设备上完成。6.2 在Jetson上搭建YOLO环境需要知道的限制热词里有人问“在AGX Orin上搭建YOLO环境”这个我也踩过不少坑。Jetson系列用的是ARM架构加定制版CUDA和普通的x86桌面环境不一样。直接pip install torch往往装的是CPU版或干脆装不上。正确做法是到NVIDIA官网下载JetPack自带的PyTorch包或者用NVIDIA出的容器镜像。一个容易忽略的坑是Python版本。JetPack不同的版本绑定不同的Python比如JetPack 5.x是Python 3.8JetPack 6.x是Python 3.10。你用3.9的conda环境在Orin上可能找不到匹配的PyTorch包。所以搭建环境前先去NVIDIA文档查清楚JetPack版本对应的Python和PyTorch版本再创建虚拟环境。推理时还有一个优化点把NMS放在TensorRT的执行图里而不是在CPU上做。这样检测结果直接从显存返回省去反复拷贝的延迟。Ultralytics导出TensorRT时默认已经集成了NMS插件但如果你自己写ONNX推理就需要手动处理输出流程稍长。6.3 实际推理流程与报警联动部署到田间后推理流程很直接摄像头或测报灯定时拍图传到边缘盒子模型检测统计各类害虫数量如果超过阈值就推送预警。用ONNX Runtime跑推理的核心逻辑大概是import cv2 import onnxruntime as ort import numpy as np session ort.InferenceSession(best.onnx, providers[CUDAExecutionProvider, CPUExecutionProvider]) def letterbox(img, new_shape640): h, w img.shape[:2] ratio min(new_shape / h, new_shape / w) new_h, new_w int(round(h * ratio)), int(round(w * ratio)) resized cv2.resize(img, (new_w, new_h)) canvas np.full((new_shape, new_shape, 3), 114, dtypenp.uint8) canvas[:new_h, :new_w] resized return canvas, ratio, (new_w, new_h) img cv2.imread(test.jpg) input_img, ratio, (nw, nh) letterbox(img) input_tensor input_img[:, :, ::-1].transpose(2, 0, 1)[None].astype(np.float32) / 255.0 outputs session.run(None, {session.get_inputs()[0].name: input_tensor}) # 对outputs做解码和NMS略这段只是基础框架真正上线还需要处理很多工程细节比如夜间补光、镜头起雾、盒子断电恢复、结果上传到云端。很多项目死在“模型精度够了但工程稳定性不够”所以部署阶段宁可多花时间在电源、网络、防水这些看起来和AI无关的事情上也不要只盯着推理速度。在虫情测报场景我一般把一次推理控制在1到2秒内包括拍照、检测、统计、上报用Jetson Orin跑yolov8s大概是几十毫秒前处理加几十毫秒推理完全来得及。如果换成普通工控机CPU跑就需要模型导出为INT8量化或在更低分辨率上推理否则很难满足全天候巡检的要求。7. 最后我的几点经验和这套数据集的下一步7.1 数据闭环比一劳永逸更重要很多项目把数据集当一次性资产训完模型就束之高阁。但农业场景变化太快光照季节不同作物品种不同害虫迁飞规律也不同。一套3200张的数据集只能覆盖“当时当地”的情况。我现在的习惯是每跑完一个田块就把误检、漏检的典型图片捞回来重新标注后合并进训练集每两周做一次增量训练。这个闭环跑两个月后模型在目标田块的准确率能再涨一大截。7.2 别迷信大模型先看数据质量有一次我把训练脚本调了半天各种增强、损失函数都用上mAP始终卡在0.8附近。后来一位老前辈提醒我“你检查过标签吗”我回去把标注可视化翻了一遍发现有一批图片的标注框明显比虫体大一圈相当于给模型喂了大量带噪声的标注。我花了两天重标这批图mAP直接涨了6个百分点。这件事让我彻底明白数据质量的杠杆远大于模型结构。如果你想在害虫检测上做出成绩先把大部分精力花在采集、清洗、标注、质检上比折腾换模型更实在。7.3 从单模型到多模态智慧农业还有很长的路现在热词里总提“YOLO目标检测多模态AI分析”在智慧农业里这确实是个值得做的方向。YOLO负责找出“哪里有虫子、是什么虫子”多模态模型可以进一步结合图像描述虫害为害状、结合气象数据预测暴发概率、结合作物发育期给出防治建议。但地基始终是高质量的目标检测结果——如果YOLO这一步都不稳后面的分析全是空中楼阁。这套3200张的数据集以后我也想继续扩类加入天敌瓢虫、赤眼蜂和中性昆虫做成一个“昆虫群落监测”级别的数据集让智慧农业从单纯的害虫检测走向生态监测。眼下最要紧的还是把每一个框标准确把每一类虫子的差异搞清楚。数据好了模型自然差不了。