YOLOv9 在自定義數(shù)據(jù)集上進(jìn)行目標(biāo)檢測(cè) | 計(jì)算機(jī)視覺項(xiàng)目
在快速發(fā)展的計(jì)算機(jī)視覺領(lǐng)域,目標(biāo)檢測(cè)是一個(gè)基石應(yīng)用程序。在眾多的目標(biāo)檢測(cè)算法中,YOLOv9已經(jīng)成為一個(gè)強(qiáng)大且多功能的解決方案,提供了實(shí)時(shí)檢測(cè)能力,并具有令人印象深刻的準(zhǔn)確性。在這篇全面的指南中,我們將探索在自定義數(shù)據(jù)集上訓(xùn)練YOLOv9的過程,并在測(cè)試數(shù)據(jù)上進(jìn)行推理。

通過本教程的學(xué)習(xí),你將深入了解YOLOv9的工作原理以及如何使用自定義數(shù)據(jù)集在你的項(xiàng)目中實(shí)現(xiàn)它。那么,讓我們開始一起探索YOLOv9的強(qiáng)大功能吧!
激活函數(shù)系列
- Softmax激活函數(shù)
- Sigmoid/Logistic激活函數(shù)
- 雙曲正切(Tanh)激活函數(shù)
- 修正線性單元(ReLU)激活函數(shù)
數(shù)據(jù)集:https://www.kaggle.com/datasets/snehilsanyal/construction-site-safety-image-dataset-roboflow
克隆YOLOv9倉庫
!git clone https://github.com/SkalskiP/yolov9.git讓我們使用git clone命令從GitHub克隆YOLOv9倉庫,并開始探索使用YOLOv9進(jìn)行實(shí)時(shí)目標(biāo)檢測(cè)。Git是一個(gè)版本控制系統(tǒng),允許開發(fā)人員跟蹤他們的代碼庫的更改,與他人協(xié)作和管理項(xiàng)目歷史。
克隆過程完成后,我們將在機(jī)器上擁有YOLOv9倉庫的本地副本。這將使我們能夠探索代碼庫,進(jìn)行修改,并使用YOLOv9算法進(jìn)行我們自己的目標(biāo)檢測(cè)任務(wù)。
dataDir = '/content/css-data/' # css-data is the unzip path of the dataset
workingDir = '/content/' # Working Dir in google colab在這里,我們?yōu)轫?xiàng)目設(shè)置目錄路徑。變量dataDir保存我們CSS(建筑工地安全)數(shù)據(jù)存儲(chǔ)的目錄路徑。我們將其設(shè)置為'/content/css-data/',表明我們的CSS數(shù)據(jù)集文件位于'/content/'目錄內(nèi)的名為'css-data'的目錄中。
接下來,我們有變量workingDir,它定義了我們工作目錄的路徑。
num_classes = 10
classes = ['Hardhat', 'Mask', 'NO-Hardhat', 'NO-Mask', 'NO-Safety Vest', 'Person', 'Safety Cone', 'Safety Vest', 'machinery', 'vehicle']定義了兩個(gè)變量:
- num_classes設(shè)置為整數(shù)值10,表示分類任務(wù)中的類別數(shù)。
- classes是一個(gè)包含10個(gè)字符串元素的列表,代表不同的類別:'Hardhat'(安全帽)、'Mask'(口罩)、'NO-Hardhat'(無安全帽)、'NO-Mask'(無口罩)、'NO-Safety Vest'(無安全背心)、'Person'(人員)、'Safety Cone'(安全錐)、'Safety Vest'(安全背心)、'machinery'(機(jī)械)和'vehicle'(車輛)。
import yaml
import os
file_dict = {
'train': os.path.join(dataDir, 'train'),
'val': os.path.join(dataDir, 'valid'),
'test': os.path.join(dataDir, 'test'),
'nc': num_classes,
'names': classes
}
with open(os.path.join(workingDir,'yolov9', 'data.yaml'), 'w+') as f:
yaml.dump(file_dict, f)定義了一個(gè)名為file_dict的字典,包含以下鍵值對(duì):
- ‘train’:訓(xùn)練數(shù)據(jù)目錄的路徑,通過連接‘dataDir’變量和‘train’形成。
- ‘val’:驗(yàn)證數(shù)據(jù)目錄的路徑,通過連接‘dataDir’變量和‘valid’形成。
- ‘test’:測(cè)試數(shù)據(jù)目錄的路徑,通過連接‘dataDir’變量和‘test’形成。
- ‘nc’:類別數(shù),來源于‘num_classes’變量。
- ‘names’:類別名稱列表,來源于‘classes’變量。
在‘workingDir/yolov9’目錄內(nèi)以寫入模式打開名為‘data.yaml’的文件。使用YAML格式將file_dict字典的內(nèi)容寫入'data.yaml'文件。如果文件不存在,則創(chuàng)建一個(gè)新文件。
下載YOLOv9權(quán)重
!wget https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-e.pt我們現(xiàn)在正在獲取YOLOv9的預(yù)訓(xùn)練權(quán)重文件。使用!wget,我們可以直接從網(wǎng)絡(luò)環(huán)境中檢索文件。
在這個(gè)命令中,我們正在下載名為yolov9-c.pt的文件,該文件來自托管在GitHub上的YOLOv9倉庫的v0.1版本。這些預(yù)訓(xùn)練權(quán)重對(duì)于使用學(xué)習(xí)到的參數(shù)初始化我們的YOLOv9模型至關(guān)重要,使其能夠準(zhǔn)確檢測(cè)對(duì)象。
下載完成后,我們將能夠使用這些權(quán)重來微調(diào)我們的自定義數(shù)據(jù)集進(jìn)行目標(biāo)檢測(cè)任務(wù),節(jié)省了從頭開始訓(xùn)練模型所需的時(shí)間和計(jì)算資源。
cd yolov9現(xiàn)在,讓我們導(dǎo)航到‘yolov9’目錄?!畒olov9’是我們剛剛從GitHub克隆的倉庫。這樣做,我們將獲得‘yolov9’模型的代碼,我們將用于在自定義數(shù)據(jù)集上訓(xùn)練yolov9模型。
!pip install -r requirements.txt -q接下來,我們使用pip包管理器安裝項(xiàng)目所需的Python包和依賴項(xiàng)。!pip install命令允許我們從Python包索引(PyPI)或指定的要求文件安裝Python包。
在這里,-r requirements.txt告訴pip安裝'requirements.txt'文件中列出的所有包。該文件包含訓(xùn)練yolov9模型所必需的Python庫列表。
-q標(biāo)志代表'quiet'模式,這意味著pip將在沒有錯(cuò)誤的情況下靜默執(zhí)行安裝過程,不會(huì)顯示詳細(xì)輸出。這有助于保持安裝過程的簡(jiǎn)潔明了,特別是在腳本或自動(dòng)化任務(wù)中。
!python train_dual.py --workers 8 --batch 4 --img 640 --epochs 50 --data /content/yolov9/data.yaml --weights /content/yolov9-e.pt --device 0 --cfg /content/yolov9/models/detect/yolov9.yaml --hyp /content/yolov9/data/hyps/hyp.scratch-high.yaml這個(gè)命令啟動(dòng)了YOLOv9模型的訓(xùn)練過程。但在執(zhí)行單元格之前,我們需要修改兩個(gè)參數(shù),第一個(gè)參數(shù)是—data,我們將在—data參數(shù)中傳遞上面創(chuàng)建的data.yaml文件路徑,第二個(gè)參數(shù)是—cfg,我們需要對(duì)yolov9.yaml文件進(jìn)行一些更改,因?yàn)檫@個(gè)原始的yolov9.yaml文件是為COCO數(shù)據(jù)集配置的,COCO數(shù)據(jù)集包含80個(gè)類別,而我們的自定義數(shù)據(jù)集有10個(gè)類別,所以我們需要在yolov9.yaml中調(diào)整nc參數(shù)并傳遞nc=10,因?yàn)槲覀冇?0個(gè)類別,而不是80,我希望你明白我的意思—hyp包含模型的超參數(shù),我們不需要修改它,所以保持原樣。
現(xiàn)在讓我們使用!python train_dual.py微調(diào)我們的自定義數(shù)據(jù)集上的yolov9模型:
- --workers 8:這個(gè)參數(shù)指定了訓(xùn)練期間數(shù)據(jù)預(yù)處理的數(shù)據(jù)加載工作器的數(shù)量。更高的數(shù)字可以加快數(shù)據(jù)加載和預(yù)處理的速度。
- --batch 4:這個(gè)參數(shù)設(shè)置了訓(xùn)練的批次大小。批次大小決定了每次訓(xùn)練迭代中使用的樣本數(shù)量。
- --img 640:這個(gè)參數(shù)指定了訓(xùn)練的輸入圖像大小。在這種情況下,圖像將在訓(xùn)練期間調(diào)整為640像素的高度和寬度。
- --epochs 5:這個(gè)參數(shù)設(shè)置了訓(xùn)練的周期數(shù)。一個(gè)周期是完整地遍歷整個(gè)訓(xùn)練數(shù)據(jù)集一次。
- --data /content/yolov9/data.yaml:這個(gè)參數(shù)指定了包含數(shù)據(jù)集配置信息的YAML文件的路徑。
- --weights /content/yolov9-c.pt:這個(gè)參數(shù)指定了用于在訓(xùn)練前初始化模型的預(yù)訓(xùn)練權(quán)重文件(yolov9-c.pt)的路徑。
- --device 0:這個(gè)參數(shù)指定了用于訓(xùn)練的設(shè)備。這里,0可能表示第一個(gè)可用于訓(xùn)練的GPU設(shè)備。
- --cfg /content/yolov9/models/detect/yolov9.yaml:這個(gè)參數(shù)指定了模型配置文件(yolov9.yaml)的路徑,該文件定義了YOLOv9模型的架構(gòu)和參數(shù)。
- --hyp /content/yolov9/data/hyps/hyp.scratch-high.yaml:這個(gè)參數(shù)指定了超參數(shù)文件(hyp.scratch-high.yaml)的路徑,該文件包含訓(xùn)練期間模型的調(diào)整參數(shù)。
推理
!python detect.py --img 640 --conf 0.1 --device 0 --weights /content/yolov9/runs/train/exp2/weights/best.pt --source /content/css-data/test/images/004763_jpg.rf.46484e6ca73caeaa9de45822cf1085a9.jpgfrom IPython.display import Image
Image(filename="/content/yolov9/runs/detect/exp2/004763_jpg.rf.46484e6ca73caeaa9de45822cf1085a9.jpg", width=600)




































