在計算機視覺領域,圖像分割指的是為圖像中的每個像素分配一個標簽的任務,它也可以被看作是dense prediction task,對圖像中每個像素進行分類。和使用矩形候選框的目標檢測不同,圖像分割需要精確到像素級位置,因此它在醫學分析、衛星圖像物體檢測、虹膜識別和自動駕駛汽車等任務中起著非常重要的作用。
隨著深度學習的不斷發展,近年來圖像分割技術也在速度和準確率上迎來了一次次突破?,F在,我們能在幾分之一秒內完成分割,同時保證極高的準確性。在這篇文章中,我們將介紹一些用于圖像分割的主要技術及其背后的簡單思路。我們將從最基礎的語義分割(semantic segmentation)開始,慢慢進階到更復雜的實例分割(instance segmentation)。
目標檢測、語義分割和實例分割
語義分割
語義圖像分割是為圖像中的每個像素分配語義類別標簽的任務,它不分割對象實例?,F在,處理這類任務的主流方法是FCN及其衍生,所以我們先從FCN看起。
全卷積網絡(FCN)
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個通道,每個通道預測一個類別。
反向的卷積操作
仍以VGG為例,由于前面采樣部分過大,有時候會導致后面進行反向卷積操作得到的結果分辨率較低,會出現細節丟失等問題。為此,FCN的解決方法是疊加第三、四、五層池化層的特征,以生成更精準的邊界分割。如下圖所示:
需要注意的一點是,在進行上采樣之前,所有池化特征都會先通過(N+1,1,1)這個卷積層。
FCN分割效果
U-NET
U-NET架構
U-NET常被用于生物醫學圖像分割,它遵循了FCN的編碼器-解碼器結構,不使用任何全連接層。如上圖所示,常規情況下,U-NET的編碼器是一個包含10個卷積層的CNN,中間包含最大池化層(紅色箭頭)。它的解碼器會對feature map進行多次上采樣和卷積,目的是為了提取更高效、更抽象的特征。得到heatmap后,U-NET最后再用1×1的卷積層做分類,也就是說解碼器一共有13層,整個架構總共由23層可學習的卷積層組成。
為什么要做上采樣?答:池化層會丟失圖像信息和降低圖像分辨率且是不可逆的操作,對圖像分割任務有一些影響。上采樣可以補足一些圖片的信息,但是信息補充的肯定不完全,所以還需要與左邊的分辨率比較高的圖片相連接起來(直接復制過來再裁剪到與上采樣圖片一樣大?。@就相當于在高分辨率和更抽象特征當中做一個折衷,因為隨著卷積次數增多,提取的特征也更加有效,更加抽象?!猨ianyuchen23
SEGNET
SegNet架構
SegNet的全稱是“用于圖像分割的深度卷積編碼器-解碼器架構”,事實上,大多數語義分割方法都遵循這種基本架構,它們的編碼器都是用VGG16,解碼器都仿照U-NET——多次上采樣后再卷積。但是,SegNet有自己獨到的特點:
上采樣是不可學習的
解碼器使用和編碼器相同的卷積(filter大小和相應層的通道數量)
SegNet中的上采樣是一種反向最大池化操作。為了補足圖像信息,U-NET會對編碼階段的特征做通道降維,再把它和特征反向卷積后得到上采樣進行相加,這一過程需要學習。而SegNet采用的方法是記錄下編碼階段的最大池化index,比如在某層移動2×2的最大池化窗口時最高值像素的位置,然后把這個index用于解碼階段的上采樣。空白的像素值用0填充:
SegNet上采樣
在這個稀疏feature map進行正常卷積后,我們就能得到密集feature map。因此相比較FCN,SegNet的內存利用率更高,計算效率也更高。
需要注意的是,一般來說,解碼器每一層的輸入通道數和feature map大小都與其對應的編碼器相同,但第一層不是。編碼器的第一層都3個輸入通道(RGB),但解碼器第一層有更多通道,這是為了給每個類別生成分割掩膜。
用SegNet進行道路場景分割
實例分割
所謂實例分割,指的就是結合了語義分割和分類的任務。它在本質上更復雜,因為為了區分同一類的不同實例,我們往往需要為每個獨立對象創建單獨的、縮小的掩膜,然后再把它的大小調整為輸入圖像中對象的大小。
下面是實例分割的一些常用方法。
DEEPMASK
DeepMask架構
DeepMask是FAIR于2015年提出的一種實例分割方法,輸入一張圖片后,它能為子圖像塊(image patch)中的對象生成56×56的分割掩膜,并以掩膜為中心進行分類。對于圖像的子圖像塊,它有兩個約束:
子圖像塊中必須包含一個大致居中的對象
這個對象必須被完整包含在子圖像塊中,且在給定的比例范圍內
由于DeepMask一次只能為子圖像塊分割一個對象,當它處理包含復雜、重復對象的圖像時,它會在多個位置以多個比例密集應用。鑒于以上兩個約束條件,這是可以理解的,也是必要的。
整個模型由VGG-A構成,它保留了兩個全連接層,但刪去了最后一個最大池化層,共有8個卷積層和4個池化層。模型輸出的下采樣因子為16,共有2個輸出,一是子圖像塊對應物體的一個掩膜,二是這個子圖像塊包含一個物體的得分。
DeepMask分割效果
Multi-task Network Cascades(MNC)
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類是背景。
MNC分割效果
即便是這么復雜的架構,整個網絡也是可以端到端訓練的。
INSTANCEFCN
InstanceFCN是FCN的改進版,它不僅在語義分割任務上表現出色,在實例分割上也有不錯的結果。之前我們提到過,FCN的每個輸出像素是一個類別的分類器,那么InstanceFCN的每個輸出像素就是實例相對位置的分類器。例如,下圖被分為9塊區域,在其中的第6個得分圖中,每個像素就是對象是否在實例右側的分類器。
試想一下,如果圖像中只有一個實例,分割過程會很簡單;如果有多個重疊實例,那么我們就得先區分實例,然后再進行分割。相比FCN,InstanceFCN的最大改進是引入相對位置,它在輸入圖像上生成k2實例敏感分數圖,每個分數圖對應于特定的相對位置,這就實現了相同位置不同語義的預測。
為了從這些分數圖上生成圖像實例,InstanceFCN在這組分數圖上用了一個m×m的滑動窗口。在這個滑動窗中,每一個m/k×m/k的子窗口直接從相應的分數圖中同樣的子窗口復制那一部分數值。之后這組子窗口按照相對位置拼起來就得到了m×m的結果。這一部分被稱為實例組合模塊(instance assembling module)。
模型的架構包括在輸入圖像上用VGG-16做特征提取。在輸出的feature map頂部,有兩個全卷積分支:一個用來估計分割實例(如上所述),另一個用來對實例進行評分。
InstanceFCN架構
如上圖所示,對于第一個分支,模型先采用一個512維的1×1卷積層轉換特征,然后用3x3的卷積層生成一組k2實例敏感分數圖。這個實例組合模塊負責在分辨率為m×m(m=21)的滑動窗中預測分割掩膜。
對于第二個分支,模型先采用一個512維的3×3卷積層,后面跟隨一個1x1的卷積層。這個1x1的卷積層是逐像素的邏輯回歸,用于分類以像素為中心的m×m滑動窗口中的對象是/不是實例。因此,這個分支的輸出是對象分數圖,其中一個分數對應于生成一個實例的一個滑動窗口,所以它對不同的對象類別會“視而不見”。
InstanceFCN分割效果
FCIS
正如InstanceFCN是對FCN的改進,完全卷積實例感知語義分割(FCIS)也是在InstanceFCN基礎上做出的進一步優化。上節我們說道,InstanceFCN預測分割掩膜的分辨率都是m×m,而且沒法將對象分類為不同類別。FCIS解決了這兩個問題,它既能預測不同分辨率的掩膜,也能預測不同的對象類別。
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的前景掩膜是每個類別每個像素分割分數的合并。
FCIS架構
FCIS分割效果
MASK R-CNN
MASK R-CNN是目標檢測模型Faster R-CNN的進階版,它在后者候選框提取的基礎上添加了一個并行的分支網絡,用預測分割掩膜。這個分支網絡是個共享feature map的FCN,它為每個ROI提供Km2維的輸出,其中K對應類別個數,即輸出K個掩膜,m對應池化分辨率。這樣的設計允許網絡為每個類別生成掩膜,避免了不同類實例之間因重疊產生混淆。此外,分類分支是直接在掩膜上分類,所以分割和分類是分離的。
Mask R-CNN架構中用于預測掩膜的分支
關注輸入圖像的空間結構是準確預測掩膜的前提,而這種像素到像素的操作需要ROI特征的完全對齊。在目標檢測任務中,一些模型會用RoIPool提取這些特征,但它們不總是嚴格對齊的,因為ROI的維度不僅可以是積分,也可以是浮點數。RoIPool通過將它們四舍五入到最接近的整數來量化這些維度,不僅如此,量化的RoI還被進一步細分為量化的空間區間,在該區間上執行合并。雖然這些量化對分類問題沒什么影響,但如果把它們用于像素級對齊,分割掩膜預測會出現巨大偏差。
RoIAlign: 虛線網格表示feature map,實線表示RoI(有2×2個bin,每個bin中4個采樣點)
考慮到實例分割要求像素級別的精準,MASK R-CNN引入了一種新的方法來提取特征,稱為RoIAlign。它背后的想法是很簡單:既然錯位是由量化引起的,那就避免所有量化。RoIAlign不會對維度做任何約減,它引入了一個插值過程,先通過雙線性插值到14×14,再池化到7×7,很大程度上解決了由直接池化采樣造成的Misalignment對齊問題。需要注意的是,使用RoIAlign提取的RoI特征具有固定的空間維度,這點和RoIPool一樣。
小結
以上就是現在常用的語義分割、實例分割模型,它們基本上都是FCN的變體,把編碼器作為簡單的特征提取器,重點放在解碼器創新上。此外,一些研究人員也嘗試過用其他方法來解決實例分割問題,比如上面提到的MASK R-CNN就是改造目標檢測模型的成果,總而言之,FCN還是解決這類任務的重要基石。
-
圖像
+關注
關注
2文章
1087瀏覽量
40499 -
計算機視覺
+關注
關注
8文章
1698瀏覽量
46030 -
深度學習
+關注
關注
73文章
5507瀏覽量
121272
原文標題:一文概覽用于圖像分割的CNN
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論