YOLO演進 — 4 — Scaled-YOLOv4

李謦伊
謦伊的閱讀筆記
14 min readDec 7, 2020

--

Scaled-YOLOv4 於 2020 年 11 月 16 日提出,目的是改進 YOLOv4。之前有示範過使用 Scaled-YOLOv4 中的 YOLOv4-CSP 進行訓練,本文將要來介紹 Scaled-YOLOv4。

先來看看 Scaled-YOLOv4 與其他目標檢測模型的比較圖~~

📄 論文連接: https://arxiv.org/abs/2011.08036

YOLOv4 作者針對不同的設備: 一般 GPU, 低運算 GPU, 高運算 GPU 進行適合其設備的模型縮放。

首先作者分析 CNN 模型對於不同模型縮放方式的總計算量 (FLOPs),其中 CNN 模型有 ResNet、ResNext和Darknet,模型縮放方式有三種: 增加/減少圖像大小、模型層數、通道數量,縮放因子分別為 α、β、γ。由下表可以看出圖像大小、模型層數、通道數量的增加都會導致計算量增加,w, h 為 feature map 大小、k 為模型層數、b 為通道數。

接著比較將 CSPNet 應用於各種 CNN 模型,除了降低計算量還提高了準確度以及推論速度。由下表可以看到加入 CSPNet 的計算量比原先的模型分別減少了 23.5%、46.7% 和 50.0%,因此作者選擇使用 CSP-ized 模型。

CSP-ized YOLOv4

在一般 GPU 上使用 CSP-ized YOLOv4 以獲得最佳速度與準確度的權衡。

📌 Backbone — CSPDarknet53 + Mish activation

📚 先來複習一下,CSPDarknet53 就是 CSPNet + Darknet53,而 CSPNet 就是先將 Base layer 的 feature map 劃分為2個部分,然後再經過 transition -> concatenation -> transition 將2個部分融合起來

YOLOv4-csp 的 Backbone 一樣使用 CSPDarknet53,但做了一些改進。

在 Table 2 的 CSPDarknet53 的計算量裡,並不包含跨 stage 的下採樣卷積運算,而跨 stage 的下採樣卷積使用 kernel_size=3, stride=2, padding=1 的 filter,因此會再多出 whb²(9/4) 的計算量,每個 stage 的總運算量為 whb²(9/4 + 3/4 + 5k/2)

計算: whb²(9/4) = b x (3x3) x (w/2) x (h/2) x b

由此可知當 k>1 時,CSPDarknet 的 stage 比 Darknet 的 stage 有更好的計算優勢。

在 CSPDarknet53 中每個 stage 的 residual layer 數量為 1, 2, 8, 8, 4,為了得到更好的速度、準確度,作者將第一個 CSP stage 改為原始的 Darknet residual layer。

可以使用 Netron 查看網路架構

📌 Neck — CSPPANet + Mish activation

作者為了減少計算量,將 CSPNet 融合 YOLOv4 的 PANet,結構表示為下圖 2(b),2(a) 為原本的結構,如此改進可以減少 40% 的計算量。

📚 先來複習一下,PANet 是以 FPN 為基礎做改進的網路結構,將串的層數再多加一層,並且把原本相加的部分修改為合併

作者也將 YOLOv4 的 SPP 做更改,原本是位於網路的第一個計算列表的中間位置,更改為 CSPPANet 的第一個計算列表的中間位置,如下圖 2(b)

YOLOv4-csp 與 YOLOv4 的 Neck 網路架構比較如下

YOLOv4-tiny

在低運算 GPU 中模型的推理速度除了會受到模型大小、計算量外,還會因為設備資源的限制而有所影響,因此需要考慮到記憶體頻寬 (memory bandwidth)、記憶體使用量 (memory access cost,MAC)、動態隨機存取記憶體流量 (DRAM),在網路設計上要遵循以下規則:

  • 使計算複雜度少於 O(whkb²)

為了要在計算量小的情況下達到所要求的準確度,輕量模型會比大型模型的參數利用效率還要高。在進行模型縮放時,希望計算複雜度能夠盡可能的低

作者分析了有效利用參數的網路: DenseNet 和 OSANet 模型的總計算量 (FLOPs),由下表3 顯示,其中 k << g < b,g 為 DenseNet 中的 growth rate,指每層輸出的 channel 數目。

DenseNet 的計算複雜度為 O(whgbk)、OSANet 為 O(max(whbg, whg²k)),這兩個網路的複雜度都小於 Resnet: O(whkb²)。最終選擇了 OSANet 作為 YOLOv4-tiny 的網路設計模型,因此 YOLOv4-tiny 的 Backbone 為 CSPNet + OSANet。

📚 OSANet 是來自於 VoVNet 的 OSA (One-Shot Aggregation) module,其思想是從 DenseNet module 改進得來的,在最後一次性的將所有 layer concate 起來,好處是可以讓輸入與輸出的通道數一致,取得較小的 MAC

📚 VoVNet 介紹: https://blog.csdn.net/xiaohu2022/article/details/105318534

📄 VoVNet paper: https://arxiv.org/abs/1904.09730

  • 最小化/平衡 feature map 大小

為了在計算速度, 準確度上獲得最佳 trade-off,作者提出了一個新概念: 在 CSPOSANet 的計算模塊之間進行梯度截斷。由於 OSANet module 屬於 PlainNet 結構,因此能夠在計算模塊的任一層中融合 CSPNet 都可以達到梯度截斷的效果;而在 DenseNet 或 ResNet module 的架構中,需要將一整個計算模塊作為一個整體與 CSPNet 融合。

📚 梯度截斷: https://blog.csdn.net/a1b2c3d4123456/article/details/90718413

📚 PlainNet 是基於 VGG 修改得來的,可參考: https://arxiv.org/pdf/1512.03385.pdf

作者使用這特性重新規劃 b 通道的 base layer 與 kg 通道的計算模塊 (computational blocks),將他們平均分割為兩個相同通道的路徑,如下表4,其中 PCB 為局部的 computational blocks (partial in CB)。

CSPOSANet 可以動態的調整通道分配。假設通道數為 b+kg,最佳規劃就是將兩者平均分割為相同通道數 (b+kg)/2 的兩條路徑。當要考慮到記憶體頻寬時 (參數為 τ),最好的分割值為 ceil((b + kg)/2τ ) × τ

  • 在卷積後維持相同的通道數

對於低運算設備的計算成本,需要考慮到功耗 (power consumption),而影響功耗最大的因素就是記憶體使用量 (MAC)。

一個卷積運算後的 MAC 計算公式如下,其中 h, w, Cin, Cout, K 分別為 feature map 的高、寬、輸入通道、輸出通道、filter size。藉由算幾不等式可以得到當 Cin = Cout 時,MAC 最小。

  • 最小化卷積的輸入輸出 (CIO)

CIO 是一個可以評量 DRAM IO (Input/Output) 的指標。下表5 有列出 OSA, CSP, CSPOSANet 的 CIO。當 kg > b/2 時,CSPOSANet 可以獲得最佳 CIO。

📌 Backbone — CSPOSANet + PCB + LeakyReLU activation

YOLOv4-tiny Backbone 使用 CSPOSANet + PCB,網路架構由下圖所示。設定 g = b/2 為增長率 (growth rate),最後使其增長為 b/2 + kg = 2b,由此可推斷 k=3。對於每個 stage 的通道數量與 Neck 和 YOLOv3-tiny 相同,Neck 使用 FPN + LeakyReLU activation。

YOLOv4-large

YOLOv4-large 是基於雲端 GPU 所設計的,目的是實現高準確度的物件檢測

為了提高準確率並維持 real time 的偵測,需要在縮放因子之間找到最佳組合。作者總結了在 input, backbone, neck中可調整的潛在因子於下表6

在 one-stage 目標檢測器中,更好地預測目標大小的能力基於特徵向量的感受野,而與感受野最直接相關的是 stage,更高的 stage 更適合預測大物體。下表7 說明了感受野與一些縮放因子間的關係,從此可知在輸入尺寸增加的情況下,也增加 depth 或 stage 數量能夠增強對大物體預測的效果,其中 {input size, stage} 組合效果最好,因此作者會先在 {input size, stage} 上進行縮放,再根據環境對寬度及深度進行縮放。

📌 Model

YOLOv4-large 有 YOLOv4-P5、YOLOv4-P6、YOLOv4-P7 三種模型,YOLOv4-P5 是一個 fully CSP-ized model,而 YOLOv4-P6、YOLOv4-P7 是由 YOLOv4-P5 擴展而來的。作者在 {input size, stage} 上進行縮放,在每個 stage 的深度縮放設置為 2^ds{i},其中 ds 為 [1, 3, 15, 15, 7, 7, 7],最後使用推論時間作為約束執行額外的寬度縮放。

❗ 2^ds{i} 是指 2 的 ds{i} 次方,其中 ds{i} 為第 i 個 ds 值

實驗指出使用 YOLOv4-P6 模型、寬度縮放設置為1時,fps 可以達到 30;YOLOv4-P7 模型、寬度縮放設置為1.25時,fps 可以達到 16。

實驗結果

  • YOLOv4-csp 的比較結果

作者在 COCO minval dataset 上比較 YOLOv4 的參數量、總計算量、fps、AP,Backbone 分別有 Darknet53、CSPDarknet53,Neck 有 SPP + FPN (FPNSPP)、SPP + PAN (PANSPP),激活函數有 LeakyReLU、Mish。

由下表8可以看出融合 CSPNet 能夠減少32 % 的計算量,並且 fps 與 AP 間都有提升。最終作者選擇使用 AP 最高的 CD53s-CPANSPP-Mish 作為 YOLOv4-csp 的 Backbone。

  • YOLOv4-tiny 的比較結果

將 CSPDarknet53 與 CSPOSA + PCB 進行比較,並且在寬度、深度上做線性縮小。由下表9中看出 COSA 在相同計算量下,fps 比 tinyCD53s 要來得高,且得到更高的 AP,最後作者選擇了 COSA-2x2x 作為 YOLOv4-tiny 的 Backbone。

  • YOLOv4-large

下表 10 是 YOLOv4-large 的 AP 比較: 從頭開始訓練 (training from scratch) 和微調 (finetune)

  • Scaled-YOLOv4 與其他物件檢測模型的比較

由下表可知 Scaled-YOLOv4 在各指標上是最優的。將 YOLOv4-CSP 和相同準確度的 EfficientDet-D3 相比 (47.5%),fps 是其 1.9 倍;YOLOv4-P5 和 EfficientDet-D5 比較,準確度: 51.8% vs 51.5%,fps 是 2.9 倍;YOLOv4-P6 和 EfficientDet-D7 比較,準確度: 54.5% vs 53.7%,fps 是 3.7 倍;YOLOv4-P7 和 EfficientDet-D7x 比較,準確度: 55.5% vs 55.1%,fps 是 2.5 倍。

  • YOLOv4-large with TTA

📚 TTA 是指 Test Time Augmentation,在測試時對數據採用不同的數據增強技術,然後將全部結果取平均值作為最終的結果

YOLOv4-P5, YOLOv4-P6, YOLOv4-P7 增加了 TTA 比原先提升了 1.1%, 0.7%, 0.5% AP。

  • YOLOv4-tiny 與其他 tiny 目標檢測模型比較
  • YOLOv4-tiny 在不同 Nvidia GPU 設備中測試,包括 Xavier AGX, Xavier NX, Jetson TX2, Jetson NANO,此外還使用 TensorRT FP32 測試比較 fps
  • Scaled-YOLOv4 為一個 naive once-for-all 模型

📚 once-for-all 是個能夠在不同硬體設備上直接部屬的網路模型,並且可以在不重新訓練的情況下支持不同的深度、寬度、kernel size、分辨率設置

📄 once-for-all paper: https://arxiv.org/abs/1908.09791

作者刪除了 YOLOv4-P7 某些 stage 下的 top-down path 和 detection Branch: YOLOv4-P7\P7 表示為模型中刪除了 {P7} stage,而 YOLOv4-P7\P7\P6 表示為刪除 {P7, P6} stage。

此實驗表明 FPN-like 架構是一個 naive once-for-all 模型。下圖5顯示在不同的輸入分辨率下,修剪過的模型與原先的 AP 差異。由實驗結果可以得知 YOLOv4-P7\P7\P6 在低分辨率下的 AP 最好、YOLOv4-P7\P7 在中分辨率下的 AP 最好、而 YOLOv4-P7 在高分辨率下的 AP 最好。

由這些結果可以得知 CSP-ized YOLOv4 具有可伸縮性,能夠適用於小網路及大網路,並且 YOLOv4-large 實現了 SOTA 結果: 在 test-dev COCO數據集上有 55.8% AP,而 YOLOv4-tiny 能夠取得最佳的速度與準確度。

--

--