全卷積網絡 FCN 詳解

背景

CNN可以對圖片進行分類,但是怎麼樣才能識別圖片中特定部分的物體,在2015年以前仍是一個世界難題。神經網絡大神Jonathan Long發表了《Fully Convolutional Networks for Semantic Segmentation》在圖像語義分割挖了一個坑,因而無窮無盡的人往坑裏面跳。數組

這裏寫圖片描述

全卷積網絡 Fully Convolutional Networks

CNN 與 FCN

一般CNN網絡在卷積層以後會接上若干個全鏈接層, 將卷積層產生的特徵圖(feature map)映射成一個固定長度的特徵向量。以AlexNet爲表明的經典CNN結構適合於圖像級的分類和迴歸任務,由於它們最後都指望獲得整個輸入圖像的一個數值描述(機率),好比AlexNet的ImageNet模型輸出一個1000維的向量表示輸入圖像屬於每一類的機率(softmax歸一化)。網絡

栗子:下圖中的貓, 輸入AlexNet, 獲得一個長爲1000的輸出向量, 表示輸入圖像屬於每一類的機率, 其中在「tabby cat」這一類統計機率最高。ide

這裏寫圖片描述

FCN對圖像進行像素級的分類,從而解決了語義級別的圖像分割(semantic segmentation)問題。與經典的CNN在卷積層以後使用全鏈接層獲得固定長度的特徵向量進行分類(全聯接層+softmax輸出)不一樣,FCN能夠接受任意尺寸的輸入圖像,採用反捲積層對最後一個卷積層的feature map進行上採樣, 使它恢復到輸入圖像相同的尺寸,從而能夠對每一個像素都產生了一個預測, 同時保留了原始輸入圖像中的空間信息, 最後在上採樣的特徵圖上進行逐像素分類。函數

最後逐個像素計算softmax分類的損失, 至關於每個像素對應一個訓練樣本。下圖是Longjon用於語義分割所採用的全卷積網絡(FCN)的結構示意圖:性能

這裏寫圖片描述

簡單的來講,FCN與CNN的區域在把於CNN最後的全鏈接層換成卷積層,輸出的是一張已經Label好的圖片。學習

這裏寫圖片描述

其實,CNN的強大之處在於它的多層結構能自動學習特徵,而且能夠學習到多個層次的特徵:較淺的卷積層感知域較小,學習到一些局部區域的特徵;較深的卷積層具備較大的感知域,可以學習到更加抽象一些的特徵。這些抽象特徵對物體的大小、位置和方向等敏感性更低,從而有助於識別性能的提升。下圖CNN分類網絡的示意圖:atom

這裏寫圖片描述

這些抽象的特徵對分類頗有幫助,能夠很好地判斷出一幅圖像中包含什麼類別的物體,可是由於丟失了一些物體的細節,不能很好地給出物體的具體輪廓、指出每一個像素具體屬於哪一個物體,所以作到精確的分割就頗有難度。lua

傳統的基於CNN的分割方法:爲了對一個像素分類,使用該像素周圍的一個圖像塊做爲CNN的輸入用於訓練和預測。這種方法有幾個缺點:一是存儲開銷很大。例如對每一個像素使用的圖像塊的大小爲15x15,而後不斷滑動窗口,每次滑動的窗口給CNN進行判別分類,所以則所需的存儲空間根據滑動窗口的次數和大小急劇上升。二是計算效率低下。相鄰的像素塊基本上是重複的,針對每一個像素塊逐個計算卷積,這種計算也有很大程度上的重複。三是像素塊大小的限制了感知區域的大小。一般像素塊的大小比整幅圖像的大小小不少,只能提取一些局部的特徵,從而致使分類的性能受到限制。spa

而全卷積網絡(FCN)則是從抽象的特徵中恢復出每一個像素所屬的類別。即從圖像級別的分類進一步延伸到像素級別的分類。圖片

全鏈接層 -> 成卷積層

全鏈接層和卷積層之間惟一的不一樣就是卷積層中的神經元只與輸入數據中的一個局部區域鏈接,而且在卷積列中的神經元共享參數。然而在兩類層中,神經元都是計算點積,因此它們的函數形式是同樣的。所以,將此二者相互轉化是可能的:

  • 對於任一個卷積層,都存在一個能實現和它同樣的前向傳播函數的全鏈接層。權重矩陣是一個巨大的矩陣,除了某些特定塊,其他部分都是零。而在其中大部分塊中,元素都是相等的。

  • 相反,任何全鏈接層均可以被轉化爲卷積層。好比,一個 K=4096 的全鏈接層,輸入數據體的尺寸是 77512,這個全鏈接層能夠被等效地看作一個 F=7,P=0,S=1,K=4096 的卷積層。換句話說,就是將濾波器的尺寸設置爲和輸入數據體的尺寸一致了。由於只有一個單獨的深度列覆蓋並滑過輸入數據體,因此輸出將變成 114096,這個結果就和使用初始的那個全鏈接層同樣了。

全鏈接層轉化爲卷積層:在兩種變換中,將全鏈接層轉化爲卷積層在實際運用中更加有用。假設一個卷積神經網絡的輸入是 224x224x3 的圖像,一系列的卷積層和下采樣層將圖像數據變爲尺寸爲 7x7x512 的激活數據體。AlexNet使用了兩個尺寸爲4096的全鏈接層,最後一個有1000個神經元的全鏈接層用於計算分類評分。咱們能夠將這3個全鏈接層中的任意一個轉化爲卷積層:

  • 針對第一個鏈接區域是[7x7x512]的全鏈接層,令其濾波器尺寸爲F=7,這樣輸出數據體就爲[1x1x4096]了。
  • 針對第二個全鏈接層,令其濾波器尺寸爲F=1,這樣輸出數據體爲[1x1x4096]。
  • 對最後一個全鏈接層也作相似的,令其F=1,最終輸出爲[1x1x1000]

實際操做中,每次這樣的變換都須要把全鏈接層的權重W重塑成卷積層的濾波器。那麼這樣的轉化有什麼做用呢?它在下面的狀況下能夠更高效:讓卷積網絡在一張更大的輸入圖片上滑動,獲得多個輸出,這樣的轉化可讓咱們在單個向前傳播的過程當中完成上述的操做。

舉個栗子:若是咱們想讓224×224尺寸的浮窗,以步長爲32在384×384的圖片上滑動,把每一個經停的位置都帶入卷積網絡,最後獲得6×6個位置的類別得分。上述的把全鏈接層轉換成卷積層的作法會更簡便。若是224×224的輸入圖片通過卷積層和下采樣層以後獲得了[7x7x512]的數組,那麼,384×384的大圖片直接通過一樣的卷積層和下采樣層以後會獲得[12x12x512]的數組。而後再通過上面由3個全鏈接層轉化獲得的3個卷積層,最終獲得[6x6x1000]的輸出((12 – 7)/1 + 1 = 6)。這個結果正是浮窗在原圖經停的6×6個位置的得分!

面對384×384的圖像,讓(含全鏈接層)的初始卷積神經網絡以32像素的步長獨立對圖像中的224×224塊進行屢次評價,其效果和使用把全鏈接層變換爲卷積層後的卷積神經網絡進行一次前向傳播是同樣的。

Evaluating the original ConvNet (with FC layers) independently across 224x224 crops of the 384x384 image in strides of 32 pixels gives an identical result to forwarding the converted ConvNet one time.

以下圖所示,FCN將傳統CNN中的全鏈接層轉化成卷積層,對應CNN網絡FCN把最後三層全鏈接層轉換成爲三層卷積層。在傳統的CNN結構中,前5層是卷積層,第6層和第7層分別是一個長度爲4096的一維向量,第8層是長度爲1000的一維向量,分別對應1000個不一樣類別的機率。FCN將這3層表示爲卷積層,卷積核的大小 (通道數,寬,高) 分別爲 (4096,1,1)、(4096,1,1)、(1000,1,1)。看上去數字上並無什麼差異,可是卷積跟全鏈接是不同的概念和計算過程,使用的是以前CNN已經訓練好的權值和偏置,可是不同的在於權值和偏置是有本身的範圍,屬於本身的一個卷積核。所以FCN網絡中全部的層都是卷積層,故稱爲全卷積網絡。

這裏寫圖片描述

下圖是一個全卷積層,與上圖不同的是圖像對應的大小下標,CNN中輸入的圖像大小是贊成固定resize成 227x227 大小的圖像,第一層pooling後爲55x55,第二層pooling後圖像大小爲27x27,第五層pooling後的圖像大小爲13*13。而FCN輸入的圖像是H*W大小,第一層pooling後變爲原圖大小的1/4,第二層變爲原圖大小的1/8,第五層變爲原圖大小的1/16,第八層變爲原圖大小的1/32(勘誤:其實真正代碼當中第一層是1/2,以此類推)。

這裏寫圖片描述

通過屢次卷積和pooling之後,獲得的圖像愈來愈小,分辨率愈來愈低。其中圖像到 H/32W/32 的時候圖片是最小的一層時,所產生圖叫作heatmap熱圖,熱圖就是咱們最重要的高維特診圖,獲得高維特徵的heatmap以後就是最重要的一步也是最後的一步對原圖像進行upsampling,把圖像進行放大、放大、放大,到原圖像的大小。

這裏寫圖片描述

最後的輸出是1000張heatmap通過upsampling變爲原圖大小的圖片,爲了對每一個像素進行分類預測label成最後已經進行語義分割的圖像,這裏有一個小trick,就是最後經過逐個像素地求其在1000張圖像該像素位置的最大數值描述(機率)做爲該像素的分類。所以產生了一張已經分類好的圖片,以下圖右側有狗狗和貓貓的圖。

這裏寫圖片描述

upsampling

相較於使用被轉化前的原始卷積神經網絡對全部36個位置進行迭代計算,使用轉化後的卷積神經網絡進行一次前向傳播計算要高效得多,由於36次計算都在共享計算資源。這一技巧在實踐中常用,一次來得到更好的結果。好比,一般將一張圖像尺寸變得更大,而後使用變換後的卷積神經網絡來對空間上不少不一樣位置進行評價獲得分類評分,而後在求這些分值的平均值。

最後,若是咱們想用步長小於32的浮窗怎麼辦?用屢次的向前傳播就能夠解決。好比咱們想用步長爲16的浮窗。那麼先使用原圖在轉化後的卷積網絡執行向前傳播,而後分別沿寬度,沿高度,最後同時沿寬度和高度,把原始圖片分別平移16個像素,而後把這些平移以後的圖分別帶入卷積網絡。

這裏寫圖片描述

以下圖所示,當圖片在網絡中通過處理後變成越小的圖片,其特徵也越明顯,就像圖像中顏色所示,固然啦,最後一層的圖片再也不是一個1個像素的圖片,而是原圖像 H/32xW/32 大小的圖,這裏爲了簡化而畫成一個像素而已。

這裏寫圖片描述

以下圖所示,對原圖像進行卷積conv一、pool1後原圖像縮小爲1/2;以後對圖像進行第二次conv二、pool2後圖像縮小爲1/4;接着繼續對圖像進行第三次卷積操做conv三、pool3縮小爲原圖像的1/8,此時保留pool3的featureMap;接着繼續對圖像進行第四次卷積操做conv四、pool4,縮小爲原圖像的1/16,保留pool4的featureMap;最後對圖像進行第五次卷積操做conv五、pool5,縮小爲原圖像的1/32,而後把原來CNN操做中的全鏈接變成卷積操做conv六、conv7,圖像的featureMap數量改變可是圖像大小依然爲原圖的1/32,此時圖像再也不叫featureMap而是叫heatMap。

如今咱們有1/32尺寸的heatMap,1/16尺寸的featureMap和1/8尺寸的featureMap,1/32尺寸的heatMap進行upsampling操做以後,由於這樣的操做還原的圖片僅僅是conv5中的卷積核中的特徵,限於精度問題不可以很好地還原圖像當中的特徵,所以在這裏向前迭代。把conv4中的卷積覈對上一次upsampling以後的圖進行反捲積補充細節(至關於一個差值過程),最後把conv3中的卷積覈對剛纔upsampling以後的圖像進行再次反捲積補充細節,最後就完成了整個圖像的還原。

這裏寫圖片描述

缺點

在這裏咱們要注意的是FCN的缺點:

  1. 是獲得的結果仍是不夠精細。進行8倍上採樣雖然比32倍的效果好了不少,可是上採樣的結果仍是比較模糊和平滑,對圖像中的細節不敏感。

  2. 是對各個像素進行分類,沒有充分考慮像素與像素之間的關係。忽略了在一般的基於像素分類的分割方法中使用的空間規整(spatial regularization)步驟,缺少空間一致性。

小結

相關文章
相關標籤/搜索