通俗易懂理解SegNet语义分割模型

重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。

一、参考资料

深度学习之图像分割—— SegNet基本思想和网络结构以及论文补充

一文带你读懂 SegNet(语义分割)

二、相关介绍

1. 上采样(Upsampling)

关于上采样的详细介绍,请参考另一篇博客:Upsampling上采样相关技术

3. 转置卷积(Transposed Convolution)

关于转置卷积的详细介绍,请参考另一篇博客:深入浅出理解转置卷积Conv2DTranspose

三、SegNet网络模型

1. SegNet的创新点

SegNet与U-net网络相似,主要的区别是提出了最大池化索引,通过记录池化的位置,在上采样时恢复特征信息。具体来说,SegNet在进行池化操作时,记录池化所取值的位置,在上采样时直接用当时记录的位置进行反池化(UpPool),这样做的作用是更好的保留边界特征信息。

2. 池化索引(pooling indices)

2.1 最大池化(Max-Pooling)

Pooling 在CNN中是使得图片缩小一半的手段,通常有Max-PoolingAverage-Pooling两种 Pooling 方式,下图所示的是Max-PoolingMax-Pooling 是使用一个2x2的filter,取出这4个权重最大的一个,原图大小为4x4,Pooling 之后大小为2x2,原图左上角粉色的四个数,最后只剩最大的6,这就是max的意思。

在这里插入图片描述

2.2 池化索引的原理

SegNet是如何记录池化位置的呢?答案就是通过池化索引(pooling indices)。

在SegNet中的 Pooling 与传统 Pooling 多了一个index功能,也就是每次 Pooling,都会保存通过max选出的权值在2x2 filter中的相对位置,对上图的6来说,6在粉色2x2 filter中的位置为(1, 1)(index从0开始),黄色的3的index为(0, 0)。同时,从网络框架图可以看到绿色的 pooling 与红色的 upsampling 通过 pool indices 相连,实际上是 pooling 后的indices输出到对应的 upsampling(由于网络结构是对称的,因此第1次的 pooling 对应最后1次的 upsamping,如此类推)。

Upsamping 就是 Pooling 的逆过程,index在 Upsampling 过程中发挥作用,Upsamping使得图片尺寸变大2倍。我们清楚的知道 Pooling 之后,每个filter会丢失了3个权重,这些权重是无法复原的,但是在 Upsamping 层中可以得到在 Pooling 中相对 Pooling filter 的位置。所以Upsampling 中先对输入的特征图放大两倍,然后把输入特征图的数据根据 Pooling indices 放入,如下图所示,Unpooling 对应上述的 Upsamplingswitch variables 对应 Pooling indices

在这里插入图片描述

2.3 SegNet与FCN对比

对比FCN可以发现,SegNet在 Unpooling 时用index信息,直接将数据放回对应位置,后面再接Conv训练学习。这个上采样不需要训练学习(只是占用了一些存储空间)。而FCN利用转置卷积(Transposed Convolution)对 feature map 进行 upsampling,这一过程需要学习,同时将encoder阶段对应的 feature map 做通道降维,使得通道维度和 upsampling 相同,这样就能做像素相加(Add),得到最终的decoder输出。

在这里插入图片描述

3. SegNet网络结构

SegNet是基于Encoder-Decoder的网络结构,Encoder的backbone采用VGG-16(去除FC层)。SegNet网络结构,如下图所示:

在这里插入图片描述

在Encoder过程中,通过卷积提取特征,SegNet使用 padding=same 的卷积,即执行卷积操作后保持图像原始尺寸;在Decoder过程中,同样使用使用 padding=same 的卷积对缩小后的特征图进行上采样,不过卷积的作用是为了丰富上采样的图像信息,使得在Encoder的Pooling过程丢失的信息可以通过学习通过Decoder得到。然后对上采样后的图像进行卷积处理,来完善图像中物体的几何形状,将encoder中获得的特征还原到原来图像的具体的像素点上。最后利用 soft-max 多分类器对Decoder输出的特征图进行逐像素分类(pixel-wise classification)。

4. SegNet性能对比

在这里插入图片描述

从上面表格中可以看出:

  • SegNet比FCN和DeepLabv1慢,因为SegNet包含解码器架构。它比DeconvNet更快,因为它没有全连接层。
  • SegNet在训练和测试期间的内存要求都很低。并且模型尺寸比FCN和DeconvNet小得多。

四、相关经验

(TensorFlow)代码实现

github代码:Tensorflow-SegNet

五、参考文献

[1] Badrinarayanan V, Kendall A, Cipolla R. Segnet: A deep convolutional encoder-decoder architecture for image segmentation[J]. IEEE transactions on pattern analysis and machine intelligence, 2017, 39(12): 2481-2495.

[2] Badrinarayanan V, Handa A, Cipolla R. Segnet: A deep convolutional encoder-decoder architecture for robust semantic pixel-wise labelling[J]. arxiv preprint arxiv:1505.07293, 2015.

  • 17
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花花少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值