计算机视觉算法——图像分类网络总结
計算機視覺算法——圖像分類網絡總結
- 計算機視覺算法——圖像分類網絡總結
- 1. AlexNet
- 1.1 網絡結構
- 1.2 關鍵知識點
- 1.2.1 卷積和池化特征尺寸計算公式
- 1.2.2 ReLU非線性激活函數
- 1.2.3 防止過擬合
- 2. VGG
- 2.1 網絡結果
- 2.2 關鍵知識點
- 2.2.1 感受野的計算以及大小卷積核
- 3. GoogLeNet
- 3.1 網絡結構
- 3.2 關鍵知識點
- 3.2.1 Inception結構
- 3.2.2 1×11 \times 11×1卷積作用
- 3.2.3 輔助分類器
- 4. ResNet
- 4.1 網絡結構
- 4.2 關鍵知識點
- 4.2.1 residual模塊
- 4.2.2 batch normalization
- 5. ResNeXt
- 5.1 網絡結構
- 5.2 關鍵知識點
- 5.2.1 分組卷積
- 6. MobileNet
- 6.1 網絡結構
- 6.2 關鍵知識點
- 6.2.1 Depthwise Separable Convolution
- 6.2.2 Inverted Residuals Block 和 Linear Bottleneck(MobileNet V2)
- 6.2.3 bneck(MobileNet V3)
- 7. ShuffleNet
- 7.1 網絡結構
- 7.2 關鍵知識點
- 7.2.1 Channel Shuffle思想
- 7.2.2 設計高效網絡準則
- 8. EfficientNet
- 8.1 網絡結構
- 8.2 關鍵知識點
- 8.2.1 MBConv
- 8.2.2 Processive Learning漸進學習策略
計算機視覺算法——圖像分類網絡總結
由于后面工作方向的需要,也是自己的興趣,我決定補習下計算機視覺算法相關的知識點,參考的學習資料主要是B站Up主霹靂吧啦Wz,強推一下,Up主的分享非常的細致認真,從他這里入門是個不錯的選擇,Up主也有自己的CSDN博客,我這里主要是作為課程的筆記,也會加入一些自己的理解,我也只是個入門的小白,如果有錯誤還請讀者指正。
要入門基于DNN的計算機視覺,分類網絡構架是基礎,分類網絡會作為各種衍生網絡的backbone,也就是重要組成部分,起到了提取特征等作用,下面開始逐個總結各個圖像分類網絡的特點。
1. AlexNet
AlexNet是2012年CVPR發表的一篇革命性的論文,現在的引用量都快接近8w了,它的主要創新點是:
1.1 網絡結構
AlexNet網絡由五層卷積加三層最大池化層,以及最后三層的全連接層構成,那會兒由于GPU顯存不夠大,因此作者采用的方式是將一張圖一份為二,分別使用兩張GPU訓練,在進行第三層卷積時會將兩張GPU的輸出進行聯合輸入,在其他層數據都是獨立的。
1.2 關鍵知識點
1.2.1 卷積和池化特征尺寸計算公式
AlexNet中主要是使用了卷積和最大池化層,卷積后特征尺寸計算公式為:N=(W?F+2P)/S+1N=(W-F+2 P) / S+1 N=(W?F+2P)/S+1其中,輸入特征尺寸為WWW,卷積核的大小為F×FF \times FF×F,卷積步daxiao長為SSS,padding的像素數為PPP,那么輸出特征尺寸即為NNN。池化可以看作一種特殊的卷積核,因此池化后特征尺寸計算同樣滿足上述規律。
1.2.2 ReLU非線性激活函數
ReLU非線性激活函數有如下優勢:
1.2.3 防止過擬合
AlexNet中使用兩種方法減少過擬合,分別是:
2. VGG
VGG是2014年由牛津大學提出的,是應用非常廣泛的一種backbone,此方法在提出時主要的貢獻是:
2.1 網絡結果
VGG網絡的具體參數如下:
其中網絡D包含16個隱藏層,稱為VGG16,網絡D包含19個隱藏層,稱為VGG19,VGG16的結構如下圖所示:
這里值得注意的一點是,在網絡D中,卷積層中卷核大小為3×33 \times 33×3,步距為1,padding為1,最大池化層的尺寸為2, 步距為2,因此我們可以計算經過卷積層后的特征尺寸不變,經過最大池化層后特征尺寸減半。此外最后三層為全連接層,占據了網絡的絕大多數參數數量。
2.2 關鍵知識點
2.2.1 感受野的計算以及大小卷積核
這是VGG網路中最大的亮點,首先我們來了解下什么是感受野:在卷積神經網絡中,決定某一層輸出結果中一個元素對應的輸入層的區域大小,稱作感受野,也可以說是feature map上的一個單元對應輸入層的區域的大小,如下圖的例子:
在上圖中我們設置卷積核大小為3×33\times33×3,步距為1,padding為0,按照前文的特征尺寸計算公式,5×55\times55×5的特征,經過一層卷積后大小為3×33\times33×3,再經過一層卷積后大小為1×11\times11×1,感受野就是反過來推導,1×11\times11×1的特征單元在兩層卷積前對應的區域的大小即5×55\times55×5,因此兩層3×33\times33×3的卷積核的感受野的大小即5×55\times55×5,即可以代替一個5×55\times55×5的卷積核。我們來計算下兩種方法需要的參數數量,對于5×55\times55×5的卷積核,參數數量為:5×5×C×C=25C25 \times 5 \times C \times C = 25C^2 5×5×C×C=25C2對于兩層3×33\times33×3的卷積核,參數數量為:3×3×C×C+3×3×C×C=18C23 \times 3 \times C \times C + 3 \times 3 \times C \times C = 18C^2 3×3×C×C+3×3×C×C=18C2由此可見,在感受野相同的情況下,疊加小卷積核的數量更小,并且網絡更深,效果更有,并且有文章稱3×33\times33×3更有利于保持圖像性質。
3. GoogLeNet
GoogLeNet的網絡的亮點主要有:
3.1 網絡結構
我們可以注意到,在AlexNet和VGG中都是串行處理,而在GoogLeNet通過Inception結構實現了并行處理,下面我們對Inception結構的細節進行討論,
3.2 關鍵知識點
3.2.1 Inception結構
Inception結構設計的核心思想是,通過多個卷積核提取圖像不同尺度的信息,最后進行融合,以得到圖像更好的表征,我們以第三層的Inception結構為例,結構圖如下:
具體來說,分別是:
最后將四個結果進行連接,對這四部分輸出結果的第三維并聯,即64+128+32+32=256,最終輸出28x28x256,這一步操作稱為concate。
3.2.2 1×11 \times 11×1卷積作用
1×11 \times 11×1卷積層引起人們重視是在NIN的網絡結構中,在GoogLeNet網絡中,1×11 \times 11×1卷積層主要是用于降維和升維,目的在與減少網絡計算量,同樣以上述第三層的Inception結構為例,我們計算參數量:1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32)1 \times 1 \times 192 \times 64+(1 \times 1 \times 192 \times 96+3 \times 3 \times 96 \times 128)+(1 \times 1 \times 192 \times 16+5 \times 5 \times 16 \times 32) 1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32)
如果去掉網絡中的1×11 \times 11×1的模塊,參數量如下:1×1×192×64+3×3×192×128+5×5×192×321 \times 1 \times 192 \times 64+3 \times 3 \times 192 \times 128+5 \times 5 \times 192 \times 32 1×1×192×64+3×3×192×128+5×5×192×32由此可見,如果去掉網絡中的1×11 \times 11×1模塊,參數量將增加到原來網絡的三倍
3.2.3 輔助分類器
輔助分類器在訓練的過程中同樣會計算損失,在GoogLeNet論文中,輔助分類器的損失被乘以0.3后加到主分類器的損失中作為最終的損失來訓練網絡,主分類器的結果如下:
輔助分類器的結構如下:
結構的細節具體說來:
輔助分類器的作用的是一方面增加了反向傳播的梯度信號,幫助低層特征訓練,從而低層特征也有很好的區分能力,另一方面輔助分類器提供了額外的正則化效果,對于整個網絡的訓練很有裨益。
4. ResNet
ResNet是2015年由微軟實驗室提出的,網絡的亮點主要有:
4.1 網絡結構
網絡結構如下圖所示,其中ResNet為下圖中最上層的網絡
可以看到ResNet其實就是對residual模塊的反復堆疊,隨著網絡層數的增加,深層網絡中主要會出現如下兩個問題而導致網絡效果變差:
其中梯度消失或者梯度爆炸主要通過數據預處理、權重初始化以及batch normalization方法解決,而退化問題主要是通過本文提出的residual模塊解決,下面分別對這兩個關鍵知識點進行總結。
4.2 關鍵知識點
4.2.1 residual模塊
residual模塊主要解決了深層網絡出現的退化問題,退化問題具體表現就是層數深的網絡反而沒有層數淺的好,residual模塊結構如下圖所示:
其中,左側為34層網絡的residual模塊,右側為50、101、152層網絡的residual模塊,右側residual模塊的主要特點是增加1×11\times11×1卷積核來進行升維和降維,減少網絡參數量,以不至于過深的網絡帶來巨大的參數量導致難以學習。另一個值得注意的點是這里的residual是通過add操作將特征合并,而不是通過concate操作,這里我們來說明下concate操作和add操作的區別:
由此可見,add其實可以相當于concate之后對應通道共享同一個卷積核,add相當于加了一種先驗,當兩路輸入可以具有“對應通道的特征圖語義類似”(可能不太嚴謹)的性質的時候,可以用add來替代concate,這樣更節省參數和計算量(concate是add的2倍)。
4.2.2 batch normalization
batch normalization是2015年的論文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出的,其目的是使得我們同一通道的feature map滿足均值為0,方差為1的分布規律,batch normalization的具體操作如下:假設小批量輸入為B={x1…m}\mathcal{B}=\left\{x_{1 \ldots m}\right\}B={x1…m?},學習的參數為γ,β\gamma, \betaγ,β,那么操作主要有如下四個步驟:
其中batch normalization的結果為{yi=BNγ,β(xi)}\left\{y_{i}=\mathrm{BN}_{\gamma, \beta}\left(x_{i}\right)\right\}{yi?=BNγ,β?(xi?)}具體操作可以如下圖所示:
這里值得注意的是:
5. ResNeXt
ResNeXt是ResNet與Inception的結合體,利用分組卷積的形式在沒有增加參數數量的前提下降低了錯誤率,網絡的性能對比如下圖所示,在和ResNet和Inception的對比中都取得更好的結果:
5.1 網絡結構
其網絡結構與ResNet類似,都是通過模塊堆疊而成,唯一的區別是堆疊的模塊不同,如下圖所示:
注意到,在參數數量接近的前提下,ResNeXt中的residual模塊的通道數要比ResNet多,網絡的表達能力相應更強。上表中中ResNeXt中的參數CCC指的的是Group Convolution中的Group數,參數ddd指的是每個Group卷積的卷積核的個數,這兩個參數對精度的影響如下圖所示:
5.2 關鍵知識點
5.2.1 分組卷積
ResNeXt中堆疊的模塊本質就是就是采用分組卷積的residual模塊,因此首先我們來了解下分組卷積,如下圖所示為標準卷積操作:
對應卷積層的參數數量為:(h1×w1×c1)×c2\left({h}_{1} \times {w}_{1} \times {c}_{1}\right) \times {c}_{2} (h1?×w1?×c1?)×c2?而分組卷積操作圖示如下,將輸入按照通道分組后進行卷積后在進行Concate操作:
對應的卷積層參數數量為:h1×w1×(c1g)×(c2g)×g=h1×w1×c1×c2×1gh_{1} \times w_{1} \times\left(\frac{c_{1}}{g}\right) \times\left(\frac{c_{2}}{g}\right) \times g={h}_{1} \times {w}_{1} \times c_{1} \times c_{2} \times \frac{{1}}{{g}} h1?×w1?×(gc1??)×(gc2??)×g=h1?×w1?×c1?×c2?×g1?因此,分組卷積的數量是標準卷積的1g\frac{{1}}{{g}}g1?
ResNeXt論文中首先提出的是上圖中(a)的形式,通過一系列等價變換,最終可以得到如圖(c )所示分組卷積的形式
6. MobileNet
MobileNet目前一共有三個版本,分別是MoblileNet V1, MobileNet V2和MOblieNet V3:
MobileNet V1網絡是2017年google團隊在2017年提出的,在準確率小幅度降低的前提下大大減少模型參數和運算量(相比VGGG16準確率減少了0.9%,但是模型參數只有VGG的1/32),網絡的主要亮點有:
MobileNet V2網絡是2018年google團隊在2018年提出的,相比Mobile V1網絡準確率更高,模型更小,網絡的亮點主要有:
MoblieNet V3網絡在V2的基礎上進一步減少了計算量和提高了精度,網路的主要兩點如下:
MobileNet V1和MobileNet V2在分類任務上的性能對比如下:
MobileNet V2和MobileNet V3的性能對比如下:
6.1 網絡結構
MobileNet V1的網絡結構與VGG類似,結構如下所示:
其中Conv dw指的就是Depthwise Separable Convolution,下文介紹
MobileNet V2的網路結構如下所示:
其中bottleneck指的就是Inverted Residual Block和Linear Bottleneck結構。其中ttt是擴展因子,也就是Inverted Residual Block第一層1×11\times11×1卷積核對特征矩陣Channel擴展的倍數,ccc是輸出特征矩陣Channel,nnn是bottleneck的重復次數,sss是卷積核步距
MobileNet V3中結構如下,MobileNet V3的網路結構是通過NAS(Neual Architecture Search)搜索參數后得到網絡結構:
6.2 關鍵知識點
6.2.1 Depthwise Separable Convolution
Depthwise Separable Convolution即深度可分卷積,傳統卷積如下圖所示:
而Depthwise Separable Convolution由兩部分組成,分別是Depthwise Convolution和Pointwise Convolution,其中Depthwise Convolution操作如下圖所示:
在傳統卷積中,卷積核Channel等于輸入特征矩陣Channel,輸出特征矩陣Channel等于卷積核個數,而在Depthwise Convolutional中,卷積核Channel等于1,輸入特征矩陣Channel等于卷積核個數等于輸出特征卷積Channel,也就是一個卷積和負責一個Channel的特征矩陣。
Pointwise Convolution操作如下圖所示:
在Pointwise Convolution和普通卷積一樣,只是卷積核大小固定為1×11\times11×1
假設輸入矩陣維度為DK×DK×MD_K \times D_K \times MDK?×DK?×M,卷積核大小為DF×DF×MD_F \times D_F \times MDF?×DF?×M,數量為NNN,因此普通卷積計算量為DK?DK?M?N?DF?DˉFD_{K} \cdot D_{K} \cdot M \cdot N \cdot D_{F} \cdot \bar{D}_{F} DK??DK??M?N?DF??DˉF?可分卷積計算量為:DK?DK?M?DF?DF+M?N?DF?DFD_{K} \cdot D_{K} \cdot M \cdot D_{F} \cdot D_{F}+M \cdot N \cdot D_{F} \cdot D_{F} DK??DK??M?DF??DF?+M?N?DF??DF?因此理論上普通卷積計算量是可分卷積的8到9倍。在實驗過程中發現Depthwise Convolution參數大部分為零,參數大部分為零就意味著這部分卷積核是無效的,這是不合理的,在MobileNet V2網絡中對這個問題有所優化
6.2.2 Inverted Residuals Block 和 Linear Bottleneck(MobileNet V2)
在ResNet中提出了Residual Block模塊,如下圖所示:
在該“兩頭大中間小“的結構中,步驟如下:
而在Inverted Residual Block模塊的結構如下圖所示:
具體步驟如下:
在Inverted Residual Block中使用的Relu6激活函數:y=ReLU?6(x)=min?(max?(x,0),6)y=\operatorname{ReLU} 6(x)=\min (\max (x, 0), 6) y=ReLU6(x)=min(max(x,0),6)此外,在Inverted Residual Block模塊中的最后一個卷積層使用的是線性激活函數,也就是Linear Bottleneck,論文中通過實驗發現Relu激活函數對低維度特征信息造成大量損失,而Inverted Residual Block中使是"中間大兩頭小"的結構,因此輸出是相對低維度的特征,因此需要使用線性激活函數來替代Relu函數來避免對低維度特征信息造成損失。具體結構如下:
當stride=1且輸入特征矩陣與輸出特征矩陣shape相同時才有shortcut連接,而并不是stride=1的Inverted Residual Block都會有shortcurt連接。
6.2.3 bneck(MobileNet V3)
在以上基礎上,MobileNet V3進一步優化了Block結構,如下圖所示:
7. ShuffleNet
ShuffleNet有兩個版本,ShuffleNet V1網絡的特點主要如下:
ShuffleNet和MobileNet類似也是一個非常輕量級的網絡,其性能對比如下,可以看在FLOPs接近的條件下,ShuffleNet的效果是要由于MoblieNet V1的:
ShuffleNet V2網絡中提出了四條高效網絡設計準則:
并基于這四條準則重新優化了網絡結構,ShuffleNet V2相對硬核,有很多有意義的實驗。ShuffleNet V2的性能對比如下:
7.1 網絡結構
ShuffleNet V1的網絡結構如下:
ShuffleNet V2網絡結構如下圖所示:
從網絡結構看,仍然是模塊的堆疊,但是不同的是,ShuffleNetV1和V2使用不同的Block,具體的下文介紹。
7.2 關鍵知識點
7.2.1 Channel Shuffle思想
ResNeXt網絡中使用的Group Convolution雖然可以減少參數與計算量,但是Group Convolution中不同組之間的信息沒有交流,那么Channel Shuffle的基本思想就如下圖所示:
具體說來,就是將經過第一次Group Convolution之后的結果,將不同Group間的Channel混亂后再進行第二次Group Convolution,這樣就可以實現不同Group特征的融合。
在ShuffleNet V1中采用的全部都是Group Convolution和Depthwise Separable Convolution,如下圖所示:
上圖中(a)是ResNeXt中的殘差結構將卷積層更換為Dpethwise Convolution后的示意圖,原始的ResNeXt計算量為:hw(1×1×c×m)+hw(3×3×m×m)/g+hw(1×1×m×c)=hw(2cm+9m2/g)h w(1 \times 1 \times c \times m)+h w(3 \times 3 \times m \times m) / g+h w(1 \times 1 \times m \times c)=h w\left(2 c m+9 m^{2} / g\right) hw(1×1×c×m)+hw(3×3×m×m)/g+hw(1×1×m×c)=hw(2cm+9m2/g)其中93.4%的計算量都由1×11\times11×1的卷積占據。而圖(b)和圖(c )分別是stride=1和stride=2的ShuffleNet V1中的結構,我們計算圖(b)的計算量為:hw(1×1×c×m)/g+hw(3×3×m)+hw(1×1×m×c)/g=hw(2cm/g+9m)h w(1 \times 1 \times c \times m) / g+h w(3 \times 3 \times m)+h w(1 \times 1 \times m \times c) / g=h w(2 c m / g+9 m) hw(1×1×c×m)/g+hw(3×3×m)+hw(1×1×m×c)/g=hw(2cm/g+9m)由此可見ShuffleNet中計算量會小很多。ShuffleNet V2中對結構進一步進行了優化,具體見下文。
7.2.2 設計高效網絡準則
在ShuffleNet v2中作者提出計算復雜度不能只看FLOPs,一方面需要看Memory Access Cost,我們計算FLOPs通常值計算Convolution操作,但是在ShuffleNet V1中Convolution 操作在GPU上指占用了50%的時間,而Shuffle、Elemwise等操作占用了另外50%時間。另外一方面還需要看模型的Degree of Parallelism。
也就是說,在卷積和FLOPs不變的前提下,當卷積層的輸入特征矩陣與輸出特征矩陣Channel相等就能獲得最小的Memory Access Cost,作者的實驗如下:
作者簡單堆疊一系列相同的卷積層,其中cic_ici?和c2c_2c2?分別為各個卷積的輸入輸出特征大小,我們可以看到,當cic_ici?和c2c_2c2?比例越懸殊,網絡推理速度越慢。
意思是,當FLOPs保持不變,GConv的groups增大時,Memory Access Cost也會增大。這一部分實驗結果如下:
指的是,網絡設計的碎片化程度越高,速度越慢,雖然這種設計通常可以增加模型的精度。實驗結果如下:
其中各種frament如下圖所示:
可以看到4-fragment-parallel的情況速度最慢
大概意思是,Element-wise操作帶來影響是不可忽視的,Element-wise操作包括ReLU、AddTensor、AddBias等操作,這一部分實驗如下所示:
通過對比我們可以axin ,不加入ReLU和short-cut操作速度最快。
綜上所示,ShuffleNet V2 Block結構如下:
其中(a)(b)為ShuffleNet V1中的結構,?(d)對應(a)(b)優化后的結構,從圖中看,主要是使用Channel Spilt以及Concate代替了原來 Add操作,取消了GConv,取消了Add后的ReLU操作,將Channel Shuffle移動了Concate操作后等等。
8. EfficientNet
EfficientNet V1是google在2019年發表的文章,該文章提出EfficientNet-B7在Imagenet top-1達到當前最高準確率84.3%,相對于準確率最高的GPipex相比,參數數量僅為1/8.4,推理速度提升了6.1倍。如下圖所示:
文章同時探討了輸入分辨率,網路深度和寬度的影響:
從上圖可以看出,單獨增加網絡的輸入分辨率、網絡的深度和寬度在準確率達到80%左右后就基本達到飽和,而同時增加三者則可以突破這個飽和。
EfficientNet V2是發表于2021年CVPR上的論文,論文性能對比如下:
文章針對EfficientNet V1的問題提出了響應的解決方案:
4. 訓練圖像尺寸很大時,訓練速度非常慢,針對這個問題解決方案就是降低訓練圖像的尺寸,使用更大的batch_size;
5. 在網絡淺層中使用Depthwise convolution速度會非常慢,無法充分利用現有的一些加速器,因此EfficientNet V2中引入了Fused-MBConv結構;
6. 同等放大每個Stage是次優的,在EfficientNet V1中,每個Stage的深度和寬度都是同等放大的,但是每個Stage對網絡的訓練速度以及參數數量并不相同,所以直接使用同等縮放策略并不合理,因此在V2中采用了非均勻的縮放策略來縮放模型;
8.1 網絡結構
EfficientNet V1網絡結構是通過網絡搜索技術得到的,具體網絡結構如下表所示:
EfficientNet V2網絡結構如下圖所示:
與Efficient V1的不同點主要在于
8.2 關鍵知識點
8.2.1 MBConv
MBConv模塊結構如下圖所示:
該模塊的設計和MobileNet V3中的SE模塊基本一致,由一個平均池化層和兩個全連接層組成,第一個全連接層節點個數為輸入MBConv特征矩陣Channel的1/4,并且使用Swish激活函數,第二個全連接層節點個數和等于Depthwise Convlution輸出特征矩陣Channels,并且使用Sigmoid激活函數;
在EfficientNet V2中發現在網絡淺層中使用Depthwise Convolution速度會變慢,因此作者提出了Fused-MBConv模塊,如下圖所示,也就是講Depthwise卷積和升維的1×11\times11×1的卷積合成一個3×33\times33×3的卷積:
Fused-MBConv具體實現如下如下圖所示(在Fused-MBConv的具體實現中是沒有SE模塊的):
作者還完成了一系列對比實驗,并不是所有層都使用Fused-MBConv效果最好,而是Stage1-3使用能達到最佳的效果,此外,這里的Dropout層和我們通常理解的神經元的隨機失活是不一樣的,而是來自一篇論文《Deep Networks with Stochastic Depth》的方法,如下圖所示,是通過隨機失活神經元使得網絡獲得隨機的深度。
8.2.2 Processive Learning漸進學習策略
Processive Learning漸進學習策略其實很簡單,在訓練早期使用較小的訓練尺寸以及較弱的正則方法weak regularizatin,這樣網路能夠快速學習到一些簡單的表達能力。接著逐漸提升圖像尺寸同時增強正則方法adding stronger regularization。這里所說regularization包括Dropout,RandAugment以及Mixup。
具體算法如下圖所示:
以及采用漸進式學習策略帶來的收益,不僅可以縮短訓練時間,甚至在準確度上也能有所提高:
總結
以上是生活随笔為你收集整理的计算机视觉算法——图像分类网络总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像降噪算法——低秩聚类:WNNM算法
- 下一篇: 计算机视觉算法——目标检测网络总结