語義分割——FCN

《Fully Convolutional Networks for Semantic Segmentation》

  • FCN架構:

FCN可以接受任意尺寸的輸入圖像,採用反捲積層對最後一個卷積層的feature map進行上採樣, 使它恢復到輸入圖像相同的尺寸,從而可以對每個像素都產生一個預測,同時保留原始輸入圖像中的空間信息,最後在上採樣的特徵圖上進行逐像素分類。

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

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

  • 什麼是全卷積?

將原始的cnn全連接層改爲卷積層,

  • 如何將分類神經元轉化到全卷積網絡神經元輸出粗糙map?

傳統cnn的全連接層可以看作成kernel大小爲整個輸入區域的卷積層,

捨棄傳統網絡最後的池化層和池化層後的全連接分類層,將該全連接層替換爲卷積核爲1*1的卷積層,

  • 如何將粗糙map映射到原圖像素位置?

原文3.3節, 使用插值,比如簡單的雙線性插值計算每一個輸出yij從最接近的線形映射圖的四個輸入

  • fcn架構:

使用圖片分類網絡去掉最後的池化和分類層,將全連接層改爲卷積層,卷積核大小爲1*1,通道爲21,21代表分類的類別數,這樣網絡輸出就是[21,x,y]

  • 如何精確得到原尺寸的標籤?

如上圖,有三個上採樣的結果,其中,FCN-32s是最原始的直接對網絡輸出層pool5進行32倍上採樣後的輸出結果,該標籤和原圖的大小對應。FCN-16s也是對應到原圖的標籤,其中對pool5進行2倍上採樣,然後加上pool4的結果,進行16倍上採樣得到的結果,該標籤和原圖的大小對應。FCN-8s也是對應到原圖的標籤,其中對pool5進行2倍上採樣,加上pool4之後的結果,再加上原始網絡poll3的結果,進行8倍上採樣之後的輸出結果,該標籤和原圖的大小對應。

下圖就可以看出來fcn-8s邊緣細節表現上要比其他兩個好得多,平均IU要比其他兩個好一些,

微調:下圖顯示了只微調輸出分類器的結果(第一行)全部微調的結果(第二行),由於網絡分爲編碼器和解碼器階段,其中編碼器從resnet50等一系列訓練好的網絡得到每個像素特徵向量,解碼器得到每個像素的屬於類別的概率分數,所以我們首先可以嘗試只訓練分類階段,前面的解碼器使用imagenet訓練好的resnet50網絡,這樣的pixel acc只有83%,而全部網絡微調訓練得到的pixel acc有89%。

  • patchwise training:

第一次看到這個概念,不是很理解,最後搜索到了一個比較靠譜的解釋:

https://stackoverflow.com/questions/42636685/patch-wise-training-and-fully-convolutional-training-in-fcn

簡單翻譯:由於一副需要語義分割的圖片中有很多我們不關注的區域,因此直接輸入全卷積網絡會有很多的多餘計算,避免冗餘的一個標準方法是隻輸入給網絡圖像中的隨機小塊(圍繞感興趣目標的小圖像區域)而不是整圖像,這樣的“patchwise sampling”保證輸入有足夠的方差和訓練集的有效表示。 可以從訓練集中進行小塊採樣,或者直接對整圖的損失進行採樣,所以有這個說法“Patchwise training is loss sampling”,本文[fcn]後來實驗發現patchwise training 比起直接訓練整幅圖 並沒有大的提升,但是訓練花費的時間更多了,因此本文是整幅圖訓練。

  • 整體訓練流程:

先使用經典的網絡初始化,捨棄池化層和池化層後的全連接層;

從特徵小圖(16*16*4096)預測分割小圖(16*16*21),之後上採樣得到大圖,該網絡叫做FCN-32S

訓練網絡FCN-16s

訓練網絡FCN-8s

 

 

 

 

 

 

 

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