全卷積網絡

 

全卷積網絡

卷積神經網絡(CNN)自2012年以來,在圖像分類和圖像檢測等方面取得了巨大的成就和廣泛的應用。

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

這些抽象的特徵對分類很有幫助,可以很好地判斷出一幅圖像中包含什麼類別的物體,但是因爲丟失了一些物體的細節,不能很好地給出物體的具體輪廓、指出每個像素具傳統的基於CNN的分割方法的做法通常是:爲了對一個像素分類,使用該像素周圍的一個圖像塊作爲CNN的輸入用於訓練和預測。這種方法有幾個缺點:一是存儲開銷很大。例如對每個像素使用的圖像塊的大小爲15x15,則所需的存儲空間爲原來圖像的225倍。二是計算效率低下。相鄰的像素塊基本上是重複的,針對每個像素塊逐個計算卷積,這種計算也有很大程度上的重複。三是像素塊大小的限制了感知區域的大小。通常像素塊的大小比整幅圖像的大小小很多,只能提取一些局部的特徵,從而導致分類的性能受到限制。

針對這個問題,UC BerkeleyJonathan Long等人提出了Fully Convolutional Networks (FCN)[1]用於圖像的分割。該網絡試圖從抽象的特徵中恢復出每個像素所屬的類別。即從圖像級別的分類進一步延伸到像素級別的分類。

體屬於哪個物體,因此做到精確的分割就很有難度。

FCN的原理

FCN將傳統CNN中的全連接層轉化成一個個的卷積層。如下圖所示,在傳統的CNN結構中,前5層是卷積層,第6層和第7層分別是一個長度爲4096的一維向量,第8層是長度爲1000的一維向量,分別對應1000個類別的概率。FCN將這3層表示爲卷積層,卷積核的大小(通道數,寬,高)分別爲(4096,1,1)、(4096,1,1)、(1000,1,1)。所有的層都是卷積層,故稱爲全卷積網絡。 

可以發現,經過多次卷積(還有pooling)以後,得到的圖像越來越小,分辨率越來越低(粗略的圖像),那麼FCN是如何得到圖像中每一個像素的類別的呢?爲了從這個分辨率低的粗略圖像恢復到原圖的分辨率,FCN使用了上採樣。例如經過5次卷積(pooling)以後,圖像的分辨率依次縮小了2481632倍。對於最後一層的輸出圖像,需要進行32倍的上採樣,以得到原圖一樣的大小。

這個上採樣是通過反捲積(deconvolution)實現的。對第5層的輸出(32倍放大)反捲積到原圖大小,得到的結果還是不夠精確,一些細節無法恢復。於是Jonathan將第4層的輸出和第3層的輸出也依次反捲積,分別需要16倍和8倍上採樣,結果就精細一些了。下圖是這個卷積和反捲積上採樣的過程: 

下圖是32倍,16倍和8倍上採樣得到的結果的對比,可以看到它們得到的結果越來越精確: 

FCN的優點和不足

與傳統用CNN進行圖像分割的方法相比,FCN有兩大明顯的優點:一是可以接受任意大小的輸入圖像,而不用要求所有的訓練圖像和測試圖像具有同樣的尺寸。二是更加高效,因爲避免了由於使用像素塊而帶來的重複存儲和計算卷積的問題。

同時FCN的缺點也比較明顯:一是得到的結果還是不夠精細。進行8倍上採樣雖然比32倍的效果好了很多,但是上採樣的結果還是比較模糊和平滑,對圖像中的細節不敏感。二是對各個像素進行分類,沒有充分考慮像素與像素之間的關係,忽略了在通常的基於像素分類的分割方法中使用的空間規整(spatial regularization)步驟,缺乏空間一致性。

FCN的擴展

雖然FCN不夠完美,但是其全新的思路開闢了一個新的圖像分割方向,對這個領域的影響是十分巨大的,從20153月在arxiv6月在CVPR會議上發表到寫下這篇博客的時候一年的時間,該文章已被引用高達400次。

FCN的基礎上,UCLA DeepLabLiang-Chieh Chen[2]等在得到像素分類結果後使用了全連接的條件隨機場(fully connectedconditional random fields),考慮圖像中的空間信息,得到更加精細並且具有空間一致性的結果。

Liang-Chieh的這篇文章有兩大特點,一是忽略下采樣過程,轉而使用稀疏的卷積核以增加感知範圍。如下圖所示: 

二是使用了Fully Connected CRFCRF的能量函數中包括數據項和平滑項兩部分,數據項與各個像素屬於各類別的概率有關,平滑項控制像素與像素間類別的一致性。傳統的CRF的平滑項只考慮相鄰像素類別的關聯性,而Fully Connected CRF將圖像中任意兩個像素之間的類別關聯性都考慮進來。

下圖是CNNFully Connected CRF結合的示意圖。 

實際上,CRF或者Fully ConnectedCRF是對CNN或者FCN輸出的一種後處理技術。像素分類和空間規整這兩步是分別進行的。Shuai Zheng[3]等人將Fully Connected CRF表示成迴流神經網絡的結構(recurrent neuron networkRNN),將CNN與這個RNN放到一個統一的框架中,可以一步到位地對兩者同時進行訓練。將圖像分割中的三個步驟:特徵提取、分類器預測和空間規整全部自動化處理,通過學習獲得,得到的結果比FCN-8sDeepLab的方法的效果好了許多。如下圖結果:

CNNFCNFully Connected CRF的結合及統一的自動訓練具有很不錯的應用價值,已有很多的研究對這幾篇文章進行跟進([2][3]的引用都已過百)。例如,帝國理工的KonstantinosKamnitsasDaniel Rueckert等人在這幾篇文章的基礎上,提出了三維的多尺度CNN和全連接CRF結合的方法,稱爲DeepMedic, 用於腦腫瘤的分割,最近(44號)剛發表於arXiv

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

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

·     相反,任何全連接層都可以被轉化爲卷積層。比如,一個 K=4096 的全連接層,輸入數據體的尺寸是 7∗7∗512,這個全連接層可以被等效地看做一個 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 across224x224 crops of the 384x384 image in strides of 32 pixels gives an identicalresult 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/32∗W/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)步驟,缺乏空間一致性。

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)步驟,缺乏空間一致性。

 

 

發佈了5 篇原創文章 · 獲贊 27 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章