CSPNet全稱是Cross Stage Partial Network,主要從一個比較特殊的角度切入,能夠在降低20%計算量的情況下保持甚至提高CNN的能力。CSPNet開源了一部分cfg文件,其中一部分cfg可以直接使用AlexeyAB版Darknet還有ultralytics的yolov3運行。
1. 簡介
Cross Stage Partial Network(CSPNet)就是從網絡結構設計的角度來解決以往工作在推理過程中需要很大計算量的問題。
作者認為推理計算過高的問題是由於網絡優化中的梯度信息重復導致的。CSPNet通過將梯度的變化從頭到尾地集成到特征圖中,在減少了計算量的同時可以保證准確率。CSPNet是一種處理的思想,可以和ResNet、ResNeXt和DenseNet結合。
下圖是cspnet對不同backbone結合后的效果,可以看出計算量大幅下降,准確率保持不變或者略有提升(ps: 分類的提升確實不多)
下圖是CSPNet用於目標檢測的結果:
AlexeyAB版本的darknet的首頁就是這張圖,使用CSPNet做backbone可以極大提升模型的准確率,在同等FPS的情況下,CSPNet准確率更有競爭力。
CSPNet提出主要是為了解決三個問題:
- 增強CNN的學習能力,能夠在輕量化的同時保持准確性。
- 降低計算瓶頸
- 降低內存成本
2. 實現
CSPNet作者也設計了幾種特征融合的策略,如下圖所示:
圖中的Transition Layer代表過渡層,主要包含瓶頸層(1x1卷積)和池化層(可選)。(a)圖是原始的DenseNet的特征融合方式。(b)圖是CSPDenseNet的特征融合方式(trainsition->concatenation->transition)。(c)圖是Fusion First的特征融合方式(concatenation->transition)(d)圖是Fusion Last的特征融合方式(transition->concatenation)
Fustion First的方式是對兩個分支的feature map先進行concatenation操作,這樣梯度信息可以被重用。
Fusion Last的方式是對Dense Block所在分支先進性transition操作,然后再進行concatenation, 梯度信息將被截斷,因此不會重復使用梯度信息 。
上圖是對Fusion First、Fusion Last和CSP最終采用的融合方式(對應上圖CSPPeleeNet)在ILSVRC2012分類數據集上的對比,可以得到以下結論:
- 使用Fusion First有助於降低計算代價,但是准確率有顯著下降。
- 使用Fusion Last也是極大降低了計算代價,top-1 accuracy僅僅下降了0.1個百分點。
- 同時使用Fusion First和Fusion Last的CSP所采用的融合方式可以在降低計算代價的同時,提升准確率。
上圖是DenseNet的示意圖以及CSPDenseNet的改進,改進點在於CSPNet將淺層特征映射為兩個部分,一部分經過Dense模塊(圖中的Partial Dense Block),另一部分直接與Partial Dense Block輸出進行concate。
下圖是將CSP模型應用到ResNeXt或者ResNet中:
跟CSPDenseNet一樣,將上一層分為兩部分,Part1不進行操作直接concate,Part2進行卷積操作。
下面是實現的cfg文件可視化圖,可視化的內容是csresnet50中的一個基本模塊:
3. FPN設計
論文中列舉了三種FPN:
第一個如(a)圖所示,是最常見的FPN,在YOLOv3中使用。(ps: YOLOv3中的FPN跟原始FPN不同,其融合的方式是concate)
第二個如(b)圖所示,是ThunderNet中提出的GFM, 之前的文章中有詳解,直接將多個不同分辨率的特征進行融合,具體融合方式是相加。
第三個如(c)圖所示,是EFM,也就是本文提出的融合方式,沒兩層之間特征進行融合,並且在原有FPN基礎上再進行一次bottom-up的融合方式。
4. 實驗
首先來看一下EFM的消融實驗:
實驗是基於MS COCO數據集的,PRN其實也是同一個團隊在提出的和CSP相似的思想,被ICCV接受。
上圖來自《Enriching Variety of Layer-wise Learning Information by Gradient Combination》,也就是RPN網絡,也是將輸入特征划分為兩部分,一部分經過卷積,另一部分經過直接通過concate進行融合。
下表是CSPNet對特征融合方式所進行的消融實驗:
作者還做了非常多的實驗來驗證CSPNet的有效性,下圖是在ImageNet中的一些SOTA模型:
作者還做了非常多的實驗來驗證CSPNet的有效性,下圖是在分類網絡中的對比試驗:
下圖是在MS COCO數據集上的SOTA模型:
應用於移動端的分類模型也進行了實驗:
值得一提的是,以上模型大部分都是基於AlexeyAB的Darknet進行的實驗,也有一小部分是在ultralytics的yolov3上進行的實驗,不過后者支持的並不是很完全。
總結
CSPNet和PRN都是一個思想,將feature map拆成兩個部分,一部分進行卷積操作,另一部分和上一部分卷積操作的結果進行concate。
從實驗結果來看,分類問題中,使用CSPNet可以降低計算量,但是准確率提升很小;在目標檢測問題中,使用CSPNet作為Backbone帶來的提升比較大,可以有效增強CNN的學習能力,同時也降低了計算量。
總體來說,CSPNet還是非常強的,也得到了AlexeyAB大神的認可,darknet中也提供了具體的實現:
[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky
# 1-1
[route]
layers = -1
group_id=0
groups=2
# 1-2
[route]
layers = -2
group_id=1
groups=2
或者
# 1-1
[convolutional]
batch_normalize=1
filters=64
size=1
stride=1
pad=1
activation=leaky
[route]
layers = -2
# 1-2
[convolutional]
batch_normalize=1
filters=64
size=1
stride=1
pad=1
activation=leaky
作者也在Github中公開了部分的cfg文件實現,可以配合AlexeyAB版的Darknet進行使用,Github鏈接如下:
https://github.com/WongKinYiu/CrossStagePartialNetworks
Reference
https://github.com/WongKinYiu/CrossStagePartialNetworks
https://arxiv.org/pdf/1911.11929.pdf
https://github.com/ultralytics/yolov3
PRN: Enriching Variety of Layer-wise Learning Information by Gradient Combination