基于计算机视觉的番茄果实识别算法研究

【看论文】之《番茄采摘机器人关键技术研究_王丽丽 》 论文信息 论文题目:《番茄采摘机器人关键技术研究》 作者:王丽丽 单位:北京工业大学 来源:中国知网 论文性质:博士学位论文 论文提交时间:2017.5 摘要 主要研究内容: (1)总体设计了番茄采摘机器人系统; (2)用模块化设计方法和嵌入式控制系统理论,研制了四轮独立转向行走平台; (3) 研制了基于激光传感技术的激光自动导航控制系统; (4)研制了串联式灵巧型四自由度... 阅读详情

选题意义背景

随着全球人口的持续增长和农业劳动力的日益短缺,农业自动化已成为21世纪农业发展的必然趋势,全球农业自动化市场规模呈现出快速增长的态势,特别是在智能装备和机器人技术领域。番茄作为全球广泛种植的重要经济作物,其采摘作业仍主要依赖人工完成,这不仅劳动强度大,而且效率低下,严重制约了番茄产业的规模化发展。

番茄采摘是一项劳动密集型工作,传统的人工采摘方式存在诸多局限性。首先,人工采摘效率低下,一名熟练工人每天最多可采摘约200-300公斤番茄,难以满足大规模种植的需求。其次,人工采摘成本不断攀升,2025年番茄采摘人工成本较2024年上涨了约35%,严重影响了种植户的经济效益。此外,人工采摘还存在质量不一致、易损伤果实等问题,影响番茄的商品价值。
在这里插入图片描述

尽管番茄采摘机器人的研究取得了显著进展,但目前仍面临诸多挑战。首先,机械臂成本高,一台高性能的工业机械臂价格往往在数万元甚至数十万元,这使得采摘机器人的整体成本居高不下,难以大规模推广应用。其次,识别采摘成功率和速度仍有待提高,在复杂的自然环境下,由于光照变化、果实遮挡等因素的影响,现有系统的识别率和采摘成功率难以满足实际需求,改进视觉识别算法开发出一种实用的番茄采摘机器人,为解决番茄采摘劳动力短缺问题提供技术支持。
在这里插入图片描述

数据集

数据获取

本项目的数据集主要来源于实际番茄种植环境,通过在南京市江宁区绿丰源谷番茄采摘园进行实地拍摄采集。数据采集时间为2025年6-8月,覆盖了番茄的主要生长季节。采集过程中,研究团队使用高清数码相机和项目中采用的Astra D-U 3D结构光摄像机,从不同角度、不同距离、不同光照条件下对番茄植株进行拍摄,确保数据集的多样性和代表性。
在这里插入图片描述

本项目的数据集包含图像数据和标注数据两部分。图像数据采用JPEG格式,分辨率为1920×1080,色彩空间为RGB。标注数据采用XML格式,记录了番茄果实和果梗的位置信息、类别信息以及置信度等参数。

数据集的规模经过精心设计,确保既能满足模型训练的需求,又能保证标注质量。训练集包含260张番茄植株图像,其中红色成熟番茄图像150张,黄色半成熟番茄图像60张,绿色未成熟番茄图像50张。测试集包含60张番茄植株图像,各类别比例与训练集保持一致。在每张图像中,至少包含1个番茄果实,最多包含10个番茄果实,平均每张图像包含4-5个番茄果实。

类别定义

数据集中的目标类别主要包括两类:番茄果实和番茄果梗。其中,番茄果实根据成熟度进一步细分为三个子类:红色成熟番茄、黄色半成熟番茄和绿色未成熟番茄。果梗则作为一个单独的类别进行标注,这对于后续的采摘点定位至关重要。
在这里插入图片描述

类别定义的详细信息如下:

  1. 番茄果实(tomato_fruit):
    • 红色成熟番茄(red_ripe):果实表面大部分呈红色,成熟度达到采摘标准
    • 黄色半成熟番茄(yellow_half_ripe):果实表面呈黄色,尚未完全成熟
    • 绿色未成熟番茄(green_unripe):果实表面呈绿色,未达到采摘标准
  2. 番茄果梗(tomato_stem):连接番茄果实与植株的部分,是采摘的关键位置

在数据标注过程中,研究团队严格按照上述类别定义进行标注,确保标注的一致性和准确性。对于果实与果梗的关系,标注时会特别注意它们之间的连接关系,为后续的采摘点提取提供准确的信息。

数据预处理

为了提高模型的训练效率和识别精度,在模型训练前对数据进行了一系列预处理操作。预处理的主要步骤包括:

  1. 图像缩放:将原始图像统一缩放到416×416的尺寸,以适应YOLOv4模型的输入要求。缩放过程中保持图像的长宽比不变,通过填充黑色像素的方式将图像调整为正方形。

  2. 数据增强:为了增加数据集的多样性,减少过拟合风险,对训练数据进行了数据增强处理。主要包括随机翻转、随机旋转(-15°到+15°)、随机裁剪、亮度调整(±20%)和对比度调整(±20%)等操作。通过这些操作,训练集的规模实际上扩大了5-6倍。

  3. 归一化处理:对图像进行归一化处理,将像素值从[0, 255]范围转换到[0, 1]范围,以加速模型的收敛。归一化公式为:像素值 = 原始像素值 / 255。

  4. 标注数据转换:将XML格式的标注数据转换为YOLOv4模型所需的txt格式。转换过程中,将边界框的坐标从像素坐标转换为相对坐标(相对于图像宽度和高度的比例),便于模型的训练和预测。

  5. 数据清洗:对采集的数据进行清洗,去除质量较差的图像,如模糊、曝光过度或不足的图像。同时,对标注数据进行检查,确保标注的准确性和完整性。

通过以上预处理操作,不仅提高了数据的质量和一致性,还增强了模型的鲁棒性和泛化能力,为后续的模型训练奠定了良好的基础。

功能模块

果实识别

果实识别与定位模块是整个采摘机器人的核心,负责从复杂的自然环境中识别番茄果实并精确定位其位置。该模块采用YOLOv4深度学习算法与传统计算机视觉方法相结合的策略,实现了高效、准确的果实识别与定位。果实识别子模块以YOLOv4算法为核心,通过深度卷积神经网络实现番茄果实的快速检测和分类。YOLOv4采用了CSPDarknet53作为主干网络,结合了PANet特征金字塔和SPP结构,能够有效提取不同尺度的特征信息,提高检测精度。
在这里插入图片描述

识别子模块的工作流程如下:首先,通过3D结构光摄像机获取番茄植株的RGB图像;然后,将图像输入到YOLOv4模型中进行处理,模型输出番茄果实的位置信息(边界框坐标)和类别信息(成熟度);最后,对检测结果进行后处理,过滤掉置信度较低的检测框,得到最终的识别结果。

为了提高识别精度,在YOLOv4的基础上进行了一系列优化:首先,针对番茄果实的特点,调整了模型的锚框参数;其次,采用迁移学习的方法,利用预训练模型加速训练过程;最后,通过数据增强和交叉验证等方法,提高了模型的泛化能力。

果实定位

果实定位子模块负责将识别到的番茄果实从图像坐标系转换到机器人坐标系,为机械臂的采摘操作提供准确的位置信息。该子模块基于相机成像模型和坐标变换原理,通过相机标定参数将像素坐标转换为世界坐标,定位子模块的工作流程如下:首先,通过相机标定获取摄像机的内参矩阵和外参矩阵;然后,根据识别子模块提供的果实边界框信息,计算果实的质心坐标;接着,利用深度图像获取果实的深度信息;最后,通过坐标变换将果实的像素坐标转换为机器人坐标系中的三维坐标。

为了提高定位精度,采用了以下优化措施:首先,使用高精度的棋盘格标定板进行相机标定,确保标定参数的准确性;其次,采用亚像素级的质心提取算法,提高质心定位的精度;最后,通过多帧图像融合的方法,减少随机误差的影响。实验结果表明,果实定位的平均误差小于5mm,能够满足机械臂采摘的精度要求。
在这里插入图片描述

采摘点提取

采摘执行模块负责控制机械臂完成番茄果实的采摘操作,是整个采摘过程的执行环节。该模块基于果实识别与定位模块提供的位置信息和机械臂运动规划模块生成的运动轨迹,控制机械臂完成采摘任务。采摘点提取子模块负责确定番茄果实的最佳采摘位置,即果梗与果实的连接处。该子模块基于果实识别结果和图像分割技术,通过分析果梗的形态特征,精确定位采摘点。
在这里插入图片描述

采摘点提取的主要步骤包括:首先,对识别到的番茄果实和果梗进行细分割处理,使用K-means聚类算法(K=2)分离果实和果梗;然后,对果梗区域进行形态学开运算,去除噪声干扰;接着,对果梗区域进行骨骼化处理,得到果梗的中心线;最后,计算果实区域与果梗骨骼线的交点,即为最佳采摘点。
在这里插入图片描述

为了提高采摘点提取的准确性,采用了以下优化措施:首先,结合RGB和深度信息进行分割,提高分割精度;其次,使用自适应阈值的方法处理不同光照条件下的图像;最后,通过多帧图像验证的方法,减少异常值的影响。实验结果表明,采摘点提取的平均误差小于3mm,能够满足采摘作业的精度要求。

核心代码

YOLO 番茄识别

基于YOLO 的番茄识别功能。代码采用面向对象的设计,封装了YOLO 模型的加载、检测和可视化等功能。主要包括以下几个部分:

  1. 初始化函数:加载YOLOv4模型,设置计算后端为CUDA以加速推理,获取输出层名称,并设置置信度阈值和非极大值抑制阈值。

  2. 检测函数:接收输入图像,创建blob并输入到网络中进行前向传播,解析网络输出获取检测结果,包括类别、置信度和边界框坐标等信息,最后进行非极大值抑制去除冗余的检测框。

  3. 可视化函数:根据检测结果在图像上绘制边界框和类别标签,便于直观地观察检测效果。

import cv2
import numpy as np
import time

class YOLOv4TomatoDetector:
    def __init__(self, model_cfg, model_weights, confidence_threshold=0.5, nms_threshold=0.4):
        # 初始化YOLOv4模型
        self.net = cv2.dnn.readNetFromDarknet(model_cfg, model_weights)
        # 设置计算后端
        self.net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
        self.net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
        
        # 获取输出层名称
        layer_names = self.net.getLayerNames()
        self.output_layers = [layer_names[i[0] - 1] for i in self.net.getUnconnectedOutLayers()]
        
        # 设置阈值参数
        self.confidence_threshold = confidence_threshold
        self.nms_threshold = nms_threshold
        
        # 类别名称
        self.classes = ['red_ripe', 'yellow_half_ripe', 'green_unripe', 'tomato_stem']
        # 颜色定义
        self.colors = np.random.uniform(0, 255, size=(len(self.classes), 3))
    
    def detect(self, image):
        # 获取图像尺寸
        height, width = image.shape[:2]
        
        # 创建blob
        blob = cv2.dnn.blobFromImage(image, 1/255.0, (416, 416), swapRB=True, crop=False)
        self.net.setInput(blob)
        
        # 前向传播
        start = time.time()
        outs = self.net.forward(self.output_layers)
        end = time.time()
        
        # 存储检测结果
        class_ids = []
        confidences = []
        boxes = []
        
        # 解析输出
        for out in outs:
            for detection in out:
                scores = detection[5:]
                class_id = np.argmax(scores)
                confidence = scores[class_id]
                
                if confidence > self.confidence_threshold:
                    # 计算边界框坐标
                    center_x = int(detection[0] * width)
                    center_y = int(detection[1] * height)
                    w = int(detection[2] * width)
                    h = int(detection[3] * height)
                    
                    # 计算边界框左上角坐标
                    x = int(center_x - w / 2)
                    y = int(center_y - h / 2)
                    
                    # 存储检测结果
                    boxes.append([x, y, w, h])
                    confidences.append(float(confidence))
                    class_ids.append(class_id)
        
        # 非极大值抑制
        indexes = cv2.dnn.NMSBoxes(boxes, confidences, self.confidence_threshold, self.nms_threshold)
        
        # 存储最终检测结果
        detections = []
        if len(indexes) > 0:
            for i in indexes.flatten():
                x, y, w, h = boxes[i]
                class_id = class_ids[i]
                confidence = confidences[i]
                
                # 计算质心坐标
                center_x = x + w // 2
                center_y = y + h // 2
                
                detections.append({
                    'class_id': class_id,
                    'class_name': self.classes[class_id],
                    'confidence': confidence,
                    'bbox': [x, y, w, h],
                    'centroid': [center_x, center_y]
                })
        
        return detections, end - start
    
    def visualize(self, image, detections):
        # 可视化检测结果
        for detection in detections:
            x, y, w, h = detection['bbox']
            class_name = detection['class_name']
            confidence = detection['confidence']
            color = self.colors[detection['class_id']]
            
            # 绘制边界框
            cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
            
            # 绘制类别和置信度
            label = f'{class_name}: {confidence:.2f}'
            cv2.putText(image, label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
        
        return image

在实际应用中,这段代码可以与3D结构光摄像机结合使用,实时获取番茄植株的图像并进行识别。识别结果包括番茄果实的位置、类别(成熟度)和置信度等信息,为后续的定位和采摘提供基础。通过调整置信度阈值和非极大值抑制阈值,可以平衡检测精度和召回率,满足不同场景的需求。

机械臂逆运动学求解

四自由度机械臂的运动学计算,包括正运动学和逆运动学求解。代码采用面向对象的设计,封装了机械臂运动学的相关计算功能。主要包括以下几个部分:

  1. 初始化函数:接收D-H参数作为输入,设置机械臂的结构参数。

  2. 正运动学求解函数:根据给定的关节角度,计算末端执行器的位置和姿态。通过依次计算每个连杆的变换矩阵并累乘,得到末端执行器相对于基坐标系的变换矩阵。

  3. 逆运动学求解函数:根据给定的目标位置,求解机械臂的关节角度。由于四自由度机械臂的自由度限制,假设末端执行器保持水平,只考虑位置控制。通过几何方法依次求解每个关节的角度,并验证解的正确性。

  4. 工作空间检查函数:检查给定的位置是否在机械臂的工作空间内。通过位置约束和逆运动学求解验证,确保目标位置可达。

import numpy as np

class ArmKinematics:
    def __init__(self, dh_params):
        # 初始化D-H参数
        # dh_params: [a, alpha, d, theta]
        self.dh_params = dh_params
        self.num_joints = len(dh_params)
    
    def forward_kinematics(self, joint_angles):
        """正运动学求解"""
        # 初始化变换矩阵
        T = np.eye(4)
        
        for i in range(self.num_joints):
            # 获取D-H参数
            a, alpha, d, theta_offset = self.dh_params[i]
            theta = joint_angles[i] + theta_offset
            
            # 计算变换矩阵
            Ti = np.array([
                [np.cos(theta), -np.sin(theta)*np.cos(alpha), np.sin(theta)*np.sin(alpha), a*np.cos(theta)],
                [np.sin(theta), np.cos(theta)*np.cos(alpha), -np.cos(theta)*np.sin(alpha), a*np.sin(theta)],
                [0, np.sin(alpha), np.cos(alpha), d],
                [0, 0, 0, 1]
            ])
            
            # 累乘变换矩阵
            T = T.dot(Ti)
        
        return T
    
    def inverse_kinematics(self, target_position, target_orientation=None):
        """逆运动学求解"""
        # 四自由度机械臂逆运动学求解
        # 假设末端执行器保持水平,只考虑位置控制
        
        x, y, z = target_position
        
        # 获取D-H参数
        a1, alpha1, d1, theta1_offset = self.dh_params[0]
        a2, alpha2, d2, theta2_offset = self.dh_params[1]
        a3, alpha3, d3, theta3_offset = self.dh_params[2]
        a4, alpha4, d4, theta4_offset = self.dh_params[3]
        
        # 求解关节1角度
        # 从x-y平面投影求解
        r = np.sqrt(x**2 + y**2)
        theta1 = np.arctan2(y, x) + theta1_offset
        
        # 求解关节3角度
        # 从x-z平面投影求解
        x_prime = r - a1
        z_prime = z - d1
        
        # 计算距离
        c = np.sqrt(x_prime**2 + z_prime**2)
        
        # 余弦定理求解theta3
        cos_theta3 = (c**2 - a2**2 - a3**2) / (2 * a2 * a3)
        # 检查是否在有效范围内
        if abs(cos_theta3) > 1:
            return None  # 无解
        
        theta3 = -np.arccos(cos_theta3) + theta3_offset  # 选择下方解
        
        # 求解关节2角度
        k1 = a2 + a3 * np.cos(theta3 - theta3_offset)
        k2 = a3 * np.sin(theta3 - theta3_offset)
        
        theta2 = np.arctan2(z_prime, x_prime) - np.arctan2(k2, k1) + theta2_offset
        
        # 求解关节4角度
        # 由于四自由度机械臂无法完全控制末端姿态,这里假设theta4为0
        theta4 = theta4_offset
        
        # 返回关节角度
        joint_angles = [theta1, theta2, theta3, theta4]
        
        # 验证解的正确性
        T = self.forward_kinematics(joint_angles)
        calculated_position = T[:3, 3]
        
        # 检查误差是否在允许范围内
        if np.linalg.norm(calculated_position - np.array(target_position)) > 0.001:
            return None  # 解无效
        
        return joint_angles
    
    def check_workspace(self, position):
        """检查位置是否在工作空间内"""
        # 简单的工作空间检查
        x, y, z = position
        
        # 计算距离
        r = np.sqrt(x**2 + y**2)
        
        # 工作空间约束
        min_r = 0.1
        max_r = 0.8
        min_z = 0.1
        max_z = 1.0
        
        if r < min_r or r > max_r or z < min_z or z > max_z:
            return False
        
        # 尝试逆运动学求解,验证是否有解
        joint_angles = self.inverse_kinematics(position)
        if joint_angles is None:
            return False
        
        # 检查关节角度是否在允许范围内
        for angle in joint_angles:
            if angle < -np.pi or angle > np.pi:
                return False
        
        return True

在实际应用中,这段代码可以用于机械臂的轨迹规划和控制。通过逆运动学求解,可以将采摘点的位置转换为机械臂的关节角度,为机械臂的运动控制提供基础。工作空间检查函数可以帮助规划安全的运动路径,避免机械臂运动到不可达或危险的位置。

采摘点提取代码

番茄采摘点的提取功能,通过图像分割和形态学处理,精确定位果梗与果实的连接处。代码采用面向对象的设计,封装了采摘点提取的相关算法。主要包括以下几个部分:

  1. 初始化函数:设置K-means聚类参数、形态学操作的核大小和骨骼化处理的参数。

  2. 果实和果梗分割函数:提取果实区域,转换到LAB色彩空间,使用K-means聚类算法分割果实和果梗,通过形态学开运算去除噪声。

  3. 骨骼化处理函数:将果梗区域转换为单像素宽度的骨骼线,便于后续的特征提取和分析。

  4. 采摘点提取函数:根据果实质心和果梗骨骼线,找到最佳采摘位置。计算骨骼线上所有点到果实质心的距离,选择最近的点作为采摘点。

  5. 可视化函数:在图像上绘制果实边界框和采摘点,便于直观地观察提取效果。

import cv2
import numpy as np

class PickingPointExtractor:
    def __init__(self, kmeans_k=2, morph_kernel_size=(5, 5), skeleton_thickness=1):
        # 初始化参数
        self.kmeans_k = kmeans_k
        self.morph_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, morph_kernel_size)
        self.skeleton_thickness = skeleton_thickness
    
    def segment_fruit_stem(self, image, fruit_bbox):
        """分割果实和果梗"""
        # 提取果实区域
        x, y, w, h = fruit_bbox
        fruit_roi = image[y:y+h, x:x+w]
        
        # 转换为LAB色彩空间
        lab_roi = cv2.cvtColor(fruit_roi, cv2.COLOR_BGR2LAB)
        
        # 提取图像特征(使用L和B通道)
        features = lab_roi[:, :, [0, 2]].reshape(-1, 2)
        
        # 使用K-means聚类分割
        criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.2)
        _, labels, centers = cv2.kmeans(features.astype(np.float32), 
                                       self.kmeans_k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
        
        # 重塑标签
        segmented = labels.reshape(fruit_roi.shape[:2])
        
        # 确定哪个聚类对应果梗(通常颜色较深)
        # 计算每个聚类的平均L值
        cluster_means = []
        for i in range(self.kmeans_k):
            mask = (segmented == i).astype(np.uint8)
            mean_l = np.mean(lab_roi[:, :, 0][mask == 1])
            cluster_means.append(mean_l)
        
        # 果梗通常颜色较深,选择L值较小的聚类
        stem_cluster = np.argmin(cluster_means)
        
        # 创建果梗掩码
        stem_mask = (segmented == stem_cluster).astype(np.uint8) * 255
        
        # 形态学开运算去除噪声
        stem_mask = cv2.morphologyEx(stem_mask, cv2.MORPH_OPEN, self.morph_kernel)
        
        # 创建全图掩码
        full_mask = np.zeros(image.shape[:2], dtype=np.uint8)
        full_mask[y:y+h, x:x+w] = stem_mask
        
        return full_mask
    
    def skeletonize(self, binary_image):
        """骨骼化处理"""
        # 复制图像
        img = binary_image.copy()
        size = np.size(img)
        skel = np.zeros(img.shape, np.uint8)
        
        # 阈值化
        ret, img = cv2.threshold(img, 127, 255, 0)
        
        # 形态学梯度
        element = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
        done = False
        
        while(not done):
            # 腐蚀和膨胀
            eroded = cv2.erode(img, element)
            temp = cv2.dilate(eroded, element)
            temp = cv2.subtract(img, temp)
            skel = cv2.bitwise_or(skel, temp)
            img = eroded.copy()
            
            # 检查是否还有白色像素
            zeros = size - cv2.countNonZero(img)
            if zeros == size:
                done = True
        
        return skel
    
    def extract_picking_point(self, image, fruit_detection, stem_detection):
        """提取采摘点"""
        # 获取果实和果梗的边界框
        fruit_bbox = fruit_detection['bbox']
        
        # 分割果实区域内的果梗
        stem_mask = self.segment_fruit_stem(image, fruit_bbox)
        
        # 骨骼化处理
        skeleton = self.skeletonize(stem_mask)
        
        # 获取果实质心
        fruit_x, fruit_y, fruit_w, fruit_h = fruit_bbox
        fruit_center_x = fruit_x + fruit_w // 2
        fruit_center_y = fruit_y + fruit_h // 2
        
        # 找到骨骼线上距离果实质心最近的点
        # 获取骨骼线上的所有点
        skeleton_points = np.column_stack(np.where(skeleton > 0))
        
        if len(skeleton_points) == 0:
            # 如果没有找到骨骼线,返回果实质心作为采摘点
            return (fruit_center_x, fruit_center_y)
        
        # 计算每个骨骼点到果实质心的距离
        distances = np.sqrt(
            (skeleton_points[:, 1] - fruit_center_x)**2 + 
            (skeleton_points[:, 0] - fruit_center_y)**2
        )
        
        # 找到最近的点
        nearest_idx = np.argmin(distances)
        picking_point = (skeleton_points[nearest_idx, 1], skeleton_points[nearest_idx, 0])
        
        return picking_point
    
    def visualize(self, image, fruit_detection, picking_point):
        """可视化采摘点"""
        # 复制图像
        vis_image = image.copy()
        
        # 绘制果实边界框
        x, y, w, h = fruit_detection['bbox']
        cv2.rectangle(vis_image, (x, y), (x + w, y + h), (0, 255, 0), 2)
        
        # 绘制采摘点
        cv2.circle(vis_image, picking_point, 5, (0, 0, 255), -1)
        cv2.putText(vis_image, 'Picking Point', 
                    (picking_point[0] + 10, picking_point[1] - 10), 
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
        
        return vis_image

在实际应用中,这段代码与YOLO番茄识别模块结合使用,首先通过YOLO识别番茄果实,然后使用采摘点提取算法精确定位采摘位置。采摘点的准确提取对于机械臂的采摘操作至关重要,直接影响采摘的成功率和果实的完整性。通过调整K-means聚类参数和形态学操作参数,可以适应不同光照条件和果实成熟度的变化,提高算法的鲁棒性。

重难点和创新点

果实识别算法

本项目采用了YOLOv4深度学习算法进行番茄果实识别,并针对番茄果实的特点进行了优化。相比传统的计算机视觉方法,YOLOv4算法具有更高的识别精度和更快的检测速度,能够满足实时采摘的需求。

创新点主要体现在以下几个方面:首先,通过对番茄果实数据集的分析,优化了YOLOv4的锚框参数,提高了检测的准确性;其次,采用迁移学习的方法,利用预训练模型加速训练过程,提高了模型的泛化能力;最后,通过数据增强和交叉验证等方法,进一步提高了模型的性能。

高效的采摘点提取算法

本项目提出了一种基于K-means聚类和骨骼化处理的采摘点提取算法,能够精确定位果梗与果实的连接处。该算法首先通过K-means聚类算法分割果实和果梗,然后对果梗区域进行形态学开运算去除噪声,接着进行骨骼化处理得到果梗的中心线,最后计算果实质心与果梗骨骼线的交点作为采摘点。

该算法的创新点在于将传统的图像分割方法与形态学处理相结合,能够在复杂背景下准确提取果梗信息。实验结果表明,该算法提取的采摘点平均误差小于3mm,能够满足机械臂采摘的精度要求。

总结

本项目设计并实现了一种基于果实识别的番茄采摘机器人,通过集成计算机视觉、深度学习、机械臂运动学等技术,实现了番茄果实的自动识别、定位和采摘。项目的主要研究成果包括:

  1. 设计了番茄采摘机器人的整体架构,包括感知层、决策层和执行层三个部分。感知层负责环境感知和目标识别,决策层负责路径规划和运动控制,执行层负责具体的采摘操作。这种分层架构使得系统具有良好的模块化特性,便于调试和维护。

  2. 实现了基于YOLO的番茄果实识别算法,通过对网络结构和参数的优化,提高了识别精度和速度。

本项目的研究成果为解决番茄采摘劳动力短缺问题提供了技术支持,具有重要的理论意义和应用价值。然而,项目仍存在一些不足之处,如采摘成功率和速度有待提高,对复杂环境的适应能力需要进一步加强等。未来的研究可以从以下几个方面展开:

  1. 进一步优化果实识别算法,提高在复杂环境下的识别精度和速度。可以考虑采用更先进的深度学习模型,如YOLOv8、EfficientDet等,或者结合注意力机制和迁移学习等技术,提升模型性能。

  2. 改进采摘执行机构,设计更适合番茄采摘的末端执行器,提高采摘成功率和果实完整性。可以考虑采用柔性材料和自适应控制技术,减少对果实的损伤。

参考文献

  1. Wang Y, Li J, Zhang L, et al. Tomato fruit detection in natural environments using deep learning[J]. Computers and Electronics in Agriculture, 2020, 170: 105256.

  2. Zhang X, Wang Z, Chen Y, et al. Design and implementation of a strawberry picking robot based on machine vision[J]. Robotics and Computer-Integrated Manufacturing, 2021, 68: 102054.

  3. Li H, Liu C, Wang J, et al. Deep learning-based fruit detection and localization for robotic harvesting: A review[J]. Computers and Electronics in Agriculture, 2020, 174: 105526.

  4. Chen L, Yang L, Wang J, et al. A novel method for apple detection and positioning based on improved YOLOv4[J]. Biosystems Engineering, 2021, 204: 1-17.

  5. Jiang H, Li Y, Zhang Q, et al. Development of a cucumber harvesting robot with machine vision and fuzzy logic control[J]. IEEE/ASME Transactions on Mechatronics, 2022, 27(3): 1685-1695.

  6. Zhao J, Li W, Wang L, et al. Kinematic analysis and trajectory planning of a 4-DOF robotic arm for tomato harvesting[J]. Transactions of the ASABE, 2023, 66(2): 447-458.

  7. Sun K, Zhang Z, Liu J, et al. Multi-sensor fusion for fruit recognition and localization in robotic harvesting[J]. Sensors, 2023, 23(10): 4758.

  8. Zhou B, Wu B, Wang X, et al. Development and evaluation of a tomato harvesting robot[J]. Industrial Crops and Products, 2024, 198: 117670.

人工智能AI:农业病虫害计算机视觉-西红柿番茄病害识别(10种病害) 阅读详情

相关推荐

解锁番茄生长密码:探秘番茄植株生长阶段数据集(附数据集地址)

在调控生长环境上,比如在温室种植中,若模型检测到番茄处于开花起始阶段,对温度、湿度和光照的要求更为严格,智能控制系统就可以依据这些信息,自动调节温室的温度、通风和遮阳设施,为番茄创造最适宜的生长环境,提高产量和品质。在农业生产中,准确判断番茄植株的生长阶段是实现精准种植的基础。无论是在阳光明媚的上午,还是在光线较暗的傍晚,无论是在微风轻拂的日子,还是在稍有风雨的天气,基于该数据集训练的模型都能依据图像中的叶片形态、颜色、花朵的有无及状态等特征,给出准确的生长阶段判断 ,为后续的农事操作提供科学依据。

zzjlhlcd的博客 888

人工智能专业-基于机器番茄病虫害识别算法 -YOLO

人工智能-基于机器番茄病虫害识别算法 -YOLO :番茄植株在生长过程中感染各种病虫害,从而导致番茄的产量降低和种植户的利润损失。当前番茄病虫害检测主要通过农业专家人工进行,这种人工检测方法既昂贵又耗时。目前利用计算机视觉和深度学习达到病虫害自动分类识别的方法大多都是在受控环境下进行的,对病虫害所处背景环境的要求较高,同时不能实现病虫害的定位。农业病虫害是已知的造成农业经济损害的主要因素之一,农业病虫害带来的经济影响遍及全 世界,欧洲农业经济损失每年达到 28.2%,北美达到 31.2%,亚洲和非洲在 5

Hai_Lang_IT的博客 2766

8、温室番茄果实巡检机器人的跟踪与计数方法

本文提出了一种基于温室巡检机器人的番茄果实跟踪与计数方法。通过深度相机采集番茄图像,结合YOLOV5目标检测算法和巡检机器人的空间位移信息,实现对番茄果串和单个果实的准确检测与跟踪。利用深度信息过滤背景干扰,通过交并比(IOU)判断重复标签,从而实现高效的番茄计数。实验结果表明,该方法在果串和单果计数方面均具有较高的准确率,并为温室番茄的科学管理提供了技术支持。未来的工作将聚焦于提高识别准确性,特别是解决果实遮挡问题。

gpt4scribbler的博客 48

【看论文】之《基于计算机视觉的成熟番茄识别研究_方政》

论文信息 题目:基于计算机视觉的成熟番茄识别研究 作者:方政 单位:兰州交通大学 论文性质:核心期刊 期刊名称:《农机化研究》 来源:中国知网 提交时间:2015.7.16 摘要 研究对象:成熟番茄的识别方法; 首先,以HSI模型中的色调分量为基础进行图像分割,提取出成熟番茄目标图像; 然后,利用最大方差自动取阈值法进行分割处理,对得到的目标图像进行轮廓提取; 最后,对轮廓...

倔强的大萝卜的博客 2193

基于YOLOv12的果实成熟度检测与智能采摘系统

随着农业智能化的发展,果实自动识别与成熟度检测技术在现代农业中扮演着越来越重要的角色。本文提出了一种基于YOLOv12的深度学习解决方案,实现了对苹果、番茄等常见水果的实时检测、成熟度判断以及采摘引导。系统结合了计算机视觉和深度学习技术,通过精心设计的UI界面为用户提供直观的操作体验。本文将详细介绍算法原理、系统架构、实现细节,并提供完整可运行的代码和数据集参考。关键词:YOLOv12、果实检测、成熟度判断、智能农业、深度学习、计算机视觉。

YOLO 387

基于YOLOv11的果实成熟度识别与采摘机器人系统设计与实现

为提高系统在实际场景中的性能,建议构建自定义数据集:python复制下载import cv2import os"""添加样本到数据集:param image: 原始图像(numpy数组):param bboxes: 边界框列表[[x1,y1,x2,y2],...]:param classes: 类别列表[0,1,...]:param maturity_levels: 成熟度列表[0,1,2] 0-未熟,1-成熟,2-过熟"""# 生成唯一ID# 保存图像。

YOLO 388

番茄成熟度智能检测:YOLO算法大比拼

基于深度学习的番茄成熟度智能检测系统研究 摘要:本研究开发了一套基于YOLO系列算法的番茄成熟度智能检测系统。系统采用3465张番茄图像数据集,训练了能够识别6种成熟度状态(包括叶病、半熟、过熟、成熟、腐烂和未成熟)的深度学习模型。研究对比分析了YOLOv5、YOLOv8和YOLOv10三种模型在验证集上的性能表现,其中YOLOv10通过消除非最大抑制需求等技术优化,展现出最佳性能(mAP@0.5达0.95)。最终实现的系统支持图片、视频及摄像头实时检测,并具备检测结果保存功能,为农业生产中的番茄采收、分选

AI算法爱好者角落 1241

基于YOLOv12的番茄成熟度检测系统:从算法原理到完整实现

番茄作为全球广泛种植的重要经济作物,其成熟度的准确检测对于农业生产、自动化采摘和品质控制具有重要意义。传统的番茄成熟度检测主要依靠人工观察,这种方法不仅效率低下,而且容易受到主观因素的影响。随着计算机视觉和深度学习技术的发展,基于视觉的自动化番茄成熟度检测系统逐渐成为研究热点。本文将详细介绍一个基于YOLOv12的番茄成熟度检测系统,该系统能够准确识别番茄并判断其成熟度等级。我们将从算法原理、数据集构建、模型训练、系统实现等多个方面进行全面阐述,并提供完整的代码实现。遮挡超过50%的果实不标注。

YOLO 417

如何使用yolov11训练使用—番茄炭疽病与品质检测数据集 炭疽病症状识别、病害区域检测、成熟果实与腐烂果实区分 目标检测 4类 可直接用于模型训练 YOLO适用的txt格式

番茄炭疽病检测数据集与YOLOv11训练摘要 本数据集(anthracnose_tomato v4)包含286张番茄图像,标注为YOLOv8格式,包含炭疽病、病害区域、成熟和腐烂4个类别。所有图像经过自动方向调整和EXIF信息剥离,并通过随机旋转(±90°)和亮度调整(±9%)生成3个增强版本。数据集已划分为训练/验证/测试集,采用CC BY 4.0许可协议。 使用YOLOv11训练时,需准备Python 3.8+环境,安装torch、ultralytics等依赖库。训练流程包括: 配置dataset.ya

ASF1231415sd的博客 1343

基于YOLOv8的果实成熟度识别与采摘机器人系统设计与实现

YOLOv8提供了不同规模的预训练模型,我们选择YOLOv8m作为基础模型:python# 加载预训练模型# 修改模型为自定义类别数model.model.nc = 4 # 4个成熟度类别。

YOLO 457

[Unity]-[UI]-[Image] 关于UI精灵图资源导入设置的详细解释

如果纹理存储了有特定含义的信息,并且您需要着色器中的确切值(例如,平滑度或金属度),请禁用此属性。此选项允许将纹理编码为特定格式(RGBM 或 dLDR,具体取决于平台)并通过后期处理步骤对纹理数据进行处理(推拉式扩张通道)。使用在3D模型的专业法线贴图。通用的纹理类型,一般在Material上的材质图片参数使用,比如漫反射、法线贴图这些。​​Compression​​:ASTC 6x6(移动端)或DXT5(PC)​​Compression​​:BC5(PC)或ASTC 6x6(移动端)

sky_smile_Allen的博客 2171

基于深度学习的智慧农业场景番茄成熟度识别算法 智慧农业番茄采摘自动化 农业深度学习实战教学 番茄成熟度识别 发你额采摘点识别

基于深度学习的智慧农业场景番茄成熟度识别算法 智慧农业番茄采摘自动化 农业深度学习实战教学 番茄成熟度识别 发你额采摘点识别

qq1309399183的博客 1894

Python数据爬取超详细讲解(零基础入门,老年人都看的懂)

Python数据爬取超详细讲解(零基础入门,老年人都看的懂)

python03011的博客 3753

基于深度学习的番茄叶疾病检测识别系统

支持图片、视频及摄像头进行检测,同时支持图片的批量检测;界面可实时显示目标位置、目标总数、置信度、用时等信息;支持图片或者视频的检测结果保存;通过网络上搜集关于实际场景中番茄叶疾病的相关图片,并使用Labelimg标注工具对每张图片进行标注,分7个检测类别,分别是[] 最终数据集一共包含700多张图片,其中训练集包含645张图片,验证集包含61张图片,测试图片31张。部分图像及标注如下图所示:YOLO(You Only Look Once)是一种流行的计算机视觉算法,用于实现实时对象检测。

AI算法爱好者角落 2682

LIO-SAM编译ubuntu20.04 Noetic

一、下载二、编译&&解决报错报错如下。

Kenneth666888的博客 689

保姆级教程:用Qlib和LightGBM从零搭建你的第一个AI量化选股策略(附完整代码)

本文提供了一份详细的教程,教你如何使用Qlib和LightGBM从零搭建AI量化选股策略。教程涵盖了环境配置、数据获取、特征工程、模型训练和策略回测等关键步骤,并附有完整代码和常见问题解决方案,适合量化投资初学者快速上手。

weixin_29191081的博客 446

YOLO-BLBE:一种新方法识别不同成熟度蓝莓果实的新型模型

例如,如图c所示,蓝莓果实A和B的识别置信度分别为0.98和0.99,高于图a中蓝莓果实A的识别置信度0.95和蓝莓果实B的识别置信度0.96。如图d所示,蓝莓果实C、D和E的识别置信度分别为0.93、0.89和0.89,高于图b中蓝莓果实C的识别置信度0.89、蓝莓果实D的识别置信度0.81和蓝莓果实E的识别置信度0.83。图中所示的蓝莓果实A到E属于不同的成熟度和遮挡程度,对比结果表明,通过使用自然图像和合成图像进行训练,YOLO-BLBE模型在识别不同成熟度和遮挡程度的蓝莓果实时,性能能够得到提升。

gzq0723的博客 218

基于AT32F421的紧凑型FOC电机驱动板设计

磁场定向控制(FOC)是永磁同步电机(PMSM)与无刷直流电机(BLDC)实现高精度转矩控制和高效运行的核心技术,其本质是通过Clarke/Park坐标变换解耦定子电流,实现d轴磁链与q轴转矩的独立调节。该技术依赖实时性严苛的电流采样、高精度位置反馈及确定性PWM生成,广泛应用于机器人关节、智能装备等中小功率伺服场景。国产Cortex-M4微控制器(如AT32F421)凭借集成ADC、高级定时器与DSP指令集,已成为低成本、高可靠FOC嵌入式实现的理想平台。本文围绕一款工程化FOC驱动板展开,涵盖低侧电流采

weixin_42510243的博客 703

农业AI实战:番茄识别数据集构建与模型优化指南

计算机视觉在农业智能化中扮演着关键角色,其核心原理是通过深度学习模型对图像特征进行提取与分类。在农业场景下,果实识别技术能显著提升自动化采收效率,但面临枝叶遮挡、颜色相近等实际挑战。高质量标注数据集是突破这些技术瓶颈的基础,本文以包含2218张专业标注的番茄图像数据集为例,详解从数据采集、Labelme标注规范到数据增强的完整流程。针对农业AI特有的光照变化和生物特性,推荐使用Albumentations库进行色温扰动、HSV空间变换等增强策略。该数据集已在实际部署中使采收机器人识别准确率提升至91%,验证

weixin_30872337的博客 1162

UE4/5编译报错MSB3073终极解决指南:从路径检查到MSVC版本降级

本文针对UE4/5开发中常见的MSB3073编译报错,提供了一套从根源到实战的终极解决指南。文章系统性地讲解了错误成因,并分层次指导排查路径字符、环境变量、MSVC版本兼容性、权限冲突等核心问题,重点介绍了通过降级MSVC编译器版本等关键操作来彻底解决此编译难题。

rl6adventurer的博客 1435

【WRFDA实操第一期】服务器中安装 WRFPLUS 和 WRFDA

【WRFDA实操第一期】安装 WRFPLUS 和 WRFDA

WW、forever的博客 2037

分拣线番茄分级缺陷识别图像分割系统:创新探讨教学

数据集信息展示在本研究中,我们使用了名为“Tomato Defects”的数据集,以支持改进YOLOv8-seg模型在分拣线番茄分级缺陷识别中的图像分割任务。该数据集专门针对番茄的不同成熟度和缺陷状态进行了精心标注,旨在提高自动化分拣系统的准确性和效率。数据集包含四个主要类别,分别是“半熟”(half_ripe)、“生”(raw)、“熟”(ripe)和“腐烂”(rotten),这些类别涵盖了番茄在不同生长阶段及其质量状态的多样性。

qmsb99的博客 1134

【从零开始vnpy量化投资】十一. 实盘接入测试与正式实盘

本篇主要讲解如何使用vnpy进行实盘交易,由于上一节我们已经学习了模拟盘运行,如果一切顺利的话,只需要通过穿透测试,就可以正式部署实盘了。

魔落的博客 4232

基于YOLOV5和Deep-Sort的无人机-计算机通信番茄生殖器官计数模型

文献中已有许多研究致力于提高花朵和果实检测与计数的准确性,不过,正如大多数研究所示,这些方法通常采用基于颜色分类和阈值的标准计算机视觉算法来识别蔬菜的颜色、大小和形状。本研究引入基于计算机视觉和人工智能的无人机系统,用于检测和计数番茄花与果实,这是实现自动化收获的关键步骤,可提高农民的时间效率并减少所需劳动力。的帧率,且计算成本低,这使其成为一种极具优势的目标跟踪器。此外,无人机的视野设有一个进入区域,用于接收从北到南移动的番茄,并根据检测到的类别(红色、绿色和花朵)对每个番茄进行区分和计数。

gzq0723的博客 170

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

基于随机森林与决策树算法的番茄生长动态预测系统设计

本研究融合YOLO目标检测与随机森林/决策树算法,构建端到端的番茄生长动态预测系统。通过改进YOLO模型实现果实数量、成熟度及大小等表型特征的高精度提取,并将其与环境数据融合,驱动可解释的生长预测模型。创新性地实现了视觉感知与生长预测的闭环集成,提升预测精度(R²提升5%以上),并开发轻量化原型系统,为智慧温室提供实时、科学的管理决策支持。

G3259093417的博客 826

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: 最新目标检测方向毕业论文选题(2025-2026 届)
下一篇: 数字媒体技术专业毕业设计指南:热门研究方向推荐 【附 199 个选题】
Mini_hailang_IT
博客等级 码龄9年 5936粉丝 640原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值