環境: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]
層的random
從1
改爲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-2
,Classes,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訓練好了一個自己的目標檢測器。
下一篇打算整理一下,實際操作過程中的一些小技巧和訓練過程可視化。