語義分割論文閱讀

以前看了一些介紹語義分割的論文,可是沒有記筆記,由於想把時間花在跑模型,加強工程能力上。如今參照別人的文章,把看過的幾篇論文作一個簡單的總結。算法

1. FCN網絡

網絡結構以下圖,即輸入圖片經過CNN網絡提取特徵,以後通過上採樣,將特徵恢復成原圖大小,從而達到像素級別的分割:架構

 

全卷積網絡,有三個特色:框架

1.  將全鏈接層替換爲全卷積層,即最後一層是經過卷積生成,1*1*2046個特徵,而非直接變成全鏈接層。 我理解去掉全鏈接層好處是,卷積層能夠對任意大小的feature map 進行卷積,從而最開始輸入的圖片大小就可變了。而全鏈接層因爲計算方法的區別,必須對輸入的feature map進行統一大小,否則就沒法計算。其餘方面應該是同樣的。能夠本身手推一下。如圖所示,將全鏈接層替換爲全卷積層機器學習

 

2. 上採樣。我以爲這點很重要,將提取的高維抽象特徵,通過上採樣恢復成原圖大小,各個channel再疊加起來,完成了像素級別的特徵提取。上採樣方法和CNN 反向傳播求梯度時的上採樣方法同樣, 此處可參考其餘人手推的BP算法在CNN網絡中的實現。這個實現很重要,有必要本身學會如何手推。函數

3. 跨層鏈接。這點沒什麼好說的,目的就是經過獲取多層特徵,從而對feature的還原度好一點。論文實現了32倍,16倍和8倍上採樣(三種框架),上採樣方法以下圖所示.學習

下圖是3種倍數的上採樣的分割效果,能夠看到8倍上採樣的分割效果最好。論文裏也嘗試融合更多層特徵,以後再上採樣,可是改善效果不大優化

損失函數,參照我上一篇博客相關介紹:編碼

 

2.  U-netspa

這個框架常常被用來進行Kaggle比賽,用做baseline,應該是由於模型簡單,很是快,用少許圖像也訓練得比較好。並且最開始也是用做醫學圖像標記的,對小物體效果也很好。不過如今已將發展到DeepLab V3及Mask-RCNN了,我以爲後面兩個模型更好。

下圖就是網絡結構。由此也能夠看出來爲毛要叫U-net了。對FCN的一種改進吧,上採樣過程當中融合了更多層的原feature map的信息,同時注意是經過增長channel的方式來進行的融合,先裁剪成2*2,以後按通道加到上採樣後的通道中,而非FCN的直接求和來疊加feature map的信息。這點能夠從channel數量看出來。通道數很大,這樣能夠將上下文信息傳到分辨率更高的層中去。

左邊是下采樣,不斷提取特徵,同時分辨率降低,右邊是上採樣,增大分辨率,同時融合原feature map信息,目的是加強位置信息。由於越抽象到高層,特徵所表達的位置信息就越若。增長底層的feature map的信息,就可加強上下文信息。這點下一篇博客會專門寫一下相關網絡架構。

 說一下其損失函數的定義。這個定義的損失函數比價複雜,緣由是爲了將相互接觸的目標分開,是按照位置賦予像素一個權重,對比機器學習KNN及線性分類器及SVM這種,很像按高斯核來肯定的一個權重。畢竟細胞是相互接觸的,實際Kaggle中用的U-net損失函數定義和其餘無區別,由於比賽重疊的物體不多。

3. Segnet

沒什麼好說的,看網絡結構,感受和U-net很像,都是編碼解碼過程,並且看後面感受也沒什麼人用,就沒怎麼看。創新點是池化過程當中記住了位置信息,上採樣時按位置信息恢復能夠更好還原圖像。  我原本覺得以前全部的都是按這種形式作得,這個之後有時間要看下tensorflow的源碼上採樣實現過程了

4. Deeplab系列

deeplabv1&v2

Deeplab講一下空洞卷積的概念。其實後面是用條件隨機場作過圖像處理,加強圖像位置信息,可是條件隨機場,機率圖這部分看着頭大,公式推過幾遍,可是當時學的時候沒有用到什麼算法實例,並且DeeplabV3把這部分也去掉了,就先不寫。下面就是總體的流程。j簡單講一下v1,v2,其實也沒怎麼看。感受不如直接講V3和V3+。

 

 

空洞卷積的引入就是在不減少分辨率的狀況下增長感覺野。上一篇博客講過。空洞率rate就是空洞的個數+1. 能夠看到對相個數同的像素點進行卷積操做,空洞卷積的感覺野明顯增大。

Deeplab V2相比V1其實就是增長了使用不一樣空洞率的卷積核來進行卷積,就好像增長了不一樣尺度的feature map,以後對這些進行了融合。沒仔細看,不講了,簡單以下圖

 

Deeplab V3

感受相比前兩種,V3改進就是嘗試了ASPP模塊的改進,基礎網絡仍是resnet。V3和V3+這兩篇論文比較重要,也看了源碼,可是暫時沒時間仔細看,看完源碼以後再寫篇博客專門寫一下。

最開始,如圖所示有如下幾種級聯方式。

1.不一樣尺寸的圖像進行輸入,以後將feature map融合進來。常見於人臉檢測中。

2. 編碼解碼方式。好比U-net

3. 串聯結構

4.並聯結構

後兩種結構均在本文作了嘗試

並聯方式改進以下,增長了1*1的卷積和全局池化層。1*1卷積能夠當作空洞rate特別大的卷積,而image pooling 至關於對全局圖片進行平均池化,成爲一個點,以後通過一個1*1的卷積後,採用雙線性差值進行上採樣:

論文也嘗試過串聯結構,可是貌似效果很差?

 

 DeeplabV3+

18頁的論文,真是。。太麻煩了。其實就兩點,對DeeplabV3的進一步優化,加入了編碼解碼結構。ASPP結構是編碼,後續上採樣加入了底層的featur map信息,目的是加強位置敏感性?第二點就是基礎模型的改進。。

網絡結構再也不是Resnet,變成了Xception.不會的能夠參考下其餘人的博客。。我下一篇也會寫這個模型。。。

 

 Deeplab系列就這樣吧。這一系列看的有點着急,並且是很久以前看的從新寫心得,其實頗有必要實現下源碼加強理解。。下週會寫一份源碼的閱讀記錄。。。

PSPnet

 PSPnet其實在DeeplapV3以前,DeeplabV3就是吸收了它的global pooling層的特色作得一個改進。global pooling的意義就是吸收不一樣尺度的特徵信息,也包含了位置的信息。通過不一樣尺度的global pooling,造成1*1,2*2,3*3和6*6後的feature map,以後卷積,減少通道個數。在進行上採樣(雙線性差值方法)和未通過pooling的層進行融合。進行分割。總體過程以下圖:

Large Kernel matters

大卷積有利於掌握全局信息,可是前面global pooling和1*1會損失位置信息,且單純大卷積會形成計算量大,因此本文采用了GCN形式,且經過殘差模塊來提升邊緣信息。我不是很理解GCN是怎麼實現的,難道padding是使用的same padding?沒有看源碼,只看了下大體的結構。流程以下,看到增長的新模塊是GCN和BR結構。

 

Refinet 沒看,之後再補上 

Mask-RCNN

Mask-RCNN是很厲害的一個網絡了,這個的源碼是必需要看的。並且在Kaggle比賽中也有用這個打比賽的,效果很好。總體還從語義分割直接鏈接到的實例分割的層次,即有目標檢測加語義分割兩個的融合。

對Fster-RCNN的改進:

1. 增長mask分支,增長像素級別分類。採用了FCN結構,效果反映在loss函數上對預測目標的進一步優化結構以下:

 

loss函數以下,對每個像素預測一個二值掩膜,即0,1。即對每個RPN預測K(類別)個m*m個值,每一個類別損失函數單獨算。m*m個2值,由此來計算損失:

 

 

2. 對池化進行了優化,採用ROIalign,即便用線性插值方法對池化操做進行優化,目的是達到像素級別的對準。感受這個很早就用在了語義分割裏?具體以下:

這套方案將目標檢測和語義分割結合起來,不是單獨的用像素塊標記出物體,同時還能夠告訴你這個像素塊屬於哪種類別。結果以下:

 

相關文章
相關標籤/搜索