✨ 长期致力于苹果、采摘机器人、人工智能、深度学习、智能化感知研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
如需沟通交流,点击《获取方式


(1)轻量化Bottleneck CSP-2与注意力机制融合的改进YOLOv5s:

针对采摘机器人需要实时区分可采摘与不可采摘苹果(依据颜色、大小和遮挡程度),设计了一个高效特征提取网络。将YOLOv5s中的CSP模块替换为Bottleneck CSP-2,该模块减少计算量的同时保留跨阶段特征融合。在骨干网络的三个输出层分别嵌入SENet通道注意力模块,自适应重新校准特征图权重。对输入中尺寸目标检测层,将特征图跨接融合方式从concat改为加权双向特征金字塔,提升对小苹果和遮挡苹果的召回。在自建数据集AppleHarvest-2024(含12000幅图像,标注可采摘/不可采摘)上训练,采用Mosaic和MixUp数据增强,初始学习率0.01,使用余弦退火。最终模型召回率91.48%,精度83.83%,推理速度66帧每秒在Jetson Xavier NX上。模型大小仅5.2MB,适合嵌入式部署。通过输出类别置信度,机器人优先采摘可采摘目标。

(2)面向枝干遮挡的迂回采摘姿态识别网络:

为了应对枝干遮挡苹果(上、下、左、右侧单侧遮挡或多侧遮挡),提出一个多分支分类网络Occlusion-YOLO。在YOLOv5m基础上设计Bottleneck CSP-B特征提取模块,该模块增加一个分支用于提取遮挡边缘方向信息。在骨干网络中嵌入两个SE模块分别作用于浅层纹理和深层语义。改进特征图跨接方式,将浅层的高分辨率特征直接传递到检测头,以保留小遮挡苹果的轮廓。通过K-means聚类重新设计初始锚框尺寸,得到6个锚框适应遮挡苹果的宽高比。训练时额外标注遮挡类型(无遮挡、左上右下等8种),网络输出检测框同时输出采摘方式类别:直接采摘、上侧迂回、下侧迂回、左侧迂回、右侧迂回、不可采摘。在果园实测中,模型对单侧遮挡苹果的平均检测精度为80.7%,迂回采摘模式识别准确率达85%。基于该输出,机械臂可主动调整姿态从无遮挡侧接近苹果,采摘成功率从62%提升至79%。

(3)基于RGB-D的苹果尺寸估测与采摘-分级结合模型:

为实现边采摘边分级,构建一个融合深度信息的最大横径估测模型。使用D435相机采集苹果的RGB和深度图,通过目标检测获得外接矩形框,计算矩形框对角线长度L(像素)。同时从深度图获得苹果中心深度D(mm)。然后基于多元非线性回归拟合果实真实最大横径R与L、D之间的关系:R = a * L / D + b * L + c * D + d,使用最小二乘法估计参数a,b,c,d。在1250个红富士苹果样本上,拟合后R方为0.84,均方根误差3.95mm。将估测的横径按标准(60,70,80,90,100mm)分为五级。采摘机器人据此将果实送入不同的收集篮,实现田间分级。试验中分级总体准确率为86.3%。在机械臂抓取前,根据估测尺寸调整气动夹爪的张开幅度,避免损伤小果或抓不稳大果。该方法无需额外传感器,仅利用已有视觉数据。

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np

class BottleneckCSP2(nn.Module):
    def __init__(self, in_ch, out_ch, n=2):
        super().__init__()
        self.conv1 = nn.Conv2d(in_ch, out_ch//2, 1)
        self.conv2 = nn.Conv2d(in_ch, out_ch//2, 1)
        self.bottlenecks = nn.Sequential(*[Bottleneck(out_ch//2) for _ in range(n)])
        self.conv3 = nn.Conv2d(out_ch, out_ch, 1)

    def forward(self, x):
        y1 = self.conv1(x)
        y2 = self.conv2(x)
        y2 = self.bottlenecks(y2)
        y = torch.cat([y1, y2], dim=1)
        return self.conv3(y)

class Bottleneck(nn.Module):
    def __init__(self, ch):
        super().__init__()
        self.conv1 = nn.Conv2d(ch, ch, 1)
        self.conv2 = nn.Conv2d(ch, ch, 3, padding=1)
    def forward(self, x):
        return x + self.conv2(F.relu(self.conv1(x)))

class OcclusionYOLO(nn.Module):
    def __init__(self, num_classes=8):
        super().__init__()
        self.backbone = nn.Sequential(
            nn.Conv2d(3, 32, 3, stride=2, padding=1), nn.BatchNorm2d(32), nn.ReLU(),
            BottleneckCSP2(32, 64, n=2),
            nn.Conv2d(64, 128, 3, stride=2, padding=1), BottleneckCSP2(128, 128, n=3),
        )
        self.se1 = SELayer(128)
        self.neck = nn.Conv2d(128, 256, 1)
        self.se2 = SELayer(256)
        self.det_head = nn.Conv2d(256, (5+num_classes)*3, 1)

    def forward(self, x):
        x = self.backbone(x)
        x = self.se1(x)
        x = self.neck(x)
        x = self.se2(x)
        return self.det_head(x)

class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super().__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction), nn.ReLU(),
            nn.Linear(channel // reduction, channel), nn.Sigmoid()
        )
    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        return x * y

# 尺寸估测模型
def estimate_diameter(L_pixel, D_mm, params):
    # L_pixel: 矩形框对角线长度,D_mm: 深度值
    a,b,c,d = params
    R = a * L_pixel / D_mm + b * L_pixel + c * D_mm + d
    return np.clip(R, 50, 110)  # 单位mm

# 参数拟合 (最小二乘)
def fit_diameter_model(L_list, D_list, R_true):
    X = np.column_stack([L_list/D_list, L_list, D_list, np.ones(len(L_list))])
    params, _, _, _ = np.linalg.lstsq(X, R_true, rcond=None)
    return params",

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐