yolov3.cfg參數說明及調參經驗


對代碼中配置文件yolov3.cfg部分解釋:

# Testing(此處下面的兩行,測試的時候開啟即可) #batch=1 # 每batch個樣本更新一次參數。 #subdivisions=1 # 如果內存不夠大,將batch分割為subdivisions個子batch,每個子batch的大小為batch/subdivisions。 # Training(此處下面的兩行,訓練的時候開啟即可) batch=64 # 表示網絡積累多少個樣本后進行一次正向傳播 subdivisions=16 # 將一個batch的圖片分sub次完成網絡的正向傳播 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 = 500200 # 訓練達到max_batches后停止學習 policy=steps # 調整學習率的policy,有如下policy:CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM steps=400000,450000 # 根據batch_num調整學習率 scales=.1,.1 # 學習率變化的比例,累計相乘 [convolutional] batch_normalize=1 # 是否做BN filters=32 # 卷積核的個數,也是輸出的特征圖的維度 size=3 # 卷積核的尺寸3*3 stride=1 # 做卷積運算的步長 pad=1 # 如果pad為0,padding由 padding參數指定。如果pad為1,padding大小為size/2 activation=leaky # 常用激活函數:logistic,relu,leaky,tanh

[net]                  
batch=64                     表示網絡積累多少個樣本后進行一次BP

subdivisions=16              這個參數表示將一個batch的圖片分sub次完成網絡的前向傳播,程中將一次性加載64張圖片進內存,然后分16次完成前向傳播,意思是每次4張,前向傳播的循環過程中
                             累加loss求平均,待64張圖片都完成前向傳播后,再一次性后傳更新參數
                             調參經驗:sub一般設置16,不能太大或太小,且為8的倍數,其實也沒啥硬性規定,看着舒服就好
                             batch的值可以根據顯存占用情況動態調整,一次性加減sub大小即可,通常情況下batch越大越好,還需
                             注意一點,在測試的時候batch和sub都設置為1,避免發生神秘錯誤!

width=608                    網絡輸入的寬width
height=608                   網絡輸入的高height
channels=3                   網絡輸入的通道數channels
                             width和height一定要為32的倍數,否則不能加載網絡
                             提示:width也可以設置為不等於height,通常情況下,width和height的值越大,對於小目標的識別
                             效果越好,但受到了顯存的限制,讀者可以自行嘗試不同組合
                            
momentum=0.9                 動量 DeepLearning1中最優化方法中的動量參數,這個值影響着梯度下降到最優值得速度
decay=0.0005                 權重衰減正則項,防止過擬合

angle=0                      數據增強參數,通過旋轉角度來生成更多訓練樣本
saturation = 1.5             數據增強參數,通過調整飽和度來生成更多訓練樣本
exposure = 1.5               數據增強參數,通過調整曝光量來生成更多訓練樣本
hue=.1                       數據增強參數,通過調整色調來生成更多訓練樣本

learning_rate=0.001          學習率決定着權值更新的速度,設置得太大會使結果超過最優值,太小會使下降速度過慢。
                             如果僅靠人為干預調整參數,需要不斷修改學習率。剛開始訓練時可以將學習率設置的高一點,
                             而一定輪數之后,將其減小在訓練過程中,一般根據訓練輪數設置動態變化的學習率。
                             剛開始訓練時:學習率以 0.01 ~ 0.001 為宜。一定輪數過后:逐漸減緩。
                             接近訓練結束:學習速率的衰減應該在100倍以上。
                             學習率調整一定不要太死,實際訓練過程中根據loss的變化和其他指標動態調整,手動ctrl+c結
                             束此次訓練后,修改學習率,再加載剛才保存的模型繼續訓練即可完成手動調參,調整的依據是根據訓練
                             日志來,如果loss波動太大,說明學習率過大,適當減小,變為1/5,1/10均可,如果loss幾乎不變,
                             可能網絡已經收斂或者陷入了局部極小,此時可以適當增大學習率,注意每次調整學習率后一定要訓練久
                             一點,充分觀察,調參是個細活,慢慢琢磨
                             一點小說明:實際學習率與GPU的個數有關,例如你的學習率設置為0.001,如果你有4塊GPU,那
                             真實學習率為0.001/4
burn_in=1000                 在迭代次數小於burn_in時,其學習率的更新有一種方式,大於burn_in時,才采用policy的更新方式
max_batches = 500200         訓練次數達到max_batches后停止學習,一次為跑完一個batch

policy=steps                 學習率調整的策略:constant, steps, exp, poly, step, sig, RANDOM,constant等方式
                            
steps=400000,450000          steps和scale是設置學習率的變化,比如迭代到400000次時,學習率衰減十倍,45000次迭代時,學
scales=.1,.1                 習率又會在前一個學習率的基礎上衰減十倍
                            

[convolutional]為卷積層,詳細注釋如下:

[convolutional]              一層卷積層的配置說明
batch_normalize=1            是否進行BN處理
filters=32                   卷積核個數,也是輸出通道數
size=3                       卷積核尺寸
stride=1                     卷積步長
pad=1                        卷積時是否進行0 padding,padding的個數與卷積核尺寸有關,為size/2向下取整,如3/2=1
activation=leaky             網絡層激活函數
                             卷積核尺寸3*3配合padding且步長為1時,不改變feature map的大小

[shortcut]層詳細注釋如下:

[shortcut]                   shotcut層配置說明
from=-3                      與前面的多少次進行融合,-3表示前面第三層
activation=linear            層次激活函數

[yolo]層詳細注釋如下:

[yolo]                       YOLO層配置說明
mask = 0,1,2                 使用anchor的索引,0,1,2表示使用下面定義的anchors中的前三個anchor
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326  
classes=80                   類別數目
num=9                        每個grid cell總共預測幾個box,和anchors的數量一致。當想要使用更多anchors時需要調大num
jitter=.3                    數據增強手段,此處jitter為隨機調整寬高比的范圍
ignore_thresh = .7
truth_thresh = 1             參與計算的IOU閾值大小.當預測的檢測框與ground truth的IOU大於ignore_thresh的時候,參與
                             loss的計算,否則,檢測框的不參與loss計算。
                             理解:目的是控制參與loss計算的檢測框的規模,當ignore_thresh過於大,接近於1的時候,那么參與
                             檢測框回歸loss的個數就會比較少,同時也容易造成過擬合;而如果ignore_thresh設置的過於小,那么
                             參與計算的會數量規模就會很大。同時也容易在進行檢測框回歸的時候造成欠擬合。
                             參數設置:一般選取0.5-0.7之間的一個值,之前的計算基礎都是小尺度(13*13)用的是0.7,(26*26)用的是0.5。這次先將0.5更改為0.7。

random=1                     為1打開隨機多尺度訓練,為0則關閉
                             提示:當打開隨機多尺度訓練時,前面設置的網絡輸入尺寸width和height其實就不起作用了,width
                             會在320到608之間隨機取值,且width=height,沒10輪隨機改變一次,一般建議可以根據自己需要修改
                             隨機尺度訓練的范圍,這樣可以增大batch

 

調參經驗:[1]

  1. 在Darknet中,batch和subdivisions是結合使用的,例如這兒的batch=64,subdivisions=16表示訓練的過程中將一次性加載64張圖片進內存,然后分16次完成前向傳播,意思是每次4張,前向傳播的循環過程中累加loss求平均,待64張圖片都完成前向傳播后,再一次性后傳更新參數。
  2. subdivisions一般設置16,根據嘗試,通常設置為8的倍數,batch的值可以根據顯存占用情況動態調整,一次性加減subdivisions大小即可,通常情況下batch越大越好,還需注意一點,在測試的時候修改batch和subdivisions參數為1,避免發生錯誤。
  3. width也可以設置為不等於height,通常情況下,width和height的值越大,對於小目標的識別效果越好,但受到了顯存的限制,讀者可以自行嘗試不同組合。
  4. 一次為跑完一個batch,訓練次數達到max_batches后停止學習。max_batches的數量為檢測的目標數 * 2000 ,如果數據量比較小的時候,max_batches是因該設置大一些,要不然會發生欠擬合。
  5. momentum動量系數,DeepLearning中最優化方法中的動量參數,這個值影響着梯度下降到最優值得速度。
  6. 實際學習率learning_rate與GPU的個數有關,例如你的學習率設置為0.001,如果你有4塊GPU,那真實學習率為0.001/4。
  7. 在迭代次數小於burn_in時,其學習率的更新有一種方式,大於burn_in時,才采用下面的policy的更新方式。
  8. policy學習率調整的策略:constant, steps, exp, poly, step, sig, RANDOM,constant等方式。
  9. stepsscale是設置學習率的變化,比如迭代到400000次時,學習率衰減十倍,45000次迭代時,學習率又會在前一個學習率的基礎上衰減十倍。

 

                                            訓練一次迭代的log 圖1

疑問以及解決方案
如果你看到avg loss =nan 說明訓練錯誤; 某一行的Class=-nan說明目標太大或者太小,某個尺度檢測不到,屬於正常  
什么時候應該停止訓練? 當loss不在下降或者下降極慢的情況可以停止訓練,一般loss=0.7左右就可以了
在訓練集上測試正確率很高,在其他測試集上測試效果很差,說明過擬合了。 提前停止訓練,或者增大樣本數量訓練
如何提高目標檢測正確率包括IOU,分類正確率

設置yolo層 random =1,增加不同的分辨率。或者增大圖片本身分辨率。或者根據你自定義的數據集去重新計算anchor尺寸(darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416 then set the same 9 anchors in each of 3 [yolo]-layers in your cfg-file)

如何增加訓練樣本?

樣本特點盡量多樣化,亮度,旋轉,背景,目標位置,尺寸

添加沒有標注框的圖片和其空的txt文件,作為negative數據

訓練的圖片較小,但是實際檢測圖片大,怎么檢測小目標

1.使在用416*416訓練完之后,也可以在cfg文件中設置較大的width和height,增加網絡對圖像的分辨率,從而更可能檢測出圖像中的小目標,而不需要重新訓練

2.

set `[route] layers = -1, 11`

set ` [upsample] stride=4`

 

網絡模型耗費資源多大?

(我用過就兩個)

[yolov3.cfg]  [236MB COCO-91類]  [4GB GPU-RAM]

[yolov3.cfg]  [194MB VOC-20類]  [4GB GPU-RAM]

 

[yolov3-tiny.cfg]  [34MB COCO-91類]  [1GB GPU-RAM]

[yolov3-tiny.cfg]  [26MB VOC-20類]  [1GB GPU-RAM]

多GPU怎么訓練
  1. 首先用一個gpu訓練1000次迭代后的網絡,
  2. 再用多gpu訓練

darknet.exe detector train data/voc.data cfg/yolov3-voc.cfg /backup/yolov3-voc_1000.weights -gpus 0,1,2,3  

有哪些命令行來對神經網絡進行訓練和測試?

1.檢測圖片: build\darknet\x64\darknet.exe detector test data/coco.data cfg/yolov3.cfg yolov3.weights  -thresh 0.25 xxx.jpg

2.檢測視頻:將test 改為 demo ; xxx.jpg 改為xxx.mp4

3.調用網絡攝像頭:將xxx.mp4 改為 http://192.168.0.80:8080/video?dummy=x.mjpg -i 0

4.批量檢測:-dont_show -ext_output < data/train.txt >  result.txt

5.手持端網絡攝像頭:下載mjpeg-stream 軟件, xxx.jpg 改為 IP Webcam / Smart WebCam

 

如何評價模型好壞

build\darknet\x64\darknet.exe detector map data\defect.data cfg\yolov3.cfg backup\yolov3.weights

 

利用上面命令計算各權重文件,選擇具有最高IoU(聯合的交集)和mAP(平均精度)的權重文件


免責聲明!

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



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