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