Semantic Segmentation: A thorough Review
語義分割可以劃分到目標檢測領域,不同的是,一般意義上目標檢測只需要輸出被檢測物體的bounding box,而語義分割則需要輸出一個mask,所以要求更高了。
從技術上說,語義分割歸根結底就是對context information的建模。
研究意義
語義分割(Semantic Segmentation)的目標是給定一張圖片,對于圖片中的每一個像素做分類。例如下中給出的原始輸入圖片,語義分割算法對圖片中的每一個像素分類,得到對應的結果。在分割結果中,不同顏色代表不同類別:如紅色代表行人,藍色代表汽車,綠色代表樹,灰色代表建筑物等。語義分割問題在很多應用場景中都有著十分重要的作用(例如圖片理解,自動駕駛等),所以近年來,該問題在學術界和工業界得到了廣泛的關注。從大方面看,它是通往場景理解之路的high-level vision task。
Semantic segmentation is one of the high-level task that paves the way towards complete scene understanding.
研究現狀
與許多其他vision task一樣,深度學習的到來掀翻了流行的傳統方法的統治,在精度(有時甚至還有效率)上開始吊打其他的方法。然而,由于發展日新月異,文獻層出不窮,深度學習還不如傳統機器學習方法體系成熟,也沒有好的review能夠幫人們分辨出那些里程碑的(或真正有影響力的)工作和比較次的方法。
下圖是現在語義分割領域的常用數據集
(來自A Review on Deep Learning Techniques Applied to Semantic Segmentation-2017 [Paper])
再下圖,是比較經典的基于深度學習的方法(然而我感覺一多半的都不認識,可能這些方法是從innovation角度列出的);
這里選擇幾個比較典型的方法進行介紹;
FCN(2014.11.14 arXiv v1)
FCN是深度學習進軍語義分割領域的第一炮,它創新地將常用的卷積神經網絡結構的全連接層卷積化了(其實全卷積的提法早在overfeat中就有了,好像googlenet還是vgg中也出現過),并且引入了deconvolution進行upsampling,從而可以滿足語義分割任務end2end的學習,啟發了后續的大量研究。下圖顯示了它的基本思想
除此,FCN還利用了skip layer的思想來融合淺層的信息
此后的FCN PAMI版本中,作者對訓練的一些trick做了一些探討。
ParseNet(2015.1.15 arXiv v1)
ParseNet和SSD(Single Shot MultiBox Detector)都出自Wei Liu之手。ParseNet的主要創新就是用到了global context information來提升語義分割的精度。
文章提到了early fusion,late fusion的概念,分別對應分類前融合,分類后融合,而且還討論feature fusion前L2 norm的必要性問題。
DeconvNet
FCN之后,韓國的研究團隊隨后提出了DeconvNet,網絡拓撲結構見下圖
說實話,unpooling(利用先前pooling的indices)的思想一點也不新鮮,ZFNet的相關工作中早就有了;從上面的拓撲結構圖來看,唯一一個不和諧,也是我覺得用真正用到deconvolution的地方就是從fc7的1x1到緊隨其后的7x7,這也是整個網絡唯一一個用到deconvolution來擴大resolution的地方,此后都是通過作者自定義的一個unpooling層來實現feature map的擴大。對應的如果再netscope中看的話,就是下面這樣的
另外,作者考慮到FCN不能很好地handle scale,于是利用了一種instance-wise的訓練方法
The trained network is applied to individual object proposals to obtain instance-wise segmentations, which are combined for the final semantic segmentation; it is free from scale issues found in FCN-based methods and identifies finer details of an object.
2017/8/26更:前兩天聽了北大申發龍博士做的CVPR2017語義分割方面工作的介紹,他說…韓國人的這篇DeconvNet說明了一件事,那就是反卷積在語義分割上完全沒有用。(笑哭)
SegNet
劍橋大學的團隊提出SegNet
項目主頁:http://mi.eng.cam.ac.uk/projects/segnet/
網絡拓撲結構:
這種網絡結構乍一看和DecovNet非常相似,都是用了一種encoder+decoder的思路,但是細節上還是有不同的。SegNet相比DecovNet去掉了全連接層,這樣一來,連先前DeconvNet中那個我覺得不和諧的地方(通過deconvolution使得feature map從fc7的1x1到7x7)都不見了,整個網絡完全沒有用到deconvolution來增大resolution,就像他的名字一樣,也沒有和deconvolution攀親戚。整個結構銜接更加和諧,下圖
去掉fc層之后,參數數目極大減少,計算速度大大提升。這個網絡在精度和速度上面的均衡表現令人印象深刻。
在SegNet中,作者特意比較了他們的利用max-pooling indices進行upsampling的方法和普通的deconvolution來upsampling的方法,見下圖
看完這個圖,覺得比較得挺好的。給人一種感覺就是,SegNet大膽地承認了自己不是使用deconvolution的方法,而DeconvNet則名字上比實際上和deconvolution聯系上更緊一些(前面已經說過了,我覺得DeconvNet只有fc7之后那一層有點deconvolution的意思)。
DeepLab
谷歌的DeepLab團隊接連推出了DeepLab-v1和DeepLab-v2兩個版本,在精度上更上一層樓。
DeepLab-v1的結構以VGG16作為base network,率先使用了dilation convolution(這很大程度上促成了后面dilated convnet的提出),并且將VGG16的第一層的kernel size從7減小到3或4,全連接層的通道數也減少了,從而實現了加速。值得一提的是,作者還獨出心裁地將NIPS2011新提出的DenseCRF的成果應用進來,進行輸出label map的進一步加工(也就是精細化預測),這也起到了不小的提升效果。
DeepLab-v2的結構進一步地考慮了multi-scale的信息,提出了ASPP的結構,從而能考慮多尺度信息,這使得分割的精度進一步提升,ASPP示意圖如下
除此之外,作者還在DeepLab-v2中對訓練的一些參數設置進行了探討,比如發現使用多項式的學習策略比step和fix都要好,這也啟發了后來商湯科技的PSPNet。
Deeplab-v3,可能是看到v2被PSPNet搶了風頭,于是DeepLab-v3問世了,對標PSPNet。
主要地,作者使用了兩種策略來試驗multiple atrous rates:一種是“串聯的結構”(atrous convolution in cascade);另一種則是“并聯的結構”(atrous convolution in parallel);以此來handle語義分割中的mutliple scale問題。其中并聯的結構主要是基于先前DeepLab-v2提出的ASPP(Atrous Spatial Pyramid Pooling)結構,并且受PSPNet和 ParseNet的啟發,進一步融合了image-level global feature,提升了精度。而且,文章還論述了Multi-grid的問題,也就是如果dilation按照2,4,6,8類似的增長的話,會浪費許多image pixel,所以作者采用了多種數字組合來試驗(咦~文中我怎么找不見了,這是在哪兒看見過來著?);另外,如果dilation太大的話,最后其實相當于只有中間的feature map pixel起了作用,是effective pixel,其他的地方都去卷積了padding的零元素了。文章以ResNet作為base network,使用了Batch Normalization和諸多trick,在沒有使用CRF后處理的情況下能在PASCAL VOC2012上拿到第二名的好成績。另外一個值得稱道的地方是,文章作者分享了詳細的工程最佳實踐(best practice),讓人十分受益。比如說作者發現Batch Normalization Layer對于訓練很有必要(先前的DeepLab-v2沒有BN layer),并且使用了bootstrapping的方法來著重訓練那些標注較少的樣本等。
Dilated ConvNets
受益于DeepLab中atrous convolution的思想,普林斯頓大學的Fisher Yu將這種思想進一步總結,提出了dilated convolution,讓普通的卷積操作成為dilated convolution的特例。 Dilated convolution可以可以在不損失feature map分辨率的情況下指數級別地增加感受野,這使得更多的context information被考慮進去了,讓語義分割的精度繼續提升。
FC-DenseNet
再然后,由于DenseNet在cifar-10的分類任務上取得了很好的成績,顯示出是一種比較先進的網絡結構,于是Yoshua Bengio一行人,將DenseNet改造之后應用于語義分割任務,提出了FC-DenseNet。網絡結構如下
不過據作者描述,他們在CamVid dataset上面能夠很快地收斂,但是在PASCAL VOC上卻難以收斂,直到使用Adam optimizer來訓練,結果是表現效果很差。
PSPNet(CVPR2017)
PSPNet是CUHK和商湯科技提出的一種語義分割系統,在ImageNet2016場景競賽中拔得頭籌。文章中使用了大量的工程技巧,比較令人印象深刻是他們使用了一個叫做PSP的結構,能夠很好的multi-scale的信息,和global信息。這種好處是,可以考慮不同object的位置關系,比如說不至于讓汽車出現在河里這種反常規的位置關系出現
RefineNet (CVPR2017)
文章來自阿德萊德大學沈春華老師他們組
這篇文章的trick或者網絡的結構設計確實比較精妙,核心在于理解RefineNet的結構
現在RefineNet在VOC12上排位靠前
論文地址:https://arxiv.org/abs/1611.06612
Large Kernel Matters(CVPR2017)
這篇文章是清華和曠視科技(Face++,孫劍)合作的文章,文章強調大kernel很重要,但是不是plain large kernel,而是類似inception中的那種1xk然后接一個kx1的那種。這篇文章旨在解決語義分割中classification和localization的矛盾,因為它說先前的文章主要解決的是localization的問題,所以本篇文章就用large kernel來增大對classification的重視。
不過為啥是用1xk接上kx1的結構而不是平常的大kernel,也很難解釋清楚,感覺就像是試出來的一樣。
作者們還雄心勃勃地把ResNet中block的kernel也用自己的這種large kernel的設計(叫做GCN)替換掉,但是發現在分類上沒有提升,GCN只在語義分割上有明顯的作用,這終究還是一個難以解釋的事情。
代碼尚未開源
SDN(2017.08.04 arXiv v1)
這篇是現在VOC12上排名第二的算法,實際上應該是排名第一,因為第一名是DeepLabv3-JFT,原團隊DeepLabv3拿了一個谷歌的超大的數據集JFT去pretrain了ResNet,然后在原有基礎上刷到了第一。
SDN全名是Stacked Deconvolutional Network for Semantic Segmentation,來自自動化所盧漢清老師組,第一作者是付君師兄。基于SDN的模型,CASIA和京東的聯合團隊CASIA_IVA_JD拿到了Places2017 scene parsing競賽的冠軍。 并在ICCV2017的Joint Workshop of the COCO and Places Challenges上做了演講。
模型拓撲:
用了stacked encoder-decoder的結構,然后借鑒了densenet的dense connection,FCN的skip connection,HED的hierarchical supervision(或者deeply supervision)來更好地優化網絡。
Multi-Scale
以上提到的文章都只局限于自己已經閱讀過的,而在閱讀A Review on Deep Learning Techniques Applied to Semantic Segmentation-2017一文時,文中有關multi-scale的探討很有必要做一下筆記。
有關multi-scale的意義或者說必要性,
文中提到了下圖列出的四篇工作,詳細的內容可以去閱讀原文4.3.2
Feature Fusion
Feature Fusion部分也講的很精彩,只是還有點沒太搞懂late fusion和late fusion有什么區別(據ParseNet所言,FCN是late fusion,而自己是early fusion,這就更讓我迷糊了)
比較有代表性的工作是W. Liu, A. Rabinovich, and A. C. Berg, “Parsenet: Looking wider to see better”
利用RNN進行context information建模的
代表性工作
Reseg: A recurrent neural network-based model for semantic segmentation,”
Recurrent Convolutional Neural Networks (rCNNs)
……
(對RNN不太關注,所以就不多說了)
存在的問題
- 主要存在的問題是精度和效率的trade off,有些方法雖然精度很好,但是網絡過于復雜,離實時性差的太遠;
- 然后就是一個全局信息和局部細節的矛盾。
- 還有一個reproducibility的問題,現在發的文章非常多,但是有的文章細節交代不夠,而且后續的開源工作做得不好,導致人們復現起來十分困難,這一定程度上會阻礙語義分割的研究和發展
- 另外,怎么將各個物體之間的語義約束作為一種先驗信息融合進入語義分割框架也是一個值得考慮的地方,因為現在的分割大多都是沒有顯式地考慮物體之間的語義約束。
未來的研究思路
- 3D數據,現在大多數的研究都是在二維的數據上開展的,ImageNet2018就要開始加入3D的數據,這說明3D語義分割是有研究的必要的
- 在視頻語義分割任務中融合時間信息
- 點云數據的語義分割,這時常規的卷積神經網絡就無法直接應用進來了,需要一些離散化的方法
- multi-scale 和 mutli-context信息的利用還存在很大的改進空間
- 網絡加速以實現實時性
- 模型壓縮以減小內存占用,因為想要真正的讓研究投入應用,還要考慮設備的內存限制,而現在的有些網絡雖然精度不錯,但是非常耗內存
- multi-view信息融合
================================================================
2017/8/27 更新
Appended Review from the perspective of Automated Driving
(motivated by https://arxiv.org/abs/1707.02432)
以前的語義分割模型都是為generic images設計的,而不是針對自動駕駛,如果專為自動駕駛設計,那么可以融入更多的prior sturcture/information.
自動駕駛場景下的語義分割看重三點: accuracy, robustness, speed.
通用語義分割技術的幾個應用場景:
- 機器人
- 醫療應用,比如醫學圖像分割
- 增強現實
- 自動駕駛(主要)
語義分割方法的分類:
- 傳統方法
- 基于FCN的方法
- Structured Models
- Spatio-Temporal Models
傳統方法,傳統方法已經沒人用了,所以就不提了,大概就是用隨機森林等方法。
基于FCN的方法,有三個階段(按時間看):
- patch-wise training:比較經典的是LeCun他們做的,使用Laplacian Pyramid分3個stages+圖模型postprocess
- end-to-end learning:始于FCN
- multi-scale segmentation:FCN(skip connection),U-Net
Structured Models的方法,有
- 基于圖模型,比如CRF的方法
- 使用RNN來建模context information的方法
Spatio-Temporal Models的方法,主要是用于視頻語義分割,融合CNN和RNN(LSTM)的特點進行時空信息的建模。值得一提的是,最近發現一篇LeCun他們的文章,又在這個方向挖坑,Predicting Deeper into the Future of Semantic Segmentation,大致意思是用語義分割預測未來幀。因此,說不定視頻的語義分割也是一個有前途的方向。
————————————————————————————————————-
下面這部分主要涉及自動駕駛方面的一些東西。
就具體的應用場景而言,自動駕駛可以為語義分割帶來許多先驗信息,比如說:路面總是在圖像偏底部,路面上的標志線總是粗的,并且匯聚在圖片的消失點,交通信號燈的顏色等。
Dense High Definition(HD) maps,不知怎么翻譯,翻譯成稠密高清地圖吧。精確的目標識別難以達到,所以借用HD地圖來改善,目前主要有兩種類型的HD地圖:
- Dense Semantic Point Cloud Maps:類似語義3D點云,這個是谷歌和TomTom采用的方法,昂貴復雜,對存儲要求高。
- Landmark based Maps:相當于是上面的2D版本,是Mobileye and HERE 采用的方法。
Localization,定位。位置信息對于自動駕駛的重要性不言而喻,光有語義(分割)的信息而沒有精確的位置(比如距離)信息是不行的。解決這個問題有三種方法:
- SfM
- 雷達傳感器
- Joint In-the-Network Localization:其實就是在一個網絡中同時進行語義分割和景深估計,這樣子兩個任務可能會協作加強,這也是未來值得研究的一個方向。
Challenge
未來的,自動駕駛方面的挑戰,某種程度上也是一般語義分割的挑戰:
- 嵌入式設備的計算復雜度:現在的語義分割速度在嵌入式GPU板子上,處理高清圖還未及實時,解決的方法就是兩條,一是研發更高算力的GPU,二是研究更加efficient的算法。
- 對大型語義分割數據集的需求:語義分割的函數復雜度很高,需要類似甚至超過ImageNet量級的數據集進行訓練
- Learning Challenges
- 類別不均衡:比如行人比天空的標注要少,會造成忽視小物體;解決辦法,一是使用weighted loss function,二是使用mask predictions on detected bounding boxes of these small objects,比如Instance-Sensitive FCN
- 未見物體:處理訓練集中未見的物體,比如想象路上出現了一只考拉熊,那么softmax分類器還是會把它分成某種已經物體;解決辦法可以參考Bayesian Segnet衡量分類的不確定性。
- 簡化輸出:大意是簡化語義分割結果的輸出,尤其是在紋理非常豐富的場景中,希望輸出的結果能簡化。
- Instance級別的語義分割:有時候一些場景,比如想要跟蹤行人,需要不僅僅是類別信息,還要identity的信息,所以會需要用到instance-level的語義分割,參考的文獻仍然如Instance-Sensitive FCN。
- 目標導向的語義分割:語義分割終究是一個太寬泛的方向,具體在自動駕駛上,有些物體比如天空就無需多精確地分割出來,所以說,要考慮到具體的應用,做定制化的語義分割。
- 變化多端的物體:比如說行人的姿態結構就可以變化多樣,那么用一些更加復雜的網絡比起plain network可能能更好地處理這些復雜物體,參考文獻如:Not all pixels are equal: Difficulty-aware semantic segmentation via deep layer cascade
- Corner Case Mining:臨界/極端情況挖掘,由于物體間高度耦合,很難挖掘一些臨界場景,可以用Synthetic sequences來設計出這些場景。
另辟蹊徑
其實就是替代性的自動駕駛解決方案!
- Multi-task Learning,比如同時進行光流估計和語義分割https://arxiv.org/abs/1607.07716
- End-to-end learning,端到端的學習,就是不要搞那么多花哨的語義分割和目標檢測的模塊,精確的目標檢測并非安全的自動駕駛所必需的,這也更符合人類開車的直覺。誰會一邊開車一邊對車前方的各種物體做檢測識別呢,在乎的是只要別撞上我就行了。端到端學習的好處是不需要那么多annotation,駕駛的信息只來自于Controller Area Network (CAN) signals,輸出的也只有brake,steering,acceleration,比起語義分割的簡單多了。Uber就把未來押在這個方向上了。參考End to end learning for self-driving cars,和LeCun他們的Off-road obstacle avoidance through end-to-end learning。
- Modular End to End learning,這里比上面多了一個modular,代表在e2e的基礎上增加了輔助損失函數來保證safety和interpret ability,這種結構往往優于單純的e2e。比如Fisher Yu他們的End-to-end learning of driving models from large-scale video datasets
示意圖如下:
————————————————————————————————————-
語義分割社區常用的一些工程最佳實踐:
- 用3x3卷積核,類似VGG中一樣,這樣可以保護feature map分辨率
- 強烈推薦dilated convolution
- 為了達到實時,使用淺層網絡,以尋找accuracy和efficiency之間的trade-off
- Batch Normalization,加速收斂很有用。
- 輸入圖片的分辨率會影響分割效果,比如分辨率比較大的時候,小物體(如行人)就比較好分割;使用random crop來緩解類別不均衡的問題
- skip connection,這在許多語義分割網絡中都用到了,比如FCN和U-Net等,效果會好但是會耗顯存。
————————————————————————————————————-
收獲:對語義分割的技術概況,自動駕駛的相關技術有了更多的理解和把握;但是,以上仍然是一個比較泛的review,具體的研究突破點依然要從小方向上去尋求。
================================================================
總結
以上是生活随笔為你收集整理的Semantic Segmentation: A thorough Review的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【办公应用软件】万彩办公大师教程丨屏幕O
- 下一篇: 干货来袭!3天0基础Python实战项目