FCN和U-Net

本文爲轉載,原博客地址:https://blog.csdn.net/justpsss/article/details/77170004#

FCN

論文《Fully Convolutional Networks for Semantic Segmentation》

這篇論文作爲用CNN來做語義分割的開山之作,意義還是非常之大的,目前其他的語義分割模型基本上都是在FCN的基礎上做的一些改進。

語義分割指的是對圖片上的每一個像素所屬的類別進行分類,可以應用在圖像識別、分割、檢測等領域,目前來看最好的應用場景是在自動駕駛上,用於識別道路、行人、車輛等等。

全卷積

FCN(Fully Convolutional Networks)全卷積,意思就是該網絡中沒有全鏈接層,全部用卷積層來代替了 ,全卷積化也是其他領域深度模型的一個趨勢,除了分類網絡最後必須保留一個全鏈接層用於分類外,其他領域都有去掉全鏈接層的趨勢,如檢測領域的R-FCN等。

從Figure 2中,我們可以看到,上面是一個CNN的分類網絡,最後三個全鏈接層做推斷,最後產生一個1000類的分類概率,其中cat的概率最高,因此識別出圖片中是貓;下面是FCN的分割網絡,區別就在於把上面的CNN最後三個全鏈接層改成了卷積層,最後經過若干個上採樣層,將特徵圖擴大到跟原圖同樣大小的若干張概率圖,每張概率圖表示這個像素屬於該類別的概率值,也就是上圖的heatmap。

FCN中上採樣使用的方法是逆卷積。

逆卷積

所謂的逆卷積(deconvolution)實際上是一個轉置卷積的操作,因此在一些深度框架中都把逆卷積定義爲convolution transpose,具體的操作很多大佬在博客,知乎,github上都有介紹了,這裏貼一下Matconvnet-manual文檔中的介紹,紀念一下我用過這個框架(破涕爲笑;

ps:論文中逆卷積核的初始化方法使用的是雙線性插值。

Skip net

跳躍融合是爲了獲得更加精細的分割結果,我們先看下圖:

這裏用的是VGG爲例,pool1到pool5是五個最大池化層,因此圖中的pool5層的大小是原圖image的1/32(1/251/25),最粗糙的做法就是直接把pool5層進行步長爲32的上採樣(逆卷積),一步得到跟原圖一樣大小的概率圖(fcn-32s)。但是這樣做會丟失掉很多淺層的特徵,尤其是淺層特徵往往包含跟多的位置信息,所以我們需要把淺層的特徵加上來,作者這裏做法很簡單,就是直接“加”上來,求和操作,也就完成了跳躍融合。也就是先將pool5層進行步長爲2的上採樣,然後加上pool4層的特徵(這裏pool4層後面跟了一個改變維度的卷積層,卷積核初始化爲0),之後再進行一次步長爲16的上採樣得到原圖大小的概率圖即可(fcn-16s)。另外fcn-8s也是同樣的做法,至於後面爲什麼沒有fcn-4s、fcn-2s,我認爲是因爲太淺層的特徵實際上不具有泛化性,加上了也沒什麼用,反而會使效果變差,所以作者也沒繼續下去了。

FCN分割的結果是比較粗糙的,後面有改進的結構在FCN的結果上再進行精細分割,如加上CRF(條件隨機場)等等,另外爲了使深層的特徵圖尺度不至於太小,FCN在原圖上加了100個像素的pad,這非常的不優雅啊!後面的結構有提出一個孔算法來改進這個問題,以後寫另一個分割模型deeplab的時候再詳細說。

FCN基本介紹的差不多了,下面介紹一個在醫學圖像分割領域很出名的一個全卷積網絡——U-Net。

U-Net

論文《U-Net: Convolutional Networks for Biomedical Image Segmentation》

官網:https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/

有了上面FCN的基礎,我們先直接貼U-Net的網絡結構:

整個網絡結構看起來像一個”u”型,因此叫做U-Net。整個網絡的思路跟FCN是差不多的,一個區別是它沒有用VGG等CNN模型作爲預訓練模型,因爲u-net做的是醫學圖像的二值分割,沒必要用ImageNet的預訓練模型,而且u-net這個結構我們是可以根據自己的數據集自由加深網絡結構的,比如在處理具有更大的感受野的目標的時候;另一個區別是u-net在進行淺層特徵融合的時候,採用的是疊加的做法,而不是FCN中的求和操作,也就是上圖中的白色模塊,是直接從左邊的藍色模塊疊加過來的(如果是在Caffe中實現的,u-net是Concat層,而fcn是Eltwise層)。

另外,u-net中有一個坑,那就是所有的卷積過程都是沒有加pad的,這樣就會導致每做一次卷積,特徵的長寬就會減少兩個像素,最後網絡的輸出和輸入大小不一樣。比如上圖中,輸入的圖片大小是572x572,輸出的概率圖大小是388x388。

作者這麼做的原因是爲了數據增強,畢竟作者只用了30張原圖做訓練集。論文中介紹了一個叫overlap-tile的數據增強的方法,就是上圖這個,左圖中間的白色框區域是原始圖片,旁邊的一圈是加了鏡像的,然後取左圖中藍色框中區域作爲一張訓練圖,它對應的label就是黃色框的區域,是不是特別繞?如果想詳細瞭解的話,還是去看看官方給的代碼吧。雖然官方代碼中只給了一個測試網絡的demo代碼,但是可以推出作者做這個overlap-tile的步驟的(實際上是我給作者發郵件想要數據增強的代碼和訓練網絡的solver文件,作者沒吊我(破涕爲笑;所以不得不自己去啃demo代碼)。

另外論文中提到了加權loss函數,也就是有一個weight map,然而我在作者官網給的prototxt文件中沒有發現使用加權loss函數的跡象,不知道有沒有研究比較深的大佬給我解個惑,感激不盡!

ps:U-Net在GAN網絡中貌似也有比較廣泛的應用,以後慢慢了解吧。


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