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.pswp.cn/news/167980.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167980.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167980.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

任務4-繪制圖形

python字典的使用方法 !echo $(date)‘開始下載并解壓’ && curl -o Task4.zip https://zyenv-1302342904.cos.ap-guangzhou.myqcloud.com/datas/TianJin/Task4_TJ_ZZ.zip && unzip -o Task4.zip > /dev/null 2>&1 && echo $(date)‘解壓完…

學習課題:逐步構建開發播放器【QT5 + FFmpeg6 + SDL2】

目錄 一、播放器開發(一):播放器組成大致結構與代碼流程設計 二、播放器開發(二):了解FFmpeg與SDL常用對象和函數 三、播放器開發(三):FFmpeg與SDL環境配置 四、播放器開發(四):多線程解復用與解碼模塊實現 五、播放器開發(五…

Linux應用開發基礎知識——I2C應用編程(十三)

一、無需編寫驅動程序即可訪問 I2C 設備 APP 訪問硬件肯定是需要驅動程序的,對于 I2C 設備,內核提供了驅動程序 drivers/i2c/i2c-dev.c,通過它可以直接使用下面的 I2C 控制器驅動程序來訪問 I2C 設備。 i2c-tools 是一套好用的工具&#xff0…

虛擬機系列:Oracle VM VirtualBox虛擬機的使用教程和使用體驗情況反饋

Oracle VM VirtualBox虛擬機的使用教程和使用體驗情況反饋 一. 簡述:二. 下載三. 安裝解壓后選擇需要的版本點擊安裝1:第一步,點擊安裝,點擊下一步2. 這里直接點擊下一步,3. 網絡警告選擇:是4. 準備好以后,點擊安裝5. 點擊完成即可四. 打開五. 創建虛擬機1. 輸入虛擬機名…

H5(uniapp)中使用echarts

1,安裝echarts npm install echarts 2&#xff0c;具體頁面 <template><view class"container notice-list"><view><view class"aa" id"main" style"width: 500px; height: 400px;"></view></v…

MySQL 中的 JSON_CONTAINS 函數詳解

在處理 MySQL 中的 JSON 數據時&#xff0c;我們經常需要檢查一個 JSON 文檔是否包含特定的值。這時&#xff0c;JSON_CONTAINS 函數就顯得非常有用。 JSON_CONTAINS函數介紹 JSON_CONTAINS 是 MySQL 提供的一個 JSON 函數&#xff0c;用于測試一個 JSON 文檔是否包含特定的值…

SQLite 和 SQLiteDatabase 的使用

實驗七&#xff1a;SQLite 和 SQLiteDatabase 的使用 7.1 實驗目的 本次實驗的目的是讓大家熟悉 Android 中對數據庫進行操作的相關的接口、類等。SQLiteDatabase 這個是在 android 中數據庫操作使用最頻繁的一個類。通過它可以實現數據庫的創建或打開、創建表、插入數據、刪…

22、什么是中間件和權限攔截中間件實操

新建中間件 middleware\auth.js // 定義權限判斷中間件&#xff0c;中間件的第一個參數是context export default ({store, redirect}) > {console.log("中間件被調用")// if (!store || !store.state.userinfo) {// redirect("/")// } }頁面使用…

CF -- Educational Codeforces Round 158 (Rated for Div. 2) -- D 補題記錄

Yet Another Monster Fight Problem - D - Codeforces 題目大意&#xff1a; 現在給你一堆怪物&#xff0c;你擁有法術&#xff08;一個法術可以連續攻擊這n個所有怪物&#xff09;&#xff0c;你可以選擇任意一個怪物作為法術的第一個攻擊目標&#xff08;傷害為x&#xff…

【MySQL】索引與事務

&#x1f451;專欄內容&#xff1a;MySQL?個人主頁&#xff1a;子夜的星的主頁&#x1f495;座右銘&#xff1a;前路未遠&#xff0c;步履不停 目錄 一、索引1、使用場景2、使用索引創建索引查看索引刪除索引 3、底層數據結構&#xff08;非常重要&#xff09; 二、事務1、概念…

Android設計模式--享元模式

水不激不躍&#xff0c;人不激不奮 一&#xff0c;定義 使用共享對象可有效地支持大量的細粒度的對象 享元模式是對象池的一種實現&#xff0c;用來盡可能減少內存使用量&#xff0c;它適合用于可能存在大量重復對象的場景&#xff0c;來緩存可共享的對象&#xff0c;達到對象…

騰訊云CVM標準型SA5云服務器AMD EPYC Bergamo處理器

騰訊云服務器標準型SA5實例是最新一代的標準型實例&#xff0c;CPU采用AMD EPYC? Bergamo全新處理器&#xff0c;采用最新DDR5內存&#xff0c;默認網絡優化&#xff0c;最高內網收發能力達4500萬pps。騰訊云百科txybk.com分享騰訊云標準型SA5云服務器CPU、內存、網絡、性能、…

Qt項目打包發布超詳細教程

https://blog.csdn.net/qq_45491628/article/details/129091320

用蘋果簽名免費獲取Xcode

使用蘋果企業簽名免費獲取Xcode&#xff1a; 打開Xcode。連接iOS設備到Mac。選擇Window→Devices and Simulators。選擇該設備。將IPA文件拖到“Installed Apps”的列表框中即可安裝。使用Cydia Impactor&#xff08;可以在網上找到相關下載鏈接&#xff09;&#xff1a; 打開…

HTML網站穩定性狀態監控平臺源碼

這是一款網站穩定性狀態監控平臺源碼&#xff0c;它基于UptimeRobot接口進行開發。當您的網站遇到故障時&#xff0c;該平臺能夠通過郵件或短信通知您。下面是對安裝過程的詳細說明&#xff1a; 安裝步驟 將源碼上傳至您的主機或服務器&#xff0c;并進行解壓操作。 在Uptim…

自動化測試中幾種常見驗證碼的處理方式及如何實現?

UI自動化測試時&#xff0c;需要對驗證碼進行識別處理&#xff0c;有很多方式&#xff0c;每種方式都有自己的特點&#xff0c;以下是一些常用處理方法&#xff0c;僅供參考。 1 去掉驗證碼 從自動化的本質上來講&#xff0c;主要是提升測試效率等&#xff0c;但是為了去研究驗…

【點云surface】 修剪B樣條曲線擬合

1 介紹 Fitting trimmed B-splines&#xff08;修剪B樣條曲線擬合&#xff09;是一種用于對給定的點云數據進行曲線擬合的算法。該算法使用B樣條曲線模型來逼近給定的點云數據&#xff0c;并通過對模型進行修剪來提高擬合的精度和準確性。 B樣條曲線是一種常用的曲線表示方法…

【element優化經驗】el-dialog修改title樣式

目錄 前言 解決之路 1.把默認的這個圖標隱藏&#xff0c;官方的api有這個屬性&#xff1a;showClose值設置false. 2.title插槽定制&#xff1a;左邊定制標題&#xff0c;右邊定制按鈕區域。 3.背景顏色修改&#xff1a;默認title是有padding的需要把它重寫調&#xff0c;然…

基于卷積神經網絡CNN開發構建HAR人類行為識別Human Activity Recognition【完整代碼實踐】

行為識別相關的開發實踐在我們之前的博文中也有過相關的實踐了,感興趣的話可以自行移步閱讀即可:《python實現基于TNDADATASET的人體行為識別》 《UCI行為識別——Activity recognition with healthy older people using a batteryless wearable sensor Data Set》《人體行為…

基于 STM32Cube.AI 的嵌入式人臉識別算法實現

本文介紹了如何使用 STM32Cube.AI 工具開發嵌入式人臉識別算法。首先&#xff0c;我們將簡要介紹 STM32Cube.AI 工具和 STM32F系列單片機的特點。接下來&#xff0c;我們將詳細討論如何使用 STM32Cube.AI 工具鏈和相關庫來進行人臉識別算法的開發和優化。最后&#xff0c;我們提…