1. 程式人生 > >Facebook的物體分割新框架研究2——DeepMask

Facebook的物體分割新框架研究2——DeepMask

一、DeepMask【Learning to Segment Object Candidates.2015 NIPS

一句話,DeepMask是幹啥的:產生region proposal的!

納尼?不知道region proposal是什麼?來複習一下最近的物體檢測系統,如Faster R-CNN(參考博主的相關筆記),都是兩個步驟:先產生一系列的object proposal(Faster R-CNN裡的RPN網路乾的就是這活兒),然後送入一個object classifers進行分類(Fast R-CNN)。

整體來講,給定一個image patch作為輸入,DeepMask會輸出一個與類別無關的mask和一個相關的score估計這個patch完全包含一個物體的概率。它最大的特點是不依賴於邊緣、超畫素或者其他任何形式的low-level分割,是首個直接從原始影象資料學習產生分割候選的工作。還有一個與其他分割工作巨大的不同是,DeepMask輸出的是segmentation masks而不是bounding box。【masks其實就是每個畫素都要標定這個畫素屬不屬於一個物體,bounding box是比較粗略的】

1.網路結構

首先搞清楚網路輸入,訓練階段,網路的一個輸入樣本k是一個三元組,包括:(1)image patch xk;(2)與image patch對應的二值mask,標定每個畫素是不是物體;(3)與image patch對應的標籤yk,yk=1需要滿足兩個條件:一是這個patch包含一個大致在中間位置的物體,二是物體在一定尺度範圍內是全部包含在這個patch裡的。否則yk=-1,包括patch只包含一個物體的一部分的情況。注意只有yk=1的時候,mask才用,yk=-1時不使用mask。

網路結構圖:


顯然,本文用了ImageNet上預訓練好的VGG-A模型來初始化網路,包含8個3*3的卷積層、5個2*2的max-pooling層和3個全連線層。做的改動是去掉VGG-A最後的3個全連線層以及最後的1個pooling層,那麼剩下8個卷積層和4個pooling層。由於卷積層保持空間解析度不變,只有pooling層會造成空間解析度減半,所以4個pooling層就會使得影象的解析度縮小16倍。所以原來是h*w*3的輸入,會變成(h/16)*(w/16)*512的輸出(h=w=224的時候就是上圖中14*14*512的輸出啦)。好讓我們繼續往下走,剛才說網路需要完成兩個任務:輸出一個mask,以及給出這個patch包含一個物體的score,所以後面會接兩個並列的網路(multi-task learning一般都是這樣的結構):segmentation和scoring。

  • Segmentation
         用於分割的分支由一個1*1的卷積層後接一個分類層組成。          分類層希望有h*w個pixel分類器,每個分類器都負責判斷某個畫素是否屬於位於patch中心的那個物體。但是原圖太大啦,所以縮小成h0*w0,那麼就有h0*w0個pixel分類器啦。注意:我們希望輸出平面上的每一個pixel分類器都能夠利用整個512*14*14大小的feature map的資訊,這樣就能夠“看到”整個物體,這一點很重要,因為即使存在著好幾個物體,網路輸出的也只是對一個物體的mask。          分類層怎麼實現的呢?把分類層分解為兩個線性層,第一層把512*14*14的feature map變為512*1*1的輸出【博主猜是14*14*512的卷積層,或者是像Fast R-CNN裡RoI pooling層那樣的對映,每個通道對映為1個值,一共512個輸入通道所以輸出就是512*1*1啦】,第二層把512*1*1的輸出變成大小為h0(56)*w0(56)*1的mask【一個FC層就可以,可以看做是1*1*3136的輸出嘛~】,兩層中間沒有ReLU非線性。h0和w0都小於原image大小,所以還要經過上取樣恢復原圖大小。
  • Scoring
         用於打分的分支由一個2*2的max-pooling層後接兩個全連線層【博主注意到上面的結構圖裡第一個所謂的全連線層是將512*7*7的輸入變成512*1*1的輸出,而且看這意思好像是輸出的每個通道只和輸入的相應通道的14*14個神經元連線,每個通道獨立進行的,跟傳統意義上全連線似乎不太一樣呢~但它和segmentation的第一個線性層畫得一樣,這就印證了博主的想法:這兩個網路的第一個由512*14*14或者512*7*7對映到512*1*1的應該是每個通道獨立進行的FC層,和Fast R-CNN裡RoI pooling層一樣】組成,兩層之間帶有ReLU非線性。最終的輸出是一個objecness score,指示輸入patch的中心是否有物體存在。

2.聯合學習

由於有兩個優化任務,所以loss function肯定是兩項啦:


反向傳播在segmentation分支和scoring分支交替進行就好了~

3.整圖推斷

整張圖時,在影象的各種位置和尺寸上密集地應用這個模型,stride是16畫素,縮放尺度在1/4到2(步長根號2),那麼在每個影象位置都會給出一個分割mask和object score。

注意到,segmentation分支的下采樣因子是16,scoring分支的是32(因為多了一個max pooling),為了獲得從mask預測到object score的一對一對映,在scoring分支最後一個max-pooling層前應用了一個交織的trick來double它的空間解析度。

4.其他細節

訓練時,一個輸入patch被標記是包含一個典型的正樣本,如果有物體在patch的正中間並且最大維度正好等於128畫素。然而,給一個物體在patch中的位置一些容忍度是很關鍵的,因為在full image inference時多數物體都是和它的典型位置有一些偏移的。因此在訓練時,隨機抖動每個典型的正樣本來增加模型的魯棒性。具體來講,在±16畫素範圍內進行平移,尺度變換在2的±1/4次方範圍,還有水平翻轉。在所有情況下都是對image patch和它的ground truth mask一起做同樣的變換了啦,每個都assign一個正的label。負樣本是任何patches至少有±32畫素的平移或者2的±1次方的尺度 from 任何典型正樣本。

結構設計和超引數選擇使用MS COCO驗證資料的子集,和evaluation階段的資料不重疊。

學習率設為0.001,隨機梯度下降的batch size是32個樣本,momentum設為0.9,weight decay設為0.00005。