深度學習-物件偵測YOLOv1、YOLOv2和YOLOv3 cfg 檔解讀(二)
此篇主要是針對YOLO CNN結構的參數([convolutional]、[maxpool]、[shortcut]、[route]、[reorg]、[upsample])進行說明,其他參數設定說明請參考:
深度學習-物件偵測YOLOv1、YOLOv2和YOLOv3 cfg 檔解讀(一)。
深度學習-物件偵測YOLO cfg檔解讀 (三) — 2021年
Darknet的cfg結構跟其他模型不太一樣,像在CAFFE的protxt檔是有bottom和top的設計,網路結構是根據你設定的bottom和top來決定層跟層之間的關係。
在darknet的cfg是一個top-down的設計,也就是你看到第一個[net]的開始往下做[xxx]出現的功能。例如:
[net]
width=416
height=416
channels=3[convolutional]
batch_normalize=1
filters=64
size=3
stride=2
pad=1
activation=leaky[maxpool]
size=2
stride=2
這代表你輸入影像的寬、高和維度數,之後看到的[convolutional]就開始到下一層,上圖的寫法等於
所以你需要多少卷積層就繼續層層疊下去。
Note:卷積參數、是否做batch normalization和對應的activation function等都在[convolutional]內填寫。
那如果要用特殊結構哩,這時候就需要其他的物件([shortcut]、[route]、[reorg] 、[upsample])進行,這四個功能又可分為兩類,第一類改變模型路徑([shortcut]、[route]),第二類改變feature map大小([reorg] 、[upsample])。
改變模型路徑([route]、[shortcut])
[route]
[route]這個函式有兩種寫法,分別是layer帶入1個數字和2個數字。
[route] layer帶入一個數字
[route]
layers = -4
這個做法是要將這層之後要做的事情,往前接到前4層的輸出結果來做(-1是前一層的輸出結果),這個目的是為了而外做一分支出來,下圖解應該可以讓人清楚了解實際做法。
[route] layer帶入2個數字
[route]
layers=-1,-4[route]
layers = -1, 8
這個做法其實就是要做多個feature map進行串聯(Concatenate)這個動作,這邊有兩個寫法
第一個是兩個都是負號,例如 layers=-1,-4,就是-1層的結果跟-4層的結果串聯。
第一個是一正一負,例如 layers=-1, 8,就是-1層的結果跟第8層的結果串聯。
圖解如下,應該可以讓人清楚了解實際做法。
Note: YOLO層數的編號是從[net]後的第一個Conv開始計算,從0開始編號,在這個issue problem內有對[route]做很好的解釋。
[shortcut]
[shortcut]這個功能是用來實現residual的shortcut用的,在YOLOv3作者為了讓feature exactor能更深(取更廣的語意),所以用residual NN的方式讓原本的darknet-19(19層)拓展到darknet-53(53層),為什麼YOLOv3是53層,是作者自行設定的文章沒有特殊說明(但有點自嘲的口吻在裡面→「It has 53 convolutional layers so we call it…. wait for it….. Darknet-53」)。
改變feature map大小([reorg] 、[upsample])
[reorg]
[reorg]這步驟是YOLOv2先用到的功能,全名是reorganization。作法跟名稱很類似就是重組。目的是希望能將圖的大小在減少1/2,但又不希望像maxpool的作法會丟掉訊息,因此利用相對位置的資訊,將1張圖拆成4小張,這樣大圖的訊息就能完全保留下來。因此如果feature map大小是100*100*126 (長*寬*通道數)經由[reorg],feature map將會變成 50*50*(126*4)= 50*50*504。
[upsample]
[upsample] 這步驟是YOLOv3用到的功能。
作法是希望一張小圖可以放大回去(在segmentation領域很常用),但在物件偵測領域因為feature extractor如果在縮小比例比較小(比如1/8)的偵測,因為前面的卷積層不夠深可能造成圖片語意解析得不夠深,在1/8這之前的網路還不能完全理解圖像,所以1/16或是1/32的feature map利用upsample的方法將feature map放大回1/8的大小。這個upsample做法通常就是用deconvolution的作法,如下圖(但deconv. 實際做法可以參考連結Convolution arithmetic),因為deconv的運作方式所以根本不是什麼de-conv,而是transpose conv.細節都在上述連結內,有空在寫一篇deconv.的文章。上面是廢話,因為YOLOv3 upsample我沒記錯是用nearest neighbor做upsample (如下圖,不是bilinear)。
內容不一定完全對,如果錯誤在麻煩幫我指出,感謝。