【筆記】YOLOv3訓練自己的數據集(2)——訓練和測試訓練效果

環境:Ubuntu18.04 GTX1080

3 訓練

3.1 修改配置文件

3.1.1 修改類別名稱顯示文件darknet/data/voc.names

這裏存放的是要檢測的類別的名稱,比如gun,就把原來的內容刪除掉,鍵入gun,即可,如果是多個類別,以回車分割各個類別。

cd darknet
cp data/voc.names data/voc.names.bak  #備份原文件
gedit data/voc.names

在這裏插入圖片描述

3.1.2 修改數據文件darknet/cfg/voc.data

cd darknet
cp cfg/voc.data cfg/voc.data.bak  #備份原文件
gedit cfg/voc.data
classes= 1 /*類別數*/
train  = /home/xxx/train.txt                  /*voc2yolo.py生成的train.txt所在路徑,建議使用絕對路徑*/
valid  =/home/xxx/2007_test.txt               /*voc2yolo.py生成的2007_test.txt所在路徑,建議使用絕對路徑*/
names = cfg/voc.names                         /*3.1中修改的voc.names所在路徑*/
backup = backup                              /*Darknet訓練結果的輸出路徑,一定要有,不然沒有輸出。*/

3.1.3 修改配置文件 darknet/cfg/yolov3-voc.cfg

下面是yolov3-voc.cfg內容簡介。

[net]
# Testing /*測試配置標籤*/
# batch=1   /*測試時批次大小*/
# subdivisions=1  
# Training /*訓練配置標籤*/
batch=64  /*訓練時批次大小*/
subdivisions=16   /*訓練時,每次參與訓練的圖片數,是batch/subdivisions*/
width=416  /*圖片寬度*/
height=416 /*圖片高度*/
channels=3/*圖片通道數*/
momentum=0.9/*動量,反向傳播用*/
decay=0.0005/*衰減率,反向傳播用*/
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

learning_rate=0.001
burn_in=1000
max_batches = 50200
policy=steps
steps=40000,45000
scales=.1,.1


/**下面是每層的網絡配置*/
[convolutional]/*這一層是卷積層*/
batch_normalize=1/*使用批量歸一化*/
filters=32/*濾波器個數*/
size=3/*濾波器尺寸*/
stride=1/*濾波器步長*/
pad=1/*填充*/
activation=leaky/*激活函數是 leaky relu*/

...

[shortcut]/*這個是仿ResNet的shortcut層*/
from=-3
activation=linear

...

[convolutional]/*yolo層之前的一個卷積層,比較重要*/
size=1
stride=1
pad=1
filters=75 /*3x(類別數+4+1)*/
activation=linear

[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=20 # 類別數
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1 /*如果顯存很小,將random設置爲0,關閉多尺度訓練*/
cd darknet
cp cfg/yolov3-voc.cfg cfg/yolov3-voc.cfg.bak  #備份原配置文件
gedit cfg/yolov3-voc.cfg

要修改的地方有那麼幾處
①如果Training配置被註釋,那麼要取消Training的註釋,並且把Testing註釋。
在這裏插入圖片描述
②如果你想修改圖片的大小也可以,但是要注意圖像的寬高都要是32的倍數,因爲Darknet53最後的特徵層的寬高是原圖的1/32。不過一般情況下,不需要更改。
在這裏插入圖片描述
③類別數修改爲自己想要的檢測的類別數,比如這裏僅僅檢測槍支,類別數classes=1
使用gedit打開yolov3-voc.cfg,按下Ctrl+F,右上角輸入框裏輸入classes,定位到classes出現的三個位置,統統改爲1

在這裏插入圖片描述
④修改filters,只需要修改[yolo]層前一個[convolutional]裏的filters,結果計算公式是filters=3x(類別數+4+1),這裏就是3x(1+4+1)=18
使用gedit打開yolov3-voc.cfg,按下Ctrl+F,右上角輸入框裏輸入yolo,定位到yolo出現的三個位置,找到上面第一個出現的[convolutional]filters,統統改爲18
在這裏插入圖片描述
⑤如果顯存太小,可以把[yolo]層的random1改爲0,關閉多尺度訓練,使得訓練能繼續下去。
方法同③,使用gedit打開yolov3-voc.cfg,按下Ctrl+F,右上角輸入框裏輸入random,定位到random出現的三個位置,統統改爲0
在這裏插入圖片描述

3.2 開始訓練

訓練時可以在預訓練模型上繼續訓練,也可以從頭開始訓練。

3.2.1 從預訓練模型開始訓練

cd darknet
wget https://pjreddie.com/media/files/darknet53.conv.74
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpu 0 | tee train_yolov3.log 

3.2.2 從頭開始訓練

cd darknet
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg  -gpu 0 | tee train_yolov3.log 

這裏把訓練日誌保存到darknet/train_yolov3.log,以便後面分析訓練過程,如可視化loss曲線等。

3.2.3 控制檯輸出解釋

在這裏插入圖片描述
①每組包含三條信息,分別是:Region 82,Region 94,Region 106,三個尺度上預測不同大小的框,82卷積層爲最大的預測尺度,使用較大的mask,但是可以預測出較小的物體,94卷積層爲中間的預測尺度,使用中等的mask,106卷積層爲最小的預測尺度,使用較小的mask,可以預測出較大的物體。
Region Avg IOU表徵在當前subdivision內的圖片的平均IOU,代表預測的矩形框和真實目標的交集與並集之比;Class表徵標註物體分類的正確率,期望該值趨近於1;Obj越接近1越好;No Obj期望該值越來越小,但不爲零;count是所有的當前subdivision圖片中包含正樣本的圖片的數量。
③最後一行是每個batch(本文中是64)處理完成後都會輸出的訓練信息。
24996:第24996組batch。
0.146299:該批次內的總損失
0.214918 avg:平均損失
0.001000 rate:當前的學習率
4.207787 seconds: 當前batch訓練所花的時間
1599744 images : 目前爲止參與訓練的圖片總數 = 24996 * 64
等到avg降到1e-1~1e-2Classes,Obj等也都接近於1時,就可以停止訓練了。

4 訓練結果測試

訓練結束之後
①進入3.1.2中配置的voc.data下指定的backup目錄,把yolov3-voc_xxx.weights中選擇一個xxx最大的拷貝到darknet目錄下,比如是yolov3-voc_20000.weights
②準備一張測試圖像放在darknet/data目錄下,比如是gun.jpg

 cd darknet 
 ./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg yolov3-voc_20000.weights data/gun.jpg

在這裏插入圖片描述

至此,便從零開始使用YOLOv3訓練好了一個自己的目標檢測器。
下一篇打算整理一下,實際操作過程中的一些小技巧和訓練過程可視化。

【未完待續…】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章