YOLOV3實戰4:Darknet中cfg檔案說明和理解
阿新 • • 發佈:2018-12-18
大家好,我是小p,從今天起,將逐漸從原始碼角度解析Darknet,歡迎加入物件檢測群813221712討論和交流,進群請看群公告! 今天將要說明的是Darknet中的cfg檔案,廢話少說,直接幹!(以cfg/yolov3.cfg為例,其它類似)
[net] ★ [xxx]開始的行表示網路的一層,其後的內容為該層的引數配置,[net]為特殊的層,配置整個網路 # Testing ★ #號開頭的行為註釋行,在解析cfg的檔案時會忽略該行 # batch=1 # subdivisions=1 # Training batch=64 ★ 這兒batch與機器學習中的batch有少許差別,僅表示網路積累多少個樣本後進行一次BP subdivisions=16 ★ 這個引數表示將一個batch的圖片分sub次完成網路的前向傳播 ★★ 敲黑板:在Darknet中,batch和sub是結合使用的,例如這兒的batch=64,sub=16表示訓練的過 程中將一次性載入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倍以上。 學習率的調整參考https://blog.csdn.net/qq_33485434/article/details/80452941 ★★★ 學習率調整一定不要太死,實際訓練過程中根據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等方式 參考https://nanfei.ink/2018/01/23/YOLOv2%E8%B0%83%E5%8F%82%E6%80%BB%E7%BB%93/#more steps=400000,450000 scales=.1,.1 ★ steps和scale是設定學習率的變化,比如迭代到400000次時,學習率衰減十倍,45000次迭代時,學 習率又會在前一個學習率的基礎上衰減十倍 [convolutional] ★ 一層卷積層的配置說明 batch_normalize=1 ★ 是否進行BN處理,什麼是BN此處不贅述,1為是,0為不是 filters=32 ★ 卷積核個數,也是輸出通道數 size=3 ★ 卷積核尺寸 stride=1 ★ 卷積步長 pad=1 ★ 卷積時是否進行0 padding,padding的個數與卷積核尺寸有關,為size/2向下取整,如3/2=1 activation=leaky ★ 網路層啟用函式 ★★ 卷積核尺寸3*3配合padding且步長為1時,不改變feature map的大小 # Downsample [convolutional] ★ 下采樣層的配置說明 batch_normalize=1 filters=64 size=3 stride=2 pad=1 activation=leaky ★★ 卷積核尺寸為3*3,配合padding且步長為2時,feature map變為原來的一半大小 [shortcut] ★ shotcut層配置說明 from=-3 ★ 與前面的多少次進行融合,-3表示前面第三層 activation=linear ★ 層次啟用函式 ...... ...... [convolutional] ★ YOLO層前面一層卷積層配置說明 size=1 stride=1 pad=1 filters=255 ★ filters=num(預測框個數)*(classes+5),5的意義是4個座標加一個置信率,論文中的tx,ty,tw,th, c,classes為類別數,COCO為80,num表示YOLO中每個cell預測的框的個數,YOLOV3中為3 ★★★ 自己使用時,此處的值一定要根據自己的資料集進行更改,例如你識別4個類,則: filters=3*(4+5)=27,三個fileters都需要修改,切記 activation=linear [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 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。參考:https://www.e-learn.cn/content/qita/804953 random=1 ★ 為1開啟隨機多尺度訓練,為0則關閉 ★★ 提示:當開啟隨機多尺度訓練時,前面設定的網路輸入尺寸width和height其實就不起作用了,width 會在320到608之間隨機取值,且width=height,沒10輪隨機改變一次,一般建議可以根據自己需要修改 隨機尺度訓練的範圍,這樣可以增大batch,望讀者自行嘗試!
碼字不易,且行且珍惜,再次歡迎各位入群交流討論,讓我們一起coding!