計算機視覺中圖像分類任務脈絡梳理


本文大致梳理了計算機視覺中圖像分類的脈絡,包括常用數據集、經典模型和性能對比。

1 圖像分類常用數據集

以下是幾種常用的分類數據集,難度依次遞增。列舉了各算法在各數據集上的性能排名。

  • MNIST,60k訓練圖像、10k測試圖像、10個類別、圖像大小1×28×28、內容是0-9手寫數字。
  • CIFAR-10,50k訓練圖像、10k測試圖像、10個類別、圖像大小3×32×32。
  • CIFAR-100,50k訓練圖像、10k測試圖像、100個類別、圖像大小3×32×32。
  • ImageNet,1.2M訓練圖像、50k驗證圖像、1k個類別。每年會舉行基於ImageNet數據集的ILSVRC競賽,這相當於計算機視覺界奧林匹克。鑒於圖像分類任務上,DL已經超越人類水平,ImageNet挑戰賽在2017年是最后一屆。

2 圖像分類經典結構

基本架構 我們用conv代表卷積層、bn代表批量歸一層、pool代表池化層。最常見的網絡結構順序是conv -> bn -> relu -> pool,其中卷積層用於提取特征、池化層用於減少空間大小。隨着網絡深度的進行,圖像的空間大小將越來越小,而通道數會越來越大。當然也有不少其他架構。

兩個特點:縱觀這些卷積神經網絡提高效果的方向,主要是更深、更寬、更多的分支結構和短連接等;AlexNet提出了卷積網絡5+3的結構,后續不少經典網絡都是在此基礎上改進。

經典網絡:

  • LeNet-5
  • AlexNet
  • ZF-Net
  • GoogLeNet
  • VGG
  • ResNet
  • ResNeXt
  • DenseNet
  • SENet

2.1 LeNet-5

早期卷積神經網絡中最有代表性的架構,是Yann LeCun在1998年設計的,用於手寫數字識別的卷積神經網絡,當年美國很多銀行用它來識別支票上面的手寫數字。

2.2 AlexNet

2012年ILSVRC冠軍,6千萬參數。由於准確率遠超傳統方法的第二名(top5錯誤率為15.3%,第二名為26.2%),引起了很大的轟動。自此之后,CNN成為在圖像識別分類的核心算法模型,帶來了深度學習的大爆發。這里有整體架構的可視化具體的參數。

特點:

  • 采用更深的網絡結構,為了減弱梯度消失,使用Relu替換之前的sigmoid的作為激活函數;
  • 使用Dropout和數據擴充Data Augmentation抑制過擬合;
  • 使用Overlapping Pooling(覆蓋的池化操作)
  • 多GPU訓練和LRN(但是沒啥用)

2.3 ZF-Net

2013年ILSVRC冠軍,結構和AlexNet區別不大,分類效果也差不多。這篇文章的貢獻在於,提出了一種CNN特征可視化方法:反池化、反激活、反卷積,從而成為CNN特征可視化的開山之作。

2.4 VGG

2014年ILSVRC亞軍網絡,1.38億參數。由於網絡結構十分簡單,很適合遷移學習,因此至今VGG-16仍在廣泛使用。

特點:

2.5 GoogLeNet

2014年ILSVRC冠軍網絡。同樣也是5+3的模式(以池化層為界),參數量約為5百萬,核心模塊是Inception Module。Inception歷經了V1、V2、V3、V4等多個版本的發展,不斷趨於完善。GoogLeNet取名中L大寫是為了向LeNet致敬,而Inception的名字來源於盜夢空間中的"we need to go deeper"梗。

Inception V1:加大深度、加大寬度(通過增加分支)、減少參數

深度方面:層數更深,論文采用了22層,為了避免梯度消失問題,GoogLeNet在不同深度處(4b和4e處,以最大池化為界)增加了兩個分支,來回傳梯度。

寬度方面:采用多分支分別處理然后拼接的Inception Module。

  • 用1×1、3×3、5×5、max pooling這四種核並行的方式,讓網絡自己決定該用什么樣的卷積核;
  • 采用不同大小的卷積核意味着不同大小的感受野,可以捕捉到不同尺度的信息,最后拼接意味着不同尺度的特征進行信息融合;(不同於2011年Yann LeCun的交通標志識別模型,那個是不同層級特征,這個是不同視野)
  • 為了避免concat起來的feature map厚度過大,Inception模塊在3×3前、5×5前、max pooling后分別加上了1×1的卷積核,降低feature map厚度。

另外,為了減少參數,網絡最后采用了average pooling來代替第一個全連接層,參數可以減少一個數量級。

Inception V2:主要做了兩個改動

  • 學習VGG網絡,將7×7和5×5卷積分解成若干等效3×3卷積;(減少參數同時增加非線性轉換)
  • 增加了BN層,加快收斂速度,且有一定的正則化效果;(配合其他操作:增大學習率,更徹底的對訓練數據進行shuffle,減少數據增廣中圖像的光學畸變等;要達到V1結構相同的准確率,訓練時間只有之前的1/14)

Inception V3:主要在兩個方面改造

  • 引入Factorization into small convolutions的思想,將一個較大的二維卷積拆成兩個較小的一維卷積,比如將7×7卷積拆成1×7卷積和7×1卷積。適用於中度大小的feature map,對於m×m大小的feature map,建議m在12到20之間。作用是:1.節約參數,減小計算量,減輕過擬合;2.中間可以加一層relu激活,增加模型非線性表達能力;
  • 優化Inception Module的結構。現在模塊中有35×35、17×17和8×8三種不同的結構。這些Inception Module只在網絡的后部出現,前部還是普通的卷積層。並且還在Inception Module的分支中還使用了分支。

Inception V4:結合了殘差神經網絡ResNet,進一步降低了0.4%的錯誤率

2.6 ResNet


2015年ILSVRC冠軍網絡。核心是帶短連接的殘差模塊,其中主路徑有兩層卷積核(Res34),短連接把模塊的輸入信息直接和經過兩次卷積之后的信息融合,相當於加了一個恆等變換。短連接是深度學習又一重要思想,除計算機視覺外,短連接思想也被用到了機器翻譯、語音識別/合成領域。

兩篇論文,分別提出V1版V2版。

結構特點:

  • 總體架構:類似5+3結構,第一個模塊為普通卷積,第2、3、4、5為模塊組,然后經過一個平均池化,直接送到最后一層fc;(注意:GoogleNet中將fc6換成了平均池化層,然后經過fc7,fc8,但是ResNet直接將fc7也省掉了)
  • 兩種殘差模塊:除了左圖的殘差模塊,對於很深的網絡(超過50層),ResNet使用了更高效的瓶頸結構(BottleNeck)(主路徑的第一層和第三層均為1×1卷積,如右圖);
  • 兩路信息融合時:若前后特征圖厚度一致,則直接相加;若前后特征圖厚度不一致,則用1×1卷積來線性變換(注:前后特征圖尺寸不一致時,1×1卷積核的步長為2,起到了下采樣的效果);
  • 更好的殘差模塊preResNet:作者在V2中對不同的殘差單元做了細致的分析與實驗,最優的殘差結構如下圖所示。改進前后一個明顯的變化是采用pre-activation,BN和ReLU都提前了。

殘差網絡解決了什么,為什么有效?

背景要點:

  • NN好用的原因:一是表達能力特別強大,能擬合任意函數;二是免去了繁重的特征工程,特別適合於非結構化數據。
  • 但NN總是有一些問題,除了過擬合之外,還有特別常見的梯度消失/爆炸,和網絡退化的問題。
  • 網絡退化的原因:雖然56層網絡的解空間包含了20層網絡的解空間,但是我們在訓練網絡用的是隨機梯度下降策略,往往解到的不是全局最優解,而是局部的最優解,顯而易見56層網絡的解空間更加的復雜,所以導致使用隨機梯度下降算法無法解到最優解。
  • 殘差網絡解決了網絡深度過大帶來的網絡退化問題。

殘差網絡為何有效的三種解釋:

  • 何愷明等人從前后向信息傳播的角度給出了殘差網絡的一種解釋。在反向傳播過程中,由於模塊學習的是F(x)+x,導數為F(x)的導數加1,因此后面的梯度能比較順暢地傳到前面,即抑制了梯度消失的現象;而在前向傳播的過程中,由於普通網絡中x在經過網絡層時候總要乘以其中的權重矩陣,因此很難保持前后恆等,換句話說,當網絡深度過大時候,超出的層因為沒法保證這一模塊的輸入輸出一致,導致模型退化,而殘差模塊F(x)+x因為加了一個恆等項,模塊學習的就不再是恆等映射H(x)=x,而是H(x)=0,后者比前者更容易學習,因此在很大程度上解決了網絡退化的問題。綜上可以認為殘差連接使得信息前后向傳播更加順暢。(當然也有人認為主要是解決的網絡退化問題,因為梯度消失問題基本上已經通過relu、特殊的初始化、BN來解決了。殘差模塊雖然有助於減輕梯度消失,但主要還是解決了網絡退化。)
  • 集成學習的角度。16年一篇論文指出,殘差網絡展開后實際上相當於一系列淺層網絡的集成,在訓練中貢獻了梯度的是那些相對較短的路徑。
  • 梯度破碎的角度。2018年的一篇論文指出了一個新的觀點,盡管殘差網絡提出是為了解決梯度彌散和網絡退化的問題,但它解決的實際上是梯度破碎問題。梯度破碎就是在標准前饋神經網絡中,隨着深度增加,梯度逐漸呈現為白噪聲的現象,即神經元梯度的相關性(corelation)按指數級減少;同時,梯度的空間結構也隨着深度增加被逐漸消除。因為現在基於梯度的許多優化方法假設梯度在相鄰點上是相似的,所以破碎的梯度會使這些優化方法的效果大打折扣。而殘差連接可以極大地保留梯度的空間結構,緩解了梯度破碎問題。2018年有一篇可視化的論文支持這一說法,作者比較了Res56網絡帶殘差模塊和不帶殘差模塊的損失函數三維圖,不帶殘差模塊的損失函數表面是一片怪石嶙峋,而帶殘差模塊的損失函數表面像一片平緩的山丘,更有利於優化。

這里有一篇文章,講的非常清晰,推薦一波。

2.7 ResNeXt

ResNet的另一改進。主要是采用了VGG堆疊思想和Inception的split-transform-merge思想,在不增加參數復雜度的前提下提高准確率。ResNeXt發現,增加分支數是比加深或加寬更有效地提升網絡性能的方式。結構關鍵點是:

  • 沿用ResNet的短路連接,並且重復堆疊相同的模塊組合;
  • 多分支分別處理;
  • 使用1×1卷積降低計算量;
  • 利用分組卷積進行實現(如圖c),結構更簡潔而且速度更快。

2.8 DenseNet

CVPR2017的oral。主要思想是將每一層都與后面的層連接起來,如果一個網絡中有L層,那么會有L(L+1)/2個連接。通過這樣的密集連接,每一層在正向時候都能直接接受原始輸入信號,在反向時候也都能直接接受損失函數的梯度,即這種連接方式使得特征和梯度的傳遞更加有效,網絡也就更加容易訓練。

當然,如果全部采用這種密集連接的方式,特征圖的厚度就會很大。於是采用兩種方式降低參數量:一是將密集連接的層做成一個模塊,整個網絡采用模塊堆疊的方式,而不是所有層全部密集連接;二是在dense block中引入bottleneck layer,即卷積3x3前增加1x1卷積,以此來減少feature map數量。

缺點是太吃顯存。通常占用顯存的主要是推斷過程中產生的feature map和參數量。有些框架會有優化,自動把比較靠前的層的feature map釋放掉,所以顯存就會減少,或者inplace操作通過重新計算的方法減少一部分顯存,但是densenet因為需要重復利用比較靠前的feature map,所以無法釋放,導致顯存占用過大。

2.9 SENet

2017年ILSVRC冠軍網絡。是一個模塊,可以和其他的網絡架構結合,比如GoogLeNet、ResNet等。

兩大步驟:Squeeze和Excitation。相當於在通道上應用注意力機制,即學習各個通道的權重,根據重要程度增強有用的通道、抑制沒有用的通道。

3 各種經典模型的比較

前面介紹的各種圖像分類模型都比較經典,特別是VGG16、GoogLeNet和ResNet,現在仍然在廣泛使用。截至2017年初,各種經典架構對比如下。

Reference


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM