核心难点:果梗细、像素占比很小;颜色和枝叶接近;遮挡多;需要输出切点坐标 + 方向,不是只画框。 三个路线,按项目阶段选型:
- YOLO 检测(bbox):快速原型,只拿到果梗包围盒,适合 SDK 版本快速验证
- YOLO-Seg 实例分割:得到果梗掩码,后续用骨架提取求剪切点(最常用,推荐)
- YOLO-Pose 关键点:直接标注切点、果梗两端关键点,输出 2D 坐标,直接对接手眼 + 深度相机,适合 MoveIt 避障采摘闭环Frontiers
一、推荐选型:YOLOv8-Seg / YOLOv11-Seg(串番茄果梗)
你的串果采摘机器人,优先 YOLOv8-seg,推理速度快,能输出 mask 掩码,后续用 OpenCV 做骨架提取,得到果梗中心线,再取剪切点。
- 类别:
tomato(果实)、stem(果梗 / 果柄)两类 - 硬件:D435 / 海康 RGB-D 相机,RGB 图进 YOLO,深度图做 2D→3D 反投影(手眼标定)
1. 数据集采集 & 标注(最关键)
- 采集温室串番茄图像:多角度、远近、不同光照、遮挡、逆光;至少1000~2000 张,果梗样本尽量多(类别不平衡是最大坑)
- 标注工具:LabelMe / Roboflow
- 检测版:给果梗画包围框
- 分割版:多边形标注果梗轮廓(不要只标一小段,尽量完整果柄)
- Pose 关键点版:标注 2 个点:
stem_root(果实连接点)、cut_point(剪切点)
- 数据增强(必须开,对抗光照、枝叶干扰)
- 随机亮度、对比度、高斯模糊、HSV 扰动、随机裁剪、小尺度缩放
- 小目标增强:放大果梗区域,防止模型忽略细梗
- 可加 CycleGAN 生成夜间 / 弱光样本,提升温室鲁棒性
- 划分:train/val/test = 7:2:1;重点保证验证集有大量遮挡果梗样本
2. 模型训练配置(针对细果梗小目标优化)
# yolo配置重点
nc: 2
names: ['tomato','stem']
# 小目标优化
imgsz: 640
# 多尺度训练 mosaic开启;减小anchor尺寸,适配细果梗小框
anchors: 缩小聚类,Kmeans聚类你的数据集果梗框
# 损失:使用CIoU / DIoU;类别不平衡:设置cls_pw,增加stem类权重
训练要点:
- 预训练权重:
yolov8n-seg.pt起步(嵌入式实时);精度不够换yolov8s-seg.pt - 增加小目标特征层权重,很多论文会在 Backbone 加入 ECA/MLCA 注意力模块,提升细梗特征提取能力Frontiers
- 监控指标:重点看
stem类 AP,不要只看整体 mAP;果梗漏检是首要问题
3. 推理后处理流程(机器人采摘核心,YOLO 输出 → 剪切点)
RGB 图像输入 YOLOv8-seg → stem 掩码 mask → OpenCV 处理:
- mask 二值化,形态学开 / 闭运算去噪(腐蚀 + 膨胀,去掉枝叶零散噪点)
- 骨架提取(Zhang-Suen 细化算法),提取果梗中心线
- 在骨架线上选择剪切点 cut_point:距离果实连接处预留 3~5mm 位置(防止伤到果实)
- 骨架线拟合直线,得到果梗角度(夹爪剪切姿态)
- 结合深度相机,把 2D 像素坐标 + 深度值,通过手眼标定矩阵转换到机械臂世界坐标系,给到 SDK 或者 MoveIt 做轨迹规划Frontiers
如果用 YOLO-Pose:直接回归
cut_point关键点,省去骨架提取,更稳定,适合最终真机联调。缺点标注工作量更大。
二、YOLO 识别果梗 常见坑(采摘机器人现场实测高频问题)
- 类别不平衡:一张图里番茄大,果梗占像素极少,模型倾向忽略果梗 ✅对策:加大 stem 类别 loss 权重、过采样果梗样本、复制增强 stem 图像
- 枝叶和果梗颜色接近,误检 ✅对策:增加 HSV 色彩过滤做后处理;添加注意力机制;增加复杂遮挡样本
- 果梗被叶子 / 邻果遮挡,断 mask ✅对策:数据集大量加入遮挡样本;后处理对断裂骨架做线段拟合补全
- 深度相机在细梗位置深度丢失(D435 常见) ✅对策:采用邻域深度插值,或者二次提取深度,保证切点 3D 坐标稳定Frontiers
- 光照变化(温室阳光直射、阴影) ✅对策:相机固定曝光;数据集包含多光照;图像归一化
三、和你 WBS 两个版本的对接方案
✅ SDK 版本(原生 SDK,无 MoveIt)
YOLOv8-seg 部署在工控机 / 边缘板,输出果梗切点 2D 像素 → 深度得到 3D 相机坐标 → 手眼标定转换成机械臂基座坐标;调用 SDK 动作集合,驱动夹爪剪切。
对应 WBS 任务:手眼标定、夹爪剪切测试、采摘 Demo。
✅ MoveIt 版本
YOLO 推理输出果梗切点 + 果梗方向,同时输出环境点云 / 拟合地图; 视觉节点发布 ROS 话题:cut_point (x,y,z)、stem_pose;MoveIt 接收目标位姿,做带避障轨迹规划,完成手眼避障联调。
对应 WBS 任务:接收视觉拟合地图、避障手眼联调。
四、最简代码片段(YOLOv8-seg 推理 + mask 提取,Python)
from ultralytics import YOLO
import cv2
import numpy as np
model = YOLO("best_seg.pt")
img = cv2.imread("tomato_stem.jpg")
results = model(img, conf=0.4)
for r in results:
masks = r.masks
boxes = r.boxes
if masks is not None:
for seg_mask in masks.data:
mask_np = seg_mask.cpu().numpy()
mask_np = (mask_np * 255).astype(np.uint8)
# 这里可以做骨架提取,获取果梗剪切点
cv2.imshow("stem_mask",mask_np)
cv2.waitKey(0)
五、进阶优化方案(论文里串番茄果梗方案)
- 改进 YOLOv8:C2f + MLCA 注意力,提升细梗特征,果梗识别成功率可达 91%+Frontiers
- YOLO-GPP:单模型同时预测切点位置 + 夹爪抓取姿态,直接输出采摘位姿,非常适合串果机器人,减少后处理开发量
- RGB-D 双流 YOLO:把深度图作为第二通道输入网络,直接学习空间几何信息,提升遮挡场景稳定性
推荐开发顺序
- 先用 YOLOv8 检测框快速采集数据,验证能不能检出果梗(SDK Demo 快速验证)
- 升级 YOLOv8-seg,拿到 mask,开发骨架提取求切点
- 稳定后升级 YOLO-Pose 关键点,直接预测剪切点,降低后处理复杂度
- 部署 ROS 节点,对接 MoveIt 版本,手眼联调 + 避障测试