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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/214748.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UNETR++:深入研究高效和准确的3D医学图像分割

论文:https://arxiv.org/abs/2212.04497 代码:GitHub - Amshaker/unetr_plus_plus: UNETR: Delving into Efficient and Accurate 3D Medical Image Segmentation 机构:Mohamed Bin Zayed University of Artificial Intelligence1, Univers…

新手骑友的勇气和胆量:货拉拉

在骑行圈里,有一群跃跃欲试的新手骑友。他们面对陌生的路况、复杂的交通和未知的危险,距离的远近,心生胆怯,犯了最大的错误“不出发”。今天,让我们一起走进他们的世界,了解货拉拉为新手骑友解决这些痛点的…

系列二、IOC DI

一、IOC 1.1、概述 IOC的中文意思是控制反转,通俗地讲就是把创建对象的控制权交给Spring去管理,以前是由程序员自己去创建、控制对象,现在交由Spring去创建对象 & 管理对象(维系对象之间的关系),使用I…

NVMe-oF E-JBOF设计解析:WD RapidFlex网卡、OpenFlex Data24

OpenFlex Data24 NVMe-oF Storage Platform WD的SN840 NVMeSSD新品并没有太吸引我注意,因为它还是PCIe 3.0接口的,要知道Intel的PCIe 4.0 SSD都已经推出了。 但上面这个NVMe-oF(NVMe over Fabric)EBOF(区别于普通JBO…

搭建Angular并引入NG-ZORRO组件库

作者:baekpcyyy🐟 1.安装node.js 注:安装 16.0 或更高版本的 Node.js node官网:https://nodejs.org/en 2.进入angular官网 https://angular.cn/guide/setup-local 新建一个文件夹 vsc打开 打开终端 1.首先安装angular手脚架…

移动应用程序管理的内容、原因和方式

移动应用程序管理(MAM)是一个术语,指的是管理应用程序的整个生命周期,包括从设备安装、更新和卸载应用程序,除了在整个生命周期内管理设备外,MAM 还包括保护应用访问的数据,以及在设备上发现恶意…

深入理解数据结构:队列的实现及其应用场景

文章目录 🍂前言🍂队列的基本概念和特性🍂队列的实现方式️🌱顺序队列️🌱链式队列 🍂队列的基本操作及示例代码️🥑创建队列️🥑判空操作️🥑入队操作️🥑出…

docker容器与宿主机时间同步

前言 在Docker容器创建好之后,可能会发现容器时间跟宿主机时间不一致,此时需要同步它们的时间,让容器时间跟宿主机时间保持一致。 一、分析时间不一致的原因 宿主机采用了CST时区,CST应该是指(China Shanghai Time&…

JAVA线程池原理详解

线程池的优点 1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。 2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。 线程池的创建 public…

AIDL 如何分片传输大量 Parcelable 数据列表

本文针对 AIDL 跨进程传输大量 Parcelable 数据所产生的问题总结出一套分片传输的解决方案,并分析了一下其实现的原理。 1. 概述 大家在通过 AIDL 实现跨进程数据传输的时候,可能会遇到数据量过大导致异常的情况,通常抛出的异常如下&#xf…

如何去掉图片水印不伤原图?无痕去水印教程分享!

如何去掉图片水印不伤原图?在电商广告设计和营销领域,水印已经成为一种常见的版权保护手段。不过,水印也给淘宝商家带来了一些困扰。那么如何去掉图片水印还能不伤原图呢,接下来,将分享简单好用的无痕去水印教程&#…

python中range函数的用法

range() 是Python的一个内置函数。语法格式为:range(start, stop, step) start是初始值,stop是最终值,step是步长。range()函数仅适用于整数,所有参数都必须是整数。步长值可以为正数或负数,不得为零。使用range函数时…