天天看點

Instance-sensitive Fully Convolutional Networks - eccv 2016

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

Instance-sensitive Fully Convolutional Networks - eccv 2016

從上圖可以看出,該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)見下圖:

Instance-sensitive Fully Convolutional Networks - eccv 2016

論文采用了hole algorithm來擷取dense的feature map同時保持和原來VGG16的感受野大小。

=====

key module - assembling module

論文中的network(如上所述)是比較容易了解的,除了segment branch的assembling module。

先上圖來個感性認識

Instance-sensitive Fully Convolutional Networks - eccv 2016
Instance-sensitive Fully Convolutional Networks - eccv 2016
Instance-sensitive Fully Convolutional Networks - eccv 2016

從上述三張圖可以看出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的?還是直接看圖(筆者直接截出來的)

Instance-sensitive Fully Convolutional Networks - eccv 2016
Instance-sensitive Fully Convolutional Networks - eccv 2016

=====

local coherence

嗯,直接看圖,不說話

Instance-sensitive Fully Convolutional Networks - eccv 2016
Instance-sensitive Fully Convolutional Networks - eccv 2016

=====

與deepmask的對比

這個嘛,上面的local coherence已經說的很明白了,具體的請各位客官各自看論文和deepmask的論文

=====

實驗效果

嗯,直接看圖,不說話

Instance-sensitive Fully Convolutional Networks - eccv 2016
Instance-sensitive Fully Convolutional Networks - eccv 2016
Instance-sensitive Fully Convolutional Networks - eccv 2016

=====

總的來說,

整篇論文的思路很簡單,但是效果就是好,複現也容易(但是,筆者還是坐等論文作者開源)

但是筆者有幾處不是很明了,不知道哪位客官可以解答下:

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

筆者在此多謝喇!

歡迎前來探讨!

Instance-sensitive Fully Convolutional Networks - eccv 2016
Instance-sensitive Fully Convolutional Networks - eccv 2016

=====

如果這篇博文對你有幫助,可否賞筆者喝杯奶茶?

Instance-sensitive Fully Convolutional Networks - eccv 2016

繼續閱讀