1. 程式人生 > >【Semantic Segmentation】 Instance-sensitive Fully Convolutional Networks論文解析

【Semantic Segmentation】 Instance-sensitive Fully Convolutional Networks論文解析

ict rain 反向傳播 line sem segment 獲取 工作 xtra

這篇文章比較簡單,但還是不想寫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論文解析