1. 程式人生 > >一文概覽用於影象分割的CNN

一文概覽用於影象分割的CNN

在計算機視覺領域,影象分割指的是為影象中的每個畫素分配一個標籤的任務,它也可以被看作是dense prediction task,對影象中每個畫素進行分類。和使用矩形候選框的目標檢測不同,影象分割需要精確到畫素級位置,因此它在醫學分析、衛星影象物體檢測、虹膜識別和自動駕駛汽車等任務中起著非常重要的作用。

隨著深度學習的不斷髮展,近年來影象分割技術也在速度和準確率上迎來了一次次突破。現在,我們能在幾分之一秒內完成分割,同時保證極高的準確性。在這篇文章中,我們將介紹一些用於影象分割的主要技術及其背後的簡單思路。我們將從最基礎的語義分割(semantic segmentation)開始,慢慢進階到更復雜的例項分割(instance segmentation)。

一文概覽用於影象分割的CNN

 

目標檢測、語義分割和例項分割

語義分割

語義影象分割是為影象中的每個畫素分配語義類別標籤的任務,它不分割物件例項。現在,處理這類任務的主流方法是FCN及其衍生,所以我們先從FCN看起。

全卷積網路(FCN)

一文概覽用於影象分割的CNN

 

FCN架構

建立FCN的方法很簡單,我們只需把CNN裡的所有全連線層替換成寬高1×1的卷積層,這時卷積層的filter數量等於全連線層的神經元(輸出)數量,所有層都是卷積層,故稱全卷積網路。之所以要這麼做,是因為每個畫素的空間位置對於分割來說都很重要,而卷積層能分類全連線層無法處理的單個畫素。作為處理結果,神經網路較高層中的位置會對應於它們路徑連線的影象中的位置,即它們的感受野。

如上圖所示,FCN的架構非常簡單,主要由編碼器CNN(以VGG為例)構成,只不過其中和分類網路對應的最後三層被改成了(4096,1,1)(4096,1,1)(N+1,1,1)的卷積層(N表示類別數量)。編碼器後是一個解碼器網路,它只包含一個反向的卷積層(也稱為轉置卷積transposed convolution或反捲積deconvolution)。它的輸出與輸入影象具有相同的空間維度,並具有N+1個通道,每個通道預測一個類別。

一文概覽用於影象分割的CNN

 

反向的卷積操作

仍以VGG為例,由於前面取樣部分過大,有時候會導致後面進行反向卷積操作得到的結果解析度較低,會出現細節丟失等問題。為此,FCN的解決方法是疊加第三、四、五層池化層的特徵,以生成更精準的邊界分割。如下圖所示:

一文概覽用於影象分割的CNN

需要注意的一點是,在進行上取樣之前,所有池化特徵都會先通過(N+1,1,1)這個卷積層。

一文概覽用於影象分割的CNN

 

FCN分割效果

U-NET

一文概覽用於影象分割的CNN

 

U-NET架構

U-NET常被用於生物醫學影象分割,它遵循了FCN的編碼器-解碼器結構,不使用任何全連線層。如上圖所示,常規情況下,U-NET的編碼器是一個包含10個卷積層的CNN,中間包含最大池化層(紅色箭頭)。它的解碼器會對feature map進行多次上取樣和卷積,目的是為了提取更高效、更抽象的特徵。得到heatmap後,U-NET最後再用1×1的卷積層做分類,也就是說解碼器一共有13層,整個架構總共由23層可學習的卷積層組成。

為什麼要做上取樣?
答:池化層會丟失影象資訊和降低影象解析度且是不可逆的操作,對影象分割任務有一些影響。上取樣可以補足一些圖片的資訊,但是資訊補充的肯定不完全,所以還需要與左邊的解析度比較高的圖片相連線起來(直接複製過來再裁剪到與上取樣圖片一樣大小),這就相當於在高解析度和更抽象特徵當中做一個折衷,因為隨著卷積次數增多,提取的特徵也更加有效,更加抽象。—— jianyuchen23

SEGNET

一文概覽用於影象分割的CNN

 

SegNet架構

SegNet的全稱是“用於影象分割的深度卷積編碼器-解碼器架構”,事實上,大多數語義分割方法都遵循這種基本架構,它們的編碼器都是用VGG16,解碼器都仿照U-NET——多次上取樣後再卷積。但是,SegNet有自己獨到的特點:

  • 上取樣是不可學習的

  • 解碼器使用和編碼器相同的卷積(filter大小和相應層的通道數量)

SegNet中的上取樣是一種反向最大池化操作。為了補足影象資訊,U-NET會對編碼階段的特徵做通道降維,再把它和特徵反向卷積後得到上取樣進行相加,這一過程需要學習。而SegNet採用的方法是記錄下編碼階段的最大池化index,比如在某層移動2×2的最大池化視窗時最高值畫素的位置,然後把這個index用於解碼階段的上取樣。空白的畫素值用0填充:

一文概覽用於影象分割的CNN

 

SegNet上取樣

在這個稀疏feature map進行正常卷積後,我們就能得到密集feature map。因此相比較FCN,SegNet的記憶體利用率更高,計算效率也更高。

需要注意的是,一般來說,解碼器每一層的輸入通道數和feature map大小都與其對應的編碼器相同,但第一層不是。編碼器的第一層都3個輸入通道(RGB),但解碼器第一層有更多通道,這是為了給每個類別生成分割掩膜。

一文概覽用於影象分割的CNN

 

用SegNet進行道路場景分割

例項分割

所謂例項分割,指的就是結合了語義分割和分類的任務。它在本質上更復雜,因為為了區分同一類的不同例項,我們往往需要為每個獨立物件建立單獨的、縮小的掩膜,然後再把它的大小調整為輸入影象中物件的大小。

下面是例項分割的一些常用方法。

DEEPMASK

一文概覽用於影象分割的CNN

 

DeepMask架構

DeepMask是FAIR於2015年提出的一種例項分割方法,輸入一張圖片後,它能為子影象塊(image patch)中的物件生成56×56的分割掩膜,並以掩膜為中心進行分類。對於影象的子影象塊,它有兩個約束:

  • 子影象塊中必須包含一個大致居中的物件

  • 這個物件必須被完整包含在子影象塊中,且在給定的比例範圍內

由於DeepMask一次只能為子影象塊分割一個物件,當它處理包含複雜、重複物件的影象時,它會在多個位置以多個比例密集應用。鑑於以上兩個約束條件,這是可以理解的,也是必要的。

整個模型由VGG-A構成,它保留了兩個全連線層,但刪去了最後一個最大池化層,共有8個卷積層和4個池化層。模型輸出的下采樣因子為16,共有2個輸出,一是子影象塊對應物體的一個掩膜,二是這個子影象塊包含一個物體的得分。

一文概覽用於影象分割的CNN

 

DeepMask分割效果

Multi-task Network Cascades(MNC)

一文概覽用於影象分割的CNN

 

MNC架構,右上為簡化原理圖

MNC不直接進行例項分割,它把這個任務分成了三個更小、更簡單的子任務:

  • 區分例項。這個子任務的目標是為每個例項預測候選框和候選框是否包含物件的概率;

  • 估計掩膜。這個子任務的目標是預測物件的畫素級掩膜;

  • 對物件進行分類。這個子任務的目標是為每個掩膜級例項預測類別標籤。

這三個子任務不是並行執行的,它們要按照順序一個個完成,這也是MNC的全稱“多工網路級聯”的原因。模型用移除了所有全連線層的VGG-16處理輸入影象,生成feature map,作為三個子任務的共用資料。

子任務1:預測例項候選框

首先,神經網路以視窗的形式提取物件例項,這些候選框不包含分類預測資訊,但有一個包含/不包含物件的概率。這是個全卷積的子網路,結構類似RPN。

子任務2:估計例項掩膜

基於子任務1返回的候選框預測,模型再用ROI pooling從共享卷積特徵中提取該候選框的特徵,之後是兩個全連線層(fc),第一個fc負責把維度降到256, 第二個fc負責迴歸畫素級的掩膜。掩膜的預定義解析度是M×M,這和DeepMask中使用的預測方法有些類似,但不同的是MNC只從幾個候選框中迴歸掩膜,計算成本大大降低。

子任務3:對例項進行分類

現在模型有了子任務1給出的候選框預測,也有了子任務2用ROI pooling提取的feature map,之後就是基於掩膜和候選框預測例項類別。

這是兩條並行路徑。在基於掩膜的路徑中,ROI提取的feature map被子任務2預測的掩膜“覆蓋”,使模型更關注預測掩膜的前景特徵,計算乘積後,將特徵輸入兩路4096維的fc層。在基於候選框的路徑中,用ROI pooling提取的特徵被直接傳遞到4096維的fc層(圖中未畫出),目的是為了解決特徵大幅被掩模級通道“覆蓋”的情況(如目標物件很大)。之後,基於掩膜和基於候選框的路徑被連線起來,緊接著是N+1類的Softmax分類器,其中N類是物體,1類是背景。

一文概覽用於影象分割的CNN

 

MNC分割效果

即便是這麼複雜的架構,整個網路也是可以端到端訓練的。

INSTANCEFCN

InstanceFCN是FCN的改進版,它不僅在語義分割任務上表現出色,在例項分割上也有不錯的結果。之前我們提到過,FCN的每個輸出畫素是一個類別的分類器,那麼InstanceFCN的每個輸出畫素就是例項相對位置的分類器。例如,下圖被分為9塊區域,在其中的第6個得分圖中,每個畫素就是物件是否在例項右側的分類器。

一文概覽用於影象分割的CNN

試想一下,如果影象中只有一個例項,分割過程會很簡單;如果有多個重疊例項,那麼我們就得先區分例項,然後再進行分割。相比FCN,InstanceFCN的最大改進是引入相對位置,它在輸入影象上生成k2例項敏感分數圖,每個分數圖對應於特定的相對位置,這就實現了相同位置不同語義的預測。

為了從這些分數圖上生成影象例項,InstanceFCN在這組分數圖上用了一個m×m的滑動視窗。在這個滑動窗中,每一個m/k×m/k的子視窗直接從相應的分數圖中同樣的子視窗複製那一部分數值。之後這組子視窗按照相對位置拼起來就得到了m×m的結果。這一部分被稱為例項組合模組(instance assembling module)

模型的架構包括在輸入影象上用VGG-16做特徵提取。在輸出的feature map頂部,有兩個全卷積分支:一個用來估計分割例項(如上所述),另一個用來對例項進行評分。

一文概覽用於影象分割的CNN

 

InstanceFCN架構

如上圖所示,對於第一個分支,模型先採用一個512維的1×1卷積層轉換特徵,然後用3x3的卷積層生成一組k2例項敏感分數圖。這個例項組合模組負責在解析度為m×m(m=21)的滑動窗中預測分割掩膜。

對於第二個分支,模型先採用一個512維的3×3卷積層,後面跟隨一個1x1的卷積層。這個1x1的卷積層是逐畫素的邏輯迴歸,用於分類以畫素為中心的m×m滑動視窗中的物件是/不是例項。因此,這個分支的輸出是物件分數圖,其中一個分數對應於生成一個例項的一個滑動視窗,所以它對不同的物件類別會“視而不見”。

一文概覽用於影象分割的CNN

 

InstanceFCN分割效果

FCIS

正如InstanceFCN是對FCN的改進,完全卷積例項感知語義分割(FCIS)也是在InstanceFCN基礎上做出的進一步優化。上節我們說道,InstanceFCN預測分割掩膜的解析度都是m×m,而且沒法將物件分類為不同類別。FCIS解決了這兩個問題,它既能預測不同解析度的掩膜,也能預測不同的物件類別。

一文概覽用於影象分割的CNN

 

FCIS例項敏感分數圖

給定ROI,首先用InstanceFCN的例項組合模組生成上述分數圖。對於ROI中的每個畫素,有兩個任務(所以要生成兩個分數圖):

  • 檢測:它是否在某相對位置的物件檢測候選框內,是(detection+),否(detection-)

  • 分割:它是否在物件例項的邊界內,是(segmentation+),否(segmentation-)

基於上述任務,這時出現了三種情況:

  • 內部得分高,外部得分低:detection+,segmentation+(畫素點位於ROI中的目標部分)

  • 內部得分低,外部得分高:detection+,segmentation-(畫素點位於ROI中的背景部分)

  • 兩個得分都很低:detection-,segmentation-(畫素點不在ROI中)

對於檢測,我們可以用取最大值把前兩種情況(detection+)和情況3(detection-)區分開。整個ROI的得分是求取最大值得到分數圖的所有值的平均數,之後再通過一個softmax分類器。對於分割,softmax可以區分情況1(segmentation+)和其他情況(segmentation-)。ROI的前景掩膜是每個類別每個畫素分割分數的合併。

一文概覽用於影象分割的CNN

 

FCIS架構

一文概覽用於影象分割的CNN

 

FCIS分割效果

MASK R-CNN

MASK R-CNN是目標檢測模型Faster R-CNN的進階版,它在後者候選框提取的基礎上添加了一個並行的分支網路,用預測分割掩膜。這個分支網路是個共享feature map的FCN,它為每個ROI提供Km2 維的輸出,其中K對應類別個數,即輸出K個掩膜,m對應池化解析度。這樣的設計允許網路為每個類別生成掩膜,避免了不同類例項之間因重疊產生混淆。此外,分類分支是直接在掩膜上分類,所以分割和分類是分離的。

一文概覽用於影象分割的CNN

 

Mask R-CNN架構中用於預測掩膜的分支

關注輸入影象的空間結構是準確預測掩膜的前提,而這種畫素到畫素的操作需要ROI特徵的完全對齊。在目標檢測任務中,一些模型會用RoIPool提取這些特徵,但它們不總是嚴格對齊的,因為ROI的維度不僅可以是積分,也可以是浮點數。RoIPool通過將它們四捨五入到最接近的整數來量化這些維度,不僅如此,量化的RoI還被進一步細分為量化的空間區間,在該區間上執行合併。雖然這些量化對分類問題沒什麼影響,但如果把它們用於畫素級對齊,分割掩膜預測會出現巨大偏差。

一文概覽用於影象分割的CNN

 

RoIAlign: 虛線網格表示feature map,實線表示RoI(有2×2個bin,每個bin中4個取樣點)

考慮到例項分割要求畫素級別的精準,MASK R-CNN引入了一種新的方法來提取特徵,稱為RoIAlign。它背後的想法是很簡單:既然錯位是由量化引起的,那就避免所有量化。RoIAlign不會對維度做任何約減,它引入了一個插值過程,先通過雙線性插值到14×14,再池化到7×7,很大程度上解決了由直接池化取樣造成的Misalignment對齊問題。需要注意的是,使用RoIAlign提取的RoI特徵具有固定的空間維度,這點和RoIPool一樣。

一文概覽用於影象分割的CNN

小結

以上就是現在常用的語義分割、例項分割模型,它們基本上都是FCN的變體,把編碼器作為簡單的特徵提取器,重點放在解碼器創新上。此外,一些研究人員也嘗試過用其他方法來解決例項分割問題,比如上面提到的MASK R-CNN就是改造目標檢測模型的成果,總而言之,FCN還是解決這類任務的重要基石。

譯者的話:以上只是簡短的關鍵提煉,如果讀者希望瞭解這些模型的具體細節,可以參考文末推薦的幾篇中文論文解讀,點選閱讀原文獲取超連結。

原文地址:mohitjain.me/2018/09/30/a-look-at-image-segmentation/?utm_source=mybridge&utm_medium=blog&utm_campaign=read_more

參考文獻

[1] J. Long, E. Shelhamer, and T. Darrell. Fully convolutional networks for semantic segmentation. In CVPR, 2015. (paper)

[2] O. Ronneberger, P. Fischer, and T. Brox, “U-net: Convolutional networks for biomedical image segmentation,” in MICCAI, pp. 234–241, Springer, 2015. (paper)

[3] Badrinarayanan, V., Kendall, A., & Cipolla, R. (2017). SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 39, 2481-2495. (paper)

[4] P. O. Pinheiro, R. Collobert, and P. Dollar. Learning to segment object candidates. In NIPS, 2015. (paper)

[5] Dai, J., He, K., Sun, J. Instance-aware semantic segmentation via multi-task network cascades. In CVPR., 2016. (paper)

[6] J. Dai, K. He, Y. Li, S. Ren, and J. Sun. Instance-sensitive fully convolutional networks. In ECCV, 2016. (paper)

[7] Y. Li, H. Qi, J. Dai, X. Ji, and Y. Wei. Fully convolutional instance-aware semantic segmentation. In CVPR, 2017. (paper)

[8] K He, G Gkioxari, P Dollár, R Girshick. Mask R-CNN. In ICCV, 2017. (paper)

編譯參考

[1] jianyuchen23——U-Net論文詳解

[2] DelphiFan’s Blog——語義分割論文-SegNet

[3] Elaine_Bao——物體檢測與分割系列 DeepMask

[4] AHU-WangXiao——Instance-aware Semantic Segmentation via Multi-task Network Cascades

[5] Tina’s Blog——InstanceFCN:Instance-sensitive Fully Convolutional Networks

[6] 技術挖掘者——Mask R-CNN詳解