YOLOv9:​在自定義資料上進行影像分割訓練

楚千羽發表於2024-04-22

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']
  1. num_classes = 2:這個變數指定了模型將被訓練以分割的類別或分類的總數。在本例中,num_classes 設定為 2,表示模型將學習識別兩個不同的物體類別。

  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)
  1. 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()
  1. 定義驗證影像的路徑:這一行構建了在 dataDir 目錄中包含測試影像的目錄路徑。
  2. 列出目錄中的所有 jpg 影像:它建立了一個包含指定目錄中所有 JPEG 影像檔案的列表。
  3. 以相等間隔選擇影像:它從列表中選擇子集影像以進行視覺化。在本例中,它選擇了總影像數量的四分之一。
  4. 初始化子圖:這一行建立一個 2x2 的子圖網格,用於顯示所選影像及其對應的預測。
  5. 對每個選擇的影像進行推斷並顯示:它遍歷每個子圖,對相應的選擇影像使用 best_model.predict() 函式進行推斷,並顯示帶有邊界框或分割掩碼的標註影像。
  6. 最後,使用 plt.tight_layout() 整理子圖並使用 plt.show() 顯示它們。
YOLOv9:​在自定義資料上進行影像分割訓練

【手把手教學】如何在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:​在自定義資料上進行影像分割訓練

  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)
YOLOv9:​在自定義資料上進行影像分割訓練

  我們的模型能夠成功地識別出影像中的人、狗和汽車。有鑑於此,該模型錯誤地將揹帶識別為手提包,並且未能檢測到揹包。

  讓我們試試引數最多的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)
YOLOv9:​在自定義資料上進行影像分割訓練

  該模型能夠成功識別人、狗、汽車和揹包。

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)
YOLOv9:​在自定義資料上進行影像分割訓練
  執行下面的程式碼來檢視你的混淆矩陣:
YOLOv9:​在自定義資料上進行影像分割訓練

  執行以下程式碼,檢視您的模型在驗證集中的一批影像上的結果:

Image(filename=f"{HOME}/yolov9/runs/train/exp/val_batch0_pred.jpg", width=1000)
YOLOv9:​在自定義資料上進行影像分割訓練

第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,使得我們可以從我們的模型中得到更準確的結果。

  下面是我們模型結果的三個例子:

YOLOv9:​在自定義資料上進行影像分割訓練

  我們的模型成功地識別了球員、裁判員和守門員。

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

相關文章