在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左右,看了幾個圖,定位不錯,類比還有錯誤的