关于FCN 论文中的 Shift-and-stitch 的详尽解
作 者: 月牙眼的楼下小黑
联 系:zlf111@mail.ustc.edu.cn
声 明: 欢迎转载本文中的图片或文字,请说明出处
我这三天一直思考的问题的是:
当网络最后一层输出的
prediciton map size
和label map size
不匹配时,除了bilinea interpolation
等暴力措施,且不采取uppooling
,deconvolution
等decoder
结构, 为了实现 dense prediction , 该怎么做呢?
我前天向一位其他组的师兄请教这个问题时,他给我指出了一个方向:shift and stitch。 他这一提醒,我就想起来了,当初在看论文 《Fully Convolutional Networks for Semantic Segmentation》时,因为看不懂,就跳过了好几段,其中就包括 "3.2 Shift-sttch is filter rarefaction"这一节。
作者在这一节中指出: 为了实现dense prediction
,他们比较了三种不同方案,分别是 shift and stitch, decreasing subsampling,deconvolution
我当初为什么看不懂呢? 我们看看作者对 shift and stitch
是怎样描述的:
当然,因为我现在已经弄明白了,所以觉得作者描述得其实挺清晰了。但是在这之前,我看了好几遍还是一脸懵逼。网上关于这一段的翻译更是千篇一律,不知所云,所以很多博客就是搬运工的工作,互相抄来抄去。
网上的关于shift-and-stitch的解释:设原图与FCN所得输出图之间的降采样因子是f,那么对于原图的每个fxf 的区域(不重叠),“shift the input x pixels to the right and y pixels down for every (x,y) ,0 < x,y < f." 把这个f x f区域对应的output作为此时区域中心点像素对应的output,这样就对每个 fxf 的区域得到了 f2 个output,也就是每个像素都能对应一个output,所以成为了dense prediction
啥??啥???这都是些啥???? 黑人问号脸 ?????
后来,我看了作者 引用 的关于 shift and stitch
的两篇文章:
我明白了 shift and stitch
的做法其实就是:
设降采样因子是f , 通过 shift pixels (平移像素)的方式,产生 f2 个
version
的input
,输入网络后相应地产生 f2 个output
, 然后stitch
(这个词不好翻译,先翻译成织联)所有output
就实现了dense prediciton
。
我在另一篇论文中找到了对shift and stitch
更详尽的描述 :
接下来受论文[2] 的启发,我们举一个简单的例子来直观地说明 shift and stitch 的做法:
设网络只有一层 2x2 的maxpooling
层且 stride = 2
,所以下采样因子 f =2
, 我们需要对input image
的 pixels
平移 (x,y)
个单位,即将 image
向左平移 x
个pixels
, 再向上平移y
个单位,整幅图像表现向左上方向平移,空出来的右下角就以0
padding
。我们当然可以采取 FCN
论文中的做法,将图像向右下角平移,空出来的左上角用 0 padding
,这两种做法产生的结果是一致的,没有本质区别。(x,y)
取(0
,0
), (0
,1
),(1
,0
),(1
,1
) 后,就产生了 f^2^
= 4
个input
,不妨记为: shifted input (0,0)
、shifted input (0,1)
,shifted input (1,0)
,shifted input (1,1)
(回答一个读者的问题:图中的数字表示像素值,不是索引值 )
4
个input
分别进行 2x2 的maxpooling
操作后,共产生了4
个output
。
最后,stitch the 4 different output
获得 dense prediction
:
那么问题来了,是怎样进行 stitch
的呢?FCN 作者的说法是:
Process each of these f2 inputs, and interlace the outputs so that the predictions correspond to the pixels at the centers of their receptive fields
说的很明白了,output
中的每个pixel
都对应 original image
的
不同 receptive field
,将receptive field
的中心c
填上这个来自output
的pixel
值,就是网络对original image
中像素 c
的prediction
。
为表述简洁,我用 “ 像素 i ” 表示“ 值为 i 的像素 ”。
-
红色
output
中的像素1
对应shifted input(0,0)
的红色部分, 而对应original image
的部分,也即receptive field
仅仅为像素[1],
所以receptive field
的中心为像素[1]
, 该位置填上红色output
中像素1
的值。 -
黄色
output
中的像素4
对应shifted input
(1,0)
的黄色部分, 而对应original image
的部分,也即receptive field
为像素[3,4]
, 所以receptive field
的中心为像素[4]
, 该位置填上黄色output
中像素4
的值。 -
以此类推..
-
注意: 我们注意到黄色
output
中的像素5
与红色output
中的像素5
对应的receptive field
中心是重叠的,所以将黄色output
中的像素5
标为灰色,表示不予考虑。同理其他ouput
中的灰色区域也代表receptive field
中心重叠的像素。
附:
答一个读者的疑问:
可以麻烦以计算一下一个5x5的矩阵:【(7,12,9,1,2),(25,3,75,45,11),(27,2,5,54,7),(68,86,7,41,20),(98,54,65,5,19)】的计算结果吗?我计算出来的是【(7,12,9,空值,2),(25,空值,75,45,11),(27,空值,空值,54,空值),(68,86,空值,41,20),(98,空值,65,空值,19)】
我重新做了张图:
好,到此就完成了对FCN
论文中的 Shift-and-stitch
的详尽解释,好辛苦。还是那句酷酷的话:
转载请说明出处。
参考资料:
[1] Fully Convolutional Networks for Semantic Segmentation
[2] Recurrent Convolutional Neural Networks for Scene Parsing
[4] Convolutional Neural Networks with Intra-layer Recurrent Connections for Scene Labeling