CV01-語義分割筆記和兩個模型VGG & ResNet的筆記

目錄

一、語義分割

二、VGG模型

2.1 VGG特徵提取部分

2.2 VGG圖像分類部分

三、ResNet模型

3.1 爲什麼是ResNet

3.2 1×1卷積調整channel維度大小

3.3 ResNet裏的BottleNeck

3.4 Global Average Pooling 全局平均池化

3.5 Batch Normalization


學習語義分割理論,學習兩個經典的模型VGG & ResNet,記錄一些自己認爲重要的要點,以免日後遺忘。

一、語義分割

計算機視覺研究的分類問題,由簡單到複雜經過以下幾個階段:

  1. 最初的,Image Classification,圖像分類;比如,將一組(注意是一組,不是一個)圖片分類,圖片主體明顯,將人物圖像、風景圖像等分爲人物、風景、貓、狗等;
  2. 然後發展,Object Detection,目標檢測;比如,在圖像裏找出某個對象並提取出來,將圖片裏的貓、狗用個框圈出來;
  3. 再後來發展到,Instance Segmentation,實例分割;實例分割與目標檢測的區別是:目標檢測只能用框框圈出貓、狗,框框也圈出了背景的像素,而實例分割可以把貓、狗的像素點全部標記出來而不標記背景像素;
  4. 目前,圖片的分割已經到達了Semantic Segmentation,語義分割;語義分割就是將分類問題細化到像素級別,比如,圖片裏面每個像素都被標記爲貓、草地、樹木、天空等類別。所有像素都分類了,那麼圖片分類就達到了很精細的程度。

語義分割是一種稠密估計(Dense Predicttion)。以往的分類問題,最終的估值都是比輸入小的,比如輸入一張1024×768的圖片,輸出的或者是框框的座標(x,y),或者是實例的像素點,都比輸入1024×768。而稠密估計,輸出和輸入是一樣大的,輸入是1024×768的圖片,輸入的也是1024×768的圖片,輸入的每個像素點都被標記一個label。

 

二、VGG模型

VGG本身不是語義分割用的,但是VGG模型的設計思想被沿用至今,我們可以認爲VGG的做法都是以後人們在用的做法。VGG模型分成兩個部分,一個是特徵提取,一個是圖像分類。

2.1 VGG特徵提取部分

特徵提取都是經過多層的“卷積→激活函數、再池化”來提取出特徵值。

VGG大量使用3×3的卷積,3×3卷積有什麼好處呢?

  1. 減少參數,防止過擬合的發生。從感受野(Receptive Field)來看,兩個3×3的卷積相當於一個5×5的卷積,三個3×3的卷積相當於一個7×7的卷積,以此類推。但是,參數減少了,2×3×3小於5×5,3×3×3小於7×7……
  2. 兩個3×3的卷積相當於一個5×5的卷積,那麼兩個3×3的卷積就有兩個非線性的激活函數;三個3×3的卷積相當於一個7×7的卷積,那麼三個3×3的卷積就有三個非線性的激活函數……這就有了更多的表現能力。

VGG每經過一次池化(spatial方向H×W都減半),通道數就會加倍(channel方向增大一倍)。

2.2 VGG圖像分類部分

特徵提取結束後,接全連接層。接全連接層,先用flatten將H×W的矩陣拉成一個一維向量。

三、ResNet模型

ResNet模型的出現使網絡的深度大大增加。

3.1 爲什麼是ResNet

一般認爲,當網絡越來也深,其表現能力越強。但是,實際上網絡的能力並不會隨着深度增加一直增大,會出現網絡的退化現象,也就是深度增加其能力反而不如淺層網絡(其在測試集和訓練集上的準確率都下降),這個不是過擬合(訓練集上準確率提高,測試集上準確率下降)。

即使只增加恆等映射層,實驗結果也是網絡出現退化,隨着深度的加深連學習一個恆等映射都變困難。所以,何愷明提出殘差網絡Residual Net。來解決這個問題。

如果我們要學習一個估值H(x)有困難,那麼我們就定義殘差F(x)=H(x)-x,學習殘差F(x)相對容易,然後我們用H(x)=F(x)+x來學習到原來的估值H(x)

爲什麼殘差可以解決退化的問題呢?我個人的理解就是,經過深度網絡的卷積、池化層操作,輸入的信息損失太多。那麼把這個損失的信息補回來就解決了退化問題。所以,每2個卷積就對結果加一次x,這樣就不會造成輸入信息的損失,網絡層數可以一直加下去。

3.2 1×1卷積調整channel維度大小

因爲卷積、池化操作,導致channel發生了變化,所以需要對輸入x做channel方向調整,才能做加法。注意H(x)=F(x)+x裏面的加號是張量的加法,不是直接加。

舉例,輸入的是RGB圖像,也就是3×H×W的輸入。經過卷積、池化等,就變成了64×H×W的維度,要相加,那麼輸入x也要變成channel=64。那麼,1×1卷積就解決了這個問題。1×1卷積不改變spatial的大小,只改變channel的大小。

3.3 ResNet裏的BottleNeck

隨着深度的增加,每一層的參數個數會變的非常大(主要是channel變大,channel每層增大一倍,50層以上channel很大)。上面提到ResNet就是在計算得到的輸出上加輸入。

  1. 第一種卷積計算就是直接計算輸出,加上輸入就可以了,被稱爲BasicBlock。比如左圖中,輸入是channel=64,卷積計算和輸出都是channel=64。
  2. 第二種channel很大的情況,解決辦法是用1×1卷積調整維度,將channel降下來,算好了以後再用1×1卷積將channel升上去,被稱爲BottleNeck。比如右圖中,輸入channel=256,先1×1卷積將channel降到64,計算輸出是channel=64,再用1×1卷積將channel升到256,在做加法。

256——64——256就像瓶頸一樣——BottleNeck。

3.4 Global Average Pooling 全局平均池化

爲了連接全連接層。需要把矩陣拉成一維向量,以前辦法是flatten。C×H×W的張量,經過flatten變成了一維向量,有CHW個元素。

而全局平均池化的意思,實際上就是池化的kernel_size和輸入大小相同,這樣每個channel就只有一個平均值輸出。C×H×W的張量,經過全局平均池化變成了C×1×1,有C個元素。

全局平均池化的好處就是,全連接層的參數大大減少,避免過擬合。

3.5 Batch Normalization

爲什麼conv裏面的bias=False?因爲,後面有Batch Normalization。如果conv就加bias,卷積後做batch normalization還要再加bias,那麼conv的bias就無效了。所以,後面如果有bn就不加bias。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章