1. 程式人生 > >在VOC上訓練 darknet yolov3

在VOC上訓練 darknet yolov3

資料集

需要voc2007和voc2012, 目錄結構如下


 VOCdevkit/VOC2007
 VOCdevkit/VOC2012

darknet/sctripts/voc_label.py 在VOCdevkit目錄下執行該指令碼,生成若干txt,裡面都是絕對路徑
其中train.all.txt是所有圖片的列表, train.txt是除了voc2007 test以外的圖片列表,訓練時可以使用train.txt,用2007_test.txt作測試

另外VOCdevkit/VOC2007/labels和VOCdevkit/VOC2012/labels目錄下生成很多label檔案,裡面一行表示一個目標


class, x,y,w,h

其中(x,y,w,h)表示目標位置,對影象寬高作了歸一化,注意(x,y)是中心點

此處只需要把train.txt和2007_test.txt
修改darknet/cfg/voc.cfg中


classes= 20
train = <path-to-voc>/train.txt
valid = <path-to-voc>2007_test.txt
names = data/voc.names
backup = backup

其中data/voc.names在darknet/data/目錄下,記錄voc中類別名字

預訓練模型

下載一個在imagenet上預訓練的darknet53,放在darknet目錄下


 wget https://pjreddie.com/media/files/darknet53.conv.74

啟動訓練

3.1 修改cfg/yolov3-voc.cfg中


batch_size = 64
subdivision = 16

如果遇到GPU記憶體不夠的情況,可以適度增大subdividaion的值,當然不能超過batch_size

3.2 ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
GPU記憶體4G不到,但有時會升高到7G多, 訓練中一個關鍵指標是Avg IOU, 這個值可以偶爾為nan,但是不能一直為nan
iteration列印類似下面的結果


135: 210.697388, 304.020233 avg, 0.000000 rate, 11.308264 seconds, 8640 images

其中


iteration = 135
loss = 210.697388
avg loss = 304.020233

測試


./darknet detect cfg/yolov3-voc.cfg backup/yolov3-voc.backup data/dog.jpg

上面的命令預設使用coco的類別名,所以會看到定位正確,但類比不對

正確的命令如下


./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc.backup data/dog.jpg

下面的命令會批量處理圖片,結果儲存在results目錄下,但不會自動統計recalling


./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc.backup  

50多個epoch,avg loss 0.8左右,看了幾個圖,定位不錯,類比還有錯誤的