之前一篇『YOLO v4 建置心得 -- Windows 環境』介紹如何建置 YOLO4(Darknet),並進行物件偵測(Object Detection), 但是,下載的標準模型只能偵測 MS COCO 資料集的80種物件,如果要偵測自訂的物件,就必須使用自訂資料集來訓練模型,因此,以下就來實作模型訓練。
YOLO 模型訓練主要分兩個步驟:
標註工具有LabelImg、LabelMe等軟體,可參閱『13 Best Image Annotation Tools of 2021』。常用的是LabelImg,相關指令如下:
安裝:pip install LabelImg
執行:LabelImg
操作可參閱『LabelImg 影像標註工具使用教學,製作深度學習用的資料集』。
兩個步驟都非常費時,因此,本文選擇直接下載已標註好的資料集,只有一個類別 -- 兔子,網址為『Eastern Cottontail Rabbits Dataset』。 內容是一個圖檔(.jpg)對應一個同名的備註檔(.txt),備註檔的格式有五欄:類別代碼、物件左上角X軸座標、左上角Y軸座標、物件寬度、物件高度。
訓練程序詳閱『YOLO v4 官網』。
因為程序實在非常冗長,因此筆者稍作整理,以方便讀者快速設定。
建置 Darknet執行檔,請參閱『YOLO v4 安裝心得 -- Windows 環境』。
下載預訓模型 yolov4.conv.137 至 weights 目錄(需新增)。
切換至 darknet-master\build\darknet\x64 目錄。
複製 cfg\yolov4-custom.cfg 為 cfg\yolo-obj.cfg。以下5~10步驟修改yolo-obj.cfg檔案內設定。
batch=16:原始文件為64,批次過大會造成筆者PC記憶體不足(GPU),讀者可依據本身的GPU記憶體調配。記憶體不足的錯誤訊息為『Error: cuDNN isn't found FWD algo for convolution』。
max_batches=2000:公式為 類別數(classes) x 2000。
steps=1600,1800:公式為 max_batches 的 80%、90%。
設定模型輸入的圖像尺寸。
width=416
height=416
[yolo]段落的classes=80更改為classes=1:共3個,可直接使用編輯器的『取代』直接置換,須視類別個數調整
。
[yolo]段落的上面一個[convolutional]段落的filters=255更改為filters=18,共3個,請小心修改,filters值須視類別個數調整,公式為(類別個數+5) x 3。
新增檔案 build\darknet\x64\data\obj.names,內容如下,須列出所有類別:
Rabbits
新增檔案 build\darknet\x64\data\obj.data,內容如下:
# 視類別個數調整
classes = 1
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = backup/
複製訓練資料(*.jpg、 *.txt) 至 build\darknet\x64\data\obj\ 目錄(需新增)。部分檔名過長,訓練可能出現錯誤,可修改成較短的檔名。使用Labelimg開啟上述目錄,可觀看標註的圖像,如下:
新增檔案 build\darknet\x64\data\train.txt,檔案內容為每個圖像檔名。前面加data/obj/。
訓練指令如下,若訓練時有些檔案找不到,試著將檔名及txt檔名改短:
darknet.exe detector train data/obj.data cfg/yolo-obj.cfg weights/yolov4.conv.137
筆者訓練約2小時,過程的損失函數如下圖,最後會存至 chart_yolo-obj.png。
訓練後的權重檔會儲存在backup目錄,檔名為 yolo-obj_final.weights。
如果訓練中途停止,或要延長訓練週期,可執行指令如下:
darknet.exe detector train data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_2000.weights
其中yolo-obj_2000.weights為執行2000訓練週期的權重檔,以上指令表示由第2000週期繼續訓練。
darknet.exe detector test data/obj.data cfg\yolo-obj.cfg backup\yolo-obj_final.weights
或者
darknet detector test data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_final.weights data\obj\4616855_80b098a3_jpg.rf.a0a319f1836215681493f06c81856b99.jpg
或者一次測試多個檔案:
darknet detector test data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_final.weights < data/train.txt
輸出如下:
修改darknet.py 最後第三行,指定相關設定檔:
import sys
print(performDetect(sys.argv[1], configPath = "./cfg/yolo-obj.cfg", weightPath = "./backup/yolo-obj_final.weights", metaPath= "./data/obj.data"))
測試指令如下:
python .\darknet_custom.py data\obj\4616855_80b098a3_jpg.rf.a0a319f1836215681493f06c81856b99.jpg
輸出如下:
也可以自網路上下載圖檔試試看,注意要是同品種的兔兔,白兔可認不出來喔。
工商廣告一下:
PyTorch:
開發者傳授 PyTorch 秘笈
預計 2022/6/20 出版。
TensorFlow:
深度學習 -- 最佳入門邁向 AI 專題實戰。
感謝分享!!!
另外在跟著實作的過程,有發現步驟10的filters=8應該改為filters=18
Joy,
謝謝你的指正,文章已更新。