【Semantic Segmentation】 Instance-sensitive Fully Convolutional Networks論文解析
這篇文章比較簡單,但還是不想寫overview,轉自: https://blog.csdn.net/zimenglan_sysu/article/details/52451098
另外,讀這篇paper的時候,一直想不明白白一個問題,就是他分出了\(k^2\)個Instance-sensitive score maps,他是怎麽訓練的。。換句話說,ground truth是怎麽弄的? 文章裏只說了用logistics做損失函數,應該需要看代碼,因為還沒有搞分割的打算,先不詳細了解代碼。
Instance-sensitive Fully Convolutional Networks - eccv 2016
=====
論文地址:http://arxiv.org/abs/1603.08678
=====
一句話概括:
根據local coherence的特性,以sliding window的方式,利用FCN產生positive-sensitive的instance-level的segment proposal。
=====
framework
從上圖可以看出,該network是一個full convolutional network(based on VGG16),除了feature extractor(VGG16的前13個conv layers)外,還有兩個branches:
1 segment branch
該branch由1*1 conv,3*3 conv和一個assembling layer構成,後接segment的loss layer(采用logistic regression layer)
2 scoring branch
該branch由3*3 conv,1*1 conv構成,後接一個scoring的loss layer(采用logistic regression layer)
顯然segment branch產生instance-level的segmentation mask,scoring branch對segment branch產生的instance mask進行打分。
(這裏為objectness score,有點不明白為什麽不是class-specific的)。
剩下的network architecture(VGG16-base)見下圖:
論文采用了hole algorithm來獲取dense的feature map同時保持和原來VGG16的感受野大小。
=====
key module - assembling module
論文中的network(如上所述)是比較容易理解的,除了segment branch的assembling module。
先上圖來個感性認識
從上述三張圖可以看出assembling module是如何工作的了,具體來說:
1 理解k^2 feature maps
由segment branch產生k^2個feature maps(或者理解為predicted masks),
這k^2 feature map編碼了不同的位置信息,如top-left,top-center,……,bottom-right。
也就是每個feature map對應一個位置。
2 assembling -> producing instance-level mask
假如給定一個bounding box M(m*m大小),那麽就可以將bounding box投影到k^2個feature map。
(類似RoIPooling)
將bounding box劃分為k*k個bin,每個bin的大小為(m/k,m/k),
同理,bounding box投影到的feature map上的投影bounding boxes的
每個bounding box N_i (i=1,2, ...., k^2)也劃分為k*k個bins。
這樣M的每個bin K對應到第K個feature map上的N_k的bin K(剛好都是k^2)
那麽對應的instance-level mask的輸出為:同樣為m*m大小,同樣劃分為k*k個bins
將第K個feature map上的N_k的bin K的feature values,拷貝到輸出對應的bin K上。
(反向傳播時,就是將對應的diff反過來拷貝過來就好)
說的有點繞口,但是它就是這麽簡單。
這裏的輸入bounding box並不是由proposal method產生的,而是論文作者以sliding window的方式
和指定bounding box的大小來產生的:
1 假設k^2的feature maps的大小為h和w,(同樣對應的scoring branch的score map的大小也是h和w)
2 feature map上的每個pixel都產生一個bounding box,其大小為m*m,(論文裏m=21)
3 每個pixel根據該bounding box
(已經是投影再feature map上的bounding box了,這個需要註意,而不是再從原圖投影到feature map上),
輸入其的instance-level的mask
4 這裏的每個instance-level mask(一共w*h個)都由一個對應的objectness score,由scoring branch的score map給出
需要註意的是這裏的w和h由個隱性的約束條件:h>=m, w>=m
=====
training & testing
那麽論文是怎麽training和testing的?還是直接看圖(筆者直接截出來的)
=====
local coherence
嗯,直接看圖,不說話
=====
與deepmask的對比
這個嘛,上面的local coherence已經說的很明白了,具體的請各位客官各自看論文和deepmask的論文
=====
實驗效果
嗯,直接看圖,不說話
=====
總的來說,
整篇論文的思路很簡單,但是效果就是好,復現也容易(但是,筆者還是坐等論文作者開源)
但是筆者有幾處不是很明了,不知道哪位客官可以解答下:
1 branches的conv layer設計,為什麽segment branch的為1*1,3*3,而scoring branch為3*3,1*1,為什麽這樣設計?
2 scoring branch的score為什麽不是class-specific的而是objectness?
3 為什麽不用proposal method的方式來產生bounding boxes?
4 訓練segment branch時,是如何為每個predicted instance-level的mask分配對應的ground-truth?
5 為什麽不用在論文作者的另外一篇論文上:Instance-aware Semantic Segmentation via Multi-task Network Cascades
筆者在此多謝喇!
歡迎前來探討!
=====
如果這篇博文對你有幫助,可否賞筆者喝杯奶茶?
【Semantic Segmentation】 Instance-sensitive Fully Convolutional Networks論文解析