YOLO目標檢測

使用VOC數據訓練模型

下載數據集

我們將使用Pascal VOC數據集訓練我們的模型,該數據集可以用來做圖像分類、目標檢測、圖像分割。
下載地址:
將下載的三個VOC數據集壓縮文件放在darknet/scripts/中,使用以下命令解壓:

tar xf voc.tar && tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar && tar xf VOCtest_06-Nov-2007.tar
  • Annotations文件夾:用於存放圖片描述,文件格式爲.xml,文件保存了圖片文件名,尺寸,標註,座標,是否分割等信息。

  • ImageSets文件夾:保存了不同用途的圖片名字列表,文件格式是.txt。其中包括,
    layout文件夾:保存具有人體部位的圖片名字列表。
    main文件夾:保存用於圖像物體識別的圖片名字列表。
    segmenttions文件夾:保存用於圖像分割的圖片名字列表。

  • JPEGImages文件夾:保存全部圖片源文件。

  • SegmentationClassSegmentationObject保存用於圖像分割的源圖片,兩者區別如圖所示:

創建標籤

標籤結構:("類別",“中心點x座標”,“中心點y”座標,“圖片寬度”,“圖片高度”)

# 在scripts文件夾內
python voc_label.py

執行成功後會生成一個label文件夾和三個txt文件,分別是2007_train.txt2007_test.txt2007_val.txt2012_train.txt

修改配置文件

打開darknet/cfg/voc.data,修改trainvalid文件路徑

classes:數據集中圖片分類數量。
train:用於訓練的圖片數據集絕對路徑。
valid:用於驗證的圖片數據集絕對路徑。
names:數據集中圖片分類名字,如:“dog”,“person”等。
backup:模型訓練完成後,權重文件保存路徑。

模型訓練

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

備用下載:

修改cfg/yolov3-voc.cfg

[net]
# 模型測試模式
# Testing
# batch=1
# subdivisions=1 

# 模型訓練模式
#Training 
# batch_size
batch=64
subdivisions=16
#用於進一步分割batch_size,分割後的batch_size大小爲:batch_size/subdivisions

# 模型輸入圖像寬
width=416
# 模型輸入圖像高
height=416
# 圖像通道數
channels=3
# 使用帶動量優化函數的動量參數
momentum=0.9
# 權重衰減率,用於防止過擬合
decay=0.0005

# 以下4項是通過改變圖像角度,飽和度,曝光量,色調來生成更多樣本,可用於防止過擬合
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

# 初始學習率
learning_rate=0.001
burn_in=1000
# 迭代次數
max_batches = 50200
# 當迭代到40000,45000時更改學習率
policy=steps
steps=40000,45000
scales=.1,.1

[convolutional]
# BN標準化處理,可以通過改變數據分佈,處理梯度過小問題,加快模型收斂
batch_normalize=1
# 輸出特徵大小
filters=32
# 卷積核大小3x3
size=3
# 卷積步長爲1
stride=1
# pad爲0,padding由 padding參數指定。如果pad爲1,padding大小爲size/2
pad=1
# 激活函數,和relu的區別是當輸入值小於0時,輸出不爲0
activation=leaky

**。。。。。省略。。。。。。**

[yolo]
mask = 0,1,2
# 預選框,可手動指定也可通過聚類學習得到
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
# 識別種類
classes=20
# 每個cell預測box數量,yolov1時只有一個
num=9
# 增加噪聲
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

執行訓練:

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

停止繼續訓練:

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

訓練完成後,權重文件保存在backup文件夾內。

參數解釋

  • cfg文件參數含義

batch: 每一次迭代送到網絡的圖片數量,也叫批數量。增大這個可以讓網絡在較少的迭代次數內完成一個epoch。在固定最大迭代次數的前提下,增加batch會延長訓練時間,但會更好的尋找到梯度下降的方向。如果你顯存夠大,可以適當增大這個值來提高內存利用率。這個值是需要大家不斷嘗試選取的,過小的話會讓訓練不夠收斂,過大會陷入局部最優。

subdivision:這個參數很有意思的,它會讓你的每一個batch不是一下子都丟到網絡裏。而是分成subdivision對應數字的份數,一份一份的跑完後,在一起打包算作完成一次iteration。這樣會降低對顯存的佔用情況。如果設置這個參數爲1的話就是一次性把所有batch的圖片都丟到網絡裏,如果爲2的話就是一次丟一半。

angle:圖片旋轉角度,這個用來增強訓練效果的。從本質上來說,就是通過旋轉圖片來變相的增加訓練樣本集。

saturationexposurehue:飽和度,曝光度,色調,這些都是爲了增強訓練效果用的。

learning_rate:學習率,訓練發散的話可以降低學習率。學習遇到瓶頸,loss不變的話也減低學習率。

max_batches: 最大迭代次數。

policy:學習策略,一般都是step這種步進式。

stepscales:這兩個是組合一起的,舉個例子:learn_rate: 0.001, step:100,25000,35000 scales: 10, .1, .1 這組數據的意思就是在0-100次iteration期間learning rate爲原始0.001,在100-25000次iteration期間learning rate爲原始的10倍0.01,在25000-35000次iteration期間learning rate爲當前值的0.1倍,就是0.001, 在35000到最大iteration期間使用learning rate爲當前值的0.1倍,就是0.0001。隨着iteration增加,降低學習率可以是模型更有效的學習,也就是更好的降低train loss。

最後一層卷積層中filters數值是 3 * (classes + 5)(YOLOv3)。

region裏需要把classes改成你的類別數。

最後一行的random,是一個開關。如果設置爲1的話,就是在訓練的時候每一batch圖片會隨便改成320-640(32整倍數)大小的圖片。目的和上面的色度,曝光度等一樣。如果設置爲0的話,所有圖片就只修改成默認的大小 416*416。

  • 訓練log中各參數的意義

Region Avg IOU:平均的IOU,代表預測的bounding box和ground truth的交集與並集之比,期望該值趨近於1。

Class:是標註物體的概率,期望該值趨近於1.

Obj:期望該值趨近於1.

No Obj:期望該值越來越小但不爲零.

Avg Recall:期望該值趨近1

avg:平均損失,期望該值趨近於0

rate:當前學習率

推薦博客:
YOLO訓練自己的數據集的一些心得

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