✨ 长期致力于大蒜、在线切根、切割高度控制、收获、目标检测研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
如需沟通交流,点击《获取方式


(1)双光谱融合的鳞茎边界检测与切割线动态回归:

针对田间大蒜鳞茎与蒜秧颜色相近导致传统RGB图像分割困难的问题,设计了一种近红外-可见光双光谱融合检测网络,命名为IR-RGB-FusionYOLO。该网络采用双流结构,可见光分支使用MobileNetV3作为骨干提取纹理特征,近红外分支使用ShuffleNetV2提取反射强度特征,两分支的特征图经过注意力融合模块(包含通道注意力与空间注意力)进行加权融合。融合后的特征输入到三个检测头,分别负责鳞茎中心点、鳞茎宽度以及切割参考线的偏移量回归。训练数据集包含5600张标注图像,其中3000张来自晴天自然光照,2600张来自阴天或弱光条件,所有图像均配准了对应的近红外通道数据。标签定义中,切割线位置为鳞茎底部向上6mm处,标注为关键点坐标。损失函数采用CIoU损失与关键点偏移L1损失加权组合,权重系数分别为0.7和0.3。在测试集上的平均精度AP@0.5达到94.2%,切割线位置预测的平均绝对误差仅为1.24像素(对应实际距离0.31mm)。相比单可见光YOLOv5,误检率降低了41%,特别是在蒜秧缠绕严重的情况下,IR通道能有效穿透遮挡。在Jetson Xavier NX平台上,模型推理速度为28帧/秒,满足在线切根的实时性要求。

(2)自适应切割高度模糊PID控制器与夹持速比优化:

为实现切根过程中圆盘刀随鳞茎底部轮廓起伏而动态调整高度,设计了一种基于模糊PID的自适应切割高度控制器,命名为Fuzzy-Height-PID。控制器的输入量包括目标切割线与实际切割线之间的误差e(单位mm)以及误差变化率ec(mm/s),输出量为步进电机的位置修正值Δu。模糊规则表共49条,采用三角形隶属函数,e的论域为[-5,5]mm,ec的论域为[-3,3]mm/s。模糊推理采用Mamdani法,解模糊用重心法。传统PID的初始参数经Ziegler-Nichols法整定为Kp=2.5,Ki=0.3,Kd=0.8,模糊控制器动态调整这三个参数的增量因子。此外,对输送系统进行了运动学建模:夹持输送链速比为1:1.2(主动轮与从动轮线速度差),拨指链速比设为1:0.85。建立输送速比计算方程v_clamp = ω_c * r_c,v_finger = ω_f * r_f,要求v_clamp / v_finger在1.1到1.3之间以保证蒜株在切割前被拉直。通过台架试验优选出速比1.18,此时蒜株俯仰角变化小于3度。在响应测试中,当切割线参考值阶跃变化5mm时,Fuzzy-Height-PID的调节时间为0.22秒,超调量8%,而常规PID则需要0.45秒且超调17%。

(3)基于孪生网络的在线切根质量实时评估与自修正策略:

由于田间环境复杂,切割刀片磨损、蒜头形状变异等因素会导致切根质量下降,因此设计了一个轻量级孪生质量评估网络Siamese-QE。该网络接收切割后的蒜头侧视图像(128x128像素)以及一个参考模板图像(完美切割样例),输出两个分支的特征相似度,并预测三个质量指标:余根长度、切面平整度、鳞茎损伤概率。训练时,将质量指标分为优、良、差三级,共使用18000张带标注图像。对于预测为“差”的样本,系统触发自修正流程:首先调整切割线偏移量(累加+0.5mm或-0.5mm),然后记录该偏移量下的后续10次切割质量,若平均质量评分提升则保持偏移方向,否则反向调整。同时,为了应对刀片磨损导致的切割力变化,在圆盘刀驱动轴上集成一个应变式扭矩传感器,当扭矩波动超过初始值的15%时,系统自动增加步进电机的下压力(从默认的12N逐步提升至18N)。在一台自走式大蒜联合收获机上进行了田间试验,共收割2亩大蒜。试验分为两组:启用在线质量评估与自修正组(实验组)和固定参数组(对照组)。实验组共处理2760头大蒜,余根平均长度为2.3mm(标准差0.8mm),鳞茎切伤率1.2%,漏切率0.6%;对照组余根平均长度4.7mm(标准差2.1mm),切伤率4.5%,漏切率2.8%。实验组的表现优于国家标准中关于切根质量的一等品要求。此外,自修正策略在运行约200次切割后自适应地将切割线下移了1.2mm,补偿了刀片磨损的影响。

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

class SiameseQE(nn.Module):
    def __init__(self, embedding_dim=64):
        super().__init__()
        self.encoder = nn.Sequential(
            nn.Conv2d(3, 32, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
            nn.Conv2d(64, 128, 3, padding=1), nn.ReLU(), nn.AdaptiveAvgPool2d(1),
            nn.Flatten(), nn.Linear(128, embedding_dim)
        )
        self.fc_reg = nn.Linear(embedding_dim*2, 3)  # 回归三个质量指标
    def forward(self, img, template):
        feat_img = self.encoder(img)
        feat_temp = self.encoder(template)
        concat = torch.cat([feat_img, feat_temp], dim=1)
        quality = self.fc_reg(concat)
        return quality  # [余长, 平整度, 损伤概率]

# 模糊PID控制器类(简化版)
class FuzzyPID:
    def __init__(self, kp, ki, kd):
        self.kp, self.ki, self.kd = kp, ki, kd
        self.integral = 0
        self.prev_error = 0
    def fuzzify(self, e, ec):
        # 简化模糊规则:e和ec的隶属函数三角形
        u = self.kp * e + self.ki * self.integral + self.kd * ec
        # 模糊调整(实际实现需要查表,此处示意)
        delta_kp = 0.2 * (1 if e*ec>0 else -0.5)
        delta_kd = 0.05 * abs(ec)
        self.kp += delta_kp
        self.kd = max(0.1, self.kd + delta_kd)
        return u
    def update(self, e, dt=0.02):
        ec = (e - self.prev_error) / dt
        u = self.fuzzify(e, ec)
        self.integral += e * dt
        self.integral = np.clip(self.integral, -10, 10)
        self.prev_error = e
        return u

# 质量自修正循环模拟
qe_model = SiameseQE()
qe_model.load_state_dict(torch.load('siamese_qe.pth'))
qe_model.eval()
offset_mm = 0.0
quality_buffer = []
for cut_idx in range(500):
    # 采集图像(模拟)
    img = torch.randn(1,3,128,128)
    template = torch.randn(1,3,128,128)
    with torch.no_grad():
        q = qe_model(img, template)[0].numpy()  # [余长,平整度,损伤]
    score = 1.0 - (q[0]/10.0 + q[2])/2  # 综合评分
    quality_buffer.append(score)
    if cut_idx % 10 == 9 and np.mean(quality_buffer) < 0.7:
        # 触发自修正
        offset_mm += 0.5 if np.mean(quality_buffer[-10:]) < np.mean(quality_buffer[-20:-10]) else -0.5
        print(f'调整切割偏移: {offset_mm:.1f}mm')
        quality_buffer = []
    # 应用偏移到PID控制器(略)

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐