图像语义分割(2)- SegNet

SegNet【1】是FCN 的一个改进版,由 Cambridge 提出,旨在解决自动驾驶或智能机器人的图像语义分割

      图像语义分割(2)- SegNet
                        图1. SegNet 分割效果

这里是官方的项目主页,上面介绍了 SegNet 的两个版本(标准版 + 实现准度预估的贝叶斯版【2】)


标准版SegNet

FCN 一样,SegNet 也基于 VGG-16。不同的是,SegNet 将后面 3 个全连接层删掉而不是像 FCN 一样,将其转换为卷积层

此外,SegNet 明确将反卷积(上采样)组织为 解码器,将卷积(下采样)组织为 编码器。提出了一个结构上很有对称美感的网络(图2)

          图像语义分割(2)- SegNet
               图2. 网络左边由卷积+池化组成,右边由反卷积+卷积(same卷积,不改变尺寸)

1)卷积单元(图2蓝色)
可以看到,SegNet 的编码和解码都有卷积模块

这个卷积模块包含:same 卷积(卷积前后尺寸不变)、BN批归一化、ReLU**

其中关于 same 卷积可以参考文章《 卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)》,里面总结了 same 卷积、full 卷积和 valid 卷积 3 种形式

Batch Normalisition 通过对输入**函数的数据做归一化处理可以在一定程度上改善梯度弥散的问题。详细分析推荐这篇文章

同样,作为 Sigmoid 的改进版,ReLU 可以通过避免输出进入饱和区域而改善梯度弥散问题

2)池化与上采样
编码与解码模块最大的不同在于,前者通过池化缩小尺寸,后者通过上采样恢复尺寸

SegNet 中使用最大池化,并且同时输出最大点的 index。同一层次的上采样根据 index 确定池化前 max 值的点的位置,并对其他丢失的点做插值

             图像语义分割(2)- SegNet
                   图3. SegNet里池化和反池化的过程

关于反卷积,从这里看到一张比较形象的图片

       图像语义分割(2)- SegNet
                          图4. 反卷积

如图4所示,输入为22,反卷积核为44,一个像素被其“散射”成44的结构,结构和结构之间按照stride排列,重叠的部分做累加
按照《图像语义分割(1)- FCN》里的计算公式,最终的尺寸为 (21)3+4=7

3)Softmax 输出
网络最后一层通过 Softmax 选择概率最大的为该像素的类别


贝叶斯版SegNet

标准版SegNet输出的是每个像素关于类别的先验概率,为了评价其准确性,贝叶斯SegNet利用 DropOut给出结果的置信度(后验概率)

       图像语义分割(2)- SegNet
                   图5. 贝叶斯版SegNet在每个卷积前加了一个dropout

传统的 DropOut 层是作为正则化技术被引入的,通过随机的将某些神经元权重置0,降低学习速率,避免模型过拟合

本质上,DropOut 是一个 二项分布,文章【2】里将概率设为0.5,相当于以这个概率对卷积结果做随机采样,然后统计 均值方差,方差越大说明不确定性越大,结果越不可信

             图像语义分割(2)- SegNet
              图6. 第2行为groundtruth,第3行为分割结果,第4行为方差图

  • 可以看到,边缘部分的不确定性最大
  • 为了得到统计结果,贝叶斯版需要多次前向采样

代码实现

官方给出了基于 CAFFE 的代码
文章《图像语义分割代码实现(2)》使用官方代码做训练和测试


【1】Badrinarayanan V, Kendall A, Cipolla R. Segnet: A deep convolutional encoder-decoder architecture for image segmentation[J]. arXiv preprint arXiv:1511.00561, 2015.

【2】 Kendall A, Badrinarayanan V, Cipolla R. Bayesian segnet: Model uncertainty in deep convolutional encoder-decoder architectures for scene understanding[J]. arXiv preprint arXiv:1511.02680, 2015.