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
- Scoring
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。