實例分割 | yolov11訓練自己的數據集

前言

因工作要求使用的都是yolov5系列的模型,今天學習一下最先進的yolov11,記錄一下環境配置及訓練過程。

1.項目下載及環境安裝

源碼位置:yolov11
在這里插入圖片描述
可以看到,這里要求python版本大于等于3.8,我這里安裝python3.10.

conda create -n yolov11 python=3.10
conda activate yolov11
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple

2.標注自己的數據集

標注實例分割數據集的工具有很多,這里建議labelme和AnyLabeling任意選一個。
如圖所示,標注后的數據集是json格式的:
在這里插入圖片描述
我們需要將其轉成yolo系列需要的txt格式。
json轉txt格式轉化代碼:

# json2txt.py
# json2txt.py
import cv2
import os
import json
import glob
import numpy as npclass_names = ["cls1_name", "cls2_name", "cls3_name", "cls4_name", "cls5_name"]def convert_json_label_to_yolov_seg_label():json_path = "F:/Desktop/hand/labels"  # 本地json路徑json_files = glob.glob(json_path + "/*.json")# print(json_files)# 指定輸出文件夾output_folder = "F:/Desktop/hand/labels_txt"  # txt存放路徑if not os.path.exists(output_folder):os.makedirs(output_folder)for json_file in json_files:# print(json_file)with open(json_file, 'r') as f:json_info = json.load(f)img = cv2.imread(os.path.join(json_path, json_info["imagePath"]))height, width, _ = img.shapenp_w_h = np.array([[width, height]], np.int32)txt_file = os.path.join(output_folder, os.path.basename(json_file).replace(".json", ".txt"))with open(txt_file, "w") as f:for point_json in json_info["shapes"]:txt_content = ""np_points = np.array(point_json["points"], np.int32)label = point_json["label"]index = class_names.index(label)# print(type(label))norm_points = np_points / np_w_hnorm_points_list = norm_points.tolist()txt_content += str(index) + " " + " ".join([" ".join([str(cell[0]), str(cell[1])]) for cell in norm_points_list]) + "\n"f.write(txt_content)convert_json_label_to_yolov_seg_label()

轉換后是這樣的:
在這里插入圖片描述
分割數據集,我們需要將轉化成txt的數據集分割成訓練集、驗證集和測試集,這是分割代碼:

# txt_split.py
# 將圖片和標注數據按比例切分為 訓練集和測試集
import shutil
import random
import os# 原始路徑
image_original_path = "hhh/images/"
label_original_path = "hhh/labels_txt/"cur_path = os.getcwd()
#cur_path = 'D:/image_denoising_test/denoise/'
# 訓練集路徑
train_image_path = os.path.join(cur_path, "datasets/images/train/")
train_label_path = os.path.join(cur_path, "datasets/labels/train/")# 驗證集路徑
val_image_path = os.path.join(cur_path, "datasets/images/val/")
val_label_path = os.path.join(cur_path, "datasets/labels/val/")# 測試集路徑
test_image_path = os.path.join(cur_path, "datasets/images/test/")
test_label_path = os.path.join(cur_path, "datasets/labels/test/")# 訓練集目錄
list_train = os.path.join(cur_path, "datasets/train.txt")
list_val = os.path.join(cur_path, "datasets/val.txt")
list_test = os.path.join(cur_path, "datasets/test.txt")train_percent = 0.8
val_percent = 0.1
test_percent = 0.1def del_file(path):for i in os.listdir(path):file_data = path + "\\" + ios.remove(file_data)def mkdir():if not os.path.exists(train_image_path):os.makedirs(train_image_path)else:del_file(train_image_path)if not os.path.exists(train_label_path):os.makedirs(train_label_path)else:del_file(train_label_path)if not os.path.exists(val_image_path):os.makedirs(val_image_path)else:del_file(val_image_path)if not os.path.exists(val_label_path):os.makedirs(val_label_path)else:del_file(val_label_path)if not os.path.exists(test_image_path):os.makedirs(test_image_path)else:del_file(test_image_path)if not os.path.exists(test_label_path):os.makedirs(test_label_path)else:del_file(test_label_path)def clearfile():if os.path.exists(list_train):os.remove(list_train)if os.path.exists(list_val):os.remove(list_val)if os.path.exists(list_test):os.remove(list_test)def main():mkdir()clearfile()file_train = open(list_train, 'w')file_val = open(list_val, 'w')file_test = open(list_test, 'w')total_txt = os.listdir(label_original_path)num_txt = len(total_txt)list_all_txt = range(num_txt)num_train = int(num_txt * train_percent)num_val = int(num_txt * val_percent)num_test = num_txt - num_train - num_valtrain = random.sample(list_all_txt, num_train)# train從list_all_txt取出num_train個元素# 所以list_all_txt列表只剩下了這些元素val_test = [i for i in list_all_txt if not i in train]# 再從val_test取出num_val個元素,val_test剩下的元素就是testval = random.sample(val_test, num_val)print("訓練集數目:{}, 驗證集數目:{}, 測試集數目:{}".format(len(train), len(val), len(val_test) - len(val)))for i in list_all_txt:name = total_txt[i][:-4]srcImage = image_original_path + name + '.jpg'srcLabel = label_original_path + name + ".txt"if i in train:dst_train_Image = train_image_path + name + '.jpg'dst_train_Label = train_label_path + name + '.txt'shutil.copyfile(srcImage, dst_train_Image)shutil.copyfile(srcLabel, dst_train_Label)file_train.write(dst_train_Image + '\n')elif i in val:dst_val_Image = val_image_path + name + '.jpg'dst_val_Label = val_label_path + name + '.txt'shutil.copyfile(srcImage, dst_val_Image)shutil.copyfile(srcLabel, dst_val_Label)file_val.write(dst_val_Image + '\n')else:dst_test_Image = test_image_path + name + '.jpg'dst_test_Label = test_label_path + name + '.txt'shutil.copyfile(srcImage, dst_test_Image)shutil.copyfile(srcLabel, dst_test_Label)file_test.write(dst_test_Image + '\n')file_train.close()file_val.close()file_test.close()if __name__ == "__main__":main()

3.編寫訓練代碼并訓練

我這里習慣使用代碼訓練,還有命令訓練,如果感興趣的朋友可以去官網了解。

# train.py
from ultralytics import YOLOif __name__ == '__main__':model = YOLO(r'ultralytics/cfg/models/11/yolo11-seg.yaml')  model.train(data=r'config.yaml',imgsz=640,epochs=800,single_cls=True,  batch=16,workers=10,device='0',)

配置文件:

# config.yaml
path: ../datasets/images  # 數據集所在路徑
train: train  # 數據集路徑下的train.txt
val: val  # 數據集路徑下的val.txt
test: test  # 數據集路徑下的test.txt# Classes
names:0: class1_name1: class2_name2: class3_name3: class4_name4: class5_name

這里的path改成你的數據集位置,如果txt_split.py在項目根目錄下運行則不需要修改路徑,只需要修改類別即可。
修改之后,只需要python train.py運行即可。

測試代碼:

# test.py
from ultralytics import YOLO
# 加載訓練好的模型,改為自己的路徑
model = YOLO('runs/train/exp22/weights/best.pt')  #修改為訓練好的路徑
source = '11.jpg' #修改為自己的圖片路徑及文件名
# 運行推理,并附加參數
model.predict(source, save=True, imgsz=640)

轉成onnx模型并運行:

yolo export model=runs/segment/train11/weights/best.pt imgsz=640 format=onnx opset=12 simplify
python examples/YOLOv8-Segmentation-ONNXRuntime-Python/main.py --model runs/segment/train5n/weights/bestv8.onnx

4.常見報錯

RuntimeError: Trying to create tensor with negative dimension -37: [0, -37]
運行YOLOv8-Segmentation-ONNXRuntime-Python時報錯,修改配置文件

參考

語義分割:YOLOv11的分割模型訓練自己的數據集(從代碼下載到實例測試)
在這里插入圖片描述
配置文件位置在ultralytics/cfg/datasets/,如果這里一直報錯can't find file,就直接寫絕對路徑

總結

因為項目還沒完成,主要精力在此項目中,過程寫的有點倉促,后面會慢慢優化文章質量,補全沒完成的部分。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72327.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72327.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72327.shtml

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

相關文章

大模型推理時的尺度擴展定律

大模型推理時的尺度擴展定律 FesianXu at 20250212 at Wechat Search Team 前言 大模型的尺度擴展定律告訴我們:『LLM的性能會隨著模型的參數量、模型的訓練量、模型的訓練數據量的增加而增加』。訓練存在尺度擴展定律,測試也存在尺度擴展定律&#xff…

如何使用useEffect模擬組件的生命周期?

什么是 useEffect? useEffect 是 React 提供的一個 Hook,用于處理副作用(side effects)。它允許你在函數組件中執行一些操作,這些操作通常會影響組件的渲染,比如數據獲取、訂閱、DOM 操作等。通過 useEffe…

Linux網絡基礎(協議 TCP/IP 網絡傳輸基本流程 IP VS Mac Socket編程UDP)

文章目錄 一.前言二.協議協議分層分層的好處 OSI七層模型TCP/IP五層(或四層)模型為什么要有TCP/IP協議TCP/IP協議與操作系統的關系(宏觀上是如何實現的)什么是協議 三.網絡傳輸基本流程局域網(以太網為例)通信原理MAC地址令牌環網 封裝與解包分用 四.IP地址IP VS Mac地址 五.So…

網絡安全-使用DeepSeek來獲取sqlmap的攻擊payload

文章目錄 概述DeepSeek使用創建示例數據庫創建API測試sqlmap部分日志參考 概述 今天來使用DeepSeek做安全測試,看看在有思路的情況下實現的快不快。 DeepSeek使用 我有一個思路,想要測試sqlmap工具如何dump數據庫的: 連接mysql數據庫&#…

AI繪畫軟件Stable Diffusion詳解教程(2):Windows系統本地化部署操作方法(專業版)

一、事前準備 1、一臺配置不錯的電腦,英偉達顯卡,20系列起步,建議顯存6G起步,安裝win10或以上版本,我的顯卡是40系列,16G顯存,所以跑大部分的模型都比較快; 2、科學上網&#xff0…

Linux NAT和代理服務器

目錄 0.前言 1.NAT 網絡地址轉換 1.1 NAT 技術背景 1.2 NAT的定義與分類 1.3 NAT的工作原理 1.4 NAT的缺陷 2.代理服務器 2.1 概述 2.2 正向代理 2.3 反向代理 2.4 NAT 與代理服務器的區別和聯系 3.小結 (圖像由AI生成) 0.前言 在前面的文章中&#x…

AI學習第七天

數組:基礎概念、存儲特性及力扣實戰應用 在計算機科學與數學的廣袤領域中,數組作為一種極為重要的數據結構,發揮著不可或缺的作用。它就像一個有序的 “數據倉庫”,能高效地存儲和管理大量數據。接下來,讓我們深入了解…

ue5 創建多列StreeView的方法與理解

創建StreeView的多列樣式怎么就像是創建單行單列差不多?貌似就是在單行單列中加入了多列widget? 示例代碼 DetailTabWidget #pragma once #include "TreeViewItemBase.h"class SDetailTabWidget : public SCompoundWidget {SLATE_BEGIN_ARGS(SDetailTabWidget){…

Linux之yum詳解

—— 小 峰 編 程 目錄 1、Linux軟件的安裝方式 2、什么是yum 3、配置網絡yum源 4、yum命令 【語法】 【yum常用命令】 1、Linux軟件的安裝方式 在CentOS系統中,軟件管理方式通常有三種方式: rpm安裝 、 yum安裝 以及 編譯安裝 。 2、什么是yum…

lvgl運行機制分析

lv_timer_handler() 是 LVGL 的“心臟”:這個函數會依次做以下事情: 處理定時器(如動畫、延遲回調)。 讀取輸入設備(如觸摸屏、按鍵的狀態)。 刷新臟區域(僅重繪屏幕上發生變化的區域&#xf…

達夢數據庫授權給某個用戶查詢其他指定用戶下所有表的權限

方法1: 新版本有一個數據庫參數 GRANT_SCHEMA,表示是否開啟授予和回收模式權限功能。0:否;1:是 此參數為靜態參數,默認是0,將改參數修改為1后,重啟數據庫生效。 將參數修改為1 S…

人大金倉國產數據庫與PostgreSQL

一、簡介 在前面項目中,我們使用若依前后端分離整合人大金倉,在后續開發過程中,我們經常因為各種”不適配“問題,但可以感覺得到大部分問題,將人大金倉視為postgreSQL就能去解決大部分問題。據了解,Kingba…

Python之參數星號(*)使用筆記

背景 在學習python時發現方法調用和方法定義會經常發現有帶星號的標記,為了弄明白是怎么使用的。特此做個筆記。 一、參數符號對比速查表 符號類使用場景作用描述示例無符號函數定義/調用普通位置參數或關鍵字參數.def func(a, b)*函數定義收集多余位置參數為元組…

使用haproxy實現MySQL服務器負載均衡

一、環境準備 主機名IP地址備注openEuler-1192.168.121.11mysql-server-1openEuler-2192.168.121.12mysql-server-2openEuler-3192.168.121.13clientRocky-1192.168.121.51haproxy 二、mysql-server配置 [rootopenEuler-1 ~]# yum install -y mariadb-server [rootopenEuler…

Python與Web3.py庫:構建去中心化應用的未來

Python與Web3.py庫:構建去中心化應用的未來 在區塊鏈的世界里,“去中心化”是最核心的理念之一,它賦予了用戶更多的控制權和自由,消除了傳統中心化系統中的單點故障和信任問題。而在這場技術革命中,Web3.0無疑是最受矚…

對“預訓練”的理解

預訓練有什么用 傳統的機器學習是偏數學的,對數據的量不做過多要求,而深度學習的項目通常是有大量的數據可供使用。 在平常的任務或者項目中,我們可能并沒有大量數據,只有少量數據,在這時我們就可以通過“借用”有大…

VMware Ubuntu 共享目錄

在VMware中掛載Ubuntu共享目錄需要以下步驟,分為設置共享文件夾和在Ubuntu中掛載兩部分: 一、VMware 設置共享文件夾 關閉Ubuntu虛擬機 在配置前,建議先關閉虛擬機(若已運行需關閉,部分VMware版本支持熱添加&#xff0…

AF3 crop_chains函數解讀

AlphaFold3 feature_processing_multimer模塊的crop_chains函數的功能是對多條鏈的蛋白質結構預測任務中的MSA(多序列比對)特征和模板特征進行裁剪(cropping)。裁剪的目的是為了控制輸入模型的MSA序列數量和模板數量,以適應模型的輸入限制或優化計算效率。 源代碼: def…

Java基礎-數組,集合創建方式

Java 中 new 關鍵字的作用 在 Java 中,new 關鍵字用于 在堆內存中分配空間 并創建對象。 數組 和 集合 在 Java 中都是對象,因此必須使用 new 來創建實例。Java 和 C 之間的主要區別在于 內存管理 和 對象的創建方式。 Java 與 C 中數組 & 集合的創…

LeeCode題庫第三十九題

39.組合總和 項目場景: 給你一個 無重復元素 的整數數組 candidates 和一個目標整數 target ,找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 ,并以列表形式返回。你可以按 任意順序 返回這些組合。 candidates 中的 同…