使用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
文件夾:保存全部圖片源文件。 -
SegmentationClass
,SegmentationObject
保存用於圖像分割的源圖片,兩者區別如圖所示:
創建標籤
標籤結構:("類別",“中心點x座標”,“中心點y”座標,“圖片寬度”,“圖片高度”)
# 在scripts文件夾內
python voc_label.py
執行成功後會生成一個label文件夾和三個txt文件,分別是2007_train.txt,2007_test.txt,2007_val.txt,2012_train.txt
修改配置文件
打開darknet/cfg/voc.data
,修改train
,valid
文件路徑
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
:圖片旋轉角度,這個用來增強訓練效果的。從本質上來說,就是通過旋轉圖片來變相的增加訓練樣本集。
saturation
,exposure
,hue
:飽和度,曝光度,色調,這些都是爲了增強訓練效果用的。
learning_rate
:學習率,訓練發散的話可以降低學習率。學習遇到瓶頸,loss不變的話也減低學習率。
max_batches
: 最大迭代次數。
policy
:學習策略,一般都是step這種步進式。
step
,scales
:這兩個是組合一起的,舉個例子: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訓練自己的數據集的一些心得