1. 程式人生 > >全卷積網路FCN詳解

全卷積網路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”這一類統計概率最高。

這裡寫圖片描述

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

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

這裡寫圖片描述

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

這裡寫圖片描述

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

這裡寫圖片描述

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

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

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

全連線層 -> 成卷積層

全連線層和卷積層之間唯一的不同就是卷積層中的神經元只與輸入資料中的一個區域性區域連線,並且在卷積列中的神經元共享引數。然而在兩類層中,神經元都是計算點積,所以它們的函式形式是一樣的。因此,將此兩者相互轉化是可能的:

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

  • 相反,任何全連線層都可以被轉化為卷積層。比如,一個 K=4096 的全連線層,輸入資料體的尺寸是 7×7×521,這個全連線層可以被等效地看做一個 F=7,P=0,S=1,K=4096 的卷積層。換句話說,就是將濾波器的尺寸設定為和輸入資料體的尺寸一致了。因為只有一個單獨的深度列覆蓋並滑過輸入資料體,所以輸出將變成 1×1×4096,這個結果就和使用初始的那個全連線層一樣了。

全連線層轉化為卷積層:在兩種變換中,將全連線層轉化為卷積層在實際運用中更加有用。假設一個卷積神經網路的輸入是 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 大小的圖,這裡為了簡化而畫成一個畫素而已。

這裡寫圖片描述

如下圖所示,對原影象進行卷積conv1、pool1後原影象縮小為1/2;之後對影象進行第二次conv2、pool2後圖像縮小為1/4;接著繼續對影象進行第三次卷積操作conv3、pool3縮小為原影象的1/8,此時保留pool3的featureMap;接著繼續對影象進行第四次卷積操作conv4、pool4,縮小為原影象的1/16,保留pool4的featureMap;最後對影象進行第五次卷積操作conv5、pool5,縮小為原影象的1/32,然後把原來CNN操作中的全連線變成卷積操作conv6、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)步驟,缺乏空間一致性。

小結