YOLOv9:在自定義資料上進行影像分割訓練
介紹
在快速發展的計算機視覺領域,物體分割在從影像中提取有意義資訊方面發揮著重要作用。在各種分割演算法中,YOLOv9 已經成為一個強大而靈活的解決方案,提供了高效的分割能力和出色的準確性。
在這個全面的指南中,我們將深入探討如何在自定義資料集上訓練 YOLOv9 進行物體分割,並對測試資料進行推斷。透過本教程,您將深入瞭解 YOLOv9 的分割機制,並學會如何使用自定義資料集和 ultralytics 應用它到您的專案中。
目錄
-
步驟 1:下載資料集
-
步驟 2:安裝 Ultralytics
-
步驟 3:載入 YOLOv9-seg 預訓練模型和推斷
-
步驟 4:在自定義資料集上微調 YOLOv9-seg
-
步驟 5:載入自定義模型
-
步驟 6:對測試影像進行推斷
步驟 1:下載資料集
我們將使用 Furniture BBox To Segmentation (SAM) 資料集進行本教程。您可以從 Kaggle 獲取 Furniture BBox To Segmentation (SAM) 資料集,Kaggle 是一個流行的資料科學競賽、資料集和機器學習資源平臺。下載資料集後,如果資料集被壓縮(例如 ZIP 或 TAR 檔案),您可能需要解壓縮檔案。
資料集連結:
http://kaggle.com/datasets/nicolaasregnier/furniture
步驟 2:安裝 Ultralytics
!pip install ultralytics -q
匯入包
from ultralytics import YOLO
import matplotlib.pyplot as plt
import cv2
import pandas as pd
import seaborn as sns
步驟 3:使用預訓練的 YoloV9 權重進行推斷
model = YOLO('yolov9c-seg.pt')
model.predict("image.jpg", save=True)
1. model = YOLO('yolov9c-seg.pt'):
-
這一行初始化了一個 YOLOv9(You Only Look Once)模型,用於物體分割。
-
該模型從名為 'yolov9c-seg.pt' 的檔案中載入,其中包含了專門設計用於分割任務的 YOLOv9 架構的預訓練權重和配置。
2. model.predict("image.jpg", save=True):
-
這一行使用初始化的 YOLOv9 模型對名為 "image.jpg" 的輸入影像執行預測。
-
predict 函式接受輸入影像並進行分割,識別並勾畫影像中的物體。
-
save=True 參數列示分割結果將被儲存。
步驟 4:在自定義資料集上微調 YOLOv9-seg
yolov9 的配置:
dataDir = '/content/Furniture/sam_preds_training_set/'
workingDir = '/content/'
變數 dataDir 表示物件分割模型的訓練資料所在的目錄路徑。訓練資料儲存在一個名為 "sam_preds_training_set" 的目錄下,該目錄位於 "/content" 目錄下的 "Furniture" 目錄中。類似地,變數 workingDir 表示儲存主要工作檔案的目錄路徑。
num_classes = 2
classes = ['Chair', 'Sofa']
-
num_classes = 2:這個變數指定了模型將被訓練以分割的類別或分類的總數。在本例中,num_classes 設定為 2,表示模型將學習識別兩個不同的物體類別。
-
classes = ['Chair', 'Sofa']:這個列表包含了模型將被訓練以識別的類別或物件的名稱。列表中的每個元素對應一個特定的類標籤。這些類別被定義為 'Chair' 和 'Sofa',模型將被訓練以分割屬於這些類別的物體。
import yaml
import os
file_dict = {
'train': os.path.join(dataDir, 'train'),
'val': os.path.join(dataDir, 'val'),
'test': os.path.join(dataDir, 'test'),
'nc': num_classes,
'names': classes
}
with open(os.path.join(workingDir, 'data.yaml'), 'w+') as f:
yaml.dump(file_dict, f)
- file_dict:建立一個包含資料集資訊的字典:
-
'train'、'val' 和 'test':訓練、驗證和測試資料目錄的路徑,分別。這些路徑透過將 dataDir(包含資料集的目錄)與相應的目錄名稱連線而獲得。
-
'nc':資料集中類別的數量,由變數 num_classes 表示。
-
'names':一個類名列表,由變數 classes 表示。
-
with open(...) as f:以寫入模式('w+')開啟名為 'data.yaml' 的檔案。如果檔案不存在,將被建立。with 語句確保在寫入後正確關閉檔案。
-
yaml.dump(file_dict, f):將 file_dict 字典的內容寫入到 YAML 檔案 f 中。yaml.dump() 函式將 Python 物件序列化為 YAML 格式並寫入到指定的檔案物件中。
model = YOLO('yolov9c-seg.pt')
model.train(data='/content/data.yaml' , epochs=30 , imgsz=640)
初始化一個 YOLOv9 模型,用於物件分割,使用指定的預訓練權重檔案 'yolov9c-seg.pt'。然後將模型訓練在由 data 引數指定的自定義資料集上,data 引數指向包含資料集配置細節(如訓練和驗證影像的路徑、類別數量和類別名稱)的 YAML 檔案 'data.yaml'。
步驟 5:載入自定義模型
best_model_path = '/content/runs/segment/train/weights/best.pt'
best_model = YOLO(best_model_path)
我們正在定義訓練期間獲得的最佳效能模型的路徑。best_model_path 變數儲存了儲存最佳模型權重的檔案路徑。這些權重表示在訓練資料上表現最佳的 YOLOv9 模型的學習引數。
接下來,我們使用 best_model_path 例項化 YOLO 物件。這將使用訓練期間獲得的最佳模型的權重初始化 YOLO 模型的一個例項。這個被例項化的 YOLO 模型,稱為 best_model,現在已經準備好用於對新資料進行預測。
步驟 6:對測試影像進行推斷
# Define the path to the validation images
valid_images_path = os.path.join(dataDir, 'test', 'images')
# List all jpg images in the directory
image_files = [file for file in os.listdir(valid_images_path) if file.endswith('.jpg')]
# Select images at equal intervals
num_images = len(image_files)
selected_images = [image_files[i] for i in range(0, num_images, num_images // 4)]
# Initialize the subplot
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
fig.suptitle('Test Set Inferences', fontsize=24)
# Perform inference on each selected image and display it
for i, ax in enumerate(axes.flatten()):
image_path = os.path.join(valid_images_path, selected_images[i])
results = best_model.predict(source=image_path, imgsz=640)
annotated_image = results[0].plot()
annotated_image_rgb = cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB)
ax.imshow(annotated_image_rgb)
ax.axis('off')
plt.tight_layout()
plt.show()
- 定義驗證影像的路徑:這一行構建了在 dataDir 目錄中包含測試影像的目錄路徑。
- 列出目錄中的所有 jpg 影像:它建立了一個包含指定目錄中所有 JPEG 影像檔案的列表。
- 以相等間隔選擇影像:它從列表中選擇子集影像以進行視覺化。在本例中,它選擇了總影像數量的四分之一。
- 初始化子圖:這一行建立一個 2x2 的子圖網格,用於顯示所選影像及其對應的預測。
- 對每個選擇的影像進行推斷並顯示:它遍歷每個子圖,對相應的選擇影像使用 best_model.predict() 函式進行推斷,並顯示帶有邊界框或分割掩碼的標註影像。
- 最後,使用 plt.tight_layout() 整理子圖並使用 plt.show() 顯示它們。
【手把手教學】如何在YOLOv9上訓練自己的目標檢測資料集
文章源於網路,如若侵權,請聯絡刪除!
前言
文章演示瞭如何在自定義資料集上執行推理和訓練YOLOv9模型。作者克隆了YOLOv9專案程式碼,下載了模型權重,然後使用預設的COCO權重進行推理。然後,使用足球運動員檢測資料集訓練了一個微調的模型。作者回顧了訓練圖和混淆矩陣,然後在來自驗證集的影像上測試了模型。
0. 寫在前面
今天筆者為大家分享國外的James Gallagher和Piotr Skalski編寫的YOLOv9使用教程!原部落格連結為https://blog.roboflow.com/train-yolov9-model。
YOLOv9開源了一種新的CV模型架構,比現有流行的YOLO模型(YOLOv8、YOLOv7和YOLOv5)在MS COCO資料集上取得了更高的mAP。
本指南展示瞭如何在自定義資料集上訓練YOLOv9模型,將透過一個訓練視覺模型的例子來識別一個球場上的足球運動員。有了這一點,可以用這個指南使用你想要的任何資料集。
話不多說,讓我們開始!
1. 什麼是YOLOv9?
YOLOv9是由Chien-Yao Wang, I-Hau Yeh, and Hong-Yuan Mark Liao開發的計算機視覺模型。Hong-Yuan Mark Liao和Chien-Yao Wang還對YOLOv4、YOLOR和YOLOv7等流行的模型架構進行了研究。YOLOv9引入了兩種新的架構:YOLOv9和GELAN,這兩種架構都可以從論文釋出的YOLOv9 Python庫中使用。
使用YOLOv9模型,可以訓練出一個目標檢測模型。此時不支援分割、分類等任務型別。YOLOv9有四種模型,按引數個數排序是:v9-S、v9-M、v9-C、v9-E。目前v9 - S和v9 - M的權重暫不可用。其中最小的模型在MS COCO資料集的驗證集上達到了46.8 %的AP,而最大的模型達到了55.6 %。這為目標檢測效能提供了一個新的先進水平。下面的圖表展示了來自YOLOv9研究團隊的研究結果。
YOLOv9在撰寫本指南時沒有官方許可證。截至2023年2月22日,一位主要研究人員指出:"我認為應該是GPL3,我會檢查並更新許可檔案。"。這表明許可證將很快確定。
2. 如何安裝YOLOv9
YOLOv9被打包為一系列指令碼,您可以使用這些指令碼進行工作。在撰寫本指南時,沒有官方的Python包或包裝器可供您與模型進行互動。
要使用YOLOv9,您需要下載專案儲存庫。然後,您可以執行訓練作業或從現有的COCO檢查點進行推理。
本教程假定您正在使用Google Colab。如果您在筆記本環境之外的本地機器上工作,請根據需要調整命令。
YOLOv9中存在一個錯誤,阻止您對影像進行推理,但Roboflow團隊正在維護一個非官方的分支,其中包含一個補丁,直到修復釋出。要從我們的補丁分支安裝YOLOv9,請執行以下命令:
git clone https://github.com/SkalskiP/yolov9.git
cd yolov9
pip3 install -r requirements.txt -q
讓我們設定一個HOME目錄來工作:
import os
HOME = os.getcwd()
print(HOME)
接下來,需要下載模型權重。目前只有v9 - C和v9 - E權重可用。可以使用以下命令進行下載:
!mkdir -p {HOME}/weights
!wget -P {HOME}/weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-c.pt
!wget -P {HOME}/weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-e.pt
!wget -P {HOME}/weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/gelan-c.pt
!wget -P {HOME}/weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/gelan-e.pt
現在可以使用專案庫中的指令碼在YOLOv9模型上執行推理和訓練。
3.在YOLOv9模型上推理
在示例影像上使用v9 - C COCO檢查點進行推理。建立一個新的資料目錄,並將示例影像下載到您的筆記本中。你可以用我們的狗圖片作為例子,也可以用你想要的任何其他圖片。
!mkdir -p {HOME}/data
!wget -P {HOME}/data -q https://media.roboflow.com/notebooks/examples/dog.jpeg
SOURCE_IMAGE_PATH = f"{HOME}/dog.jpeg"
我們現在可以在我們的影像上進行推理:
!python detect.py --weights {HOME}/weights/gelan-c.pt --conf 0.1 --source {HOME}/data/dog.jpeg --device 0
Image(filename=f"{HOME}/yolov9/runs/detect/exp/dog.jpeg", width=600)
我們的模型能夠成功地識別出影像中的人、狗和汽車。有鑑於此,該模型錯誤地將揹帶識別為手提包,並且未能檢測到揹包。
讓我們試試引數最多的v9 - E模型:
!python detect.py --weights {HOME}/weights/yolov9-e.pt --conf 0.1 --source {HOME}/data/dog.jpeg --device 0
Image(filename=f"{HOME}/yolov9/runs/detect/exp2/dog.jpeg", width=600)
該模型能夠成功識別人、狗、汽車和揹包。
4. 如何訓練YOLOv9模型
您可以使用YOLOv9專案目錄中的train.py檔案來訓練YOLOv9模型。
第1步:下載資料集
要開始訓練模型,您將需要一個資料集。對於本指南,我們將使用一個關於足球運動員的資料集。生成的模型將能夠在場地上識別足球運動員。
如果您沒有資料集,請檢視Roboflow Universe,這是一個共享了超過200,000個計算機視覺資料集的社群。您可以找到涵蓋從書脊到足球運動員再到太陽能電池板的資料集。
執行以下程式碼來下載我們在本指南中使用的資料集:
%cd {HOME}/yolov9
roboflow.login()
rf = roboflow.Roboflow()
project = rf.workspace("roboflow-jvuqo").project("football-players-detection-3zvbc")
dataset = project.version(1).download("yolov7")
當您執行此程式碼時,將會要求您透過Roboflow進行身份驗證。請跟隨在您的終端中出現的連結進行驗證。如果您沒有賬戶,將被帶到一個頁面,您可以在該頁面建立一個賬戶。然後,再次點選連結以使用Python包進行身份驗證。
此程式碼以YOLOv7格式下載資料集,該格式與YOLOv9模型相容。
您可以使用任何按照YOLOv7格式格式化的資料集來進行此操作。
第2步:使用YOLOv9 Python指令碼訓練模型
讓我們為我們的資料集訓練一個模型,訓練20個epochs。我們將使用GELAN-C架構進行此操作,該架構是YOLOv9 GitHub倉庫釋出的兩種架構之一。GELAN-C的訓練速度快。GELAN-C的推理時間也很快。
您可以使用以下程式碼進行此操作:
%cd {HOME}/yolov9
!python train.py \
--batch 16 --epochs 20 --img 640 --device 0 --min-items 0 --close-mosaic 15 \
--data {dataset.location}/data.yaml \
--weights {HOME}/weights/gelan-c.pt \
--cfg models/detect/gelan-c.yaml \
--hyp hyp.scratch-high.yaml
你的模型將開始訓練。模型訓練時,將看到每個epoch的訓練指標。一旦模型完成訓練,就可以使用YOLOv9生成的圖來評估訓練結果。
執行下面的程式碼來檢視你的訓練圖:
Image(filename=f"{HOME}/yolov9/runs/train/exp/results.png", width=1000)
執行下面的程式碼來檢視你的混淆矩陣:
執行以下程式碼,檢視您的模型在驗證集中的一批影像上的結果:
Image(filename=f"{HOME}/yolov9/runs/train/exp/val_batch0_pred.jpg", width=1000)
第3步:在自定義模型上執行推理
既然我們有了一個訓練好的模型,我們就可以進行推理。為此,我們可以使用YOLOv9庫中的detection . py檔案。
執行以下程式碼對驗證集中的所有影像進行推理:
!python detect.py \
--img 1280 --conf 0.1 --device 0 \
--weights {HOME}/yolov9/runs/train/exp/weights/best.pt \
--source {dataset.location}/valid/images
import glob
from IPython.display import Image, display
for image_path in glob.glob(f'{HOME}/yolov9/runs/detect/exp4/*.jpg')[:3]:
display(Image(filename=image_path, width=600))
print("\n")
我們在大小為640的影像上訓練了我們的模型,這使得我們可以用較少的計算資源來訓練模型。在推理過程中,我們將影像尺寸增加到1280,使得我們可以從我們的模型中得到更準確的結果。
下面是我們模型結果的三個例子:
我們的模型成功地識別了球員、裁判員和守門員。
5. 結論
YOLOv9是由Chien-Yao Wang, I-Hau Yeh, and Hong-Yuan Mark Liao釋出的一種新的計算機視覺模型架構。可以使用YOLOv9架構訓練目標檢測模型。
在本指南中,我們演示瞭如何在自定義資料集上執行推理和訓練YOLOv9模型。我們克隆了YOLOv9專案程式碼,下載了模型權重,然後使用預設的COCO權重進行推理。然後,我們使用足球運動員檢測資料集訓練了一個微調的模型。我們回顧了訓練圖和混淆矩陣,然後在來自驗證集的影像上測試了模型。
Ref
[1] YOLOv9:在自定義資料上進行影像分割訓練:https://mp.weixin.qq.com/s/U1VLKWREGCtwDjD7gmTlxA
[2] 【手把手教學】如何在YOLOv9上訓練自己的目標檢測資料集: https://mp.weixin.qq.com/s/Fg66Keg1ttHCNl_pLKp5Fw
[3] 【YOLO系列】YOLOv9論文超詳細解讀(翻譯 +學習筆記):https://blog.csdn.net/weixin_43334693/article/details/136383022
[4] YOLOv9論文:《YOLOv9: 利用可程式設計梯度資訊學習你想學習的內容》
YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 論文連結:YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information
[5] YOLOV9開源專案:GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information
[6] 一文搞懂YOLOv9訓練推理全流程|YOLOv9你絕對不知道的細節!: https://zhuanlan.zhihu.com/p/690115605