關於yolo配置文件以及訓練時各參數的含義


一、配置文件yolo.cfg

 

[net]
# Testing #測試模式
batch=1
subdivisions=1
# Training #訓練模式 每次前向圖片的數目=batch/subdivisions
# batch=64
# subdivisions=16
#關於batch與subdivision:在訓練輸出中,訓練迭代包括8組,這些batch樣本又被平均分成subdivision=8次送入網絡參與訓練,以減輕內存占用的壓力;batch越大,訓練效果越好,subdivision越大,占用內存壓力越小

width=416
height=416
channels=3
#網絡輸入的寬、高、通道數這三個參數中,要求width==height, 並且為32的倍數,大分辨率可以檢測到更加細小的物體,從而影響precision

momentum=0.9 #動量,影響梯度下降到最優的速度,一般默認0.9
decay=0.0005 #權重衰減正則系數,防止過擬合
angle=0 #旋轉角度,從而生成更多訓練樣本
saturation = 1.5 #調整飽和度,從而生成更多訓練樣本
exposure = 1.5 #調整曝光度,從而生成更多訓練樣本
hue=.1 #調整色調,從而生成更多訓練樣本

learning_rate=0.001
#學習率決定了權值更新的速度,學習率大,更新的就快,但太快容易越過最優值,而學習率太小又更新的慢,效率低,一般學習率隨着訓練的進行不斷更改,先高一點,然后慢慢降低,一般在0.01--0.001

burn_in=1000
#學習率控制的參數,在迭代次數小於burn_in時,其學習率的更新有一種方式,大於burn_in時,才采用policy的更新方式
max_batches = 50200
#迭代次數,1000次以內,每訓練100次保存一次權重,1000次以上,每訓練10000次保存一次權重
policy=steps # 學習率策略,學習率下降的方式
steps=40000,45000 #學習率變動步長
scales=.1,.1
#學習率變動因子:如迭代到40000次時,學習率衰減十倍,45000次迭代時,學習率又會在前一個學習率的基礎上衰減十倍

[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 #激活函數類型


[yolo]
mask = 6,7,8 #使用anchor時使用前三個尺寸
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
#anchors是可以事先通過cmd指令計算出來的,是和圖片數量,width,height以及cluster(就是下面的num的值,即想要使用的anchors的數量)相關的預選框,可以手工挑選,也可以通過k-means算法從訓練樣本中學出

classes=20
num=9
#每個grid cell預測幾個box,和anchors的數量一致。當想要使用更多anchors時需要調大num,且如果調大num后訓練時Obj趨近0的話可以嘗試調大object_scale
jitter=.3 #通過抖動來防止過擬合,jitter就是crop的參數
ignore_thresh = .5
#ignore_thresh 指得是參與計算的IOU閾值大小。當預測的檢測框與ground true的IOU大於ignore_thresh的時候,參與loss的計算,否則,檢測框的不參與損失計算,目的是控制參與loss計算的檢測框的規模,當ignore_thresh過於大,接近於1的時候,那么參與檢測框回歸loss的個數就會比較少,同時也容易造成過擬合;而如果ignore_thresh設置的過於小,那么參與計算的會數量規模就會很大。同時也容易在進行檢測框回歸的時候造成欠擬合。
#參數設置:一般選取0.5-0.7之間的一個值,之前的計算基礎都是小尺度(13*13)用的是0.7,(26*26)用的是0.5。這次先將0.5更改為0.7。
truth_thresh = 1
random=1 #如果顯存小,設置為0,關閉多尺度訓練,random設置成1,可以增加檢測精度precision,每次迭代圖片大小隨機從320到608,步長為32,如果為0,每次訓練大小與輸入大小一致

 

batch:每次迭代要進行訓練的圖片數量

subdivision:batch中的圖片再產生子集,源碼中的圖片數量int imgs = net.batch * net.subdivisions * ngpus

也就是說每輪迭代會從所有訓練集里隨機抽取 batch = 64 個樣本參與訓練,每個batch又會被分成 64/16 = 4 次送入網絡參與訓練,以減輕內存占用的壓力,也就是每次 subdivision = 16 送入網絡

width:輸入圖片寬度, height:輸入圖片高度,channels :輸入圖片通道數

對於每次迭代訓練,YOLO會基於角度(angle),飽和度(saturation),曝光(exposure),色調(hue)產生新的訓練圖片

angle:圖片角度變化,單位為度,假如 angle=5,就是生成新圖片的時候隨機旋轉-5~5度

weight decay:權值衰減

防止過擬合,當網絡逐漸過擬合時網絡權值往往會變大,因此,為了避免過擬合,在每次迭代過程中以某個小因子降低每個權值,也等效於給誤差函數添加一個懲罰項,常用的懲罰項是所有權重的平方乘以一個衰減常量之和。權值衰減懲罰項使得權值收斂到較小的絕對值。

angle:圖片角度變化,單位為度,假如 angle=5,就是生成新圖片的時候隨機旋轉-5~5度

saturation & exposure: 飽和度與曝光變化大小,tiny-yolo-voc.cfg中1到1.5倍,以及1/1.5~1倍

hue:色調變化范圍,tiny-yolo-voc.cfg中-0.1~0.1

max_batches:最大迭代次數

learning rate:學習率

學習率決定了參數移動到最優值的速度快慢,如果學習率過大,很可能會越過最優值導致函數無法收斂,甚至發散;反之,如果學習率過小,優化的效率可能過低,算法長時間無法收斂,也易使算法陷入局部最優(非凸函數不能保證達到全局最優)。合適的學習率應該是在保證收斂的前提下,能盡快收斂。
設置較好的learning rate,需要不斷嘗試。在一開始的時候,可以將其設大一點,這樣可以使weights快一點發生改變,在迭代一定的epochs之后人工減小學習率。

policy:調整學習率的策略

調整學習率的policy,有如下policy:CONSTANT, STEP, EXP, POLY,STEPS, SIG, RANDOM

steps:學習率變化時的迭代次數

根據batch_num調整學習率,若steps=100,20000,30000,則在迭代100次,20000次,30000次時學習率發生變化,該參數與policy中的steps對應

scales:學習率變化的比率

相對於當前學習率的變化比率,累計相乘,與steps中的參數個數保持一致

 

二、訓練時的參數含義

  • 397: 指示當前訓練的迭代次數
  • 7.748884: 是總體的Loss(損失)
  • 7.593599 avg: 是平均Loss,這個數值應該越低越好,一般來說,一旦這個數值低於0.060730 avg就可以終止訓練了。
  • 0.000025 rate: 代表當前的學習率,是在.cfg文件中定義的。
  • 5.510836 seconds: 表示當前批次訓練花費的總時間。
  • 25408 images: 這一行最后的這個數值是397*64的大小,表示到目前為止,參與訓練的圖片的總量。
  • Avg IOU: 0.574694: 表示在當前subdivision內的圖片的平均IOU,代表預測的矩形框和真實目標的交集與並集之比,這里是57.46%,這個模型需要進一步的訓練。
  • Class: 0.962937: 標注物體分類的正確率,期望該值趨近於1。
  • Obj: 0.022145: 越接近1越好。
  • No Obj: 0.000459: 期望該值越來越小,但不為零。
  • count: 2:count后的值是所有的當前subdivision圖片(本例中一共8張)中包含正樣本的圖片的數量。在輸出log中的其他行中,可以看到其他subdivision也有的只含有<16個正樣本,說明在subdivision中含有不含檢測對象的圖片。

參考:

https://blog.csdn.net/la_fe_/article/details/81623869

https://blog.csdn.net/a8039974/article/details/90443950


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM