资讯动态

基于YOLO26的草莓采摘点图像分割识别与机械臂联动系统

发布时间:2026/10/17 3:35:20 来源:尧图企业网站定制
草莓采摘这事看着简单做起来才知道有多费人。一颗一颗弯着腰剪果梗摘一天下来腰都直不起来农忙时招人还招不到。我在参与某智慧农业试验基地的项目时真正意识到“采摘点识别”才是草莓自动采摘里最要命的一环。果实是红的、背景是绿的目标检测框能框出草莓但框出来不代表能摘你得知道剪切点在哪、果梗在哪、旁边有没有未成熟的青果要避开。于是我们做了这套以深度学习YOLO26算法为核心的草莓采摘点图像分割识别系统顺便把生长状态监测和种植智能化管理也一起带起来了。这篇文章想讲清楚的是一个属番茄但又比番茄娇贵得多的草莓采摘场景怎么通过图像分割识别技术落地从数据采集、标注规范、网络设计、训练调参到部署联动机械臂和管理平台整条链路里有哪些坑、哪些心得。无论你是做农业机器人的算法工程师还是农场里想引入智能化设备的负责人亦或是刚入门深度学习想找个真实场景练手的学生这期内容应该都能给你一些可以照着做的参考。1. 项目整体思路与场景定位1.1 为什么把“采摘点分割识别”作为核心草莓种植和番茄、黄瓜不一样最大的特点是一株上同时挂着不同成熟度的果实。一个花序里头茬果已经通红第二茬果还在转白第三茬可能刚开花。机器去摘红果时如果只用目标检测框框住的是整个果实区域但框的中心往往不是采摘点甚至框里会混入旁边的青果和叶片。一旦机械臂按框中心去抓要么夹到青果要么一把抓在果肉上直接造成损伤。所以我把项目核心拆成了两层第一层是像素级分割把每一个草莓果实从背景里完整抠出来得到它的轮廓和成熟度类别第二层是在分割结果上继续回归采摘点也就是果梗和果实的连接处附近甚至要算出一个可切割的参考点。这两件事合在一起才叫“采摘点图像分割识别”而不是单纯“识别草莓”。这套逻辑也能顺带服务于生长状态监测。因为有了每个果实的mask轮廓和成熟度标签系统可以统计单株挂果数、成熟果数量、畸形果比例、果实大小分布数据回流到管理后台之后种植者就能知道哪一排该疏果、哪一茬该追肥这就是智慧农业里说的“长势可视化”。1.2 整体链路从图像到机械臂执行项目的整体链路大致是这样的RGB-D相机先拍下草莓垄的彩色图深度图同步采集图像进入YOLO26分割识别网络输出每个果实的mask、成熟度类别、采摘点坐标采摘点二维坐标结合深度图通过手眼标定矩阵转换到机械臂基坐标系机械臂规划路径避开叶片和邻近果实移动到采摘点完成剪切同时分割识别结果以结构化数据的形式上报到种植管理平台做统计展示和农事提醒。整个系统闭环之后机械臂一秒钟能看到的东西和人工采摘时眼睛看到的东西就对齐了。人眼扫一眼能判断“这个红了、那个没红、果梗在哪个方向”模型要做的事情就是把这个判断过程拆成可计算的步骤。后面所有章节基本都是在讲这条链路中每一环怎么落地。我特别想强调一个观点农业场景的算法项目卡点往往不在模型结构上而在“从图像到动作”的链路稳定性上。你模型mAP再高深度图一抖、标定误差一偏机械臂照样抓不准。所以本文后面既有模型训练的内容也有标定和部署的细节。1.3 技术选型为什么选择YOLO系分割网络先说个背景。我们平时讲的YOLO主要解决的是“框出目标”的问题但分割任务要细致得多。我为这个项目一开始对比过几个方案Mask R-CNN分割精度确实不错但单帧推理速度偏慢在嵌入式平台上跑不到实时的要求传统图像处理方式比如基于颜色阈值的分割晴天和阴天两个样补光灯一开又变一个样根本没法稳定用。最后选择了YOLO系网络的分割路线在目标检测框架上扩展出mask分支这样能同时兼顾速度和精度。项目组内部把这套改进后的网络简称为YOLO26其实就是结合了YOLO系列多版本设计经验、针对草莓分割场景做了定制的一种实例分割模型。它不是灵光一现的选择而是基于工程约束的取舍温室里机械臂要连续作业单帧图像处理时间必须控制得很低叶片遮挡多果实边缘可能是重叠的模型又必须能区分实例。YOLO系网络在这类场景里有一个天然优势就是它的检测头本身就很擅长处理多尺度、多目标密集排布把分割分支加在检测头之上能复用成熟的特征表达训练起来也稳定。2. 数据采集与标注实操2.1 田间数据采集的硬件搭配与光照处理模型要能在真实大棚里干活训练数据就必须从真实大棚里来。我们前期用公开的草莓数据集做过测试效果一塌糊涂因为公开数据大多是单果特写、背景干净而实际温室内果实密集、叶片交错、光线忽明忽暗。后来干脆自己采。采集设备选的是RGB-D深度相机架在移动小车上模拟机械臂从侧上方45度俯视草莓垄的视角。这个视角很关键因为采摘时机械臂末端就是从那个方向靠近果实的。如果你用水平视角拍的数据训练模型部署时换个俯视角模型精度会掉得让你怀疑人生。光照处理是农业图像里最容易翻车的点。白天大棚里阳光直射时草莓表面会有高光红色通道直接过曝模型很容易把高光区域当成白色病斑或漏检阴天和傍晚光线弱图像噪声又大。我们的做法是白天采集时用遮光网挡掉直射光夜间开启固定色温的LED补光灯保证同一个拍摄距离下的照度基本一致。宁可让所有图像看起来“平平无奇”也不能让模型学会依赖某种特定的光照纹理。2.2 采摘点标注规范多边形加关键点的两套体系这一步是整个项目里最枯燥但最不能省的部分。我们用的是和常规分割数据集类似的多边形标注方式但额外加了一套采摘点标注体系。先说类别。草莓果实按成熟度分成四类未成熟青果、转色果、成熟红果、异常果。异常果包括畸形果、病果、烂果这部分对农业管理很有价值采摘时则要避开。标注时直接用多边形把果实轮廓描出来注意一定不要把花萼和果梗圈进去否则mask边缘不干净后面算采摘点会偏。然后是采摘点。我们用点标注的形式在果实与果梗连接的位置打一个点。这个点不是果梗本身而是“如果人工拿剪刀去剪最合理的剪切位置”。实际操作中这个点通常落在果实顶部和果梗交界处偏果梗方向两三毫米的位置。被叶片完全遮挡看不出连接点的果实标注为“遮挡不可见”训练时单独作为一类置信度约束不让模型瞎猜。标注工具体验强烈推荐带关键点标注能力的那类开源标注工具。如果只有分割标注后面还要自己做点标注的二次对齐非常麻烦。标注数量上我们第一批标了2000张图每张图平均有8到15个果实实例累计接近两万个实例。这个量级对分割任务来说不算大但配合数据增强已经够冷启动。2.3 数据增强与样本平衡策略草莓数据天然的痛点就是成熟红果太多青果和转色果相对少。如果按原始分布直接训练模型会变成“红果杀手”对转色果的召回率很低。但采摘场景恰恰需要精准区分边界状态转色果如果搞错了机械臂很可能把半熟的果子摘下来损失很大。数据增强上除了常规的随机翻转、缩放、平移之外我重点用了三类第一类是HSV颜色增强把红色通道饱和度往下拉、亮度往上提模拟清晨和傍晚的光照第二类是随机遮挡用黑色矩形块随机盖住一部分果实模拟叶片遮挡第三类是Mosaic拼接把不同时期、不同光照下的图片混在一起强迫模型学更鲁棒的特征。另外我们对少数类别做了过采样。青果和转色果样本在训练时被重复采样的概率提高让模型在梯度更新时能更均衡地学习。这里有个小经验不要一味追求类别比例完全相等草莓采摘场景里“成熟红果”的重要性本来就最高但至少要保证转色果占比不低于15%否则边界样本很容易被吃掉。2.4 标注质量检查清单数据标注这种事返工成本极高所以一定要在训练之前设置质量检查关卡。我踩过的最大一次坑是标注员把相邻两颗紧贴的草莓描成了一个多边形结果模型学出来的mask总是一坨连体采摘点计算直接崩溃。我后来定了一套检查清单每个多边形的顶点数量是否控制在“贴合轮廓但不过度精细”的范围顶点太多容易过拟合边缘噪声果实之间有重叠时是否每个实例单独标注、遮挡部分能否合理推断采摘点是否落在类别标签对应的果实上有没有错标到旁边的果实是否有把花萼、果梗、叶片圈进mask的情况异常果是否独立标注不要和成熟红果混在一起。每次抽检不少于10%的图片发现问题后统一回到标注平台修正。看似费时间但能省掉后面无数次debug的时间。3. YOLO26模型的分割识别设计与训练3.1 网络结构上的改进要点这一版模型的整体设计延续了YOLO系列“一个网络同时输出多个任务”的思路在特征提取部分采用多尺度结构保证小果和远处果实也能有足够的分辨率特征。草莓果实大小差异很大前排大果可能占到图像面积的十分之一后排小果可能只有几十个像素多尺度特征融合的优先级比堆叠更深网络更高。在特征提取网络的每个关键阶段我们加入了注意力模块重点强化对颜色和纹理特征的响应。草莓成熟度判断主要靠颜色但叶片和果实的颜色在某些光照下会接近单纯靠卷积感受野很难稳定区分。注意力机制可以让网络更关注果实区域的局部细节弱化背景干扰。分割头的设计上我们没有直接用简单的反卷积上采样而是做了多层特征融合后再输出mask。原因很实际草莓果实边缘经常被叶片遮挡直接上采样会把边缘糊掉导致mask边界不干净采摘点误差变大。融合低层高分辨率特征和高层语义特征之后边缘锐利度明显好了一个档次。3.2 输出设计与损失函数模型的输出不再是单纯的分类和检测框而是四样东西类别标签、边界框、分割mask、采摘点坐标。采摘点坐标我用了关键点回归的方式直接回归到归一化的图像坐标同时输出一个可见性标志表示这个点当前画面里是否可靠。损失函数分四部分组合分类用二元交叉熵边界框用CIoU损失mask部分用Dice损失和二值交叉熵的加权组合采摘点回归用平滑L1损失。整体是一个多任务加权损失权重上我会把mask损失和采摘点损失的权重调高一些因为这两项直接决定采摘能否成功分类错误反而可以通过后处理兜底。这里有个工程细节值得说mask损失和检测损失一起训练时网络很容易“偏科”也就是检测框学得很好但mask边缘粗糙。我们的解决办法是训练初期先让检测分支和分割分支共享主干训练一段时间再提高mask损失的权重相当于先让网络“看懂”草莓在哪再让它“抠细”草莓轮廓。3.3 训练配置与超参选择训练配置上输入分辨率我做过对比640×640时速度最快但小果实的目标容易丢1280×1280时精度高但推理耗时翻倍。最后取了个中间值采用960×960左右的分辨率再配合多尺度训练。优化器用的是带动量的随机梯度下降基础学习率定在0.01到0.02之间采用warmup加余弦退火曲线。batch size视显存而定我这边常用16。训练轮数上整个模型要跑300轮左右因为分割任务比纯检测收敛慢。数据加载里有一个特别容易被忽略的点如果训练数据里图像的宽高比差异太大直接resize会导致果实形状变形mask标注也跟着变形。我统一在训练前做了letterbox填充把图像等比缩放到目标尺寸后再补边避免形变影响采摘点在图像上的相对位置。3.4 评估指标不只看mAP还要看采摘点偏差模型训练好了怎么判断能不能用我建议至少看三类指标不要只盯着mAP。第一类是mask分割精度也就是mask的IoU和dR值衡量网络把果实轮廓抠得准不准。第二类是成熟度分类准确率特别是成熟红果和转色果的区分精度。第三类是我个人觉得最重要的“采摘点像素偏差”就是在测试集上计算预测采摘点和人工标注采摘点之间的距离。采摘点像素偏差比mAP更贴近实际作业效果mAP高但采摘点偏了机械臂照样摘不到。我们在验证集上的目标是把平均像素偏差控制在10个像素以内并且偏差超过20像素的样本比例低于5%。这个指标才真正能指导后面的机械臂采摘。评估维度指标目标值说明分割精度mask IoU≥0.85轮廓贴合程度成熟度分类红果/转色果准确率≥0.92决定能否采摘采摘点精度像素偏差≤10px直接关联机械臂剪切综合检测mAP50-95≥0.78整体鲁棒参考4. 生长状态监测与采摘点解算4.1 成熟度分级逻辑模型输出的成熟度类别本质上就是生长状态监测的第一手数据。传统种植者巡园时靠眼睛数红果数量、判断是否该采摘现在模型每天按固定路线拍摄一次棚内图像系统自动统计每株的成熟果数量、转色果比例、青果数量生成趋势曲线。具体做法上我们对每个mask内部的颜色分布再做一次细粒度分析。模型输出成熟红果类别之外我还会统计mask区域内红色像素的占比和饱和度均值把它量化为“成熟度指数”。这个指数可以用来做采摘优先级的排序比如同一条垄上有的红果已经熟透三天、颜色发暗有的刚转红后者可以稍微晚半天再摘。虽然都是成熟果但采摘优先级不一样对延长货架期很有帮助。这套监测逻辑在资源管理上也很有价值。通过连续多天的数据积累系统能估算出一个大概的产量帮助农场提前联系销售渠道或者安排采收工人不至于出现摘多了卖不完、摘少了不够卖的被动局面。4.2 采摘点偏移计算模型直接回归出的采摘点是个候选如果要真正引导机械臂还需要做一次比较讲究的坐标修正。草莓的果梗通常很细视觉上只有几个像素宽直接回归出的点可能会落在果实上或者果梗末端剪切位置差一点点果柄残留长度就不一样影响草莓的商品外观。我的做法是以模型回归出的采摘点为中心在分割mask的上边缘附近搜索果实轮廓的局部最高点然后把采摘点沿果梗方向向上偏移一个固定补偿量通常取5到8毫米。这个补偿量不是拍脑袋定的是通过多次采摘试验统计出来的根据机械臂末端剪切器的刀口尺寸反推太短了果柄会碎太长了又会带着花萼看起来不美观。这里还要考虑不同品种的差异。比如有些品种果梗偏长、偏硬有些品种果梗短而且细剪切点的偏移量要能通过配置项快速调整而不是写死在代码里。我在系统里留了一个“品种参数表”每次换品种只需要改几个阈值不用重新训练模型。4.3 遮挡与重叠果串的处理策略温室里没有哪颗草莓是孤零零挂在那的花萼、叶片、相邻果实、支撑绳都会造成遮挡。我们统计过傍晚采摘场景下大概有30%的果实在画面中存在不同程度的遮挡。对于这部分样本强行预测采摘点非常危险。我们的处理策略是分三级第一级采摘点和果实轮廓都很完整清晰直接计算并采摘第二级采摘点可见但果实边缘部分被遮挡这时用mask的可见部分推断果实中心再结合深度图计算位置采摘路径上增加避障规划第三级采摘点完全不可见模型输出“遮挡不可靠”标志系统宁可不采摘把结果记录下来等待叶片摆动、机械臂换个角度或者下一次巡检再进行二次识别。这套策略的核心原则是“宁可漏采不可错采”。草莓果实一旦被机械臂误触轻则碰伤卖相重则整颗报废一块钱两块钱的果子直接变次品经济损失比漏采一次大得多。在农业自动化里安全边界永远要比理论精度优先。4.4 深度信息融合与空间坐标推理二维图像里的采摘点最终要变成三维空间里的机械臂末端目标位置这一环靠的就是深度图。RGB-D相机输出的深度图和彩色图分辨率不一定对齐我先做了对齐处理然后在采摘点周围取一个几像素半径的邻域计算这些像素点深度值的中位数。取中位数而不是均值是为了避开深度图里常见的飞点噪声有些点在物体边缘会出现突然跳变的异常深度如果均值会被拉偏中位数要稳健得多。拿到深度值之后结合相机内参把像素坐标转换成相机坐标系下的三维坐标。这一步就是从“图片里有个点”到“空间中有个点”的关键转换。再往后相机是装在移动平台上的平台位置会动所以需要把手眼标定矩阵实时更新。我们在机械臂基座和相机之间做了标定只要平台或相机的位姿变了标定矩阵就要重新算。实际作业时机械臂末端到达目标点附近后还会有一个确认动作或二次定位用来消除累积误差。5. 部署与自动采摘引导联动5.1 边缘计算平台选型与推理加速模型训练的终极目标是上机器人不是躺在实验室里跑demo。我们用的是一块嵌入式GPU平台算力比台式显卡低不少所以推理加速是必须做的一步。首先把模型导出为FP16精度的格式精度损失很小肉眼几乎看不出来但推理速度和显存占用都改善明显。其次做了批处理优化机械臂每次作业请求一张图像单帧处理延迟要控制在几十毫秒以内这样才能保证机械臂动作不卡顿。这里有个容易被忽视的性能瓶颈在图像预处理上。读图、缩放、归一化如果都在CPU上做GPU再快也白搭。我把预处理尽量放到GPU端完成减少CPU和GPU之间的数据拷贝实测单帧延迟又降了一截。农业环境下供电不稳、散热条件差模型推理频率还要做动态控制环境光线好的时候降低拍摄频率光线复杂时提高拍摄频率既省电又保证处理效果。5.2 机械臂采摘路径生成逻辑模型给出采摘点三维坐标后机械臂怎么动是另一个系统工程。草莓垄里空间狭窄叶片密集机械臂如果走直线过去大概率会撞到旁边的果实和叶子。我们采用的做法是分阶段规划机械臂先快速移动到果实区域上方一个安全高度这个阶段只保证不碰撞大障碍然后从安全高度垂直下探末端接近采摘点下探过程中实时根据深度图更新障碍物信息利用深度图提供的点云数据生成避障路径。说白了就是“先粗定位再精细逼近”。末端剪切器的设计也很讲究。草莓果梗只有几毫米粗但剪切点附近有花萼刀具如果不够精细很容易把果肉压伤。我们在末端加了力传感器在剪切前会轻轻碰触果梗确认力度达到设定范围后才执行剪切动作避免空剪或者误剪旁边的叶片。整套流程走下来单颗草莓的采摘周期大概在十几秒左右虽然比不上人工中最快的快手但胜在能持续工作、不会疲劳。5.3 智慧农业管理平台的数据回流采摘引导只是系统的一面另一面是数据回流。每一个分割识别结果包括果实的类别、大小、位置、采摘时间、是否成功采摘都会自动上报到后端的种植管理平台。管理平台上可以看到每一条垄的成熟果分布热力图、每天采摘量统计、连续一段时间的果实生长曲线。这些数据能发现很多肉眼看不到的规律比如某条垄靠东侧的区域果实普遍偏小可能是水肥不均或者光照不足某个品种转色期特别长可能是温度管理有问题。有了这些数据再结合农艺师的判断种植决策就从“凭经验”逐渐变成“看数据”。这套平台还支持农事提醒比如系统检测到某个区域成熟果数量超过设定值会提醒管理人员及时组织采摘避免成熟果挂在藤上过久影响品质。对规模化种植来说这个价值不亚于自动化采摘本身。6. 常见问题与排查实录6.1 模型训练不收敛或精度异常我见过最多的训练问题是loss在某个数值附近震荡不降或者mask精度久久上不去。大概率是标注数据质量出了问题比如多边形的类别标错、采摘点偏移过大、不同标注员对同一类果实的理解不一致。排查思路是先抽50张训练图人工过一遍重点看那部分loss最高的样本往往一眼就能发现问题。还有一个容易被忽略的原因是学习率设置偏高。分割任务对学习率比检测更敏感学习率过大的话mask分支的参数会来回震荡。解决方法是把基础学习率调低到原来的五分之一到三分之一并把warmup轮数拉长让网络先用稳定的学习率把主干特征学扎实。6.2 成熟红果漏检红果漏检大多发生在转色末期的果实上颜色介于红和粉之间跟叶片背面的颜色很像。如果你发现漏检集中在某个时间段比如傍晚那就是这个时间段的光照导致红色通道特征减弱。我们的解决办法有两个方向一是数据层面增加傍晚和阴天光源下拍摄的真实样本让模型见过更多“不那么红”的成熟果二是算法层面把成熟度判断从“纯颜色阈值”改成“颜色加纹理”的组合特征果实表面特有的光泽纹理在分割分支中能得到体现分类分支就不会那么依赖单一颜色。6.3 采摘点偏差大采摘点偏差是直接决定是否能摘准的指标如果测试集上偏差突然变大先检查标注是否准确再看深度图是否在果实边缘出现黑洞。很多RGB-D相机在近距离拍细小物体时深度值会是无效值导致采摘点三维坐标漂移。排查经验是先看二维采摘点是否准确二维都不准就是模型问题二维准但三维位置偏那就是深度图或标定问题。如果是标定问题重新做一次手眼标定特别是检查机械臂基座是否在安装后发生过微小位移。这个坑我们踩过机械臂重新装一次后忘了标定系统连续摘空了好几天。6.4 推理延迟过高推理延迟高优先考虑设置问题。先把输入分辨率降到训练时可接受的最低值然后用推理优化工具做模型压缩。如果还慢检查是不是显卡上同时跑了其他任务占用了显存又或者有没有做不必要的后处理计算。后处理这块容易被忽略mask转多边形、边缘平滑、采摘点搜索、深度值邻域统计如果都用Python串行实现耗时比模型推理还高。我把这部分尽量用底层库实现并且对中间结果做缓存实测单帧总耗时降了差不多一半。6.5 避坑清单汇总最后整理一份我踩坑后固化下来的清单供直接参考不要直接拿公开草莓数据训练完就部署务必补充当地种植条件下的真实数据标注时务必区分开果实和花萼花萼导致的采摘点偏移是最大的系统性误差之一夜间补光灯不是随便开的色温和亮度都要固定否则模型每天夜里都会“变脸”高架栽培和地栽草莓的视角、株距完全不同换种植模式后模型需要重新微调再上线机械平台移动后一定要重新做手眼标定这是部署时最容易漏掉的一步系统要支持“人工接管”模式模型置信度低于阈值时把控制权交回人工别让机器人硬摘。这套系统做到现在我最大的体会是农业场景里的算法项目真正难的不是模型本身而是让整条链路在又湿又热、光线乱变、叶片乱晃的温室环境里稳定跑起来。深度学习模型的精度只是地基地基之上还得有扎实的数据工程、可靠的标定流程、合理的机械执行策略才能让机器人像人一样稳稳当当地把草莓摘下来。最后再分享一个小技巧如果是刚刚开始做这类项目不要一上来就追求全自动采摘可以先做“识别加人工采摘”的半自动模式让模型只负责告诉工人哪颗草莓该摘、采摘点大概在哪工人手里拿个平板就能照着操作。这样既能把数据闭环先跑通又能收集到大量真实采摘反馈比闷头训练几个月的模型再一次性部署实用得多。等数据和系统都稳定了再逐步放开机械臂自动采摘风险会小很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑