Python影像辨識筆記(十二):使用YOLOv4進行COCO資料集訓練

注意:

[1]AlexeyAB版本中,labels的txt文件必須和images在同一個目錄底下,否則訓練過程中會出現loss都是0的問題[2]如果訓練時出現NaN的狀況:1.調低learning_rate、2.scales可調成.01[3]如果遇到無法載入圖片的問題,可能的原因:(1)在Windows作業系統上編輯了資料集圖片路徑清單導致(2)資料集圖片解壓縮不完整,請將整個資料夾移除後,重新下載[4]如果沒有OpenCV的話,會遇到無法使用mosaic資料增強、chart.png輸出的問題,盡量在有OpenCV的環境上進行訓練,除此之外,模型訓練出來的mAP可能會比有OpenCV的少將近2%[5]chart.png可以用來判斷loss有沒有隨著訓練次數越多而跟著下降,並且從中觀察有沒有overfitting

參考資料:

https://github.com/AlexeyAB/darknet/wiki

前言:

本次有幸使用四顆NVIDIA Tesla V100的GPU,進行YOLOv4 Model的訓練,在訓練效能上,比以前只用Jetson TX2快上許多。

因此,我想藉由這次機會,和大家分享,如何自己訓練COCO Dataset的YOLOv4 Model。

本文:

下載darknet

$ git clone https://github.com/AlexeyAB/darknet
$ cd darknet

修改Makefile並進行darknet編譯

本文假設讀者已完成GPU、CuDNN……等相關設定,因此不再贅述

由於所使用的Server因為一些因素,無法使用OpenCV,我們就維持OPENCV=0的狀態

$ sudo nano Makefile#參數調整如下
GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=0
AVX=0
OPENMP=0
LIBSO=0
$ make

下載COCO Dataset(darknet/)

# 這個script能夠自動下載並建立COCO資料集所需的文件
# 如果訓練的時候還是遇到錯誤,可以手動一行一行的執行command,避免錯誤產生
$ ./scripts/get_coco_dataset.sh

下載yolov4.conv.137(用來進行Model訓練)(darknet/)

$ wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137

(選)準備測試集
目的是為了要進行COCO Server的mAP測試,如果不需要可跳過

$ wget http://images.cocodataset.org/zips/test2017.zip
$ unzip test2017.zip
$ wget
https://raw.githubusercontent.com/AlexeyAB/darknet/master/scripts/testdev2017.txt
$ mv testdev2017.txt /yanwei.liu/darknet/coco/testdev2017.txt# 注意,testdev2017.txt的檔案路徑,必須自己手動修改成對應路徑

修改coco.data(darknet/cfg/coco.data)
[1]再次留意trainvalno5k.txt和testdev2017.txt中的內容

$ nano coco.data#將train、valid改成屬於自己路徑的資料夾
classes= 80
train = /yanwei.liu/darknet/coco/trainvalno5k.txt
valid = yanwei.liu/darknet/coco/testdev2017.txt
names = /yanwei.liu/darknet/data/coco.names
backup = /yanwei.liu/darknet/backup/
eval=coco
trainvalno5k.txt的範例內容(只顯示一筆)
/yanwei.liu/darknet/coco/images/train2014/COCO_train2014_XXXXXX.jpg
testdev2017.txt的範例內容(只顯示一筆)
/yanwei.liu/darknet/coco/images/test2017/XXXXXX.jpg

設定cfg檔案(darknet/cfg)

$ cd darknet/cfg
$ cp yolov4-custom.cfg yolov4-coco.cfg #建立yolov4-coco.cfg檔案
$ nano yolov4-coco.cfg
[net]
# Training
batch=64 #若電腦較慢者batch和subdivisions都先改成1
#僅測試,若一直 使用1會造成後續predict無bounding box
subdivisions=8 #在Tesla V100上,subdivisions可以用8(416x416)
width=416 #在Tesla V100上使用608會出現Out of memory,先改成416
height=416
channels=3
momentum=0.949
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
learning_rate=0.001
burn_in=1000
max_batches = 160000 #使用2000*Class數量,如果有80個class就是2000*80
policy=steps #然而,500500次訓練的mAP會比160000的好上不少
steps=128000,144000 #80%*max_batches,90%*max_batches
scales=.1,.1
#cutmix=1
mosaic=0 #由於Server目前沒有OpenCV的關係,mosaic要改成0

開始訓練(darknet/)

$ cd darknet
$ ./darknet detector train cfg/coco.data cfg/yolov4-coco.cfg yolov4.conv.137 -gpus 0,1,2,3 -map |tee -a trainRecord.txt
#上面的指令讀取coco.data中設定的 train & valid圖片路徑、label names、上個步驟的yolov4-coco.cfg作為神經層設定、yolov4.conv.137作為用來幫助訓練的Pre-trained Model、-gpus 0,1,2,3使用了4顆GPU、-map會顯示mAP、tee指令將output輸出至trainRecord.txt文件,可供後續資料視覺化,了解訓練過程$ ./darknet detector train cfg/coco.data cfg/yolov4-coco.cfg yolov4.conv.137 -gpus 0 -dont_show -mjpeg_port 8090 -map |tee -a trainRecord.txt#上面的指令是在有OpenCV環境下使用, -dont_show代表著在無GUI環境的Server上不顯示chart.png,-mjpeg_port 8090代表將訓練即時輸出到Server IP位址的8090 Port

Written by

Machine Learning / Deep Learning / Python / Flutter cakeresume.com/yanwei-liu

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store