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
筆者在此多謝喇!
歡迎前來探讨!
=====
如果這篇博文對你有幫助,可否賞筆者喝杯奶茶?