如何在自定義數(shù)據(jù)集上訓(xùn)練 YOLOv8 實(shí)例分割模型
在本文中,我們將介紹微調(diào) YOLOv8-seg 預(yù)訓(xùn)練模型的過程,以提高其在特定目標(biāo)類別上的準(zhǔn)確性。Ikomia API簡化了計(jì)算機(jī)視覺工作流的開發(fā)過程,允許輕松嘗試不同的參數(shù)以達(dá)到最佳結(jié)果。
使用 Ikomia API 入門
通過 Ikomia API,我們只需幾行代碼就可以訓(xùn)練自定義的 YOLOv8 實(shí)例分割模型。要開始,請(qǐng)?jiān)谔摂M環(huán)境中安裝 API。
pip install ikomia
在本教程中,我們將使用 Roboflow 的珊瑚數(shù)據(jù)集。您可以通過以下鏈接下載此數(shù)據(jù)集:https://universe.roboflow.com/ds/Ap7v6sRXMc?key=ecveMLIdNa
使用幾行代碼運(yùn)行訓(xùn)練 YOLOv8 實(shí)例分割算法
您還可以直接加載我們準(zhǔn)備好的開源筆記本。
from ikomia.dataprocess.workflow import Workflow
# Initialize the workflow
wf = Workflow()
# Add the dataset loader to load your custom data and annotations
dataset = wf.add_task(name='dataset_coco')
# Set the parameters of the dataset loader
dataset.set_parameters({
'json_file': 'Path/To/Mesophotic Coral/Dataset/train/_annotations.coco.json',
'image_folder': 'Path/To/Mesophotic Coral/Dataset/train',
'task': 'instance_segmentation',
})
# Add the YOLOv8 segmentation algorithm
train = wf.add_task(name='train_yolo_v8_seg', auto_connect=True)
# Set the parameters of the YOLOv8 segmentation algorithm
train.set_parameters({
'model_name': 'yolov8m-seg',
'batch_size': '4',
'epochs': '50',
'input_size': '640',
'dataset_split_ratio': '0.8',
'output_folder':'Path/To/Folder/Where/Model-weights/Will/Be/Saved'
})
使用 NVIDIA GeForce RTX 3060 Laptop GPU(6143.5MB),50個(gè)時(shí)期的訓(xùn)練過程大約需要1小時(shí)。
什么是 YOLOv8 實(shí)例分割?
在進(jìn)行具有所有參數(shù)詳細(xì)信息的逐步方法之前,讓我們更深入地了解實(shí)例分割和 YOLOv8。
1.什么是實(shí)例分割?
實(shí)例分割是計(jì)算機(jī)視覺任務(wù),涉及在圖像中識(shí)別和描繪單個(gè)對(duì)象。與語義分割不同,后者將每個(gè)像素分類為預(yù)定義的類別,實(shí)例分割旨在區(qū)分和分離對(duì)象的各個(gè)實(shí)例。
在實(shí)例分割中,目標(biāo)不僅是對(duì)每個(gè)像素進(jìn)行分類,還要為每個(gè)不同的對(duì)象實(shí)例分配一個(gè)唯一的標(biāo)簽或標(biāo)識(shí)符。這意味著將同一類別的對(duì)象視為單獨(dú)的實(shí)體。例如,如果圖像中有多個(gè)汽車實(shí)例,實(shí)例分割算法將為每輛汽車分配一個(gè)唯一的標(biāo)簽,以實(shí)現(xiàn)精確的識(shí)別和區(qū)分。
實(shí)例檢測(cè)、語義分割和實(shí)例分割之間的比較
與其他分割技術(shù)相比,實(shí)例分割提供了有關(guān)對(duì)象邊界和空間范圍的更詳細(xì)和精細(xì)的信息。它廣泛用于各種應(yīng)用,包括自動(dòng)駕駛、機(jī)器人技術(shù)、目標(biāo)檢測(cè)、醫(yī)學(xué)圖像和視頻分析。
許多現(xiàn)代實(shí)例分割算法,如 YOLOv8-seg,采用深度學(xué)習(xí)技術(shù),特別是卷積神經(jīng)網(wǎng)絡(luò)(CNN),以同時(shí)執(zhí)行像素級(jí)分類和對(duì)象定位。這些算法通常結(jié)合了目標(biāo)檢測(cè)和語義分割的優(yōu)勢(shì),以實(shí)現(xiàn)準(zhǔn)確的實(shí)例級(jí)分割結(jié)果。
2.YOLOv8概述
(1) 發(fā)布和優(yōu)勢(shì)
由Ultralytics開發(fā)的YOLOv8是一種專門用于目標(biāo)檢測(cè)、圖像分類和實(shí)例分割任務(wù)的模型。它以其準(zhǔn)確性和緊湊的模型大小而聞名,成為YOLO系列的顯著補(bǔ)充,該系列在YOLOv5方面取得了成功。憑借其改進(jìn)的架構(gòu)和用戶友好的增強(qiáng)功能,YOLOv8為計(jì)算機(jī)視覺項(xiàng)目提供了一個(gè)出色的選擇。
與其他實(shí)時(shí)目標(biāo)檢測(cè)器的比較:YOLOv8實(shí)現(xiàn)了最先進(jìn)(SOTA)的性能
(2) 架構(gòu)和創(chuàng)新
雖然YOLOv8的官方研究論文目前不可用,但對(duì)存儲(chǔ)庫和可用信息的分析提供了有關(guān)其架構(gòu)的見解。YOLOv8引入了無錨檢測(cè),該方法預(yù)測(cè)對(duì)象中心而不依賴錨框。這種方法簡化了模型并改善了后處理步驟,如非最大抑制。
該架構(gòu)還包含新的卷積和模塊配置,傾向于ResNet樣式的結(jié)構(gòu)。有關(guān)網(wǎng)絡(luò)架構(gòu)的詳細(xì)可視化,請(qǐng)參閱GitHub用戶RangeKing創(chuàng)建的圖像。
YOLOv8模型結(jié)構(gòu)(非官方)
(3) 訓(xùn)練例程和數(shù)據(jù)增強(qiáng)
YOLOv8的訓(xùn)練例程包括馬賽克增強(qiáng),其中多個(gè)圖像被組合在一起,使模型暴露于對(duì)象位置、遮擋和周圍像素的變化。但是,在最終訓(xùn)練時(shí)關(guān)閉此增強(qiáng)以防止性能降低。
(4) 準(zhǔn)確性和性能
YOLOv8的準(zhǔn)確性改進(jìn)已在廣泛使用的COCO基準(zhǔn)測(cè)試上得到驗(yàn)證,在該基準(zhǔn)測(cè)試中,該模型實(shí)現(xiàn)了令人印象深刻的平均精度(mAP)分?jǐn)?shù)。例如,YOLOv8m-seg模型在COCO上實(shí)現(xiàn)了令人矚目的49.9% mAP。以下表格提供了YOLOv8-seg不同變體的模型大小、mAP分?jǐn)?shù)和其他性能指標(biāo)的摘要:
以下是使用YOLOv8x檢測(cè)和實(shí)例分割模型的輸出示例:
YOLOv8x檢測(cè)和實(shí)例分割模型
逐步操作:使用Ikomia API微調(diào)預(yù)訓(xùn)練的YOLOv8-seg模型
使用您下載的航拍圖像數(shù)據(jù)集,您可以使用Ikomia API訓(xùn)練自定義的YOLO v7模型。
第1步:導(dǎo)入并創(chuàng)建工作流
from ikomia.dataprocess.workflow import Workflow
wf = Workflow()
Workflow是創(chuàng)建工作流的基本對(duì)象。它提供了設(shè)置輸入(如圖像、視頻和目錄)、配置任務(wù)參數(shù)、獲取時(shí)間度量和訪問特定任務(wù)輸出(如圖形、分割掩碼和文本)的方法。我們初始化一個(gè)工作流實(shí)例。然后,“wf”對(duì)象可用于向工作流實(shí)例添加任務(wù),配置它們的參數(shù),并在輸入數(shù)據(jù)上運(yùn)行它們。
第2步:添加數(shù)據(jù)集加載器
下載的COCO數(shù)據(jù)集包括兩種主要格式:.JSON和圖像文件。圖像被分成train、val、test文件夾,每個(gè)文件夾都有一個(gè)包含圖像注釋的.json文件:
- 圖像文件名
- 圖像大?。▽挾群透叨龋?/li>
- 具有以下信息的對(duì)象列表:對(duì)象類別(例如“person”、“car”);邊界框坐標(biāo)(x、y、寬度、高度)和分割掩碼(多邊形)
我們將使用Ikomia API提供的dataset_coco模塊加載自定義數(shù)據(jù)和注釋。
# Add the dataset loader to load your custom data and annotations
dataset = wf.add_task(name='dataset_coco')
# Set the parameters of the dataset loader
dataset.set_parameters({
'json_file': 'Path/To/Mesophotic Coral/Dataset/train/_annotations.coco.json',
'image_folder': 'Path/To/Mesophotic Coral/Dataset/train,
'task': 'instance_segmentation'
})
第3步:添加YOLOv8分割模型并設(shè)置參數(shù)
我們向工作流添加'train_yolo_v8_seg'任務(wù),用于訓(xùn)練自定義的YOLOv8-seg模型。為了自定義我們的訓(xùn)練,我們指定以下參數(shù):
# Add the YOLOv8 segmentation algorithm
train = wf.add_task(name='train_yolo_v8_seg', auto_connect=True)
# Set the parameters of the YOLOv8 segmentation algorithm
train.set_parameters({
'model_name': 'yolov8m-seg',
'batch_size': '4',
'epochs': '50',
'input_size': '640',
'dataset_split_ratio': '0.8',
'output_folder':'Path/To/Folder/Where/Model-weights/Will/Be/Saved'
})
這是可配置的參數(shù)及其相應(yīng)的描述:
- batch_size:在更新模型之前處理的樣本數(shù)。
- epochs:在訓(xùn)練數(shù)據(jù)集上的完整通過次數(shù)。
- input_size:訓(xùn)練和驗(yàn)證期間的輸入圖像大小。
- dataset_split_ratio:算法自動(dòng)將數(shù)據(jù)集分為訓(xùn)練和評(píng)估集。值為0.8表示使用80%的數(shù)據(jù)進(jìn)行訓(xùn)練,20%進(jìn)行評(píng)估。
您還可以修改以下參數(shù):
- workers:數(shù)據(jù)加載的工作線程數(shù)。當(dāng)前設(shè)置為'0'。
- optimizer:要使用的優(yōu)化器??捎玫倪x擇包括SGD、Adam、Adamax、AdamW、NAdam、RAdam、RMSProp和auto。
- weight_decay:優(yōu)化器的權(quán)重衰減。當(dāng)前設(shè)置為'5e-4'。
- momentum:SGD動(dòng)量/Adam beta1值。當(dāng)前設(shè)置為'0.937'。
- lr0:初始學(xué)習(xí)率。對(duì)于SGD,設(shè)置為1E-2,對(duì)于Adam,設(shè)置為1E-3。
- lrf:最終學(xué)習(xí)率,計(jì)算為lr0 * lrf。當(dāng)前設(shè)置為'0.01'。
第4步:運(yùn)行您的工作流
最后,我們運(yùn)行工作流以開始訓(xùn)練過程。
wf.run()
您可以使用Tensorboard或MLflow等工具監(jiān)視培訓(xùn)的進(jìn)度。一旦訓(xùn)練完成,train_yolo_v8_seg任務(wù)將在output_folder中的時(shí)間戳文件夾內(nèi)保存最佳模型。您可以在時(shí)間戳文件夾的weights文件夾中找到您的best.pt模型。
測(cè)試微調(diào)的YOLOv8-seg模型
首先,我們可以在預(yù)訓(xùn)練的YOLOv8-seg模型上運(yùn)行珊瑚圖像:
from ikomia.dataprocess.workflow import Workflow
from ikomia.utils.displayIO import display
# Initialize the workflow
wf = Workflow()
# Add the YOLOv8 segmentation alrogithm
yolov8seg = wf.add_task(name='infer_yolo_v8_seg', auto_connect=True)
# Set the parameters of the YOLOv8 segmentation algorithm
yolov8seg.set_parameters({
'model_name': 'yolov8m-seg',
'conf_thres': '0.2',
'iou_thres': '0.7'
})
# Run on your image
wf.run_on(path="Path/To/Mesophotic Coral Identification.v1i.coco-segmentation/valid/TCRMP20221021_clip_LBP_T109_jpg.rf.a4cf5c963d5eb62b6dab06b8d4b540f2.jpg")
# Inspect your results
display(yolov8seg.get_image_with_mask_and_graphics())
瑚檢測(cè)使用YOLOv8-seg預(yù)訓(xùn)練模型
我們可以觀察到,infer_yolo_v8_seg默認(rèn)的預(yù)訓(xùn)練模型將珊瑚錯(cuò)誤地識(shí)別為熊。這是因?yàn)樵撃P褪窃贑OCO數(shù)據(jù)集上進(jìn)行訓(xùn)練的,該數(shù)據(jù)集不包含任何珊瑚對(duì)象。
要測(cè)試我們剛剛訓(xùn)練的模型,我們使用'model_weight_file'參數(shù)指定路徑到我們的自定義模型。然后在先前使用的相同圖像上運(yùn)行工作流。
# Set the path of you custom YOLOv8-seg model to the parameter
yolov8seg.set_parameters({
'model_weight_file': 'Path/To/Output_folder/[timestamp]/train/weights/best.pt',
'conf_thres': '0.5',
'iou_thres': '0.7'
})
珊瑚檢測(cè)使用自定義模型
將我們的結(jié)果與地面實(shí)況進(jìn)行比較,我們成功地識(shí)別了Orbicella spp.的物種。然而,我們觀察到一些假陰性的情況。為了提高我們自定義模型的性能,進(jìn)一步訓(xùn)練更多的時(shí)期并使用更多圖像進(jìn)行數(shù)據(jù)增強(qiáng)可能會(huì)有益處。另一個(gè)展示有效檢測(cè)結(jié)果的示例是用Agaricia agaricites物種演示的:
YOLOv8檢測(cè)珊瑚物種:Agaricia agaricites