萬字長文解析Scaled YOLOv4模型(YOLO變體模型)

嵌入式視覺發表於2022-12-29

一,Scaled YOLOv4

Scaled YOLOv4 的二作就是 YOLOv4 的作者 Alexey Bochkovskiy

摘要

作者提出了一種網路縮放方法,不僅可以修改深度、寬度、解析度,還可以修改網路的結構。

1,介紹

實驗結果表明,基於 CSP 方法的 YOLOv4 目標檢測模型在保持最優速度和準確率的前提下,同時也具有向上/向下可伸縮性,可用於不同大小的網路。由此,作者提出了一種網路縮放方法,它不僅改變深度、寬度、解析度,而且還改變網路的結構。

主要工作Scaled YOLOv4 的主要工作如下:

  • 設計了一種針對小模型的強大的模型縮放方法,系統地平衡了淺層 CNN 的計算代價和儲存頻寬;
  • 設計一種簡單有效的大型目標檢測器縮放策略;
  • 分析各模型縮放因子之間的關係,基於最優組劃分進行模型縮放;
  • 實驗證實了 FPN 結構本質上是一種 once-for-all 結構;
  • 利用上述方法研製了 YOLOv4-tinyYOLO4v4-large 模型。

以往模型縮放,如 EfficientDet 無非是首先選擇網路基礎模組,它往往又好又快,然後針對影響目標檢測的重要引數如:網路寬度 \(w\)、深度 \(d\)、輸入影像解析度size 等進行(滿足一定條件下按照一定規律)調參,或者 NAS 自動調參。

2,相關工作

2.1,模型縮放

傳統的模型縮放是指改變模型的深度,如 VGG 變體,以及後邊可以訓練深層的 ResNet 網路等;後面 agoruyko 等人開始考慮模型的寬度,透過改變卷積層卷積核的數量來實現模型縮放,並設計了 Wide ResNet[43],同樣的精度下,它的引數量儘管比原始 ResNet 多,但是推理速度卻更快。隨後的 DenseNetResNeXt 也設計了一個複合縮放版本,將深度和寬度都考慮在內。

何凱明等人提出的 ResNet 網路解決了隨著深度增加帶來的網路退化問題。

3,模型縮放原則

3.1,模型縮放的常規原則

這段內容,原作者的表達不夠嚴謹,計算過程也沒有細節,所以我不再針對原文進行一一翻譯,而是在原文的基礎上,給出更清晰的表達和一些計算細節。

這裡,我們得先知道對一個卷積神經網路來說,其模型一般是由 conv stageconv blockconv layer 組成的。我以 ResNet50 為例進行分析,大家就能明白了。ResNet50 的卷積過程分成 4stage,分別對應的卷積 blocks 數目是 \([3,4,6,3]\),卷積 blockbottleneck 殘差單元,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 層,所以命名為 ResNet50ResNet 模型的組成和結構參數列如下圖所示。

大部分 backbone 都是分成 4stage

resnet網路參數列

對一個基礎通道數是 \(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 的關係如下表所示。

resnet-resnext-darknet網路計算量和網路深度寬度及輸入影像解析度的關係

這裡以 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\),所以 bolckFLOPs 為:

\[\begin{align*} r1 &= (b \times 1^2\times \frac{b}{4} + \frac{b}{4} \times 3^2\times \frac{b}{4} + \frac{b}{4} \times 1^2\times b)\times hw \\\\ &= \frac{17}{16}whb^2 \end{align*}\]

這裡值得注意的是,雖然各個 conv block 會略有不同,比如 每個 conv stage 的第一個 conv block 都會將特徵圖縮小一倍,但是其 FLOPs\(r1\) 是線性的關係,所以,對於有 \(k\)conv blockResNet 來說,其總的計算量自然就可大概近似為 \(17whkb^2/16\)ResNeXtDarknet 卷積層的 FLOPs 計算過程類似,所以不再描述。

由表 1 可以看出,影像大小、深度和寬度都會導致計算代價的增加,它們分別成二次,線性,二次增長

Wang 等人提出的 CSPNet 可以應用於各種 CNN 架構,同時減少了引數和計算量。此外,它還提高了準確性,減少了推理時間。作者把它應用到 ResNet, ResNeXt,DarkNet 後,發現計算量的變化如表 2 所示。

csp和resnet等結合後FLOPs的變化

CNN 轉換為 CSPNet 後,新的體系結構可以有效地減少 ResNetResNeXtDarknet 的計算量(FLOPs),分別減少了 23.5%46.7%50.0%。因此,作者使用 CSP-ized 模型作為執行模型縮放的最佳模型

3.2,為低端裝置縮放的tiny模型

對於低端裝置,設計模型的推理速度不僅受到計算量和模型大小的影響,更重要的是必須考慮外圍硬體資源的限制。因此,在執行 tiny 模型縮放時,我們必須考慮以下因素:記憶體頻寬、記憶體訪問代價(MACs)和 DRAM traffic。為了考慮到以上因素,我們的設計必須遵循以下原則:

1,使計算複雜度少於 \(O(whkb^2)\)

作者分析了高效利用引數的網路:DenseNetOSANet 的計算量,分別為 \(O(whgbk)\)\(O(max(whbg, whkg^2))\)。兩者的計算複雜度階數均小於 ResNet 系列的 \(O(whkb^2)\)。因此,我們基於 OSANet 設計 tiny 模型,因為它具有更小的計算複雜度。

這裡的 OSANet 其實是 VoVNet 網路,專門為 GPU 平臺設計的更高效的 backbone 網路架,其論文解讀可參考我之前寫的文章

OSA和Dense layer的計算複雜度

2,最小化/平衡 feature map 的大小

說實話,沒看明白論文這段內容,這不是跟論文 CSPNet 一樣的結論嗎,即分割為通道數相等的兩條路徑。

為了獲得在計算速度方面的最佳平衡,我們提出了一個新概念:在CSPOSANet 的計算塊之間執行梯度截斷。如果我們將原來的 CSPNet 設計應用到 DenseNetResNet 架構上,由於這兩種架構的第 \(j\) 層輸出是第 \(1^{st}\) 層到第 \((j-1)^{th}\) 層輸出的積分,我們必須將整個計算塊作為一個整體來處理。由於 OSANet 的計算塊屬於 PlainNet 架構,從計算塊的任意層製作 CSPNet 都可以達到梯度截斷的效果。我們利用該特性對基層的 \(b\) 通道和計算塊(computational block)生成的 \(kg\) 通道進行重新規劃,並將其分割為通道數相等的兩條路徑,如表 4 所示。

Table4

當通道數量為 \(b + kg\) 時,如果要將這些通道分割成兩條路徑,最好將其分割成相等的兩部分,即 \((b + kg)/2\)

3,在卷積後保持相同的通道數

評估低端裝置的計算成本,必須考慮功耗,而影響功耗的最大因素是記憶體訪問代價(\(MAC\))。根據 Shufflenetv2 的推導證明,可知卷積層的輸入輸出通道數相等時,即 \(C_{in} = C_{out}\) 時, \(MAC\) 最小。

4,最小化卷積輸入/輸出(CIO)

CIO 是一個可以測量 DRAM IO 狀態的指標。表 5 列出了 OSACSP 和我們設計的 CSPOSANetCIO。當 \(kg > \frac {b}{2}\) 時,CSPOSANet 可以獲得最佳的 CIO

Table5

3.3,為高階裝置縮放的Large模型

feature pyramid network (FPN)的架構告訴我們,更高的 stage 更適合預測大的物體。表 7 說明了感受野與幾個引數之間的關係。

Table7

從表 7 可以看出,寬度縮放可以獨立操作。當輸入影像尺寸增大時,要想對大物件有更好的預測效果,就必須增大網路的 depthstage (一般每個 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

CSP-YOLOv4的neck調整

3,SPP

4.2,YOLOv4-tiny

YOLOv4-tiny 是為低端 GPU 裝置設計的,設計將遵循 3.2 節中提到的原則。

我們將使用 PCBpartial in computational block) 架構的 CSPOSANet 作為 YOLOv4 backbone。我們設 \(g = b/2\) 為增長率,最終使其增長到 \(b/2 + kg = 2b\)。透過計算,我們得到 \(k = 3\)YOLOv4 的卷積塊(computational block)結構如圖 3 所示。對於每個階段的通道數量和 neck 網路結構,我們採用 YOLOv3-tiny 一樣的設計。

YOLOv4-tiny的計算塊結構

4.3,YOLOv4-large

專門為雲端 GPU 設計的,主要目的就是為實現高精度的目標檢測。我們設計了一個完全 CSP 化的模型 YOLOv4-P5,並將其擴充套件到 YOLOv4-P6YOLOv4-P7Sacled-YOLOv4 large 版本的模型結構圖,如下圖所示。

sacled-yolov4-large版本模型結構圖

我們透過設計 \(size^{input}\), #stage 來對 backbone 執行復合縮放。我們把每個 stage 的深度設定為 \(2^{d_{s_{i}}}\)\(d_s\) 範圍為 \([1, 3, 15, 15, 7, 7, 7]\)。與之前的 ResNet 的卷積劃分為 4stage 不同,這裡最多劃分為 7stageYOLOv4-P7)。

5,實驗

與其他實時目標檢測檢測器進行比較,對比實驗結果如表 11 所示。

與其他目標檢測器相比的對比實驗結果

總結

通篇論文看下來,感覺這篇論文最主要的貢獻在於透過簡單的理論分析和對比實驗,驗證了模型縮放的原則,進一步擴充了 CSPNet 方法,並基於此設計了一個全新的 Scaled-YOLOv4。個人感覺就是針對不同的 GPU 平臺,可以根據作者分析出來的模型縮放理論且符合其他一些原則的情況下,透過選擇不同的模型寬度和深度引數,讓模型更深更寬。

anchor-free 的方法,如 centernet 是不需要複雜的後處理,如 NMSBackbone 模型的寬度、深度、模組的瓶頸比(bottleneck)、輸入影像解析度等引數的關係。

Reference

[43] Sergey Zagoruyko and Nikos Komodakis. Wide residualnet works. arXiv preprint arXiv:1605.07146, 2016.

參考資料

相關文章