一,Scaled YOLOv4
Scaled YOLOv4
的二作就是YOLOv4
的作者Alexey Bochkovskiy
。
摘要
作者提出了一種網路縮放方法,不僅可以修改深度、寬度、解析度,還可以修改網路的結構。
1,介紹
實驗結果表明,基於 CSP
方法的 YOLOv4
目標檢測模型在保持最優速度和準確率的前提下,同時也具有向上/向下可伸縮性,可用於不同大小的網路。由此,作者提出了一種網路縮放方法,它不僅改變深度、寬度、解析度,而且還改變網路的結構。
主要工作。Scaled YOLOv4
的主要工作如下:
- 設計了一種針對小模型的強大的模型縮放方法,系統地平衡了淺層
CNN
的計算代價和儲存頻寬; - 設計一種簡單有效的大型目標檢測器縮放策略;
- 分析各模型縮放因子之間的關係,基於最優組劃分進行模型縮放;
- 實驗證實了
FPN
結構本質上是一種once-for-all
結構; - 利用上述方法研製了
YOLOv4-tiny
和YOLO4v4-large
模型。
以往模型縮放,如 EfficientDet
無非是首先選擇網路基礎模組,它往往又好又快,然後針對影響目標檢測的重要引數如:網路寬度 \(w\)、深度 \(d\)、輸入影像解析度size
等進行(滿足一定條件下按照一定規律)調參,或者 NAS
自動調參。
2,相關工作
2.1,模型縮放
傳統的模型縮放是指改變模型的深度,如 VGG
變體,以及後邊可以訓練更深層的 ResNet
網路等;後面 agoruyko
等人開始考慮模型的寬度,透過改變卷積層卷積核的數量來實現模型縮放,並設計了 Wide ResNet
[43],同樣的精度下,它的引數量儘管比原始 ResNet
多,但是推理速度卻更快。隨後的 DenseNet
和 ResNeXt
也設計了一個複合縮放版本,將深度和寬度都考慮在內。
何凱明等人提出的
ResNet
網路解決了隨著深度增加帶來的網路退化問題。
3,模型縮放原則
3.1,模型縮放的常規原則
這段內容,原作者的表達不夠嚴謹,計算過程也沒有細節,所以我不再針對原文進行一一翻譯,而是在原文的基礎上,給出更清晰的表達和一些計算細節。
這裡,我們得先知道對一個卷積神經網路來說,其模型一般是由 conv stage
、conv block
、conv layer
組成的。我以 ResNet50
為例進行分析,大家就能明白了。ResNet50
的卷積過程分成 4
個 stage
,分別對應的卷積 blocks
數目是 \([3,4,6,3]\),卷積 block
是 bottleneck
殘差單元,bottleneck
殘差單元又是 \(1\times 1\)、\(3\times 3\) 和 \(1\times 1\) 這樣 3
個卷積層組成的,所以 ResNet50
總共的卷積層數目為:\(3\times 3 + 4\times 3+ 6\times 3 + 3\times 3 = 48\),再加上第一層的卷積和最後一層的分類層(全連線層),總共是 50
層,所以命名為 ResNet50
。ResNet
模型的組成和結構參數列如下圖所示。
大部分
backbone
都是分成4
個stage
。
對一個基礎通道數是 \(b\) 的卷積模組(conv block
),總共有 \(k\) 個這樣的模組的 CNN
網路來說,其計算代價是這樣的。如 ResNet
的總的卷積層的計算量為 \(k\ast [conv(1\times 1,b/4)\rightarrow conv(3\times 3,b/4)\rightarrow conv(1\times 1,b)]\);ResNeXt
的總的卷積層的計算量為 \(k\ast [conv(1\times 1,b/2)\rightarrow gconv(3\times 3/32, b/2)\rightarrow conv(1\times 1, b)]\);Darknet
網路總的計算量為 \(k\ast [conv(1\times 1,b/2)\rightarrow conv(3\times 3, b)]\)。假設可用於調整影像大小、層數和通道數的縮放因子分別為 \(\alpha\)、\(\beta\) 和 \(\gamma\)。當調整因子變化時,可得出它們和 FLOPs
的關係如下表所示。
這裡以 Res layer
為例,進行計算量分析。首先上表的 \(r\) 應該是指每個 stage
中間的殘差單元的計算量,而且還是 bottleneck
殘差單元,因為只有 stage
中間的 bottleneck conv block
的第一個 \(1\times 1\) 卷積層的輸入通道數才是輸出通道數的 4
倍,只有這種情況算出來的計算量 \(r\) 才符合表 1
的結論。
卷積層 FLOPs
的計算公式如下,這裡把乘加當作一次計算,公式理解請參考我之前寫的 文章。
\(FLOPs=(C_i\times K^2)\times H\times W\times C_o\)
對於上面說的那個特殊的 bottleneck conv block
來說,卷積過程特徵圖大小沒有發生變化,假設特徵圖大小為 \(wh\),所以 bolck
的 FLOPs
為:
這裡值得注意的是,雖然各個 conv block
會略有不同,比如 每個 conv stage
的第一個 conv block
都會將特徵圖縮小一倍,但是其 FLOPs
和 \(r1\) 是線性的關係,所以,對於有 \(k\) 個 conv block
的 ResNet
來說,其總的計算量自然就可大概近似為 \(17whkb^2/16\)。ResNeXt
和 Darknet
卷積層的 FLOPs
計算過程類似,所以不再描述。
由表 1
可以看出,影像大小、深度和寬度都會導致計算代價的增加,它們分別成二次,線性,二次增長。
Wang
等人提出的 CSPNet 可以應用於各種 CNN
架構,同時減少了引數和計算量。此外,它還提高了準確性,減少了推理時間。作者把它應用到 ResNet, ResNeXt,DarkNet
後,發現計算量的變化如表 2
所示。
CNN
轉換為 CSPNet
後,新的體系結構可以有效地減少 ResNet
、ResNeXt
和 Darknet
的計算量(FLOPs
),分別減少了 23.5%
、46.7%
和 50.0%
。因此,作者使用 CSP-ized
模型作為執行模型縮放的最佳模型。
3.2,為低端裝置縮放的tiny模型
對於低端裝置,設計模型的推理速度不僅受到計算量和模型大小的影響,更重要的是必須考慮外圍硬體資源的限制。因此,在執行 tiny
模型縮放時,我們必須考慮以下因素:記憶體頻寬、記憶體訪問代價(MACs
)和 DRAM traffic
。為了考慮到以上因素,我們的設計必須遵循以下原則:
1,使計算複雜度少於 \(O(whkb^2)\)。
作者分析了高效利用引數的網路:DenseNet
和 OSANet
的計算量,分別為 \(O(whgbk)\)、\(O(max(whbg, whkg^2))\)。兩者的計算複雜度階數均小於 ResNet
系列的 \(O(whkb^2)\)。因此,我們基於 OSANet
設計 tiny
模型,因為它具有更小的計算複雜度。
這裡的
OSANet
其實是 VoVNet 網路,專門為GPU
平臺設計的更高效的backbone
網路架,其論文解讀可參考我之前寫的文章。
2,最小化/平衡 feature map 的大小
說實話,沒看明白論文這段內容,這不是跟論文
CSPNet
一樣的結論嗎,即分割為通道數相等的兩條路徑。
為了獲得在計算速度方面的最佳平衡,我們提出了一個新概念:在CSPOSANet
的計算塊之間執行梯度截斷。如果我們將原來的 CSPNet
設計應用到 DenseNet
或 ResNet
架構上,由於這兩種架構的第 \(j\) 層輸出是第 \(1^{st}\) 層到第 \((j-1)^{th}\) 層輸出的積分,我們必須將整個計算塊作為一個整體來處理。由於 OSANet
的計算塊屬於 PlainNet
架構,從計算塊的任意層製作 CSPNet
都可以達到梯度截斷的效果。我們利用該特性對基層的 \(b\) 通道和計算塊(computational block
)生成的 \(kg\) 通道進行重新規劃,並將其分割為通道數相等的兩條路徑,如表 4
所示。
當通道數量為 \(b + kg\) 時,如果要將這些通道分割成兩條路徑,最好將其分割成相等的兩部分,即 \((b + kg)/2\)。
3,在卷積後保持相同的通道數
評估低端裝置的計算成本,必須考慮功耗,而影響功耗的最大因素是記憶體訪問代價(\(MAC\))。根據 Shufflenetv2
的推導證明,可知卷積層的輸入輸出通道數相等時,即 \(C_{in} = C_{out}\) 時, \(MAC\) 最小。
4,最小化卷積輸入/輸出(CIO)
CIO
是一個可以測量 DRAM IO
狀態的指標。表 5
列出了 OSA
、CSP
和我們設計的 CSPOSANet
的 CIO
。當 \(kg > \frac {b}{2}\) 時,CSPOSANet
可以獲得最佳的 CIO
。
3.3,為高階裝置縮放的Large模型
feature pyramid network
(FPN
)的架構告訴我們,更高的 stage
更適合預測大的物體。表 7
說明了感受野與幾個引數之間的關係。
從表 7
可以看出,寬度縮放可以獨立操作。當輸入影像尺寸增大時,要想對大物件有更好的預測效果,就必須增大網路的 depth
或 stage
(一般每個 stage
都會降低特徵圖解析度的一半)的數量。在表 7
中列出的引數中,\(\left \{ size^{input}, \#stage \right \}\) 的組合效果最好。因此,當執行縮放時,我們首先在 \(\left \{ size^{input} \right \}\),#stage
上執行復合縮放,然後根據實時的環境,我們再分別進一步縮放深度 depth
和寬度 width
。
4,Scaled-YOLOv4
4.1,CSP-ized YOLOv4
YOLOv4
是為通用 GPU
上的實時目標檢測而設計的。
1,Backbone
為了獲得更好的速度/精度權衡,我們將第一個 CSP
階段轉換為原始的 DarkNet
的殘差層。
沒能理解這段內容。
2,Neck
3,SPP
4.2,YOLOv4-tiny
YOLOv4-tiny
是為低端 GPU
裝置設計的,設計將遵循 3.2
節中提到的原則。
我們將使用 PCB
(partial in computational block
) 架構的 CSPOSANet
作為 YOLOv4
backbone
。我們設 \(g = b/2\) 為增長率,最終使其增長到 \(b/2 + kg = 2b\)。透過計算,我們得到 \(k = 3\)。YOLOv4
的卷積塊(computational block
)結構如圖 3
所示。對於每個階段的通道數量和 neck
網路結構,我們採用 YOLOv3-tiny
一樣的設計。
4.3,YOLOv4-large
專門為雲端 GPU
設計的,主要目的就是為實現高精度的目標檢測。我們設計了一個完全 CSP
化的模型 YOLOv4-P5
,並將其擴充套件到 YOLOv4-P6
和 YOLOv4-P7
。Sacled-YOLOv4
large
版本的模型結構圖,如下圖所示。
我們透過設計 \(size^{input}\), #stage
來對 backbone
執行復合縮放。我們把每個 stage
的深度設定為 \(2^{d_{s_{i}}}\)。\(d_s\) 範圍為 \([1, 3, 15, 15, 7, 7, 7]\)。與之前的 ResNet
的卷積劃分為 4
個 stage
不同,這裡最多劃分為 7
個 stage
(YOLOv4-P7
)。
5,實驗
與其他實時目標檢測檢測器進行比較,對比實驗結果如表 11
所示。
總結
通篇論文看下來,感覺這篇論文最主要的貢獻在於透過簡單的理論分析和對比實驗,驗證了模型縮放的原則,進一步擴充了 CSPNet
方法,並基於此設計了一個全新的 Scaled-YOLOv4
。個人感覺就是針對不同的 GPU
平臺,可以根據作者分析出來的模型縮放理論且符合其他一些原則的情況下,透過選擇不同的模型寬度和深度引數,讓模型更深更寬。
anchor-free
的方法,如centernet
是不需要複雜的後處理,如NMS
。Backbone
模型的寬度、深度、模組的瓶頸比(bottleneck
)、輸入影像解析度等引數的關係。
Reference
[43] Sergey Zagoruyko and Nikos Komodakis. Wide residualnet works. arXiv preprint arXiv:1605.07146, 2016.