02.27 Panoramic Segmentation

一. 背景介紹

語義分割(Semantic Segmentation):對一張圖片上的所有像素點進行分類,同一物體的不同實例不需要單獨分割出來。

實例分割(Instance Segmentation):目標檢測(比b-box更精確到邊緣)和語義分割(標出同類不同個體)的結合。

全景分割(Panoramic Segmentation):語義分割和實例分割的結合,背景也要檢測和分割。

圖像分割是圖像理解的重要基石,在自動駕駛、無人機、工業質檢等應用中都有著舉足輕重的地位。缺陷檢測論文現在好多都是藉助語義分割方法做的遷移應用到實際的工業現場等,比如國外知名的VIDI軟件、國內一些檢測軟件。

圖像分割:Semantic/Instance/Panoramic Segmentation

二. 語義分割

1. 【UNet】

結構:

Unet主要針對生物醫學圖像分割。繼承FCN的思想。整體結構就是先編碼(下采樣),對圖像的低級局域像素值進行歸類與分析,從而獲得高階語義信息; 再解碼(上採樣),收集這些語義信息,並將同一物體對應到相應的像素點上,迴歸到跟原始圖像一樣大小的像素點的分類。

圖像分割:Semantic/Instance/Panoramic Segmentation

encoder的基本單元是:兩個valid卷積層(圖像size會減小)接一個max pooling(2x2)下采樣(1/2);

decoder的基本單元是:[up-conv(2x2)+skip connection]接兩個valid卷積層。

U-Net的skip connection不同於FCN的對應像素求和,是對channel的concat(拼接)過程。Unet上採樣部分可以用上採樣或轉置卷積,這裡詳細解釋下up-conv轉置卷積。

圖像分割:Semantic/Instance/Panoramic Segmentation

實際在計算機中,並不是逐像素滑動計算,效率太低。而是將卷積核轉換成等效的矩陣,通過輸入向量和卷積核矩陣相乘獲得輸出向量。如圖,input:4x4,Kernel:3x3,Padding/Stride:0,output:2x2,卷積核要在輸入的不同位置卷積4次,通過補零將卷積核分別置於一個4x4矩陣的四個角落,這樣輸入可以直接和這四個4x4的矩陣進行卷積,取代了滑窗操作。將輸入展開為[16,1]向量X,輸出矩陣記作Y([4,1]),四個4x4卷積核分別展開並拼接成卷積矩陣C([16,4])。普通的卷積運算可表示為矩陣運算:X T * C = Y T 。

圖像分割:Semantic/Instance/Panoramic Segmentation

圖像分割:Semantic/Instance/Panoramic Segmentation

我們將一個1x16的行向量乘以16x4的矩陣,得到了1x4的行向量。反過來,在需要輸入一個小的特徵,輸出更大尺寸的特徵時,將一個1x4的向量乘以一個4x16的矩陣就能得到一個1x16的行向量,這就是轉置卷積的思想。根據普通卷積,公式改寫為:Y T * C T = X T 。

圖像分割:Semantic/Instance/Panoramic Segmentation

普通卷積和轉置卷積這兩個操作不可逆,同一個卷積核在轉置卷積操作之後不能恢復原始數值,只恢復形狀。相同的形狀就足夠了,

在訓練中我們可以學習卷積核對應的權值來還原圖像

關鍵策略:

(1).Deep Supervision。

4次上採樣,並在各階段使用skip connection,而不是直接在high-level特徵上訓練,保證了最後恢復出來的特徵圖融合了更多的low-level特徵,也使不同尺度特徵得到了融合,從而可以進行多尺度預測。4次上採樣也使得分割圖恢復邊緣等信息更加精細。

(2).分類策略。

兩層conv 3x3得到heatmap,再用conv 1x1分成兩類,得到對應2個類得分(每個像素點針對兩類都有一個得分)的最後兩張heatmap, 然後作為softmax函數的輸入,算出概率比較大的softmax類,輸入給交叉熵進行BP。

(3).Overlap-tile策略。

為了預測框中圖像,為了預測黃色區域的分割,需要藍色區域作為輸入,缺失區域通過鏡像輸入圖像擴張。這對於應用網絡到大圖像很重要,避免gpu內存限制問題。

圖像分割:Semantic/Instance/Panoramic Segmentation

(4).數據增加。

少量樣本情況下,讓網絡獲得不變性和魯棒性,數據增加必不可少。處理顯微鏡圖片時,我們需要平移與旋轉不變性,並且對形變和灰度變化魯棒。將訓練樣本進行隨機彈性形變是訓練分割網絡的關鍵。使用隨機位移矢量(random displacement vectors)在粗糙的3*3網格上產生平滑形變(smooth deformations),位移是從10像素標準偏差的高斯分佈中採樣的,然後使用雙三次插值計算每個像素的位移。在contracting path的末尾採用drop-out層更進一步增加數據。

圖像分割:Semantic/Instance/Panoramic Segmentation

圖像分割:Semantic/Instance/Panoramic Segmentation

(6).加權loss。

採用SGD訓練,最後一層使用交叉熵函數與softmax。為了使某些像素點更加重要,引入了w(x)。對每一張標註圖像預計算了一個權重圖,來補償訓練集中每類像素的不同頻率,使網絡更注重學習相互接觸的細胞之間小的分割邊界。使用形態學操作計算分割邊界。權重圖計算公式如下:

圖像分割:Semantic/Instance/Panoramic Segmentation

wc是用於平衡類別頻率的權重圖,d1代表到最近細胞的邊界的距離,d2代表到第二近的細胞的邊界的距離。基於經驗我們設定w0=10,σ≈5像素。網絡的權重由高斯分佈初始化,分佈的標準差為(N/2)^0.5, N為每個神經元的輸入節點數量。例如,對於一個上一層是64通道的3*3卷積核來說,N=9*64。

UNet系列,或基於UNet衍生出來的其他網絡還包括:3D U-Net、UNet++、TernausNet、Res-UNet、Dense U-Net、MultiResUNet、R2U-Net、Attention UNet等。

2.【SegNet】

結構:

SegNet是Cambridge提出旨在解決自動駕駛或者智能機器人的圖像語義分割深度網絡,和FCN思路十分相似,只是Encoder,Decoder(upsampling)使用的技術不一致。

圖像分割:Semantic/Instance/Panoramic Segmentation

encoder的基本單元是:2-3個same卷積層(圖像size不變,BN對訓練圖像的分佈歸一化,加速學習)接一個max pooling(2x2)下采樣;

decoder的基本單元是:upsampling接2-3個same卷積層,卷積為上採樣放大的圖像豐富信息,使池化過程丟失的信息被重建。

關鍵策略:

(1).Pooling Indices。

SegNet在pooling上有個創新,引入了index功能。這裡詳細解釋下。

圖像分割:Semantic/Instance/Panoramic Segmentation

如上圖,每次pooling,都會保存通過max選出的權值在2x2 filter中的相對位置,6在粉色2x2 filter中的位置為(1,1)(index從0開始),黃色的3的index為(0,0)。同時,從網絡結構圖可以看到綠色的pooling與紅色的upsampling通過pooling indices相連,表示pooling後的indices輸出到對應的upsampling層。upsampling中先對輸入的特徵圖放大兩倍,然後把輸入特徵圖的數據根據pooling indices放入,如下圖所示。

圖像分割:Semantic/Instance/Panoramic Segmentation

2x2的輸入變成4x4的圖,除了被記住位置的pooling indices,其他位置的權值為0,因為數據已經被pooling走了。因此,SegNet使用卷積來填充缺失的內容。

(2).分類策略。

在網絡框架中,SegNet最後一個卷積層會輸出所有的類別(包括其他類),網絡最後加上一個softmax層,由於是端到端,所以softmax需要求出每一個像素在所有類別最大的概率,作為該像素的label,最終完成圖像像素級別的分類。

4.【Deeplabv3++】

結構:

圖像分割:Semantic/Instance/Panoramic Segmentation

主幹網絡(DCNN): 更深的Xception結構。

圖像分割:Semantic/Instance/Panoramic Segmentation

Xception: 帶有殘差連接的深度可分卷積層的線性堆疊,基於Inception。

encoder: 原DeepLabv3作為encoder,ASPP有四個不同的rate,額外一個全局平均池化;

decoder: 先把encoder的結果上採樣4倍,然後與resnet中下采樣前的特徵(先1x1卷積降通道數)concat,再進行3x3的卷積,最後上採樣4倍輸出結果。

關鍵策略:

(1). 深度可分離卷積(Depthwise separable convolution)。

encoder 的主幹網絡 Xception 中引入的深度可分離卷積: depthwise_separable_convolution = depthwise_convolution(先每個通道上獨自進行空間卷積) + pointwise_convolution(再用1x1卷積核組合前面dep_conv得到的特徵),在保持網絡性能的同時,大幅減少參數量。

圖像分割:Semantic/Instance/Panoramic Segmentation

(2). 空洞卷積(dilated convolution)。

又叫膨脹卷積,是通過增加一個超參數dilation rate(kernel的間隔數量),在標準的卷積圖裡注入空洞來增加感受野,有效避免了upsampling和pooling設計的缺陷:參數不可學習、內部數據結構及空間層級化信息丟失、小物體信息無法重建。

圖像分割:Semantic/Instance/Panoramic Segmentation

但是,Gridding Effect(kernel不連續,不是所有的pixel都用來計算)會使膨脹卷積損失信息的連續性,另外,單憑大dilation rate獲得的信息可能對小物體分割沒效果。通向標準化設計,Hybrid Dilated Convolution(HDC)因此被引入。HDC有三個特徵:疊加捲積的dilation rate不能有大於1的公約數;將dilation rate設計成鋸齒狀結構,如[1, 2, 5, 1, 2, 5]循環結構;第2層的最大dilation rate M 2 <= kernel size(k),至少可以用dilation rate 1(標準卷積)來覆蓋掉所有洞。

(3).ASPP(astrous spatial pyramid pooling)。

ASPP通過不同的rate構建不同感受野的卷積核,捕獲多尺度信息,並聯(串聯)不同膨脹率的空洞卷積,來獲取更多上下文信息。

圖像分割:Semantic/Instance/Panoramic Segmentation

(4).encoder-decoder結構。

把ASPP模塊和encoder-decoder結合在一起,encoder-decoder結構可以更好的地恢復物體的邊緣信息。

圖像分割:Semantic/Instance/Panoramic Segmentation

三. 實例分割

1.【Mask-RCNN】

結構:

Mask-RCNN是一個通用的實例分割架構,以Faster-RCNN為原型(速度5fps,更慢)的二階段模型,增加了一個用於分割的Mask預測分支,可用於人的姿態估計等任務。

圖像分割:Semantic/Instance/Panoramic Segmentation

步驟:首先是找出RPN,然後對RPN找到的每個ROI進行分類、定位、並找到binary mask。與其他先找到mask再進行分類的網絡不同。因為沒有采用全連接層並且使用了RoIAlign,可以實現輸出與輸入的像素一一對應。

圖像分割:Semantic/Instance/Panoramic Segmentation

主幹網絡:標準的卷積神經網絡(VGG/ResNet,可+FPN提升性能)作為特徵提取器。底層檢測的是低級特徵(邊緣和角等),較高層檢測的是更高級的特徵。

RPN網絡:同Faster-RCNN,基於滑動窗口掃描圖像,尋找目標區域,輸出anchor box類別(FG/BG)並根據偏移量精調b-box擬合目標,過濾掉一部分候選的ROI。

ROIAlign:對這些剩下的ROI進行ROIAlign操作(先將原圖和特徵圖的像素對應起來,然後將特徵圖和固定的feature對應起來)。

Final分類迴歸:對這些ROI進行分類(N類別分類)、b-box迴歸和mask生成。

損失函數:L = L cls + L box + L mask 。 L cls 和L box 與Faster-RCNN的定義相同,表示b-box的分類和迴歸損失值,L mask 表示mask部分損失值。

關鍵策略:

(1).ROIAlign。

Faster-RCNN存在的問題是:特徵圖與原始圖像是不對準的,所以會影響檢測精度。而Mask-RCNN提出了RoIAlign的方法來取代ROI pooling,可以保留大致的空間位置。

圖像分割:Semantic/Instance/Panoramic Segmentation

為了得到為了得到固定大小(7X7)的feature map,ROIAlign技術沒有使用量化操作,取而代之的是 雙線性插值

圖像分割:Semantic/Instance/Panoramic Segmentation

黑色實線框表示ROI feature,最後輸出是2x2,利用雙線性插值來估計這些藍點(虛擬座標點,又稱雙線性插值的網格點)處所對應的像素值,最後得到相應的輸出。雙線性插值本質上就是在兩個方向上做線性插值。

(2).FCN on ROI。

生成mask時,在每個ROI裡面進行FCN操作。

圖像分割:Semantic/Instance/Panoramic Segmentation

(3).Sigmoid Loss。

對於預測的二值mask輸出,我們對每個像素點應用sigmoid函數,整體Loss定義為平均二值交叉損失熵。引入預測K個輸出的機制,允許每個類都生成獨立的掩膜,避免類間競爭。這樣做解耦了掩膜和種類預測。不像FCN的做法,在每個像素點上應用softmax函數,整體採用的多任務交叉熵,這樣會導致類間競爭,最終導致分割效果差。

圖像分割:Semantic/Instance/Panoramic Segmentation

四. 代碼實現

https://github.com/mrgloom/awesome-semantic-segmentation 這裡面非常全,語義分割和實例分割典型網絡的實現都有,包括Keras、Pytorch和Tensorflow等主流架構。

五. reference

https://blog.csdn.net/github_37973614/article/details/84559861

https://zhuanlan.zhihu.com/p/44958351

https://blog.csdn.net/zhuzemin45/article/details/79709874

https://www.jianshu.com/p/755b001bfe38

https://www.cnblogs.com/hellcat/p/9749538.html#_label0

https://www.jianshu.com/p/9176bb2a8b86

本文借鑑了上述優秀的文章,部分圖片出自相應段落,感謝作者!


分享到:


相關文章: