yolo cfg文件解析

# Testing 初始batch參數要分爲兩類,分別爲訓練集和測試集,不同模式相應放開參數,#爲註釋符號
#batch=1
#subdivisions=1
# Training

batch=64 一批訓練樣本的樣本數量,每batch個樣本更新一次參數,整個batch前向完成之後進行.backup
subdivisions=8 batch/subdivisions作爲一次性送入訓練器的樣本數量
(subdivision是組數)
如果內存不夠大,將batch分割爲subdivisions個子batch
(subdivisions相當於分組個數,相除結果作爲一次送入訓練器的樣本數量)
注意:上面這兩個參數如果電腦內存小,則把batch改小一點,batch越大,訓練效果越好
Subdivisions越大,可以減輕顯卡壓力(分組數目越多,每組樣本數量則會更少,顯卡壓力也會相應減少)

width=416
height=416
channels=3
以上三個參數爲輸入圖像的參數信息 width和height影響網絡對輸入圖像的分辨率,從而影響precision,只可以設置成32的倍數(爲什麼是32?由於使用了下采樣參數是32,所以不同的尺寸大小也選擇爲32的倍數{320,352……608},最小320320,最大608608,網絡會自動改變尺寸,並繼續訓練的過程。)

momentum=0.9 DeepLearning1中最優化方法中的動量參數,這個值影響着梯度下降到最優值得速度 (注:SGD方法的一個缺點是其更新方向完全依賴於當前batch計算出的梯度,因而十分不穩定。Momentum算法借用了物理中的動量概念,它模擬的是物體運動時的慣性,即更新的時候在一定程度上保留之前更新的方向,同時利用當前batch的梯度微調最終的更新方向。這樣一來,可以在一定程度上增加穩定性,從而學習地更快,並且還有一定擺脫局部最優的能力)

decay=0.0005 權重衰減正則項,防止過擬合,正則項往往有重要意義
//增加樣本的數量,改變基礎樣本的狀態,去增加樣本整體的數量,增加樣本量減少過擬合
angle=0 通過旋轉角度來生成更多訓練樣本
saturation = 1.5 通過調整飽和度來生成更多訓練樣本
exposure = 1.5 通過調整曝光量來生成更多訓練樣本
hue=.1 通過調整色調來生成更多訓練樣本

learning_rate=0.001
學習率決定着權值更新的速度,設置得太大會使結果超過最優值,直接錯過最優值,震盪回去,太小會使下降速度過慢,導致收斂過慢。如果僅靠人爲干預調整參數,需要不斷修改學習率。剛開始訓練時可以將學習率設置的高一點,而一定輪數之後,將其減小。在訓練過程中,一般根據訓練輪數設置動態變化的學習率。
基本訓練守則
剛開始訓練時:學習率以 0.01 ~ 0.001 爲宜。
一定輪數過後:逐漸減緩。
接近訓練結束:學習速率的衰減應該在100倍以上。
提供參考資料學習率的調整參考https://blog.csdn.net/qq_33485434/article/details/80452941

burn_in=1000 在迭代次數小於burn_in時,其學習率的更新有一種方式,大於burn_in時,才採用policy的更新方式

max_batches = 500200 訓練達到max_batches後停止學習,多個batches

policy=steps 這個是學習率調整的策略,有policy:constant, steps, exp, poly, step, sig, RANDOM,constant等方式
調整學習率的policy,有如下policy:constant, steps, exp, poly, step, sig, RANDOM
constant
保持學習率爲常量,caffe裏爲fixed
steps
比較好理解,按照steps來改變學習率

Steps和scales相互一一對應
steps=40000,45000 下面這兩個參數steps和scale是設置學習率的變化,比如迭代到40000次時,學習率衰減十倍。45000次迭代時,學習率又會在前一個學習率的基礎上衰減十倍。根據batch_num調整學習率
scales=,.1,.1 學習率變化的比例,累計相乘

涉及幾個參數(以後要學習的代碼,具體參數可以調節)

exp
gamma=
返回base_lr*gamma^iter,iter爲當前迭代次數,gamma設置爲0.98

poly
power=4
max_batches=800000
對學習率進行多項式衰減。圖中power爲0.9

sig
學習率進行sigmod函數衰減
gamma= 0.05
step=200
效果如圖所示

step
返回net.learning_rate*pow(net.scale, batch_num/net.step)

[convolutional]
batch_normalize=1 是否做BN操作
filters=32 輸出特徵圖的數量
size=3 卷積核的尺寸
stride=1 做卷積運算的步長
pad=1 如果pad爲0,padding由 padding參數指定。
如果pad爲1,padding大小爲size/2,padding應該是對輸入圖像左邊緣拓展的像素數量
activation=leaky 激活函數的類型:logistic,loggy,relu,elu,relie,plse,hardtan,lhtan,linear,ramp,leaky,tanh,stair

# Downsample //以下爲訓練網絡結構。

[convolutional]
batch_normalize=1
filters=64
size=3
stride=2
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=32
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky
shortcut部分是卷積的跨層連接,就像Resnet中使用的一樣,參數from是−3,意思是shortcut的輸出是通過與先前的倒數第三層網絡相加而得到。跨越連接。
[shortcut]
from=-3
activation=linear
• 輸入與輸出:輸入與輸出一般保持一致,並且不進行其他操作,只是求差。
• 處理操作:res層來源於resnet,爲了解決網絡的梯度彌散或者梯度爆炸的現象,提出將深層神經網絡的逐層訓練改爲逐階段訓練,將深層神經網絡分爲若干個子段,每個小段包含比較淺的網絡層數,然後用shortcut的連接方式使得每個小段對於殘差進行訓練,每一個小段學習總差(總的損失)的一部分,最終達到總體較小的loss,同時,很好的控制梯度的傳播,避免出現梯度消失或者爆炸等不利於訓練的情形。

# Downsample

[convolutional]
batch_normalize=1
filters=128
size=3
stride=2
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=64
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=128
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=64
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=128
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

# Downsample
//下采樣
[convolutional]
batch_normalize=1
filters=256
size=3
stride=2
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

# Downsample

[convolutional]
batch_normalize=1
filters=512
size=3
stride=2
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

# Downsample

[convolutional]
batch_normalize=1
filters=1024
size=3
stride=2
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=1024
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=1024
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=1024
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=1024
size=3
stride=1
pad=1
activation=leaky

[shortcut]
from=-3
activation=linear

######################

[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky
重點來了
[convolutional]
size=1
stride=1
pad=1
filters=18
每一個[region/yolo]層前的最後一個卷積層中的 filters=num(yolo層個數)*(classes+5) ,5的意義是5個座標,論文中的tx,ty,tw,th,po
activation=linear

[yolo] //在yoloV2中yolo層叫region層,yolo2,3各自叫法不同
mask = 6,7,8 //訓練框
mask的值是0,1,2,這意味着使用第一,第二和第三個anchor。 這是有道理的,因爲檢測層的每個單元預測3個box。 總共有三個檢測層,共計9個anchor,
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
1.anchors是可以事先通過cmd指令計算出來的,是和圖片數量,width,height以及cluster(應該就是下面的num的值,即想要使用的anchors的數量)相關的預選框,可以手工挑選,也可以通過k means 從訓練樣本中學出
2.聚類的腳本放在github中
3. 預測框的初始寬高,第一個是w,第二個是h,總數量是num*2
classes=1
num=9 每個grid預測的BoundingBox num/yolo層個數
jitter=.3 利用數據抖動產生更多數據,YOLOv2中使用的是crop,filp,以及net層的angle,flip是隨機的,crop就是jitter的參數,tiny-yolo-voc.cfg中jitter=.2,就是在0~0.2中進行cr

ignore_thresh = .5
參數解釋:ignore_thresh 指得是參與計算的IOU閾值大小。當預測的檢測框與ground true的IOU大於ignore_thresh的時候,不會參與loss的計算,否則,檢測框將會參與損失計算。
參數目的和理解:目的是控制參與loss計算的檢測框的規模,當ignore_thresh過於大,接近於1的時候,那麼參與檢測框迴歸loss的個數就會比較少,同時也容易造成過擬合;而如果ignore_thresh設置的過於小,那麼參與計算的會數量規模就會很大。同時也容易在進行檢測框迴歸的時候造成欠擬合。
參數設置:一般選取0.5-0.7之間的一個值,之前的計算基礎都是小尺度(1313)用的是0.7,(2626)用的是0.5。這次先將0.5更改爲0.7。
truth_thresh = 1
random=1 random設置成1,可以增加檢測精度precision
//路由層 進行多尺度訓練
[route]
layers = -4
當屬性只有一個值時,它會輸出由該值索引的網絡層的特徵圖。 在我們的示例中,它是−4,所以層級將輸出路由層之前第四個層的特徵圖。
當圖層有兩個值時,它會返回由其值所索引的圖層的連接特徵圖。 在我們的例子中,它是−−1,61,並且該圖層將輸出來自上一層(-1)和第61層的特徵圖,並沿深度的維度連接。
[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[upsample]
stride=2

[route]
layers = -1, 61

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=512
activation=leaky

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=512
activation=leaky

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=512
activation=leaky

[convolutional]
size=1
stride=1
pad=1
filters=18
activation=linear

[yolo]
mask = 3,4,5
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=1
num=9
每個grid cell預測幾個box,和anchors的數量一致。當想要使用更多anchors時需要調大num,
且如果調大num後訓練時Obj趨近0的話可以嘗試調大object_scale

jitter=.3
利用數據抖動產生更多數據,YOLOv2中使用的是crop,filp,以及net層的angle,flip是隨機的, jitter就是crop的參數,tiny-yolo-voc.cfg中jitter=.3,就是在0~0.3中進行crop

ignore_thresh = .5 決定是否需要計算IOU誤差的參數,大於thresh,IOU誤差不會夾在cost function中
truth_thresh = 1
random=1 多尺度如果爲1,每次迭代圖片大小隨機從320到608,步長爲32,如果爲0,每次訓練大小與輸入大小一致
[route]
layers = -4

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[upsample]
stride=2

[route]
layers = -1, 36

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=256
activation=leaky

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=256
activation=leaky

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=256
activation=leaky

[convolutional]
size=1
stride=1
pad=1
filters=18
activation=linear

[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=1
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

原英文地址: https://timebutt.github.io/static/understanding-yolov2-training-output/
原中文翻譯地址:https://blog.csdn.net/dcrmg/article/details/78565440
8個分組,因此有八個subdivision,每個subdivision有八個照片
以上截圖顯示了所有訓練圖片的一個批次(batch),批次大小的劃分根據我們在 .cfg 文件中設置的subdivisions參數。在我使用的 .cfg 文件中 batch = 64 ,subdivision = 8,所以在訓練輸出中,訓練迭代包含了8組,每組又包含了8張圖片,跟設定的batch和subdivision的值一致。(注: 也就是說每輪迭代會從所有訓練集裏隨機抽取 batch = 64 個樣本參與訓練,所有這些 batch 個樣本又被均分爲 subdivision = 8 次送入網絡參與訓練,以減輕內存佔用的壓力)

• 9798: 指示當前訓練的迭代次數
• 0.370096: 是總體的Loss(損失)
• 0.451929 avg: 是平均Loss,這個數值應該越低越好,一般來說,一旦這個數值低於0.060730 avg就可以終止訓練了。
• 0.001000 rate: 代表當前的學習率,是在.cfg文件中定義的。
• 3.300000 seconds: 表示當前批次訓練花費的總時間。
• 627072 images: 這一行最後的這個數值是9798*64的大小,表示到目前爲止,參與訓練的圖片的總量。

• Region Avg IOU: 0.326577: 表示在當前subdivision內的圖片的平均IOU,代表預測的矩形框和真實目標的交集與並集之比,這裏是32.66%,這個模型需要進一步的訓練。
• Class: 0.742537: 標註物體分類的正確率,期望該值趨近於1。
• Obj: 0.033966: 越接近1越好。
• No Obj: 0.000793: 期望該值越來越小,但不爲零。
• Avg Recall: 0.12500: 是在recall/count中定義的,是當前模型在所有subdivision圖片中檢測出的正樣本與實際的正樣本的比值。在本例中,只有八分之一的正樣本被正確的檢測到。(和最開始初定的閾值有關係)
• count: 8:count後的值是所有的當前subdivision圖片(本例中一共8張)中包含正樣本的圖片的數量。在輸出log中的其他行中,可以看到其他subdivision也有的只含有6或7個正樣本,說明在subdivision中含有不含檢測對象的圖片。
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg voc/ darknet53.conv.74 -gpus 0,1,2,3

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