【實例分割_SOLOv1】SOLO: Segmenting Objects by Locations_2019


在這裏插入圖片描述

論文:https://arxiv.org/abs/1912.04488
代碼:https://github.com/WXinlong/SOLO

一、背景

實例分割具有很大的挑戰性,因爲它需要正確分離圖像中的所有對象,同時還需要在像素級對每個實例進行語義分割。圖像中的對象屬於一組固定的語義類別,但是實例的個數是未知的,所以,語義分割可以被看做是一個密集的分類問題(對每個像素進行分類),直接利用分類的方法來預測每個像素的類別是一個很大的挑戰。

現有的方法是怎麼做的:

  • top-down:也就是“先檢測,後分割”,先檢測 bbox,後在每個bbox中進行mask的分割
  • bottom-up:學習關係親和場,給每個 pixel 分配一個嵌入式向量,將屬於不同實例的 pixel 推遠,把屬於同一個實例的 pixel 拉近。之後,需要一個後處理來分開每個實例。

上述方法的特點: 分步實現 + indirect,前者很大程度上基於檢測結果的準確性,後者很大程度上依賴於嵌入式向量的學習和 grouping prcessing.

二、本文方法

本文旨在於直接分割實例 mask。

作者提出的問題: 圖像中實例的本質區別是什麼?

解答:

以 MS COCO爲例,驗證集中有 36780 個目標

  • 98.3% 的目標對兒的中心距離大於 30 pixels
  • 1.7% 的目標對兒中,其中 40.5% 的大小之比大於 1.5x

總結:在大多數情況下,圖像中的兩個實例,要麼中心位置不同,要麼大小不同。

反思:是否可以通過中心位置和對象大小直接區分實例?

SOLO:Seperate Object instances by Location and sizes

在語義分割中,現在主流的方法是使用FCN來輸出N個通道的密集預測,每個輸出通道負責其中一個語義類別(包括背景),語義分割的目的是區分不同的語義範疇,在本文中,引入“實例類別”的概念來區分圖像中的對象實例,即量化的中心位置和對象大小,這使得可以利用位置來分割對象,故名爲“SOLO”。

Locations: 圖像被分爲 S×SS \times S 的格子,得到 S2S^2 箇中心位置類別

根據目標中心,每個目標實例被分配到其中一個格子內,作爲其中心位置的類別。本文將中心位置的類別編碼成 channel axis,類似於語義分割中的語義類別。

每個輸出通道都是對每個中心位置類別的響應,對應的 channel 的特徵圖可以預測屬於該類別的實例的mask。所以,結構化的幾何信息自然地保存在空間矩陣中。

實際上,實例類別近似於實例的對象中心位置,因此,通過將每個 pixel 分類到其實例類別中,就相當於使用迴歸方法從每個像素來預測對象中心。

將位置預測任務轉化爲分類而不是迴歸任務的原因在於: 使用分類時,更加直接,且更易於使用固定數量的通道對多個實例進行建模,同時不依賴於分組或學習嵌入式向量之類的後處理。

Sizes:使用 FPN 來區分不同大小的目標實例,以便將不同大小的對象分配給不同 level 的特徵圖,作爲對象大小類別。

所有的實例都被規則的分配,使得能夠通過 “instance categories” 來區分類別。
注意:FPN是本文的核心之一,因爲它對分割性能有着很大的影響,尤其是對不同大小的物體。

SOLO效果:

  • 端到端訓練,且無後處理
  • 只需要mask的標註信息,無需 bbox 標註信息,
  • 在 COCO 上實現了和 Mask R-CNN 基本持平的效果
  • SOLO 只需要解決兩個像素級的分類問題,類似於語義分割,
  • 本質上,SOLO 通過離散量化,將座標迴歸轉化爲分類問題,可以避免啓發式的座標規範化和 log 變換,通常用於像 YOLO 這樣的檢測器中。

三、本文方法的具體做法

3.1 問題定義

給定一個任意的圖像,實例分割系統需要確定是否有需要分割的實例, 如果有,則返回分割的 mask。

SOLO 的核心想法:將實例分割問題轉化爲兩個問題:類別預測+實例 mask 生成

  • 將輸入圖像分成格子 :S×SS\times S
  • 如果目標的中心落到格子裏邊,則這個格子要 輸出實例類別(semantic category)+ 分割實例(segmenting instance)

3.1.1 Semantic category

對於每個 grid, SOLO 會預測 C 維的輸出,分別代表每個類別的置信得分,C 爲類別個數。把圖像劃分爲 S×SS\times S 個格子,輸出就是 S×S×CS \times S \times C,如圖2_top所示。

該設計方法是基於一個假設:每個格子都只屬於一個單獨的實例。

推理階段:C 維輸出表示每個實例屬於不同類別的概率

在這裏插入圖片描述

3.1.2 Instance Mask

和類別預測並列的分支是實例mask預測分支,該分支對每個 positive grid cell 產生一個對應的 instance mask。

對於輸入圖像 II,將其分爲 S×SS\times S 的格子,則最多會預測 S2S^2 個格子,將這些 mask 編碼成一個 3D 輸出的tensor,輸出有3維,也就是3個通道。則, instance mask 分支的輸出維度爲:HI×WI×S2H_I \times W_I \times S^2kthchannelk_{th}-channel 是對 (i,j)(i,j) 位置的分割響應,其中 k=i×S+jk= i\times S + j。最後,在 semantic category 和 class-agnostic mask 之間建立了一對一的對應關係(圖2所示)。

現有的方法如何預測實例掩碼: 採用 FCN

不足:傳統的卷積在運算上具有空間不變性,圖像分類需要空間不變性,但語義分割模型需要對空間變化敏感的模型,因爲這個模型是以 grid cell 爲條件的,所以必須由不同的特徵通道來分開。

本文方法如何實現預測 mask: 網絡開頭的地方,直接給網絡輸入歸一化後的 pixel 座標(參考 CoordConv operator[14])。也就是建立一個和原始的輸入尺寸相同的 tensor,這個 tensor 裏邊的 pixel 的座標被歸一化到 [-1,1]。之後,將該 tensor concat 到輸入特徵,並傳遞到之後的層。爲了使得卷積能夠訪問其自己的輸入座標,本文將空域 functionality 加到 FCN 模型中。

假設原始特徵 tensor 尺寸爲 H×W×DH \times W \times D,新的 tensor 尺寸爲 H×W×(D+2)H \times W \times (D+2),其中,最後的兩個 channels 是 xyx-y pixel 座標。

Forming Instance Segmentation: SOLO中,類別的預測和對應的 mask 可以很自然的使用其 grid cell 來聯繫起來,k=iS+jk=i \cdot S + j。基於此,可以直接對每個 grid 來建立最終的實例分割結果。

原始的實例分割結果是通過將所有 grid 的結果結合起來得到的,之後,使用 NMS 來獲得最終的實例分割結果,沒有其他後處理。

3.2 Network Architecture

SOLO 使用 FPN 作爲 backbone,FPN 在每個 level 產生固定通道但不同大小的特徵圖(通道通常爲256-d),這些特徵圖作爲預測 head 的輸入:semantic category head + instance mask head。同一個head的不同 level的參數是共享的。不同 level 的grid number 是不同的。另外,只有最後的 1x1 conv 的參數是沒有共享的。

爲了表明 SOLO 的通用性和高效性,作者使用了不同的 backbone 和 head 進行實驗:

  • backbone
  • head
  • loss 函數

3.3 SOLO learning

3.3.1 Label Assignment

類別預測分支: 網絡需要給每個小格子預測目標類別概率。以 (i,j)(i,j) 位置爲例,如果該網格內落入了任何 gt mask 的中心區域,則被分爲正例,否則被分爲負例。中心點採樣在現在的目標檢測方法中是非常高效的,所以作者在mask 類別分類任務上使用了類似的方法。

給定 gt mask 的中心 (cx,cy)(c_x, c_y),寬 ww,高 hh。中心區域的尺度控制因子是 ϵ:(cx,cy,ϵw,ϵh)\epsilon:(c_x, c_y, \epsilon w, \epsilon h)

本文作者設定 ϵ=0.2\epsilon=0.2,則每個 gt mask 平均有 3 個 正樣本(positive samples)。

對每個 positive sample,都會設定一個二值分割 mask,此處共有 S2S^2 個 grid,所有每個圖像都會輸出 S2S^2 個 mask,對每個 positive sample,其對應的 binary mask 都會被標記。

注意: mask 的維度會影響 mask 預測分支,然而,作者展示了最簡單的 row-major order 在本文方法都會有很好的效果。

3.3.2 Loss Function

訓練的 loss function,λ=3\lambda=3
在這裏插入圖片描述
其中,LcateL_{cate} 是用於分類的 Focal loss,LmaskL_{mask} 是用於 mask 預測的 loss:
在這裏插入圖片描述
如果 grid 的索引(類別 label)是從左到右、從上到下排列的,則 i=k/Si=\lfloor k/S \rfloorj=k%Sj=k \% SNposN_{pos} 是 positive samples 的個數, pp^*mm^* 分別是類別和mask。11 是指示函數,如果 pi,j>0p_{i,j}^*>0,則爲1,否則爲0。

dmaskd_{mask}: 本文中,作者對比了三種不同的 loss函數

  • Binary Cross Entropy(BCE)
  • Focal loss
  • Dice loss

最終, Dice loss 以其高效性和穩定性贏得了作者的青睞

在這裏插入圖片描述

3.4 Inference

  • 首先經過 FPN,得到 (i,j)(i,j) 位置上的類別得分 pi,jp_{i,j},和對應的 mask mkm_k,其中 k=iS+jk=i \cdot S +j
  • 使用閾值 0.1 來過濾掉低的類別得分
  • 選擇前 500 個得分對應的mask,並進行 NMS。
  • 爲了將預測的 soft mask 轉化成 二值 mask,作者使用 0.5 的閾值將 soft mask 進行二值化。保留前100 個實例來進行評估。

四、實驗

8GPU,SGD,batch_size:16,共 36 個epoch,初始 lr=0.01,分別在 27 和 33 個epoch處下降10倍。圖像大小:短邊隨機採樣到 640 ~ 800 pixel。

4.1 主要結果

在 MS COCO test-dev上對比:如表1所示

  • SOLO 和 ResNet-101 結合,得到 mask AP 37.8%
  • SOLO 和 DCN-101 結合,得到 mask AP 40.4%
    在這裏插入圖片描述
    SOLO 輸出如圖8所示,在很多不同的場景都可以獲得較好的效果。
    在這裏插入圖片描述
    在這裏插入圖片描述

4.2 How SOLO works?

S=12S=12 時的網絡輸出如圖4所示,子圖 (i,j)(i,j) 表示由其對應的 mask 分支(經過 sigmoid)預測得到的 soft mask。

不同的實例是由不同的 mask 預測分支來響應的,通過在不同位置來分割實例,SOLO 將實例分割問題轉化成了 position-aware 的分類問題。

每個 grid 僅僅會對一個實例響應,且一個實例可能會被相鄰的 channel 都預測,在 inference 階段,使用 NMS 來抑制多餘的 mask。
在這裏插入圖片描述

4.3 Ablation Experiments

Grid number: 本文對比了不同的 grid number 帶來的影響,如表2所示。

特徵的生成是通過 merge ResNet(stride=8) 的 C3, C4, C5 的輸出得到的。

S=12 時, SOLO 可以在 MS COCO 上得到 27.2 的 AP,當 S=24 時,提高到了 29.0 AP。
在這裏插入圖片描述
在這裏插入圖片描述

上述結果表明,單尺度的 SOLO 可以應用到目標尺寸差異不太多的場景中。

然而,單尺度的模型遠遠低於金字塔模型。

Multi-level Prediction: 作者使用 5 級 FPN 金字塔,來分割不同尺度的目標,如表3所示。gt mask 的尺寸被顯式的用於分配它們去特定的金字塔 level。

基於上述多尺度方法,作者得到了 35.8 AP,大大的提升了效果。

CoordConv: 另外一個重要的組件是 spatially variant convolution(CoordConv)。如表4所示,標準的 conv 已經在一定程度上具有了空間可變性。當使得卷積能夠訪問自己的座標時,可以提升3.6個AP。兩個或更多的 CoordConv 會帶來更多的提升,這說明,CoordConv 能夠給預測輸出帶來空域變化或位置敏感性。
在這裏插入圖片描述
Loss function: 表5展示了不同的 loss function 給 mask 分支帶來的影響,包括 BCE、FL、DL。

  • BCE:對 positive samples,設置mask分支的 weight=10,pixel weight=2
  • FL:mask 分支 weight=2

FL 損失更優,由於實例 mask 的大部分像素都在背景中, Focal loss 原本就是爲了降低分類良好的樣本的損失來緩解樣本不平衡問題的。

  • Dice Loss:在無需人工設定 loss 的權重超參數的情況下,得到了最好的效果。該 loss 函數將 pixels 視爲一個 object,可以自動的在背景和前景像素間建立正確的平衡。
    在這裏插入圖片描述

Alignment in category branch: 類別預測分支,必須將 H×WH\times WS×SS\times S 的卷積特徵進行匹配。作者對比了三個方法:

  • interpolationg:直接雙線性插值到需要的尺寸
  • adaptive-pool:2 維 max-pool,從 H×WH\times WS×SS\times S
  • region-grid-interpolation:對每個網格,使用基於密集採樣點的雙線性插值,並將結果與均值進行聚合。

從結果來看,這些不同的方法並沒有帶來很大的性能差異,也就是說對齊的過程較爲靈活。

Different head depth: SOLO 中,實例分割是一個 pixel-to-pixel 的任務,作者使用 FCN 來探索 mask 的空間佈局。如圖5所示,作者對比了不同的 head 深度帶來的影響。將 head 的深度從 4 提升到 7,獲得了 1.2 的 AP 提升。當深度超過 7 時,性能趨於穩定。故本文中使用深度爲 7。

爲什麼 SOLO 中 head 更深?

之前的工作,如 Mask R-CNN,通常在 head 使用 4 層卷積來進行 mask 的預測,在 SOLO 中,mask 是基於空間位置來調節的,所以作者將座標附加到 head 開始的地方,mask head 必須由足夠的特徵表達能力來學習這種平移。對於類別分類分支,計算的開銷可以胡烈,因爲 S2<<H×WS^2 << H \times W
在這裏插入圖片描述

4.4 SOLO-512

作者還訓練了小的版本,來突破實時語義分割的界限。作者使用的模型的輸出具有較小的分辨率,較短的邊爲 512 而非 800。其他設置和 SOLO 相同。

在這裏插入圖片描述
SOLO 對於密集的、任意的實例預測任務來說,是一種通用的技術。
在這裏插入圖片描述

五、Decoupled SOLO

假設設定 S=20S=20, SOLO 的輸出是 S2=400S^2=400 個通道的 map,然而,這些預測在一般情況下是冗餘的,因爲目標是稀疏的。所以作者又在本節引入了 Decoupled SOLO,如圖7所示。
在這裏插入圖片描述
Decoupled SOLO:

  • 原始輸出 tensor : MRH×W×S2M \in R^{H \times W \times S^2}
  • 經過解耦之後的輸出:分別對應於兩個座標的 tensor,XRH×W×SX \in R^{H \times W \times S}XYH×W×SX \in Y^{H \times W \times S}

所以,輸出空間從 H×W×S2H \times W \times S^2 降到了 H×W×2SH \times W \times 2S

對於落到網格 (i,j)(i,j) 中的目標:

  • 原始SOLO 在輸出 tensor M 的第 k 個通道分割其 mask,k=iS+jk=i \cdot S + j
  • Decoupled SOLO,該對象的預測 mask 被定義爲兩個 channel map 的元素級別的相乘:
    在這裏插入圖片描述

在這裏插入圖片描述

七、Conclusion

SOLO 是一個端到端的實例分割框架,與 mask r-cnn 相比,達到了競爭性的準確性。

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