SegNet 笔记

关键点

  1. encode-decode 结构
  2. upsampling: pooling indices

一、网络结构

SegNet 是一个 encoder-decoder 的网络结构。SegNet 和 FCN 思路十分相似,只是 Encoder,Decoder(Upsampling)使用的技术不一致。此外 SegNet 的编码器部分使用的是 VGG16 的前 13 层卷积网络(去掉 fc 层),每个编码器层都对应一个解码器层,最终解码器的输出被送入 soft-max 分类器以独立的为每个像素产生类概率。

左边是卷积提取特征,通过pooling增大感受野,同时图片变小,该过程称为 Encoder,右边是反卷积与 upsampling,通过反卷积使得图像分类后特征得以重现,upsampling 还原到图像原始尺寸,该过程称为 Decoder,最后对每一个像素进行 multi-class soft-max 分类,输出不同分类的最大值,得到最终分割图。

二、Decoder

Encoder过程中,通过卷积提取特征,SegNet使用的卷积为same卷积,即卷积后保持图像原始尺寸;在Decoder过程中,同样使用same卷积,不过卷积的作用是为upsampling变大的图像丰富信息,使得在Pooling过程丢失的信息可以通过学习在Decoder得到。SegNet中的卷积与传统CNN的卷积并没有区别。

2.1 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,如此类推)。 

2.2 upsampling

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

2.3 对比 FCN

SegNet 在 Unpooling 时用 index 信息,直接将数据放回对应位置,后面再接 Conv 训练学习。这个上采样不需要训练学习 (只是占用了一些存储空间)。反观 FCN 则是用 transposed convolution 策略,即将 feature 反卷积后得到 upsampling,这一过程需要学习,同时将 encoder 阶段对应的 feature 做通道降维,使得通道维度和 upsampling 相同,这样就能做像素相加得到最终的decoder输出。

Table of Contents