文章目錄
論文: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: 圖像被分爲 的格子,得到 箇中心位置類別
根據目標中心,每個目標實例被分配到其中一個格子內,作爲其中心位置的類別。本文將中心位置的類別編碼成 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 生成
- 將輸入圖像分成格子 :
- 如果目標的中心落到格子裏邊,則這個格子要 輸出實例類別(semantic category)+ 分割實例(segmenting instance)
3.1.1 Semantic category
對於每個 grid, SOLO 會預測 C 維的輸出,分別代表每個類別的置信得分,C 爲類別個數。把圖像劃分爲 個格子,輸出就是 ,如圖2_top所示。
該設計方法是基於一個假設:每個格子都只屬於一個單獨的實例。
推理階段:C 維輸出表示每個實例屬於不同類別的概率
3.1.2 Instance Mask
和類別預測並列的分支是實例mask預測分支,該分支對每個 positive grid cell 產生一個對應的 instance mask。
對於輸入圖像 ,將其分爲 的格子,則最多會預測 個格子,將這些 mask 編碼成一個 3D 輸出的tensor,輸出有3維,也就是3個通道。則, instance mask 分支的輸出維度爲:。 是對 位置的分割響應,其中 。最後,在 semantic category 和 class-agnostic mask 之間建立了一對一的對應關係(圖2所示)。
現有的方法如何預測實例掩碼: 採用 FCN
不足:傳統的卷積在運算上具有空間不變性,圖像分類需要空間不變性,但語義分割模型需要對空間變化敏感的模型,因爲這個模型是以 grid cell 爲條件的,所以必須由不同的特徵通道來分開。
本文方法如何實現預測 mask: 網絡開頭的地方,直接給網絡輸入歸一化後的 pixel 座標(參考 CoordConv operator[14])。也就是建立一個和原始的輸入尺寸相同的 tensor,這個 tensor 裏邊的 pixel 的座標被歸一化到 [-1,1]。之後,將該 tensor concat 到輸入特徵,並傳遞到之後的層。爲了使得卷積能夠訪問其自己的輸入座標,本文將空域 functionality 加到 FCN 模型中。
假設原始特徵 tensor 尺寸爲 ,新的 tensor 尺寸爲 ,其中,最後的兩個 channels 是 pixel 座標。
Forming Instance Segmentation: SOLO中,類別的預測和對應的 mask 可以很自然的使用其 grid cell 來聯繫起來,。基於此,可以直接對每個 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
類別預測分支: 網絡需要給每個小格子預測目標類別概率。以 位置爲例,如果該網格內落入了任何 gt mask 的中心區域,則被分爲正例,否則被分爲負例。中心點採樣在現在的目標檢測方法中是非常高效的,所以作者在mask 類別分類任務上使用了類似的方法。
給定 gt mask 的中心 ,寬 ,高 。中心區域的尺度控制因子是 。
本文作者設定 ,則每個 gt mask 平均有 3 個 正樣本(positive samples)。
對每個 positive sample,都會設定一個二值分割 mask,此處共有 個 grid,所有每個圖像都會輸出 個 mask,對每個 positive sample,其對應的 binary mask 都會被標記。
注意: mask 的維度會影響 mask 預測分支,然而,作者展示了最簡單的 row-major order 在本文方法都會有很好的效果。
3.3.2 Loss Function
訓練的 loss function,:
其中, 是用於分類的 Focal loss, 是用於 mask 預測的 loss:
如果 grid 的索引(類別 label)是從左到右、從上到下排列的,則 ,, 是 positive samples 的個數, 和 分別是類別和mask。 是指示函數,如果 ,則爲1,否則爲0。
本文中,作者對比了三種不同的 loss函數
- Binary Cross Entropy(BCE)
- Focal loss
- Dice loss
最終, Dice loss 以其高效性和穩定性贏得了作者的青睞
3.4 Inference
- 首先經過 FPN,得到 位置上的類別得分 ,和對應的 mask ,其中 。
- 使用閾值 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?
時的網絡輸出如圖4所示,子圖 表示由其對應的 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: 類別預測分支,必須將 和 的卷積特徵進行匹配。作者對比了三個方法:
- interpolationg:直接雙線性插值到需要的尺寸
- adaptive-pool:2 維 max-pool,從 到
- 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 必須由足夠的特徵表達能力來學習這種平移。對於類別分類分支,計算的開銷可以胡烈,因爲 。
4.4 SOLO-512
作者還訓練了小的版本,來突破實時語義分割的界限。作者使用的模型的輸出具有較小的分辨率,較短的邊爲 512 而非 800。其他設置和 SOLO 相同。
SOLO 對於密集的、任意的實例預測任務來說,是一種通用的技術。
五、Decoupled SOLO
假設設定 , SOLO 的輸出是 個通道的 map,然而,這些預測在一般情況下是冗餘的,因爲目標是稀疏的。所以作者又在本節引入了 Decoupled SOLO,如圖7所示。
Decoupled SOLO:
- 原始輸出 tensor :
- 經過解耦之後的輸出:分別對應於兩個座標的 tensor, 和 。
所以,輸出空間從 降到了 。
對於落到網格 中的目標:
- 原始SOLO 在輸出 tensor M 的第 k 個通道分割其 mask,
- Decoupled SOLO,該對象的預測 mask 被定義爲兩個 channel map 的元素級別的相乘:
七、Conclusion
SOLO 是一個端到端的實例分割框架,與 mask r-cnn 相比,達到了競爭性的準確性。