談一談深度學習之semantic Segmentation

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

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

  語義分割作的是什麼事呢? 就是給你一張圖,你要對其中的每一個pixel作分類,例如把全部的人都塗成紅色,車都塗成藍色。這是在機器人領域和自動駕駛中都很是重要的一步,由於咱們開始讓電腦真正的開始認識這個世界了。以下圖所示:ide

 

 

 

 

  semantic segmentation的轉折點是從long的那那篇FCN開始的,以前的方法大可能是用PGM建模的方法來作,原理都很清楚,但效果就是很差,由於難以解決的問題太多了。等DL大火以後,果真仍是DL大法好,FCN這篇文章我以前是寫過筆記的,那時候還比較年輕,如今再好好說一下。post

  這篇文章提出來的全卷積的概念並不新鮮, 也無怪乎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的流程了,我分幾點說一下吧:rest

1、encoder層code

  encoder層個人理解是把原圖downsample的步驟,通常來講這一步使用的網絡是和分類使用的一致的,分類的網絡性能越強,最後大效果也就越好,因此如今廣泛使用的是resnet(152),這裏須要注意的問題就是,傳統的classification下采樣的倍數太大了,不利於分割,可是咱們又不能不用pretrain-model,由於用了imagenet或者COCO的pretrain model,結果必定會漲。。並且收斂會快不少。這裏通用的解決方法是用hole算法,其實說白了,就是使用dilated convlution,在卷積的時候,不是對一塊連續的區域卷積,而是跳躍式的,以下圖所示:orm

  

  這樣作的話有兩個好處:

      1.pretrain model能夠用了,在須要downsample的地方,把全部的卷積變爲一個dilation 2的卷積。

      2.能夠任意的提升感覺野了,只要增長dilation便可,固然,有機會能夠說一下,理論上的感覺野不表明實際的感覺野,由於會有不少的重合,因此理論感覺野的中間會對最後的結果影響很大,而邊緣地方影響很小,最近有篇paper也提到了這點,有時間放上連接吧。。。PS:所以在將來recepitive filed的研究上,我以爲好好解決這個問題是一個不錯的思路。

  

2、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。。。

3、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上作點文章...但願能夠出點東西吧。加油~

相關文章
相關標籤/搜索