2020-09-24
轉載請注明作者和出處: http://blog.csdn.net/john_bh/
文章鏈接: Single Stage Instance Segmentation — A Review
會議及時間:2020.6
實例分割一直是計算機視覺中很熱門的課題,這幾年發展的很快,從 two stage 到 single stage , 從MaskRCNN 到SOLO,不斷涌現出一些優秀的文章,分割的精度不斷提高,速度也不斷刷新。最近讀了一篇關於single stage 實例分割的綜述,簡單梳理了實例分割的發展脈絡,這里做一下簡單的總結和整理,正在做實例分割方向的同學可以深入看一看文章中提到的paper。
碼字不易,如果你覺得寫的還可以,順便點個贊,歡迎轉發。
1. 實例分割
實例分割是一項具有挑戰性的計算機視覺任務,需要預測對象實例及其逐像素分割掩碼。這使得它混合了語義分割和目標檢測。如下圖所示:
從左到右,依次是目標檢測任務,語義分割,實例分割任務。從圖可以看出,實例分割不僅僅要求分割出物體的mask,識別出它的類別,還需要去區分同一類里面的不同instance。
自發明Mask R-CNN以來,最新的實例分割方法主要是Mask RCNN及其變體(PANet,Mask Score RCNN等)。 它采用先檢測后分割的方法,首先執行對象檢測以提取每個對象實例周圍的邊界框,然后在每個邊界框內執行二進制分割以分離前景(對象)和背景。
但是,Mask RCNN速度很慢,因此無法使用許多實時應用程序。 此外,Mask RCNN預測的掩碼具有固定的分辨率(28 × 28 28\times 2828×28),因此對於具有復雜形狀的大型對象還不夠完善。 在 anchor-free 目標檢測方法(例如CenterNet和FCOS)的發展推動下,推動單階段實例分割的研究,例如CenterMask,BlendMask。 這些方法中的許多方法都比Mask RCNN更快,更准確,如下圖所示(該圖來自SOLOv2):
該博客將回顧單階段實例分割的最新進展,重點是 掩碼表示 ----實例分割的一個關鍵方面。
2. Mask的表征方式
在實例分割中要問的一個核心問題是實例掩碼的表示或參數化:
- 是使用局部掩碼還是全局掩碼?
- 如何表示/參數化掩碼?

表示實例掩碼的方式主要有兩種:局部掩碼和全局掩碼。
- 全局掩碼: 這正是是我們最終想要的,它與輸入圖像具有相同的空間范圍。
它的自然優勢是對大小的物體都具有相同的分辨率(因此具有固定長度的特征)。可以以原圖的方式來分割出mask,這不會讓小物體丟失全局信息,同時也可以讓小物體更容易被看見。對於大物體來說,它看的也更加清晰,邊界也應當會更加的清晰。 - 局部掩碼: 它沒有作為全局掩碼過多的邊界,因此通常更為緊湊。它必須與掩碼位置一起使用才能恢復到全局掩碼,而
局部掩碼的大小將取決於對象的大小。但是,要執行有效的批處理,實例掩碼需要固定長度的參數化。最簡單的解決方案是將實例掩碼的大小調整為固定的圖像分辨率,這是Mask RCNN所采用的。它優點其實也很明顯,它同樣很簡單,可以和任何目標檢測算法結合起來,同時它應該速度相對來說更快,占用的顯存毫無疑問會更小。
根據使用的是局部掩碼還是全局掩碼,可以將單階段實例分割大致分為基於局部掩碼和基於全局掩碼的方法。
2.1 局部mask的表征方法
基於局部掩碼的方法直接在每個局部區域上輸出實例掩碼。
從某種意義上說,邊界框是一個粗糙的掩碼,它以最小的邊界矩形近似於掩碼的輪廓。 ExtremeNet(通過將極端點和中心點分組進行自下而上的對象檢測,CVPR 2019)使用 four extreme points(因此具有8個自由度的邊界框而不是傳統的4自由度)執行檢測,並且可以自然擴展這種更豐富的參數化通過在其相應邊緣上的兩個方向上將一個 extreme points 擴展到整個邊緣長度的1/4的片段,從而將其生成八邊形掩碼。
從那時起,有一系列工作嘗試將實例掩碼的輪廓編碼/參數化為固定長度的系數,並給出不同的分解基礎。這些方法使每個實例的中心(不一定是bbox中心)和相對於該中心的輪廓回歸。
- ESE-Seg(用於實時實例分割的顯式形狀編碼,ICCV 2019)為每個實例設計一個內部中心半徑形狀簽名,並將其與Chebyshev多項式擬合。
- PolarMask(PolarMask:具有極地表示法的單鏡頭實例分割,CVPR 2020)利用從中心以恆定角度間隔的光線來描述輪廓。
- FourierNet(FourierNet:使用可微分的形狀解碼器進行實例分割的緊湊型掩碼表示)引入了使用Fourier變換的輪廓形狀解碼器,並實現了比PolarMask更平滑的邊界。

這些方法通常使用20到40個系數來參數化掩碼輪廓。 它們可以快速推斷並且易於優化。 但是,它們的缺點也很明顯。 首先,從視覺上看,它們看上去都非常糟糕。 他們無法精確描繪掩碼,也無法描繪出在中心有孔的對象。
2.2 通過4D的張量構建mask
TensorMask(TensorMask:密集對象分割的基礎,ICCV 2019)是通過在每個特征圖位置預測遮罩來展示密集遮罩預測思想的第一批作品之一。 TensorMask仍會預測感興趣區域的掩碼而不是全局掩碼,並且它能夠運行實例分割而無需運行對象檢測。
TensorMask利用結構化的4D張量來表示空間域上的掩碼(2D迭代輸入圖像中的所有可能位置,2D表示每個位置的掩碼),還引入對齊的表示和張量雙錐體以恢復空間細節,但是這些對齊操作 使網絡甚至比兩階段的Mask R-CNN慢。 另外,為了獲得良好的性能,需要使用比標准COCO對象檢測管道(6倍計划)長六倍的計划來對其進行培訓。
@ 知乎 林大佬
wh可以理解,vu可以看做是什么?像素點的坐標?不對,wh就已經包含了位置坐標信息了。應該是中心點在xy坐標處的mask,表示方式就是uv。這個方法要說巧妙吧,倒也滿巧妙,畢竟何凱明出品,必出精品,但它的速度竟然比MaskRCNN還慢,有點殺第一百自損三千的趕腳。除此之外它需要更多的訓練時間,是MaskRCNN訓練時間的6倍。這簡直無法忍受。
2.3 Compact Mask Encoding
自然對象掩碼不是隨機的,類似於自然圖像,實例掩碼的固有維數比像素空間的內維數低得多。 MEInst(用於單鏡頭實例分割的掩碼編碼,CVPR 2020)將遮罩提取為緊湊且固定尺寸的表示形式。 通過PCA的簡單線性變換,MEInst能夠將 28 × 28 28×2828×28 的局部掩碼壓縮為60維特征向量。 本文還嘗試在一級目標檢測器(FCOS)上直接回歸 28 × 28 = 784 − d i m 28×28 = 784-dim28×28=784−dim 特征向量,並且在AP點下降1-2個情況下也得到了合理的結果。 這意味着直接預測高維掩碼(每個TensorMask以自然表示)並不是完全不可能的,但是很難優化。 掩碼的緊湊表示使其更易於優化,並且在推理時也可以更快地運行。 它與Mask RCNN最相似,可以直接與大多數其他對象檢測算法一起使用。
@ 知乎 林大佬
這個編碼方式是很精妙的,完美的規避了端到端對齊的問題,什么是端到端對齊?一張圖片里面的box數目,box大小都是不一樣的,因此MaskRCNN這樣的局部Mask的分割方式都會不可避免的引入RoIAlign這樣的操作,導致了每一個batch都需要一個對齊的操作。MEInst這里做的工作就是一個標准化。不過令人遺憾的是,理想很豐滿,但是現實卻很骨感,雖然論文證明了這種表征方式可行,速度卻沒有和MaskRCNN高出多少,源自於這里面的編碼和解碼的操作比較耗時。
2.4 全局Mask表征方式
基於全局掩碼的方法首先基於整個圖像生成中間和共享特征圖,然后組合提取的特征以形成每個實例的最終掩碼。這是最近的一階段實例分割方法中的主流方法。
原型和系數
YOLACT(YOLACT:實時實例分割,ICCV 2019)是嘗試進行實時實例分割的首批方法之一
YOLACT將實例分割分為兩個並行任務,生成一組原型掩碼並預測每個實例的掩碼系數。原型掩碼是使用FCN生成的,可以直接受益於語義分割的進步。系數被預測為邊界框的額外特征。這兩個並行步驟之后是組裝步驟:通過矩陣乘法實現的簡單線性組合,並使用每種實例的預測邊界框進行裁剪操作。裁剪操作減輕了網絡抑制邊界框外部噪聲的負擔,但如果邊界框包含同一類的另一個實例的一部分,仍然會發現一些泄漏。
由於yolact里面采用了全局的Mask,並且最終生成的mask質量只取決於全圖的分辨率,與mask的數目無關,這就使得yolact在計算mask的速度上,可以和mask的數目無關,它是一個常量。這也是Yolact速度比較快的原因之一;
- InstanceFCN(實例敏感的全卷積網絡,ECCV 2016)和 FCIS(全卷積實例感知語義分割,CVPR 2017)
它們似乎是YOLACT的特例。 InstanceFCN和FCIS都使用FCN生成多個實例敏感的分數圖,其中包含對象實例的相對位置,然后將組裝模塊應用於輸出對象實例。位置敏感的分數圖可以看作是原型掩碼,但是IntanceFCN和FCIS代替了學習的線性系數,而是使用一組固定的空間池化操作來組合位置敏感的原型掩碼。
BlendMask(BlendMask:自上而下遇到實例分割,自下而上,CVPR 2020),是一個比較精妙,精度很高,速度也做的很快的方法。
建立在YOLACT之上,但是BlendMask並未預測每個原型掩碼的標量系數,而是預測了低分辨率(7×7)的注意力圖來混合 邊界框內的掩碼。 該關注圖被預測為附加到每個邊界框的高維特征(7×7 = 49-d)。 有趣的是,BlendMask使用的原型掩碼為4,但是即使只有1個原型掩碼也可以使用。 CenterMask(CenterMask:具有點表示的單鏡頭實例分割,CVPR 2020)幾乎以完全相同的方式工作,並明確使用1個原型掩碼(稱為全局顯着圖)。
@ 知乎 林大佬
你如果仔細思考BlendMask的做法,你會看到MaskRCNN的引子,但是也會看到Yolact的引子。因為它依賴於detector,同時也用到了全局的Mask。這篇paper,在它的Blender模塊里面,使用了全局的Mask,同時通過FCOS檢測到的position來融合局部的mask和對應位置的全局Mask,進而得到一個更加准確的Mask回歸。結果也確實如此,BlendMask渲染出來的Mask邊框更加完美。
CondInst(實例分割的條件卷積)
又向前邁了一步,並完全消除了對邊界框的任何依賴,徹底的去掉了detector,完全完全的不需要檢測器來輔助。 它沒有組裝裁剪的原型掩碼,而是借鑒了動態濾鏡的思想,並預測了輕質FCN頭的參數。 FCN頭共有三層,共有169個參數。 令人驚訝的是,作者表明,即使原型模板僅是2通道的CoordConv,該網絡也可以預測COCO為31 AP時的良好結果。
BlendMask / CenterMask和CondInst都是YOLACT的擴展。
BlendMask / CenterMask正在嘗試將裁剪的原型掩碼與每個bbox中的更細粒度的掩碼混合。 YOLACT是BlendMask或CenterMask的一種特殊情況,其中注意圖的分辨率為1×1。
CondInst嘗試將裁剪的原型掩碼與由動態預測的濾鏡組成的更深轉換進行混合。 YOLACT是CondInst的一種特殊情況,其中FCN是1 1×1 conv層。
使用分支來預測原型掩碼可以使這些方法受益於使用語義分割的輔助任務(通常在AP中提高1到2點)。它也可以自然擴展以執行全景分割。
關於代表每個實例掩碼所需的參數,下面列出了一些技術細節。這些具有全局掩碼和系數的方法每個實例掩碼使用32、196、169個參數。
- YOLACT使用32個原型掩碼+ 32個昏暗掩碼系數+盒子裁剪; - BlendMask使用4個原型掩碼+ 4個7×7注意圖+盒子裁剪; - CondInst使用coordConv + 3 1×1動態轉換(169個參數)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
SOLOv1 & SOLOv2
原作者在知乎上回答了 如何看待SOLO: Segmenting Objects by Locations,是實例分割方向嗎?:
語義分割可預測圖像中每個像素的語義類別。 類似地,例如分割,我們建議預測每個像素的“實例類別”。 現在的關鍵問題是,我們如何定義實例類別?
如果輸入圖像中的兩個對象實例具有完全相同的形狀和位置,則它們是相同的實例。 任何兩個不同的實例具有不同的位置或形狀。而且由於通常難以描述形狀,因此我們用大小來近似形狀。

因此,“實例類別”由位置和大小定義。位置按其中心位置分類。 SOLO通過將輸入圖像划分為S x S個單元格和 S × S S\times SS×S 類的網格來近似中心位置。通過將不同大小的對象分配給要素金字塔(FPN)的不同級別來處理大小。因此,對於每個像素,SOLO只需決定將哪個像素(以及相應的實例類別)分配給哪個SxS網格單元和哪個FPN級別。因此,SOLO僅需要執行兩個像素級分類問題,類似於語義分割。現在,另一個關鍵問題是口罩如何代表?
實例掩碼由堆疊到 S × S S\times SS×S通道中的全局掩碼直接表示。這是一個巧妙的設計,可以同時解決許多問題。首先,許多先前的研究將2D遮罩存儲為平坦向量,當遮罩分辨率提高導致通道數量激增時,這很快變得很棘手。全局遮罩自然保留了遮罩像素內的空間關系。其次,全局遮罩生成可以保留遮罩的高分辨率。第三,預測遮罩的數量是固定的,而與圖像中的對象無關。這類似於原型掩碼的工作,我們將看到這兩個流如何在SOLOv2中合並。
SOLO將實例細分公式化為僅分類問題,並消除了任何依賴於回歸的問題。這使得SOLO自然獨立於對象檢測。 SOLO和CondInst是直接在全局掩碼上運行的兩個方法,並且是真正的 bounding box free。
-
分辨率的權衡
從SOLO預測的全局掩碼中,我們可以看到這些掩碼對定位誤差相對不敏感,因為相鄰通道預測的掩碼非常相似。這帶來了對象定位的分辨率(以及精度)與實例掩碼之間的折衷。TensorMask的4D結構張量的想法在理論上是完全合理的,但在當前NHWC張量格式的框架中很難在實踐中實現。將具有空間語義的2D張量展平為1D向量將不可避免地丟失一些空間細節(類似於對完全連接的網絡進行語義分割),並且甚至在表示128×128的低分辨率圖像時也有其局限性。位置的2D或掩碼的2D必須犧牲分辨率。以前的大多數研究都認為位置分辨率更為重要,並且降低采樣率/壓縮掩碼尺寸會損害掩碼的表現力和質量。 TensorMask試圖達到一種平衡,但是乏味的操作導致緩慢的訓練和推理。 SOLO意識到我們不需要高分辨率的位置信息,而是通過將位置壓縮為一個粗略的S²網格來借鑒YOLO。這樣,SOLO可以保持全局掩碼的高分辨率。
-
Decoupled SOLO & Dynamic SOLO
如上所述,SOLO在S²通道中預測的全局掩碼非常冗余且稀疏。 即使在S = 20的粗略分辨率下,也有400個通道,而且圖片中的對象也不大可能每個通道都包含有效的實例掩碼。在解耦的SOLO中,形狀為H × W × S 2 H \times W \times S^2H×W×S2的原始M張量由兩個形狀為H × W × S H \times W \times SH×W×S的張量X XX和Y YY代替。對於位於網格位置( i , j ) (i,j)(i,j)的對象,M i j M_{ij}Mij近似為 逐元素相乘X i ⊗ Y j X_i⊗Y_jXi⊗Yj。 這將400個通道減少到40個通道,並且實驗表明性能沒有降低。

現在自然要問我們是否可以通過預測更少的掩模並預測每個網格單元的組合系數來借鑒YOLACT的原型掩模思想? SOLOv2正是這樣做的。在SOLOv2中,有兩個分支,一個功能分支和一個內核分支。 特征分支預測E個原型掩碼,而內核分支預測每個S²網格單元位置的大小為D的內核。 正如我們在上面的“ YOLACT”部分所看到的,這種動態過濾方法是最靈活的。 當D = E時,它是原型掩碼(或1×1轉換)的簡單線性組合,與YOLACT相同。 本文還嘗試了3×3的conv內核(D = 9E)。 通過預測輕量級多層FCN的權重和偏差(例如在CondInst中),可以采取進一步的措施。

現在,由於全局掩碼分支與其專用位置分離,我們可以觀察到,新興的原型掩碼展示的圖案比SOLO中的更加復雜。 它們仍然對位置敏感,並且與YOLACT更相似。
2.4 掩模的隱式表示
最初,CondInst和SOLOv2中使用動態濾波器的想法聽起來很輝煌,但是如果您將其視為線性組合系數列表的自然擴展,則實際上非常簡單。
還可以認為使用系數或注意力圖將掩膜參數化,或者最終將其參數化為用於小型神經網絡頭部的動態過濾器。 最近在3D學習中也探索了使用神經網絡對幾何實體進行動態編碼的想法。 傳統上,3D形狀通過體素,點雲或網格進行編碼。 占用網絡(Occupancy Networks:Learning 3D Reconstruction in Function Space,CVPR 2019)建議通過將深度神經網絡的連續決策邊界視為3D表面,將形狀編碼為神經網絡。 網絡接受3D點,並告訴它是否在編碼的3D形狀的邊界上。 這種方法可以在推理過程中以任何分辨率提取3D網格。
我們是否可以學習一個由每個對象實例的動態過濾器組成的神經網絡,以便該網絡以2D形式獲取一個點,並在該點屬於或不屬於該對象掩碼的情況下進行輸出? 這自然會輸出全局掩碼,並且可以具有任何所需的分辨率。 回顧CondInst的消融研究,結果表明即使沒有原型掩碼,也只有CoordConv輸入(用作執行統一的空間采樣)。 由於此操作與原型掩碼的分辨率分離,因此有趣的是,以更高的分辨率單獨輸入CoordConv以獲取更高分辨率的全局掩碼,以查看這是否會提高性能。 我堅信實例掩碼的隱式編碼將是未來。

3. 小結
大多數單階段實例分割工作都基於anchor-free 對象檢測,例如CenterNet和FCOS。 也許不足為奇,以上許多論文來自阿德萊德大學創建FCOS的同一實驗室。 他們最近在https://github.com/aim-uofa/AdelaiDet/上開放了其平台的資源。
最近的許多方法都非常快,可以實現實時或接近實時的性能(30+ FPS)。 NMS通常是實時實例分割的瓶頸。 為了實現真正的實時性能,YOLACT使用Fast NMS,SOLOv2使用Matrix NMS。
- 通過更高維度的encoding來表征Mask是很棘手的問題,現在大多數的算法都把mask encoding在低緯度,比如20到200,事實上可能也是這個方法的瓶頸所在,不然大家都用更高的了;
- 手工制作的contour的方法,不是很好的辦法,這類方法看起來沒啥前途,事實上我的其他post也講到過實例分割的用途,一個最大的用途就是在無人駕駛里面用,如果你的Mask不夠准,我也就沒啥用了;
- 局部Mask的方法大多數依賴於detector,我任務這樣的方法過於復雜了,它也沒有使得精度提高多少,反而使得部署過於困難,比如BlendMask需要全局的mask和location融合,還會引入類似於ROIAlign和ROIPooling的操作,在后處理階段,實際使用上是很復雜的;
- 全局的Mask表征有時候比較昂貴,顯存和速度都可能成為瓶頸,ConsInst這種方式其實應該速度會比SOLOV2慢一點,因為它的分支數更多;
- SOLOv2這個思路延續下去,或許會有更好的方法產生。
4. References
- SOLO: Segmenting Objects by Locations ,Arxiv 12/2019,ECCV 2020
- SOLOv2:Dynamic, Faster and Stronger,Arxiv 03/2020
- CondInst: Conditional Convolutions for Instance Segmentation, Arxiv 03/2020 ECCV 2020 oral
- PolarMask: Single Shot Instance Segmentation with Polar Representation, CVPR 2020 oral
- PointRend: Image Segmentation as Rendering, CVPR 2020 oral
- BlendMask: Top-Down Meets Bottom-Up for Instance Segmentation, CVPR 2020
- CenterMask: single shot instance segmentation with point representation, CVPR 2020
- MEInst: Mask Encoding for Single ShotInstance Segmentation, CVPR 2020)
- ESE-Seg: Explicit Shape Encoding for Real-Time Instance Segmentation, ICCV 2019
- YOLACT: Real-time Instance Segmentation, ICCV 2019
- TensorMask: A Foundation for Dense Object Segmentation, ICCV 2019
- FCOS: Fully Convolutional One-Stage Object Detection, ICCV 2019
- Occupancy Networks:Learning 3D Reconstruction in Function Space, CVPR 2019
- Mask Scoring R-CNN, CVPR 2019
- PANet: Path Aggregation Network for Instance Segmentation, CVPR 2018
- CoordConv: An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution, NeurIPS 2018
- Mask R-CNN, ICCV 2017 Best paper
- FCIS: Fully Convolutional Instance-aware Semantic Segmentation, CVPR 2017
- Associative Embedding: End-to-End Learning for Joint Detection and Grouping, NeuRIPS 2017
- InstanceFCN: Instance-sensitive Fully Convolutional Networks, ECCV 2016)
- FCN: Fully Convolutional Networks for Semantic Segmentation, CVPR 2015
This article was originally published on Towards Data Science and re-published to TOPBOTS with permission from the author.
