1. 程式人生 > 實用技巧 >Yolov3引數理解

Yolov3引數理解

1.yolov3-voc.cfg(參考很多文章寫的彙總,有些寫了但還是不是很懂,如果有誤請及時指正)

[net]
# Testing                                  測試模式
# batch=1
# subdivisions=1
# Training                                 訓練模式
 batch=64                                  一批訓練樣本的樣本數量,每batch個樣本更新一次引數
 subdivisions=16                           batch/subdivisions作為一次性送入訓練器的樣本數量,如果記憶體不夠大,將batch分割為subdivisions個子batch
 
                                           上面這兩個引數如果電腦記憶體小,則把batch改小一點,batch越大,訓練效果越好
                                           subdivisions越大,可以減輕顯示卡壓力
                                           
                                           
width
=416 input影象的寬 height=416 input影象的高 channels=3 input影象的通道數 以上三個引數為輸入影象的引數資訊 width和height影響網路對輸入影象的解析度, 從而影響precision,只可以設定成32的倍數 momentum
=0.9 [?]DeepLearning1中最優化方法中的動量引數,這個值影響著梯度下降到最優值得速度https://nanfei.ink/2018/01/23/YOLOv2%E8%B0%83%E5%8F%82%E6%80%BB%E7%BB%93/#more decay=0.0005 [?]權重衰減正則項,防止過擬合.每一次學習的過程中,將學習後的引數按照固定比例進行降低,為了防止過擬合,decay引數越大對過擬合的抑制能力越強。 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 = 20200 訓練達到max_batches後停止學習 policy=steps 這個是學習率調整的策略,有policy: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=40000,45000 下面這兩個引數steps和scale是設定學習率的變化,比如迭代到40000次時,學習率衰減十倍。 scales=.1,.1 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 啟用函式的型別 # 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] from=-3 activation=linear # Downsample ...... # Downsample ###################### [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=45 每一個[region/yolo]層前的最後一個卷積層中的 filters=(classes+1+coords)*anchors_num, 其中anchors_num 是該層mask的一個值.如果沒有mask則 anchors_num=num是這層的ancho 5的意義是5個座標,論文中的tx,ty,tw,th,to activation=linear [yolo] 在yoloV2中yolo層叫region層 mask = 6,7,8 這一層預測第6、7、8個 anchor boxes ,每個yolo層實際上只預測3個由mask定義的anchors 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的數量)相關的預選框,可以手工挑選,也可以通過kmeans 從訓練樣本中學出 classes=10 網路需要識別的物體種類數 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=0 如果為1,每次迭代圖片大小隨機從320到608,步長為32,如果為0,每次訓練大小與輸入大小一致 [route] layers = -4 ...... #可以新增沒有標註框的圖片和其空的txt檔案,作為negative資料 #可以在第一個[yolo]層之前的倒數第二個[convolutional]層末尾新增 stopbackward=1,以此提升訓練速度 #即使在用416*416訓練完之後,也可以在cfg檔案中設定較大的width和height,增加網路對影象的解析度,從而更可能檢測出影象中的小目標,而不需要重新訓練 #Out of memory的錯誤需要通過增大subdivisions來解決

2.訓練時的引數

本來想截一個批次的但是太大了沒截全,批次大小的劃分對應上面.cfg 檔案中設定的subdivisions引數。上面的的 .cfg 檔案中 batch = 64 ,subdivision = 16,所以在訓練輸出中,訓練迭代包含了16組,每組又包含了4張圖片,跟設定的batch和subdivision的值一致。
(注: 也就是說每輪迭代會從所有訓練集裡隨機抽取 batch = 64 個樣本參與訓練,所有這些 batch 個樣本又被均分為 subdivision = 16 次送入網路參與訓練,以減輕記憶體佔用的壓力)

此處有16*3條資訊,每組包含三條資訊,分別是:
Region 82 Avg IOU:
Region 94 Avg IOU:
Region 106 Avg IOU:
三個尺度上預測不同大小的框 82卷積層 為最大的預測尺度,使用較大的mask,但是可以預測出較小的物體 94卷積層 為中間的預測尺度,使用中等的mask, 106卷積層為最小的預測尺度,使用較小的mask,可以預測出較大的物體

批輸出


針對上圖中最後一行中的資訊。如下的輸出是由 detector.c 生成的
20001: 指示當前訓練的迭代次數
0.048537: 是總體的Loss
0.048537avg: 是平均Loss(這個數值應該越低越好,一般來說,一旦這個數值低於0.060730 avg就可以終止訓練了)
0.002000 rate: 代表當前的學習率,在.cfg檔案中定義了它的初始值和調整策略。
3.904890 seconds: 表示當前批次訓練花費的總時間。
2560128 images:表示到目前為止,參與訓練的圖片的總量,是批次*batch的大小(因為我之前訓練到20200次後中斷過又從20000次開始的所以2560128=20001*64*2,我是這樣理解的不知道對不對)

快輸出

Region Avg IOU: 0.900319: 表示在當前subdivision內的圖片的平均IOU,代表預測的矩形框和真實目標的交集與並集之比,這裡是90.03%,很高了吧。
Class: 0.999576: 標註物體分類的正確率,期望該值趨近於1。
Obj: 0.991654: 越接近1越好。
No Obj: 0.000033: 期望該值越來越小,但不為零。

.5R:1.000000:以IOU=0.5為閾值時候的recall; recall = 檢出的正樣本/實際的正樣本

.75R:1.000000:以IOU=0.75為閾值時候的recall
count: 1:count後的值表示所有的當前subdivision圖片(本例中一共4張)中包含正樣本的圖片的數量。在輸出log中的其他行中,可以看到其他subdivision也有0、2、3、4,說明在subdivision中含有不含檢測物件的圖片。

參考了很多文章,感謝,有誤請指正