談一談深度學習之semantic Segmentation


  上一次發博客已經是9月份的事了....這段時間公司的事實在是多,有寫博客的時間都拿去看paper了..正好春節回來寫點東西,也正好對這段時間做一個總結。

  首先當然還是好好說點這段時間的主要工作:語義分割。semantic segmentation 應該是DL這幾年快速發展的最重要的領域之一了,但可惜的事,在這方面大家走的並不是很遠,還是有很多值得改進的地方,這當然是個很好的事情,特別是我這種想發paper弱渣.....

  語義分割做的是什么事呢? 就是給你一張圖,你要對其中的每個pixel做分類,例如把所有的人都塗成紅色,車都塗成藍色。這是在機器人領域和自動駕駛中都非常重要的一步,因為我們開始讓電腦真正的開始認識這個世界了。如下圖所示:

 

 

 

 

  semantic segmentation的轉折點是從long的那那篇FCN開始的,之前的方法大多是用PGM建模的方法來做,原理都很清楚,但效果就是不好,因為難以解決的問題太多了。等DL大火之后,果然還是DL大法好,FCN這篇文章我之前是寫過筆記的,那時候還比較年輕,現在再好好說一下。

  這篇文章提出來的全卷積的概念並不新鮮, 也無怪乎lecun再FCN獲得CVPR的best paper后吐槽了一發,但個人覺得現在DL領域,關鍵的不是誰提出了什么,而是誰做出了什么,誰做的更好,畢竟效果好才是王道。回到FCN,他的思路很簡單,VGG最后的全聯接層使得我們的輸入只能是固定的,這個很不好,所以就用全卷積層來代替它,這樣就可以任意輸入了,全卷積層這里有個很多人都有的概念的疑惑,那就是為什么會有人說1*1的卷積就等價於全連接層呢?(而且還是lecun說的...)這事我也糾結過,我們很簡單的理解,和全連接層等價的肯定是kernel和feature map一樣大的卷積層,但lecun這么說是有語境的...因為在做全連接層之前,我們要把圖像拉成一列,如1*1*4096這種,這樣對他做1*1的卷積就等價於全連接層了...也算是我一個無聊的發現...

  說說FCN的創新點和問題,最大的創新點就是skip connection了,這個trick到現在都是很不錯的想法,不同level的feature map所提供的信息是不同的,所以在最后分類的時候都可以用到他們,semantic segmentation一直有一個trade-off,就是物體的邊緣和物體整體的分類的正確性,high-level的feature能提供更細節的表現,low-level的feature側重於於很大一塊區域的准確性,傳統解決這個問題的方法一般是兩種:1.multi-scale的input。2.skip connection。   這方面最近有個叫refinenet的paper做的挺不錯的,它用restnet的思想將網絡分為兩條路,一個負責location,一個負責refine,有興趣可以去看看。  回到FCN的問題,也是我最想吐槽的一點....VGG的model時downsample 32倍的,所以FCN使用了原來classification一樣的模型,所以在經過最后7*7點卷積之后,feature map就只有1*1點大小了....也就是說我們要從1*1點feature map上恢復到原圖,雖然說它到channel很多,但毫無疑問,它提供的信息時嚴重不足的,這也無怪乎他得用skip connection了..這里要談一談downsample的問題,downsample太多的話會丟失原圖的很多信息,畢竟我們是做pixel級別的分類,所以根據我的經驗,一般是8倍或者16倍左右...

 

  現在做semantatic segmentation 主要還是用的deeplab那一套,接下來我准備好好講一下deeplab這一套方法... 

  deeplab那篇paper很推薦大家去看一下,他應該基本代表了現在semantic segmentation的state of art的流程了,我分幾點說一下吧:

一、encoder層

  encoder層我的理解是把原圖downsample的步驟,一般來說這一步使用的網絡是和分類使用的一致的,分類的網絡性能越強,最后大效果也就越好,所以現在普遍使用的是resnet(152),這里需要注意的問題就是,傳統的classification下采樣的倍數太大了,不利於分割,但是我們又不能不用pretrain-model,因為用了imagenet或者COCO的pretrain model,結果一定會漲。。而且收斂會快很多。這里通用的解決方法是用hole算法,其實說白了,就是使用dilated convlution,在卷積的時候,不是對一塊連續的區域卷積,而是跳躍式的,如下圖所示:

  

  這樣做的話有兩個好處:

      1.pretrain model可以用了,在需要downsample的地方,把所有的卷積變為一個dilation 2的卷積。

      2.可以任意的提高感受野了,只要增加dilation即可,當然,有機會可以說一下,理論上的感受野不代表實際的感受野,因為會有很多的重合,所以理論感受野的中間會對最后的結果影響很大,而邊緣地方影響很小,最近有篇paper也提到了這點,有時間放上鏈接吧。。。PS:因此在未來recepitive filed的研究上,我覺得好好解決這個問題是一個不錯的思路。

  

二、decoder層

  和encoder層對應的自然就是decoder層,這個也很好理解,我們要對pixel做分類,自然就要把圖像upsample到原圖的大小(或者一半,然后再做biliner upsample),upsample的方法有幾類,根據我的經驗....都差不了多少,卷積+biliear或者卷積+反卷積或者卷積+unpooling,最后一個在deconvlution那篇paper出現的方法一度讓我以為是通用的方法,直到發現大家開始拋棄pooling的downsample方法以后...不用pooling下采樣很好理解,畢竟我們是做pixel級別的分類,所以還是用可學習的下采樣,上采樣的比較好。

  另外,decoder層需要注意的事,實際上它並不需要和encoder層一樣大,deconvlution那篇paper提出的對稱結構確實優雅而且看起來就有理有據,但實際上並不是需要這么做的,enet的那篇paper對此做過說明,簡單的理解就是:decoder實際上就是對feature map做一個upsample的refine,這個時候網絡已經學習到了需要的東西了,畢竟我們並不是要去做一個autoencoder。。。

三、post-processing 后處理

  后處理這個東西,其實有點小尷尬,作為刷榜的不二神器,他有兩個問題:1.不符合現在很多人對end-to-end的迷之追求。2.太慢了,正常使用的dense crf會比神經網絡慢很多,最后的實用場景基本不可能使用。

  dense crf的調參也是我不能承受之痛...直到用了同事grid search的暴力調參大法,才結束我那段黑暗的日子....

  不扯了,簡單的說一下常見的后處理方法-CRF吧,crf作為經典的一個圖模型,本來是semantic segmentation的主要方法,直到DL出現...最終淪為了后處理...DL+CRF有着天然的方便,為什么這么說了,CRF的優化是要有一個初始化的state的,也就是每個pixel的unary energy,如果只有label的方法等話,一般也就是用概率和置信度來暴力指定了,但其實神經網絡的最后一層一般是softmax,所以我們完全可以用softmax的輸出作為CRF中unary enargy的初始化,至於pair energy,還是常規的RGB像素值和XY location值了。

  實際上,對於CRF大家是又愛又恨的,所以后面也出現了不少的改進方法,如CRF as RNN,CNN+LSTM這些,實際效果我沒試過,但估計是呵呵了,比較期待的是北大的segmodel,看他們在cityscapes上的表現,感覺CVPR2017會有一個驚喜..

 

總結:

  日常總結,segmentation是一個很不錯的領域,但個人感覺大家主要還是在拼trick和調參技巧,這真是最沒意思的行為了。但也很好,給了我們不少想象的空間,我最近的工作就是receptive filed 、side information上做點文章...希望可以出點東西吧。加油~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM