1. 需求拆解什么场景才真正需要采摘点分割1.1 从人工采摘的成本谈起我在某设施农业基地待过一段时间深刻体会到草莓采摘绝对不是一个弯个腰就能干的轻松活儿。草莓的采收窗口期很短成熟果实挂在植株上多一天损耗率就明显上升遇上阴雨天甚至可能整批烂在田里。雇佣采摘工的工资按天计算熟练工一天能采的重量也就几十公斤而且长时间弯腰作业效率下降很快。很多种植户跟我算过一笔账采收季的人工成本能占到总成本的30%到40%。这个数字非常惊人也是草莓自动采摘设备存在的最直接驱动力。1.2 视觉系统在采摘流程里的真实角色自动采摘机器人站在草莓垄间面对一丛密实的草莓植株要完成的事情其实不止找到一个红果子那么简单。机械臂从什么地方下探、夹爪接近哪个姿态、剪断什么位置全部依赖视觉系统给出准确信息。业内把这一整条链路拆成三块目标检测负责回答哪里有草莓生长状态监测负责回答哪些熟了该摘而采摘点识别负责回答该从哪里下手。这三块里采摘点是最容易被人忽视但实际最关键的环节。成熟的草莓果实本身很显眼但要让机械臂不伤果、不伤茎地把果实取下来需要识别果柄和果实的交界区域也就是俗称的采摘点。果实中心坐标用处有限因为夹爪如果直直对果心使力大概率把果子捏烂必须找到果柄的合适剪切位置整个采摘动作才能成立。本项目的核心就是用深度学习算法把采摘点从图像中精确切出来再输出可直接指导机械臂执行的空间位置信息。之前在视觉方案选型时团队也考虑过传统图像处理手段比如基于颜色阈值的果实分割、边缘检测提取果柄实测下来在温室相对干净的光照条件下勉强能看但一旦叶片阴影压上来、果柄被叶子挡住传统方法立刻崩掉。后来转向深度学习路线锁定目标检测加分割一体的思路才有了后面这套方案。2. 数据准备标注质量直接决定模型上限2.1 采集方案不是拿着手机随便拍训练数据来自某草莓种植基地的促成栽培温室品种以红颜为主兼顾少量章姬。采集设备用的是普通工业相机加装滤光片后对红绿色差更敏感图像分辨率设为1920x1080覆盖了半米左右的工作距离。这个距离不是拍的是参考机械臂末端夹爪的工作空间算出来的太近容易被叶片贴脸挡住太远又会让果柄在图上只有几个像素宽后面标注都没法标。采集时间跨度做了一个月覆盖了草莓从初果期到盛果期的形态变化。比较关键的一点是采集时段分早、中、晚三个批次这样能积累顺光、逆光、侧光不同光照方向的数据。很多团队图省事只在晴朗上午采一次模型跑起来看着指标不错一到黄昏或者阴天就露馅。我们的经验是宁可前期多花两三天采集也不要等模型上线了再回过头补样本。2.2 标注规范把采摘点画成一个什么几何形状标注规范决定了模型学到的标准答案长什么样这里必须认真设计。我们最终把采摘点定义为果实顶端与果柄连接处的一个局部区域用带角度的旋转矩形框来表达。为什么不用普通水平矩形因为草莓果实在图像里有各种朝向水平框会把大量背景和叶片包进来给分割任务添乱。旋转框能贴着果柄方向收紧让模型专注学习果柄和果实的交界特征。标注粒度上也做了细化。每张图不只标一个采摘点还会对同一果实标出多个候选采摘点位置比如果柄理想剪切段和备用剪切段模拟真实采摘时夹爪需要选择的情况。另外对遮挡关系做了三级标注完全可见的采摘点训练时作为正样本主力部分被叶片遮挡但能推断位置的设中等权重几乎看不见的不参与训练只在测试集里用来验证模型对遮挡场景的处理能力。标注工作量不算小几千张图像三人标了两周多。中间发生过一次返工原因是标准里没说明果柄被完全遮挡时该不该标导致两个标注员对同一类图像处理方式不一致后来补充了一条规则才解决。这个细节提醒我标注规范不是写出来就算数每一类边界情况都要有可操作的定义。数据增强方面除了常规的随机翻转、亮度变化、轻微旋转还特意加了模拟温室常见干扰的增强操作比如模拟叶片阴影、模拟水滴造成的局部模糊。这些增强不是拍脑袋加的而是先从现场实拍图像里统计了干扰分布再针对性设计。实测下来加入阴影模拟后模型在逆光时段的误检率下降了约17%。3. YOLO26为什么适合这个任务针对性改动比堆框架更重要3.1 为什么没有选纯实例分割框架项目立项时摆在桌面上的路线有好几条。第一是Mask R-CNN这类两阶段实例分割框架精度上限高但推理速度偏慢边缘端的算力撑不住第二是DeepLabV3这类语义分割模型分割精度不错但天然不输出实例信息两个紧挨着的草莓会被糊成一团第三才是YOLO系列。YOLO26最大的优势在于把目标检测、实例分割、关键点回归塞进同一个网络头一次前向推理同时输出目标框、掩码和采摘点坐标。这个特性对采摘机器人太重要了。机械臂控制系统需要低延迟响应如果检测用一套模型、分割用另一套模型、关键点再跑第三套三套结果还要做坐标对齐和数据融合工程复杂度立刻翻倍延迟叠加起来根本压不住。YOLO26在架构上做了不少结构性升级。骨干部分借鉴了类似跨阶段局部网络的设计思路特征是提取效率很高颈部引入混合注意力机制空间注意力和通道注意力并用对果柄这种细长小目标特别友好。果柄在整幅图中的面积占比经常只有百分之零点几没有注意力机制特征很容易在下采样过程中被淹掉。3.2 针对草莓结构的三个关键改造直接用原版YOLO26跑草莓数据也能出结果但效果一般原因主要是草莓目标尺度和常规数据集差异太大。我们对网络结构和训练策略做了三处针对性改动。第一处是新增了一个针对小目标的浅层检测头。原版网络的三个检测头分别处理大、中、小目标但对于果柄这种极细结构最小的检测头也不够敏感。我们在更高分辨率的特征层上加了第四个检测头专门负责果柄和采摘点这类细小结构。代价是推理耗时增加了一些但换来的是采摘点召回率明显提升。数据上加了浅层头之后采摘点AP50从83.6涨到88.9这属于极其显著的收益。第二处是把采摘点回归从单点坐标改成了四点描述。原方案是想输出一个中心点和角度但角度回归在深度学习里是出了名的难学角度差5度和差50度在损失函数上看不出本质区别。我们改成用四个角点描述采摘点的旋转矩形模型直接回归四个点的像素坐标绕开了角度预测的坑。后处理时根据四个角点算出中心点和旋转角效果稳定很多。第三处是分割分支的输出分辨率做了一次上采样融合。采摘点分割掩码和果实实例掩码在解码时需要不同粒度的特征我们把低层高分辨率特征和高层语义特征做加权融合再送入分割头。这样果实轮廓边缘能保持得更细腻对后面计算采摘点在三维空间的位置有直接影响。改完后模型参数量比原版增加了大概五分之一但推理速度仍然能稳定跑在每秒35帧以上用的是某边缘计算盒子完全满足机械臂实时引导的需求。4. 训练过程里的硬经验损失权重、超参数和调参顺序4.1 资源环境和一套能跑通的训练配置训练在三块消费级显卡上完成单卡24G显存批量大小设为12使用混合精度训练。总训练轮数300轮前30轮只训练新增的检测头主干参数冻结等新头稳定输出后再解冻全部参数联合训练。这个策略很关键如果一上来就全参数训练新头在随机初始化的状态下会产生很大的梯度噪声整网络都得陪跑。图像输入尺寸没有用默认的640x640而是调成800x800。草莓果柄太细输入分辨率低一点细节就没了。分辨率提高带来显存和计算量上升但在这类高价值农业场景里精度优先级高于速度。训练总耗时实际跑了大约一天半中间没有遇到特别离谱的崩溃问题唯一一次是显存溢出检查发现是关掉了梯度累积导致改回来就好。训练过程中的典型超参数配置如下超参数数值说明初始学习率0.001配合余弦退火衰减批量大小12单卡4张三卡并行输入分辨率800x800兼顾细节与显存冻结轮数前30轮只训练新检测头损失权重框5.0 / 分割1.0 / 采摘点3.0见下文分析数据增强Mosaic阴影模拟Mosaic概率0.54.2 损失权重为什么这样配框任务权重最大分割反而垫底损失权重这里面的门道值得多说几句。我们最终用的框损失权重是5.0采摘点回归是3.0分割掩码是1.0。初次看到这个配比的人可能会觉得分割任务怎么权重最低但实际原因很朴素分割掩码对机械臂来说只是大致区域提示真正决定成败的是目标框和采摘点回归是否准确。框的定位偏差直接导致夹爪扑空采摘点回归偏差则导致剪切位置不对这两个任务必须优先喂饱。分割掩码权重给低一些不代表分割效果差只是让模型在梯度冲突时优先保框和采摘点。还有一个容易踩的坑是类别不平衡。数据集中成熟果和半熟果的图像数量差异很大如果直接按原始比例训练模型会对成熟果过拟合。处理方式是给两类设采样权重让每个批次里成熟果和半熟果样本数量基本相等。长尾效应在农业数据里几乎必然存在这一块不做干预后面评估时就会发现模型对少见场景完全失控。4.3 一个让我印象深刻的调试案例有过一次诡异的过拟合现象训练集loss降得很快、验证集指标也不错但换到新环境实测就频繁误检把红色塑料袋当作草莓。这个问题的真正原因在训练集里几乎找不到纯红色背景的样本模型学到的是红色圆形的强相关没学到果柄叶片共生这一背景约束。解决办法有两个方向一是采集更多包含干扰物的负样本二是给模型增加一个上下文注意力模块。我们两条路都试了最终以增加负样本为主。新增几百张干扰物图像后该场景误检率直接下降一半以上。这给我一个很深的教训深度学习模型在农业场景里学会的可能是各种隐形的捷径特征评估指标好看不代表模型真的理解草莓长什么样。做农业视觉项目一定要预留现场验证的环节不能只看测试集数字。5. 评估结果与真实场景的差距数字背后的真相5.1 测试集构成与最终指标测试集没有直接用随机划分的方式而是按光照条件、遮挡程度、成熟度三个维度做分层抽样确保每一类都有足够样本。最终测试集草莓果实实例总数约2800个采摘点标注约3200个。关键指标如下指标数值备注成熟果检测AP5096.4%在遮挡低于50%时采摘点定位AP5089.1%与人工标注的IoU0.5成熟果检测AP7586.7%更严格的框质量采摘点分割掩码mIoU71.2%用于三维映射的粗提示单帧推理耗时27ms某边缘计算盒子每片样本处理耗时9ms不含前后处理单看数字似乎还不错但如果把遮挡程度拆开看差距就很明显。当采摘点被叶片遮挡超过一半时采摘点AP50掉到68.5%这个表现在真实温室的密植场景下显然不够用。机械臂如果在这个置信度下盲目下探很可能什么都没剪到。所以模型输出的低置信度预测必须配合策略层处理不能直接传给机械臂执行。5.2 漏检和误检的主要来源分析完所有错误案例真正困扰我们的不是普通的漏检而是三种典型场景。第一种是果实重叠造成的采摘点丢失两个草莓紧挨在一起模型经常把其中一株的采摘点错配到另一株上。第二种是果柄高光区域造成的剪切点偏移在强顶光环境下果柄反光发白模型对边界判断会漂移。第三种是果实在图像边缘、畸变较重的区域采摘点回归误差明显增大这部分数据在训练时权重不足后面补了更多边缘样本才缓解。误检方面把叶柄当成果柄排第一把未成熟果实的果柄当作成熟果采摘点排第二。后者处理起来更棘手因为从像素上看果柄形态几乎一样单纯视觉模型很难区分。我们的解决方案是把成熟度分类和采摘点回归串起来先判断果实成熟度等级再基于等级阈值决定是否输出采摘点。这本质上是一个先验约束视觉模型不该硬学它学不明白的逻辑。完善指标之后整个系统在实验基地做了为期两周的连续运行白天加灯光时段覆盖率大约98%没有发生因为视觉漏检导致机械臂碰撞的严重事故。这个结果让我对这套方案的基本可靠性有了底。6. 从图像坐标到机械臂动作一条完整的采摘引导链路6.1 像素到三维坐标的映射方法图像分割给出采摘点在图像上的像素坐标但机械臂需要的是三维空间坐标这一步必须借助相机标定完成。我们使用棋盘格标定法标定了相机内参和畸变系数然后通过手眼标定求出相机到机械臂基座的变换矩阵。整个过程听起来常规实际有不少细节。草莓采摘场景的工作距离较近在300到500毫米之间这种近距条件下畸变对定位精度的影响比远距离要大得多。实测畸变校正前采摘点在摄像头画面边缘区域的像素误差能到8个像素左右校正后降到了1.5个像素以内。手眼标定我们做了三组不同姿态下的采集每组至少20张标定板图像最终标定重投影误差控制在0.3像素以内。三维坐标重建时如果只用单个相机只能依靠果柄长度和果实尺寸的统计先验来估计深度误差范围大概在正负15毫米。这个精度对避障来说勉强够用但对精准剪切来说不够稳。后来我们加装了第二个相机组成双目系统基线长度120毫米利用采摘点在两个视角下的视差做三角测量深度误差降到正负5毫米以内。代价是标定和硬件复杂度都有提升但换来的是夹爪一次成功率明显上升。6.2 机械臂执行策略不是拿到坐标就完事坐标有了但直接让机械臂按坐标下探仍然会出问题。植株叶片是软的果实又可能轻微晃动固定轨迹插值不适用。我们在视觉输出的基础上叠加了一个两段式执行策略第一段机械臂先运动到采摘点斜上方一个安全距离处此时视觉系统重新拍一帧确认采摘点位置没有发生显著变化。这一步同时起到防碰撞校验的作用因为机械臂运动产生的气流可能把叶片吹动导致采摘点漂移。第二段夹爪沿果柄方向切入触碰检测触发后立刻收紧刃口完成剪切。视觉系统在整个剪切动作持续期间以低延迟模式运行如果发现采摘点位置突变立即发送停机指令。闭环控制带来一个额外收益即使某单次视觉定位有偏差只要偏差在机械臂可修正范围内系统也能依靠实时反馈完成采摘不影响整体成功率。我们在实验里统计的结果是视觉从输出坐标到机械臂完成动作的端到端周期约1.5秒比纯开环控制慢了一些但安全性和成功率都明显更高。6.3 部署到实际温室的几个小细节有一个很容易被忽略的细节是温室湿度对相机镜头的影响。白天棚内湿度高镜头容易起雾图像直接糊掉。我们给相机加了一个小型加热窗恒温在比环境温度高3到5摄氏度起雾问题彻底消失。另外相机支架的刚性非常重要温室地面经常因为设备运行产生轻微震动如果支架刚度不足图像抖动会造成严重拖影。我们后来用了重型铝型材支架加橡胶减震垫图像稳定性改善明显。整个部署完成后的运行画面是机械臂在草莓垄间来回移动每一次下探采摘都会伴随视觉系统一闪而过的识别过程。整个过程不再像实验室里那样追求每一次都完美反而更接近真实农业生产里稳定产出、极少出错的气质。这大概就是智慧农业项目该有的样子。