论文:Fully Convolutional Networks for Semantic Segmentation
源码:https://github.com/shelhamer/fcn.berkeleyvision.org
借鉴图像分类的一些经典CNN,并将这些网络改造,因为图像分类任务中,网络最后往往通过 fc 得到固定长度的输出,然后softmax计算属于各分类的概率,然而在语义分割任务中,需要对每个pixel进行分类预测,所以:1)将 fc 改成 conv 层,这样网络输入可以是任意size的;2)因为CNN网络中间存在下采样,所以输出往往是coarse的,要进行dense prediction,还需要进行upsample。经过这两点改造,得到 全卷积网络 FCN,可以进行end-to-end 的训练,如下图所示
![f7e0a742f392f5e3ab3d519177319130.png](https://i-blog.csdnimg.cn/blog_migrate/8898dd9bb57c78a829d8a1ad1c7b7183.jpeg)
因为FCN 是通过改造分类CNN而来,所以可以先将网络通过分类数据集进行预训练,然后进行改造并 fine-tuning 到语义分割。文中介绍了三种基础CNN分类网络:AlexNet,GoogLeNet 以及 VGG。
fc 层改为 conv 层方法为:假设 fc 层输出单元数为 n,那么相应的 conv 层的 output channel 也为 n,kernel size 论文里面没明说,但是源码中,对于pascal voc 数据集,第一个 由 fc 改过来的 conv 其 kernel size 为7, 其余 由 fc 改过来的 conv kernel size均为 1 ,看 prototxt 文件可知,网络的第一个conv 层 pad=100,个人猜测,这是为了确保 kernel size=7的卷积有效,有 5 个pooling层,下采样率为32,这要求 第一个 conv层的input 有效size 不小于 224,所以填充 pad=100,并且由于有了这个填充,所以网络最后增加了 Crop
层,以避免alignment 出现问题,关于Crop
,我们后面再讨论,先看网络改造,如下图,注意为了对比直观,Figure 2 bottom 子图 未显示出 upsample层。
![adc84b61dfe80844685b3bb6abdcadd3.png](https://i-blog.csdnimg.cn/blog_migrate/1bbf20574a1e2b578d0b4feadd38fe14.jpeg)
除了将fc改为conv,还需要upsample到origin image 大小,以实现 pixel级别的分类预测,论文作者介绍了三种方法: Shift-and-stitch, decrease subsampling 以及 deconvolution,并表明,Shift-and-stitch计算量太大,虽然这一不足可以通过decrease subsampling 弥补,但是作者通过实验发现,使用deconvolution 非常有效。关于前两个方法可以参考tsuka okami:Shift and stitch理解 这篇文章,这里只说明deconvolution这个方法。
全卷积网络
每个layer(conv,pooling,激活层)的输出都是三维数组hxwxd
,其中h, w
是空间维度,d
是特征维或者通道数。我们知道卷积网络具有平移不变性,因为每个输出unit 都是在一个 local 区域计算得到的,称为感受野 RF。记输出某个位置(i,j)
处的对应的输入数据块为
(i,j)
处的输出值为
其中 k
为 kernel size,s
为stride,
式(1)这样的函数可以组合