【論文閱讀】Fully Convolutional Networks for Semantic Segmentation
這是CVPR 2015拿到best paper候選的論文。
論文下載地址:Fully Convolutional Networks forSemantic Segmentation
回顧CNN
通常CNN網路在卷積層之後會接上若干個全連接層, 將卷積層產生的特徵圖(feature map)映射成一個固定長度的特徵向量(這就丟失了空間信息)。以AlexNet為代表的經典CNN結構適合於圖像級的分類和回歸任務,因為它們最後都期望得到整個輸入圖像的一個數值描述(概率),比如AlexNet的ImageNet模型輸出一個1000維的向量表示輸入圖像屬於每一類的概率(softmax歸一化)。
下圖中的貓, 輸入AlexNet, 得到一個長為1000的輸出向量, 表示輸入圖像屬於每一類的概率, 其中在「tabby cat」這一類統計概率最高。
傳統的基於CNN的分割方法:為了對一個像素分類,使用該像素周圍的一個圖像塊作為CNN的輸入用於訓練和預測。這種方法有幾個缺點:一是存儲開銷很大。例如對每個像素使用的圖像塊的大小為15x15,然後不斷滑動窗口,每次滑動的窗口給CNN進行判別分類,因此則所需的存儲空間根據滑動窗口的次數和大小急劇上升。二是計算效率低下。相鄰的像素塊基本上是重複的,針對每個像素塊逐個計算卷積,這種計算也有很大程度上的重複。三是像素塊大小的限制了感知區域的大小。通常像素塊的大小比整幅圖像的大小小很多,只能提取一些局部的特徵,從而導致分類的性能受到限制。
CNN的輸入是圖像,輸出是一個結果,或者說是一個值,一個概率值。
FCN提出所追求的是,輸入是一張圖片是,輸出也是一張圖片, 學習像素到像素的映射 。
FCN
全卷積網路(FCN)則是從抽象的特徵中恢復出每個像素所屬的類別。即從圖像級別的分類進一步延伸到像素級別的分類。
FCN對圖像進行像素級的分類,從而解決了語義級別的圖像分割(semantic segmentation)問題。與經典的CNN在卷積層之後使用全連接層得到固定長度的特徵向量進行分類(全聯接層+softmax輸出)不同,FCN可以接受任意尺寸的輸入圖像,採用反卷積層對最後一個卷積層的feature map進行上採樣, 使它恢復到輸入圖像相同的尺寸,從而可以對每個像素都產生了一個預測, 同時保留了原始輸入圖像中的空間信息, 最後在上採樣的特徵圖上進行逐像素分類。
最後逐個像素計算softmax分類的損失, 相當於每一個像素對應一個訓練樣本。下圖是Longjon用於語義分割所採用的全卷積網路(FCN)的結構示意圖:
簡單的來說,FCN與CNN的區別在把於CNN最後的全連接層換成卷積層,輸出的是一張已經Label好的圖片。因為語義分割需要輸出整張圖片的分割圖,所以要求網路中的特徵圖至少是二維的,這樣才能通過上採樣還原到輸入圖片的同等大小。這就需要替換掉全連接層,改換為卷積層。
全連接層轉化為卷積層:
- 說一下卷積層和全連接層的區別:卷積層為局部連接;而全連接層則使用圖像的全局信息。可以想像一下,最大的局部是不是就等於全局了?這首先說明全連接層使用卷積層來替代的可行性。
- 究竟使用卷積層代替全連接層會帶來什麼好處呢?答案:可以讓卷積網路在一張更大的輸入圖片上滑動,得到每個區域的輸出(這樣就突破了輸入尺寸的限制)。論文里Fully Convolutional Networks for Semantic Segmentation介紹的很清楚,解讀如下:
以Alexnet為例,最後一層為7x7x256,得到後面4096個神經元;但是如果使用7x7的卷積核對前面的featuremap繼續卷積(padding=0),不也可以得到1x1x4096的向量嗎。如果圖片大一點,例如384x384,那麼Alexnet最後一層大小就是12x12x256,經過7x7卷積核就是6x6x4096,這時6x6=36個神經元就有了位置信息,如下圖所示:
第一個連接區域是[7x7x512]的全連接層,令其濾波器尺寸為Kernel=7,這樣輸出數據體就為[1x1x4096]了;第二個全連接層,令其濾波器尺寸為Kernel=1,這樣輸出數據體為[1x1x4096];最後一個全連接層也做類似的,令其Kernel=1,最終輸出為[1x1x1000]。
實際操作中,每次這樣的變換都需要把全連接層的權重W重塑成卷積層的濾波器。
經過多次卷積(還有pooling)以後,得到的圖像越來越小,解析度越來越低(粗略的圖像),那麼FCN是如何得到圖像中每一個像素的類別的呢?為了從這個解析度低的粗略圖像恢復到原圖的解析度,FCN使用了上採樣。例如經過5次卷積(和pooling)以後,圖像的解析度依次縮小了2,4,8,16,32倍。對於最後一層的輸出圖像,需要進行32倍的上採樣,以得到原圖一樣的大小。
heatmap:
目前不太清楚怎麼得到的???????
上採樣:
這個上採樣是通過反卷積(deconvolution)實現的。對第5層的輸出(32倍放大)反卷積到原圖大小,得到的結果還是不夠精確,一些細節無法恢復。於是Jonathan將第4層的輸出和第3層的輸出也依次反卷積,分別需要16倍和8倍上採樣,結果就精細一些了。下圖是這個卷積和反卷積上採樣的過程:
解釋一下三次上採樣:
如上圖所示,對原圖像進行卷積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之後的圖像進行再次反卷積補充細節,最後就完成了整個圖像的還原。
下圖是32倍,16倍和8倍上採樣得到的結果的對比,可以看到它們得到的結果越來越精確:
為什麼會這樣呢?
這裡就涉及到一個 感受域 (receptive field)的概念。較淺的卷積層(靠前的)的感受域比較小,學習感知細節部分的能力強,較深的隱藏層(靠後的),感受域相對較大,適合學習較為整體的、相對更宏觀一些的特徵。 所以在較深的卷積層上進行反卷積還原,自然會丟失很多細節特徵。
反卷積:
優點和不足:
與傳統用CNN進行圖像分割的方法相比,FCN有兩大明顯的優點:一是可以接受任意大小的輸入圖像,而不用要求所有的訓練圖像和測試圖像具有同樣的尺寸。二是更加高效,因為避免了由於使用像素塊而帶來的重複存儲和計算卷積的問題。
同時FCN的缺點也比較明顯:一是得到的結果還是不夠精細。進行8倍上採樣雖然比32倍的效果好了很多,但是上採樣的結果還是比較模糊和平滑,對圖像中的細節不敏感。二是對各個像素進行分類,沒有充分考慮像素與像素之間的關係,忽略了在通常的基於像素分類的分割方法中使用的空間規整(spatial regularization)步驟,缺乏空間一致性。
筆記整理自許多博客,不一一給出。
推薦閱讀:
TAG:卷積神經網路CNN | 深度學習DeepLearning | 圖像分割 |