2023年亚太杯数学建模A题水果采摘机器人的图像识别功能(基于yolov5的苹果分割)

本文主要是介绍2023年亚太杯数学建模A题水果采摘机器人的图像识别功能(基于yolov5的苹果分割),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注:.题中附录并没有给出苹果的标签集,所以需要我们自己通过前4问得到训练的标签集,采用的是yolov5 7.0 版本,该版本带分割功能

一:关于数据集的制作:

clc;
close all;
clear;
%-----这个是生成yolov5 数据集的--------
% 图像文件夹路径
folder_path = 'E:/新建文件夹/yatai/Attachment/Apple/';
% 图像文件列表
image_files = dir(fullfile(folder_path, '*.jpg')); % 假设所有图片都是jpg格式% 解析文件名中的数字,并转换为数值类型
numbers = cellfun(@(x) sscanf(x, '%d.jpg'), {image_files.name});% 根据解析出的数字对文件列表进行排序
[~, sorted_idx] = sort(numbers);
image_files = image_files(sorted_idx);
% 存储每张图片苹果数量的数组
apple_counts = zeros(length(image_files), 1);% 存储每张图片的平均成熟度评分
average_red_intensity_ratio_per_image = zeros(length(image_files), 1);% 确保输出文件夹存在
output_folder = 'E:\新建文件夹\yatai\Attachment\Attachment 2\APPlemasktxt';
if ~exist(output_folder, 'dir')mkdir(output_folder);
end% 存储每张图片的平均苹果质量评分
average_quality_scores_per_image = zeros(length(image_files), 1);
% 遍历每张图片
for i = 1: length(image_files) %2  % 读取图像img = imread(fullfile(folder_path, image_files(i).name));·······省略了部分代码% 给分割的对象标记不同的标签labelled_img = bwlabel(binary_img);
%     figure;
%     在原始图像上绘制分割结果
%     imshow(img);
%     hold on;colors=['b' 'g' 'r' 'c' 'm' 'y'];for k = 1:length(unique(labelled_img)) - 1boundary = bwboundaries(labelled_img == k);for b = 1:length(boundary)plot(boundary{b}(:,2), boundary{b}(:,1), colors(mod(k,length(colors))+1), 'LineWidth', 2);endend% title('Segmented Apples');% hold off;% 计数分割后的苹果number_of_apples = max(labelled_img(:));disp(['Number of segmented apples: ', num2str(number_of_apples)]);apple_counts(i) = number_of_apples;% 打印当前图片的苹果数量fprintf('Image %d (%s): %d apples detected.\n', i, image_files(i).name, number_of_apples);%下面是制作分割的数据集% 给分割的对象标记不同的标签labelled_img = bwlabel(binary_img);% 准备写入YOLOv5格式的分割轮廓点文件% 根据图像文件名创建对应的txt文件名baseFileName = sprintf('%d.txt', i);txt_filename = fullfile(output_folder, baseFileName);fileID = fopen(txt_filename, 'w');% 确保文件已成功打开if fileID == -1error('Cannot open file %s for writing.', txt_filename);end% 获取图像尺寸img_height = size(img, 1);img_width = size(img, 2);% 遍历每个苹果,写入轮廓点信息for k = 1:max(labelled_img(:))[B,~] = bwboundaries(labelled_img == k, 'noholes');contours = B{1}; % 取第一组轮廓点% 检查contours的尺寸if size(contours, 2) == 2 % 确保contours有两列% 转换为归一化坐标contours_normalized = contours ./ [img_height,  img_width];% 写入文件fprintf(fileID, '0 '); % 假设苹果的类别ID为0for p = 1:size(contours_normalized, 1)
%                 fprintf('Plotting point at (%f, %f)\n', contours_normalized(p, 2), contours_normalized(p, 1)); % 调试信息fprintf(fileID, '%f %f ', contours_normalized(p, 2), contours_normalized(p, 1));endfprintf(fileID, '\n');elsewarning('Contour for apple %d in image %d does not have correct dimensions.', k, i);endendfclose(fileID);end

二:关于yolov5 7.0 的训练:

我的电脑是3080 训练了20轮测试,下面就是部分测试的结果

下面是关于数据集的划分代码 

'''
Descripttion: split_img.py
version: 1.0
Author: UniDome
Date: 2022-04-20 16:28:45
LastEditors: UniDome
LastEditTime: 2022-04-20 16:39:56
'''
import os, shutil, random
from tqdm import tqdmdef split_img(img_path, label_path, split_list):try:  # 创建数据集文件夹Data = 'E:/新建文件夹/yatai/Attachment/Attachment 2/output'os.mkdir(Data)train_img_dir = Data + '/images/train'val_img_dir = Data + '/images/val'test_img_dir = Data + '/images/test'train_label_dir = Data + '/labels/train'val_label_dir = Data + '/labels/val'test_label_dir = Data + '/labels/test'# 创建文件夹os.makedirs(train_img_dir)os.makedirs(train_label_dir)os.makedirs(val_img_dir)os.makedirs(val_label_dir)os.makedirs(test_img_dir)os.makedirs(test_label_dir)except:print('文件目录已存在')train, val, test = split_listall_img = os.listdir(img_path)all_img_path = [os.path.join(img_path, img) for img in all_img]# all_label = os.listdir(label_path)# all_label_path = [os.path.join(label_path, label) for label in all_label]train_img = random.sample(all_img_path, int(train * len(all_img_path)))train_img_copy = [os.path.join(train_img_dir, img.split('\\')[-1]) for img in train_img]train_label = [toLabelPath(img, label_path) for img in train_img]train_label_copy = [os.path.join(train_label_dir, label.split('\\')[-1]) for label in train_label]for i in tqdm(range(len(train_img)), desc='train ', ncols=80, unit='img'):_copy(train_img[i], train_img_dir)_copy(train_label[i], train_label_dir)all_img_path.remove(train_img[i])val_img = random.sample(all_img_path, int(val / (val + test) * len(all_img_path)))val_label = [toLabelPath(img, label_path) for img in val_img]for i in tqdm(range(len(val_img)), desc='val ', ncols=80, unit='img'):_copy(val_img[i], val_img_dir)_copy(val_label[i], val_label_dir)all_img_path.remove(val_img[i])test_img = all_img_pathtest_label = [toLabelPath(img, label_path) for img in test_img]for i in tqdm(range(len(test_img)), desc='test ', ncols=80, unit='img'):_copy(test_img[i], test_img_dir)_copy(test_label[i], test_label_dir)def _copy(from_path, to_path):shutil.copy(from_path, to_path)def toLabelPath(img_path, label_path):img = img_path.split('\\')[-1]label = img.split('.jpg')[0] + '.txt'return os.path.join(label_path, label)def main():img_path = r'E:\新建文件夹\yatai\Attachment\Apple'label_path = r'E:\新建文件夹\yatai\Attachment\Attachment 2\APPlemasktxt'split_list = [0.7, 0.2, 0.1]  # 数据集划分比例[train:val:test]split_img(img_path, label_path, split_list)if __name__ == '__main__':main()

A题详细代码数据集
https://docs.qq.com/doc/DZHh5ckNrWlNybFNs

这篇关于2023年亚太杯数学建模A题水果采摘机器人的图像识别功能(基于yolov5的苹果分割)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/427253

相关文章

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT

录音功能在哪里? 电脑手机等设备打开录音功能的技巧

《录音功能在哪里?电脑手机等设备打开录音功能的技巧》很多时候我们需要使用录音功能,电脑和手机这些常用设备怎么使用录音功能呢?下面我们就来看看详细的教程... 我们在会议讨论、采访记录、课堂学习、灵感创作、法律取证、重要对话时,都可能有录音需求,便于留存关键信息。下面分享一下如何在电脑端和手机端上找到录音功能

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?