聊一聊2020年實例分割領域的進展和未來展望

作者|林大佬@知乎

This article was original written by 林大佬, welcome re-post, first come with https://zhuanlan.zhihu.com/ai-man . but please keep this copyright info, thanks, any question could be asked via wechat: jintianandmerry

實例分割發展至今可謂是八仙過海各顯神通,大家都在爲打造一個精度足夠高,速度足夠快的方法不斷地開拓着。從MaskRCNN這一開山鼻祖的方法到最新的SOLO,SOLOv2等,精度在不斷刷新,速度在不斷提高。然而對這一領域問題的定義並非是一成不變。Instance segmentation不同於Detection,圍繞着這個問題可以展開非常多的方法去做它,甚至是把問題推翻,重新定義一遍instance segmentation然後再來想辦法解決它。今天本文就圍繞着從MaskRCNN這個開衫鼻祖開始,和大家聊一聊實例分割的發展脈絡,以及它的未來發展方向。正在做實例分割方向調研準備在這上面發paper的同學可以深入看一看,順便點個贊,實在無聊可以轉發一波。

實例分割任務Review

實例分割是一個很具有挑戰性的任務,我們用一張圖來描述它:

從左到右,依次是目標檢測任務,語義分割,實例分割任務。從圖可以看出,實例分割不僅僅要求分割出物體的mask,識別出它的類別,還需要去區分同一類裏面的不同instance。

自從2階段的目標檢測算法大行其道以來,FasterRCNN,各種RCNN的算法層出不窮。繼而隨着MaskRCNN算法的橫空出世,讓大家領略了原來目標檢測還可以這樣玩,許多基於RPN的實例分割算法也被相繼提出。這一思想甚至一直影響到如今。比如PANet,MaskScoreRCNN (mask scoring MaskRCNN)等,這些其實都是MaskRCNN以及2 tage目標檢測算法的思想延續而來。即通過RPN拿到box的proposal,再接着對這些Proposal進行mask的分割。不得不說,這些方法其實取得了非常大的成功,到目前位置,很多商業級別的算法都是基於MaskRCNN開發的。

但,MaskRCNN實在是太慢了。這就造成了這個算法被禁足在學術界,工業界完全不敢用,造成的latency是不可忍受的,可能就是因爲10ms的誤差,導致幾百萬美元的訂單飛了。爲此,包括學術界在內,大家都在苦思冥想,一直想開發一個足夠快,同時精度上又能夠和MaskRCNN比拼的實例分割算法。

事實上,除了速度慢以外,MaskRCNN還有一個缺點,既它產生的Mask,永遠是從28x28的tiny mask reshape而來。因此,它產出的Mask實際上是很粗糙的。這是由於 它的mask分支的resolution被固定在一定的尺寸所導致的。因此,MaskRCNN對於一些大物體同時外邊界有很複雜的場景下是不適用的。比如你拿去做大象的檢測,大象計數,那麼外邊界可能就不準確了(什麼人會專門檢測大象?)

因而,基於這些缺點,一些人就想着去解決它。得益於這幾年anchor-free方法的大力發展,大家都發現,基於anchor-free來做實例分割,好像是一個不錯的idea,於是就有了很多基於CenterNet,FCOS等方法改進的實例分割算法,比如CenterMask,BlendMask,等等。下面這張圖,來自於SOLOv2的paper,可以看看這些年實例分割算法的精度演化情況:

本篇文章不僅僅會概括實力分割發展的脈絡,也會歸納一下,評判一下不同方法的優缺點。

事實上,本文開篇就提到了一個問題:實例分割這個領域和目標檢測不一樣, 你可以有無數種方法來定義實例分割. 爲什麼這麼說呢?請繼續看:

Mask的表徵方式

許多學者其實已經意識到了這個問題,通過不同的途徑來表徵Mask,可以得到聲東擊西、曲線救國之功效,而mask的表徵方式大家最熟悉,最直觀的方式也就是binary的方法,也就是一個矩陣,裏面放着0和1,有1的地方說明有物體,0的地方是背景。還有一些mask的表徵方式就比較fancy了,比如把一個binary mask encode成一個固定維數的向量。

局部Mask和全局Mask

局部mask和全局mask的唯一區別在於,局部是拿到box之後,再做分割,從box裏面crop出我們需要的mask,而全局mask是直接從圖片上去拿到mask。

一圖以蔽之:

全局mask帶來的優點就是,它很直觀,其次它可以以原圖的方式來分割出mask,這不會讓小物體丟失全局信息,同時也可以讓小物體更容易被看見。對於大物體來說,它看的也更加清晰,邊界也應當會更加的清晰。

局部mask,就像是MaskRCNN等基於檢測的方法所採用的那樣,它的mask resize之後,最終會取決於實際物體的大小來決定這個物體的mask質量。它優點其實也很明顯,它同樣很簡單,可以和任何目標檢測算法結合起來,同時它應該速度相對來說更快,佔用的顯存毫無疑問會更小。

基於這種mask表徵的方式,我們可以將所有的實力分割算法大致分爲兩個大類別:

  • 基於局部mask的表徵方法;

  • 基於全局mask的表徵方法。

局部mask的表徵方法

首先我們聊一聊局部mask的表徵方法,它從每一個Proposal出來的region提取mask。

通過邊框迴歸表徵的局部mask編碼

bbox其實是一個很泛化的mask,它只有四個點,實際上只有兩個座標,如果我們把這四個點擴展爲32個點會怎麼樣呢?

這就是ExtremeNet的思想,這篇論文也是CVPR2019. 它通過定位center point以及regression 八個邊框點來構建mask。也就是我們傳說中的八邊形目標檢測。這同時也不由得讓我想起來最新的那篇PolyYolo:

這篇論文也是在yolo檢測基礎上,直接拓展了15個angle實現的。嚴格上來說,它和PolarMask更爲相似,他們應該都可以歸類到一類吧。不管怎麼樣,都還是局部Mask的思想爲指導。

對PolyYolo比較感興趣的朋友可以reference源代碼:https://gitlab.com/irafm-ai/poly-yolo。我們最近也會重構一個基於tensorflow2.0的版本,盡請期待。

對於PolarMask,這篇CVPR2020的文章,其實也是蠻有意義的,等於說是把這個問題推翻了,重新定義了一遍,再來解決。在這裏其實我很想跟大家分享這篇paper:https://arxiv.org/pdf/1908.04067.pdf ESESeg。

這篇論文來自於上海交大。文章採用了一個新穎的形狀簽名的方式,採用切比雪夫多項式來擬合每一個形狀的內心半徑,得到物體的mask。據說這個方法在VOC上超越了maskrcnn,以7倍的速度。

當然大家感興趣也可以點進去看看paper。最後它也是沒有超越我們框定的範疇,也是基於局部mask的方式,它可以和yolov3連接,也可以和其他任何SOTA的檢測器鏈接,做成一個實例分割框架。

但,最後,就我個人而言:

雖然ESE-Seg生成的mask比那些基於若干個angle的方式要好,但still,看起來依舊很不對味,簡單來說,沒有那個味兒。。你懂吧?

通過4D的張量構建mask

繼續來看一看基於局部mask的mask編碼方式。通過4D的tensor來構建,典型的算法就是tensorMask了。4D,其實超越了我一個地球三維生物的維度想象上界,但我們可以剝開一個維度,看看它表徵的是什麼?

wh可以理解,vu可以看做是什麼?像素點的座標?不對,wh就已經包含了位置座標信息了。應該是中心點在xy座標處的mask,表示方式就是uv。這個方法要說巧妙吧,倒也滿巧妙,畢竟何凱明出品,必出精品,但它的速度竟然比MaskRCNN還慢,有點殺第一百自損三千的趕腳。除此之外它需要更多的訓練時間,是MaskRCNN訓練時間的6倍。這簡直無法忍受。

精巧的Mask編碼方式

事實上,雖然都是局部mask編碼方式,但是contour base和mask-based有着天然的缺點。比如這樣:

你contour based就沒有辦法有效的表徵裏面的洞了。於是大家就在想,有沒有辦法可以讓mask又高效同時又準確,還能表示這樣的洞呢?

今年最近的論文MEInstance裏面就提到了一個方法,將mask編碼成一個統一的Matrix,它可以illustrate like this:

這個編碼方式是很精妙的,完美的規避了端到端對齊的問題,什麼事端到端對齊?一張圖片裏面的box數目,box大小都是不一樣的,因此MaskRCNN這樣的局部Mask的分割方式都會不可避免的引入RoIAlign這樣的操作,導致了每一個batch都需要一個對齊的操作。MEInst這裏做的工作就是一個標準化。不過令人遺憾的是,理想很豐滿,但是現實卻很骨感,雖然論文證明了這種表徵方式可行,速度卻沒有和MaskRCNN高出多少,源自於這裏面的編碼和解碼的操作比較耗時。

全局Mask表徵方式

接着,我們來看一看思路完全不一樣的實例分割方法。事實上,這個分支纔是目前比較主流的,onestage的實例分割方法。全局Mask通過預測圖片裏面每一個可能存在的Mask,來構建整張圖片的所有instance。

這些方法可以說是主流和先驅,他們可以簡單的歸結一下:

  • Yolact: yolact 是第一個做到realtime的實例分割算法,儘管它的精度不是很高 。yolact將整個任務拆分爲了兩個部分,一個部分是得到類似於FCN的語義分割結果,prototype,另外一個分支來拿到box,通過融合box和prototypes,得到mask和對應的box。實際上,這裏面全局的Mask就被使用了,儘管你察覺不到。通過box來crop全局的mask淹沒,其實大概率就可以找到對應的mask,然後再對這個mask進行一個學習,就可以迴歸出一個完整的Mask。

這裏面還有一個十分值得注意的點,由於yolact裏面採用了全局的Mask,並且最終生成的mask質量只取決於全圖的分辨率,與mask的數目無關,這就使得yolact在計算mask的速度上,可以和mask的數目無關,它是一個常量。這也是Yolact速度比較快的原因之一;

  • InstanceFCN 和 FCIS: 這兩個算法應該比MaskRCNN還老,可以說是實例分割的鼻祖的鼻祖了。這兩個方法也使用了全局的Mask,只不過在FCIS裏面,它是通過psroi來判斷mask是否存在於某個position裏面,它存在着ROI的操作,也是得這個方法比較複雜;

  • BlendMask: 最新的BlendMask,個人認爲,是一個比較精妙,精度很高,速度也做的很快的方法。你如果仔細思考BlendMask的做法,你會看到MaskRCNN的引子,但是也會看到Yolact的引子。因爲它依賴於detector,同時也用到了全局的Mask。這篇paper,在它的Blender模塊裏面,使用了全局的Mask,同時通過FCOS檢測到的position來融合局部的mask和對應位置的全局Mask,進而得到一個更加準確的Mask迴歸。結果也確實如此,BlendMask渲染出來的Mask邊框更加完美。

  • ConsInst: 最後是ConsInst,個人認爲,ConsInst應該是目前最有潛力的一個,它可以做到Realtime高速,同時保證高精度,最重要的是簡單!CondInst更進一步,徹底的去掉了detector,完全完全的不需要檢測器來輔助了。

仔細看ConsIns的架構,會發現,它的思路和SOLO有點像,直接輸出原圖中的全局Mask,只不過它的mask只負責輸出mask,不負責輸出類別,這一點和SOLO不同,與此同時,最終的mask排列順序會和類別有一個匹配的過程,這樣你才能知道哪一個mask是哪一個類別不是嗎?最後,期待ConsInst開源...

總結一下,事實上,回過頭去看,你會發現,BlendMask也好,CenterMask也罷,包括ConsInst,他們都是Yolact的擴展。爲什麼這麼說呢?

  • BlendMask/CenterMask如同我們上面分析總結的那樣,它需要一個檢測器來輔助,得到全局Mask裏面的局部mask信息,而全局的mask又輔助局部mask的優化和迴歸,從這個角度將,簡直就是和Yolact一脈相承,說不定真的是收到了Yolact的啓發也說不定;

  • ConsInst直接輸出全局的mask可能的位置,這個和Yolact何其的相似,只不過Yolact的作者發現好像我並沒有辦法把他們分開,而ConsInst的作者們做到了;

最後,我們再來講一講最新的SOLO和SOLOv2.

SOLO系列算法,給我的感覺就是兩個字,牛逼。爲什麼呢?它彷彿就是在告訴你:

We did instance segmentation by stack convolutions without any bells and whistles.

通常在論文裏面說這句話的人,我都是五體投地,跪拜大神的。爲什麼呢?就比方說有人用一個小學生都能看懂的方法推導出了泰勒展開,你能說不牛逼麼。話說回來,SOLO這個系列的方法,確實簡單,簡單是簡單,但是人家work啊,還有啥好說的呢?不服自己做實驗去。

PS:不知道是我運氣的原因,還是財力不夠(沒卡),我用4塊GPU train SOLOv2,沒有一個版本的work的。loss震盪劇烈,感興趣的朋友也可以加入我們的社羣,一起來討論交流一下:

http://t.manaai.cnt.manaai.cn

言歸正傳,關於SOLO這個算法的解釋,其實原作者有一個很詳細的解釋了:

如何看待SOLO: Segmenting Objects by Locations,是實例分割方向嗎?

https://www.zhihu.com/question/360594484/answer/936591301

我這裏結合本文的核心論述說一下,其實SOLOv2也可以歸納到全局Mask這個範疇,就如下圖所示。它直接預測全局的Mask,同時通過Mask的構建方式來區分類別。

總結:

到目前爲止,SOLOv2和ConsInst應該是真正的work,高速並且Box-Free的實例分割算法.

請注意,這裏提出了一個新的名詞,BoxFree, 就和anchofree一樣,box就是實例mask的anchor,我們也可以去掉它。

乾貨

最後論文的乾貨如下:

  • 通過更高維度的encoding來表徵Mask是很棘手的問題,現在大多數的算法都把mask encoding在低緯度,比如20到200,事實上可能也是這個方法的瓶頸所在,不然大家都用更高的了;

  • 手工製作的contour的方法,不是很好的辦法,這類方法看起來沒啥前途,事實上我的其他post也講到過實例分割的用途,一個最大的用途就是在無人駕駛裏面用,如果你的Mask不夠準,我也就沒啥用了;

  • 局部Mask的方法大多數依賴於detector,我任務這樣的方法過於複雜了,它也沒有使得精度提高多少,反而使得部署過於困難,比如BlendMask需要全局的mask和location融合,還會引入類似於ROIAlign和ROIPooling的操作,在後處理階段,實際使用上是很複雜的;

  • 全局的Mask表徵有時候比較昂貴,顯存和速度都可能成爲瓶頸,ConsInst這種方式其實應該速度會比SOLOV2慢一點,因爲它的分支數更多;

  • SOLOv2這個思路延續下去,或許會有更好的方法產生。

  • 我不知道SOLOV2難以訓練是開源代碼存在的問題,還是算法本身就比較難以訓練,這裏面存在着一些問題值得探尋。

Reference

[1]. Patrick Langechuan Liu: Single Stage Instance Segmentation Review;

[2]. Mask Encoding for Single Shot Instance Segmentation

覺得有用麻煩給個在看啦~  

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