语义分割matlab实现fcn_FCN-语义分割

论文: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

因为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

除了将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,

函数由layer类型决定,可能是一个矩阵乘法,或者max pooling,或者激活层的elementwise的非线性函数。

式(1)这样的函数可以组合࿰

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值