百面深度學習之卷積神經網絡知識總結

一. 卷積基礎知識

卷積的特點: 局部連接,權值共享

1.1 感受野的計算

image.png

1.2 卷積層的輸出尺寸

image.png

二. 卷積變種

2.1 分組卷積與深度可分離卷積

這兩種卷積都可以用來降低模型的容量.

2.1.1 分組卷積

分組卷積最早出現在alexnet中,主要用來解決在單個gpu顯存較小無法處理含有較大計算量與存儲需求的卷積層, 因此採用分組卷積來將計算與存儲分離在不同的gpu上.

後來在ResNeXt中,作者廣泛採用分組卷積來降低模型的計算量與容量.

分組卷積就是自己處理自己的那一部分.

例如針對一個C x H x W的一組特徵圖, 如果採用普通的卷積,需要的卷積核的大小為C x K x K x O, 輸出的特徵層為O x H x W(假設特徵層的寬高不變).

如果採用分組卷積, 將其分為0.5C x H x W0.5C x H x W的兩部分. 採用卷積核的大小為0.5C x K x Kx 0.5O0.5C x K x K x 0.5O, 輸出的特徵層分別為0.5O x H x W0.5O x H x W, 然後二者合成原來的O x H x W.

2.1.2 深度可分離卷積

深度可分離卷積就是採用depth wise卷積加上point wise卷積得到的層,相比較普通卷積而言,可以很大程度上減小參數量

對一個C x H x W的一組特徵圖, 如果採用普通的卷積,需要的卷積核的大小為C x K x K x O, 輸出的特徵層為O x H x W(假設特徵層的寬高不變).

如果採用深度可分離卷積, 需要由兩部分組成,第一部分是C x K x K x 1的depth wise卷積, 第二部分是C x 1 x 1 x O的point wise卷積

2.2 轉置卷積

轉置卷積(又叫做反卷積).其實也不能稱作反卷積,因為特徵層經過普通卷積操作後然後經過轉置卷積僅僅能恢復原來的形狀大小,不能恢復原來的數值.

具體的介紹可以參考大佬的博客: //blog.csdn.net/lanadeus/article/details/82534425

2.3 空洞卷積

通常可以採用pooling的方法來擴大感受野, 但是pooling的過程會降低特徵圖的分辨率,損失信息,導致上採樣過程中很難恢復原來的信息.

空洞卷積在標準的卷積中插入空洞來增加卷積核的感受野, 空洞卷積引入擴張率(dilation rate)這個超參數, 就是在卷積核中插入r-1個空洞(0), r為擴張率.

對於標準的卷積核K x K, 使用r的擴張率後,卷積核的尺寸變為K + (r-1)* (k-1)

2.4 可變形卷積

普通卷積是在固定的, 規則的網格點上進行採樣,這就束縛了網格感受野的相撞,限制了其幾何形變的適應能力. 為了克服這個限制,可變形卷積(DCN)在每個採樣點上添加一個可學習的偏移量(offset), 讓採樣點不再局限於規則的網格點.

如圖所示:

a為普通卷積, 後邊為幾種不同offset的形式
如上圖,最左端為普通的卷積,後邊的為可變形卷積,通過不同的offset,得到可變形的效果.

offset的取得由卷積層來實現, 引入一個平行分支,根據輸入的特徵圖計算出採樣點的偏移量, 然後在輸入特徵圖上對應的點進行卷積運算.

在這裡插入圖片描述

三. 卷積整體結構

主要介紹如下幾種網絡結構:

AlexNet-> VGGNet->GoogleNet/Inception-v1 -> inception v2/inception v3 -> ResNet -> Inception-v4/ Inception-resnet-> ResNeXt.

分別介紹這幾種網絡的特點:

3.1 AlexNet

  • 採用ReLU作為激活函數
  • 採用局部響應歸一化LRN
  • dropout與數據增廣
  • 利用分組卷積解決gpu顯存不足的問題

3.2 VGGNet

  • 3×3的小卷積核代替之前較大的5×5與7×7卷積核.
  • 2×2的池化代替3×3的池化
  • 去掉了局部響應歸一化

3.3 GoogleNet/ Inception-v1

  • inception模塊
  • bottleneck模塊
  • 利用全局平均池化替代第一個卷積層

在這裡插入圖片描述
上邊的兩個結構分別為不帶bottleneck的inception模塊與帶有bottleneck的版本.

3.4 Inception-v2/Inception-v3

提出了網絡設計的準則:

  • 避免表達瓶頸, 盡量讓網絡從前到後的各個層的信息表徵能力逐漸降低不能劇烈下降,或者在中間某些節點出現瓶頸.
  • 特徵圖的通道數越多,能表達的解耦信息就越多,更容易繼續寧局部處理.
  • 如果要在特徵圖上做空間域的聚合,可以先對特徵圖進行壓縮,降低參數量,這樣不會導致表達能力的損失
  • 深度與寬度需要平衡

在這裡插入圖片描述
使用3×3取代原始inception模塊的5×5.
在這裡插入圖片描述
3×3分解為1×3與3×1的串聯或者並聯
在這裡插入圖片描述

3.5 ResNet

  • 採用shortcut連接,可以一直梯度消失的現象.
    在這裡插入圖片描述

3.6 Inception-v4/Inception-ResNet

進行了更加精細的設計,融入了resnet.

3.7 ResNeXt

  • 採用分組卷積替代residual 模塊中的普通卷積.
    在這裡插入圖片描述

四. 卷積基礎模塊

4.1 BN

機器學習中,一般會假設模型的輸入數據的分佈是穩定的,如果模型輸入數據發生變化,則稱為協變量偏移,模型的訓練與測試集的分佈不一致,或者模型在訓練過程中輸入數據發生變化,這都屬於協變量偏移現象.

對於深度神經完了過訓練過程中,每一層的參數都會隨之而更新,訓練過程中如果之前層的參數被更新,那麼該層的輸入數據的分佈必然也會發生變化,網絡越深,這種內部協變量偏移的現象更加明顯. 這種協變量偏移的會帶來很多的問題:

  • 網絡的每一層都要不斷適應其輸入數據的變化,學習效率低,訓練過程緩慢.
  • 網絡前幾層的更新會使得後幾層的輸入變得過大或者過小,從而陷入激活函數的飽和區,學習過程停止.
  • 為了降低協變量偏移的影響,學習率盡量使用小一些,降低收斂速度.

BN主要是為了確保即使網絡的參數發生變化,各個層的輸入輸出數據的分佈也不會發生較大的變化.

公式:

在這裡插入圖片描述

x與y分別為原始輸入數據與BN後的輸出數據,有兩個可學習的參數\gamma(縮放參數)與\beta(平移參數).在這兩個參數的作用:

  • 保留網絡各層在訓練中的成果,如果沒有這兩個參數,那麼批歸一化就會退化為普通的標準化,訓練過程中參數雖然在更新,輸出分佈幾乎不變(均值始終為0, 標準差為1), 不能有效的學習,有這兩個參數後,網絡可以為每個神經元自適應的學習一個量身定製的分佈,保留每個神經元的學習成果.
  • 使BN有自我關閉的能力,若這兩個參數分別取數據的均值與標準差,那麼就可以復原初始的值,也就是BN被關閉.

BN放置在激活層之前之後均可

  • 如果放置在激活層之前,那麼就可以有效比秒BN破壞非線性特徵的分佈,另外BN也可以使得數據點盡量不落入激活函數的飽和區,防止梯度消失.
  • 由於常用激活函數為ReLU,沒有sigmoid的種種問題,因此,也可以放置在激活層之後,避免數據在激活層之前被轉化為相似的模式從而使得非線性特徵分佈趨於同化.工業界通常傾向於放置在激活層之後

4.2 分類網絡最後幾層的變化

在AlexNet 與VGGNet中採用兩層的全連接層,而在GoogleNet之後的網絡中一般採用全局平均池化層加上一層全連接層實現.

全局平均池化的優點:

  • 參數量與計算量大大降低.全局平均池化的參數量為0, 對於cxwxh的特徵層, 次啊用全局平均池化的計算量為cwh, 採用連接k個節點的全連接層,計算量為cwhk.
  • 具有較好的可解釋性,我們可以知道特徵圖上哪些部分對於分類貢獻最大(類別激活圖CAM).

4.3 瓶頸與沙漏結構

  • 瓶頸結構
    採用1×1的卷積來壓縮卷積層輸入特徵圖的數目,減小計算量.完成之後根據需要會使用1×1的卷積將特徵圖的數目復原.

  • 沙漏結構 : 一個編碼解碼器的結構

hourglass網絡,在目標檢測的anchor-free方法中使用.

  • 自底向上: 將特徵圖尺寸逐層壓縮(編碼器)
  • 自頂而下: 利用反卷積或者插值等上採樣操作將特徵圖的尺寸逐層擴大(解碼器)

五. 目標檢測

5.1 單步法與兩步法性能差異的原因

  • 單步法: 沒有獨立的顯式的提取候選區域的過程, 直接由輸入圖像得到其中存在的物體的類別和位置信息.
  • 兩步法: 有獨立的顯式的提取候選區域的過程,先在輸入圖像上篩選出可能存在物體的候選區域,然後針對每個候選區域,判斷是否存在物體,如果存在就給出類別以及位置修正信息.

單步法在檢測速度上有優勢,兩步法在檢測精度上有優勢.出現這種差異的原因:

  • 單步法採用預設的anchor box來捕捉可能存在圖像中各個位置的物體. 單步法模型會針對數量龐大的錨框進行是否含有物體以及物體類別的密集分類,正負樣本數目極不均衡,Focal loss通過一直負樣本對最終損失的貢獻來提升網絡的整體表現. 兩步法有獨立的候選區域提取的步驟,第一步就可以篩選掉大量不含有物體的區域,第二部進行分類以及候選框位置修正時,正負樣本的比例已經比較均衡.
  • 兩步法在提取候選區域的過程中,會對候選區域的位置進行修正,候選區域的特徵已經對其,第二部分類的效果更好, 另外在第二部中會對候選框進行第二次的修正,得到更高的定位精度. 但是這種操作同時增加了模型的複雜度, 檢測速度較慢.
  • 以faster rcnn為代表的兩步法模型在第二部對候選框進行分類和位置回歸時,是針對每個候選區域單獨進行,因此這一部分的算法複雜度正比於語塞的候選區域的數目, 這部分的數目往往十分大, 導致這部分的計算量非常大.

5.2 RCNN系列的發展過程

5.2.1 RCNN

  • 無監督的選擇性搜索將輸入圖像中具有相似顏色直方圖的特徵區域進行遞歸和步兵,產生候選區域
  • 將候選區域的圖像裁剪縮放,利用cnn提取特徵,svm分類器進行分類
  • NMS進行去重

5.2.2 SPPNet

  • SPP為空間金字塔池化, 可以接受任意尺度的特徵圖作為輸入,然後通過三個窗口大小可變的池化層輸出具有固定大小的池化特徵.這樣可以輸入任意尺度大小的圖像
  • 直接在特徵圖上針對對應的候選區域進行截取.

5.2.3 Fast RCNN

  • 使用ROI Pooling代替SPP
  • 全連接層代替SVM,實現端到端的訓練

5.2.4 Faster RCNN

  • 採用RPN代替選擇性搜索.
  • 一幅圖像先使用RPN得到候選區域,然後再取出各個候選區域的特徵圖,送入Fast rcnn的後半部分進行分類與回歸

5.3 yolo系列的發展過程

5.3.1 yolo

yolo整體使用一個端到端的cnn來直接預測目標的位置與類別, 實時性高,但是檢測精度稍低.

yolo將輸入圖像劃分成SxS的方格,每個方格需要檢測出中心點位於方格內的物體,在具體實施時, 每個方格會預測B個邊界框.

5.3.2 yolov2

yolov2針對yolo的低召回率與低的定位精度進行改進.

  • 卷積層後邊添加BN,加快收斂速度,防止過擬合.
  • yolov2的backbone在進行檢測任務之前,先在高精度圖像上finetune 10個batch.使得檢測精度能夠提前適應高分辨率的圖像.
  • yolov2直接在預設的錨框上提取特徵. yolo使用cnn作為特徵提取器, 然後加上全連接層來預測中心位置大小與i及置信度.yolov2借鑒faster rcnn的思想,使用cnn直接在錨框上預測偏移量以及置信度.方法簡單易於學習.
  • yolov2將輸入的圖像尺寸從448變成了416, 圖片通常是以某個物體為中心,採用416的輸入圖像經過下採樣後圖像的尺寸為13(416/32 = 13), 特徵圖的尺寸為奇數,方便檢測出物體的中心.
  • yolov2還將26x26x512的特徵圖經過直通層變成13x13x2048與13x13x1024的特徵圖相結合一起進行目標檢測.來提高小目標的識別精度.
  • yolov2使用多尺度的圖像進行訓練,增強魯棒性
  • 採用DarkNet-19代替VGG.

5.3.3 yolo9000

  • 使用檢測數據集與分類數據集進行聯合訓練,檢測數據集相對分類數據集來說數據量比較小,類別少,獲取困難, 採用分類與檢測數據集進行聯合尋來你, yolo9000採用字典樹,合併了ImageNet的分類標籤與COCO的檢測標籤.

5.3.4 yolov3

  • 由於圖像的標註並不保證一定互斥(例如: 女人與人), 因此採用sigmoid的激活函數代替softmax函數.
  • 採用DarkNet-53
  • 利用不同大小的特徵圖進行聯合的尋來你,在小物體上的檢測效果也更加的優良.

5.4 如何增強模型對小目標的檢測效果

  • 模型設計方面, 採用特徵金字塔(FPN), 沙漏結構等子結構來增強對小尺度特徵的感知能力;儘可能提升網絡的感受野,使得網絡能夠更多的利用上下文信息;減少總的下採樣的比例,使得最後的檢測特徵分辨率更高.
  • 訓練時, 提高小樣本物體的比例,採用數據增廣手段,將圖像縮小來生成小物體的樣本.
  • 採用更大的輸入圖像的尺寸