苹果红了几成熟?番茄现在摘还是再等一周?靠果农一个个看、靠手捏,几百亩果园根本看不过来。更麻烦的是同一棵树上的果子熟度参差不齐,有的该摘了有的还早,错过最佳采摘期,糖分和口感都受影响。
今天分享的这篇 CVPR2026 论文 HarvestNet,把果园巡检摄像头或挂载在采摘机器人上的相机输入图像,直接输出每个果实的位置、数量和成熟度等级。模型 6.3M 参数,端侧实时跑,在苹果、番茄两个公开果园数据集上刷新了轻量模型 SOTA。
一、果园果实检测到底难在哪
果实检测和停车场、车间这种受控场景完全不是一回事,田间地头的变量太多。
1.1 成熟度是连续的,不是非黑即白
很多人以为果实检测就是"找到苹果",但采摘决策真正需要的是"熟到几成"。颜色从青绿到粉白到全红是连续渐变的,硬套"熟/不熟"二分类会把大量八成熟的果子误判。而且有些品种是看颜色深浅,有些是看表面斑点,判断标准不统一。
1.2 果实互相遮挡、堆叠重叠
枝条上的果子三五成群挤在一起,互相挡住一半;叶子又盖住一片。常规目标检测在重叠果实上会出两个问题:一是两个重叠果实被当成一个框,数量偏少;二是一个果实被重复框多次,数量偏多。采摘计数和产量估算最怕这种错。
1.3 光照一天之内剧烈变化
清晨有露水、正午顶光发白、下午逆光偏黄、阴天整体偏蓝灰。颜色是判断成熟度最关键的特征,可同样一个红苹果,在不同光线下拍出来颜色差很多。模型如果学的是"红色=熟",换个光线就误判。
1.4 背景杂乱且果实小
树叶、枝干、草丛、地面、纸箱全是背景,和果实颜色接近的嫩叶、花萼也容易被误检。远距离巡检图里果实只有十几个像素,又是小目标问题。果园环境开放、风一吹叶子晃动,数据集和部署场景也很难完全一致。
二、HarvestNet 的三个核心设计
HarvestNet 的整体思路:把"找果实、分熟度、数数量"三件事在一个网络里联合完成,重点解决成熟度连续分级和重叠计数两个真实痛点。
2.1 连续成熟度回归代替多级分类
传统做法是把成熟度分成"未熟、半熟、成熟、过熟"四类做分类。HarvestNet 直接回归一个 0~1 的连续成熟度分数:
•分数连续可比较:0.72 和 0.74 的差异能被表达,分类网络只会把它们归到同一类。
•阈值按需调:不同采收策略用不同分数线——分批采收时只摘 0.85 以上的,其余继续挂果。
•结合颜色空间统计:不只看 RGB 均值,还提取 Lab、HSV 空间的颜色分布特征,让成熟度估计对光照更稳。
消融实验显示,连续回归在分级准确率上比四分类高了 4.1 个百分点,主要赢在边界样本(七到八成熟)的判断上。
2.2 重叠果实分离头
针对果实堆叠遮挡,HarvestNet 在检测头里加了一个实例分离分支:
•检测框 + 实例掩码并行输出:每个果实不仅有框,还有自己的像素掩码,两个果子即使框重叠,掩码边界也能分开。
•遮挡比例估计:顺带预测每个果实被遮挡了多少比例,被挡住超过一半的果实不参与计数,避免把遮挡残片误算成新果实。
•计数校正:按掩码去重,而不是直接数框的个数,重叠场景下计数误差明显下降。
2.3 光照鲁棒特征建模
为了应对一天内的光照变化,训练和推理上做了两件事:
•多光照数据增强:训练时随机调整色温、亮度、对比度、阴影叠加,模拟晴、阴、逆光、清晨傍晚等条件。
•颜色恒常性前置模块:先做一层轻量的颜色校正,削弱整体色偏,再进入骨干网络提取纹理和形状特征——这些特征比绝对颜色更稳定。
跨光照测试集上,成熟度估计误差(MAE)比未做光照增强的基线低了 0.09,这在实际采收决策里就是"差一成熟度等级"和"判断正确"的区别。
三、技术架构拆解
HarvestNet 的整体 pipeline 分四个模块:
模块 |
做什么 |
关键设计 |
颜色恒常前置 |
削弱光照色偏 |
轻量颜色校正网络,输出光照归一化特征 |
轻量 Backbone |
提取果实多尺度特征 |
深度可分离卷积,兼顾远处小果和近处大果 |
联合检测头 |
框定位 + 实例掩码 + 成熟度回归 |
三头共享特征,计数按掩码去重校正 |
结果汇总层 |
输出数量、分级分布、采摘建议 |
统计各成熟度区间果实数量,生成采收清单 |
几个工程上的亮点:
•参数量:6.3M,可部署在采摘机器人主控板或边缘网关。
•推理速度:640×640 输入在边缘设备上约 20fps,配合巡检无人机可边走边检测。
•输出结构化:每颗果实带位置坐标、成熟度分数、遮挡比例,方便对接采摘机械臂调度。
四、和主流方法的横向对比
论文在苹果数据集 AppleDataset 和番茄数据集 Tomato Detection 上做了对比:
方法 |
检测 mAP↑ |
成熟度 MAE↓ |
参数量(M) |
计数相对误差↓ |
YOLOv8s(仅检测) |
76.4 |
— |
11.2 |
14.2% |
YOLOv8s + 外部分级 |
76.4 |
0.182 |
13.5 |
13.8% |
Mask R-CNN |
82.1 |
0.146 |
44 |
8.6% |
HarvestNet |
84.3 |
0.118 |
6.3 |
5.9% |
可以看到,HarvestNet 的计数误差只有 5.9%,主要来自掩码分离对头重叠果实的处理;成熟度 MAE 也最低。代价是需要一定的果园标注数据,但它把检测、分级、计数串成了一条线,不需要像外部方案那样拼接两个模型。
五、快速上手:推理核心代码
下面是 HarvestNet 的推理框架,帮大家理解整体流程:
python |
实际落地时,成熟度阈值要结合品种和采收策略调——早熟品种和晚熟品种的分数线不一样。数据不足时,可以先用公开果园数据集预训练,再收集几十张本地实拍图微调。
六、毕设/竞赛拓展方向
农业视觉这个方向数据集免费、场景真实、落地故事好讲,适合毕设。分享几个可以延伸的方向:
6.1 杂草与作物区分检测
田间自动驾驶除草机器人的核心是"哪是作物、哪是杂草"。在 HarvestNet 基础上换类别设计,做轻量作物/杂草二分类检测,对接变量喷药方案,行业需求很明确。
6.2 叶片病虫害识别
不只是检测果实,扩展到叶片病斑分类——早期病害发现比治虫治霉更省钱。公开数据集 PlantVillage 类别齐全,适合做多病害识别加定位的完整方案。
6.3 产量预估与采收调度
把多帧、多角度检测结果融合成整片果园的产量分布图,按地块预估采收量,输出采摘机器人调度路径。从"单图检测"升级到"田块级决策",系统完整度高。
6.4 移动端果园巡检 App
手机拍照即出果实计数和成熟度分级结果,叠加在原图上显示。模型量化后可在端侧运行,做成给果农直接用的小工具,Demo 体验直观,答辩好展示。
七、写在最后
农业视觉和安防视觉有个共同点:真实场景远比公开数据集复杂。果园里没有标准背景,光照、遮挡、重叠天天变,模型在测试集上好看只是第一步,能在田间稳定跑下去才算落地。
HarvestNet 给我的启发是:先想清楚业务动作需要什么输出。采摘决策要的不是"这里有个物体",而是"这颗果子熟没熟、能不能摘、占不占机位"。围绕这个输出去设计多头联合预测,比堆一个通用检测模型再加后处理更贴合需求。
做毕设的同学如果走农业方向,建议先选一个单作物、单任务跑通——比如苹果计数、番茄成熟分级,再逐步加杂草、病害、产量估计。场景选小、数据拿得到、结果看得见,这套方案就站得住。
大家如果想聊具体作物的数据获取和部署方案,欢迎评论区交流。

