SegNet【1】是FCN 的一个改进版,由 Cambridge 提出,旨在解决自动驾驶或智能机器人的图像语义分割
图1. SegNet 分割效果
这里是官方的项目主页,上面介绍了 SegNet 的两个版本(标准版 + 实现准度预估的贝叶斯版【2】)
标准版SegNet
与 FCN 一样,SegNet 也基于 VGG-16。不同的是,SegNet 将后面 3 个全连接层删掉而不是像 FCN 一样,将其转换为卷积层
此外,SegNet 明确将反卷积(上采样)组织为 解码器,将卷积(下采样)组织为 编码器。提出了一个结构上很有对称美感的网络(图2)
图2. 网络左边由卷积+池化组成,右边由反卷积+卷积(same卷积,不改变尺寸)
1)卷积单元(图2蓝色) 可以看到,SegNet 的编码和解码都有卷积模块
这个卷积模块包含:same 卷积(卷积前后尺寸不变)、BN批归一化、ReLU激活
其中关于 same 卷积可以参考文章《 卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)》,里面总结了 same 卷积、full 卷积和 valid 卷积 3 种形式
Batch Normalisition 通过对输入激活函数的数据做归一化处理可以在一定程度上改善梯度弥散的问题。详细分析推荐这篇文章
同样,作为 Sigmoid 的改进版,ReLU 可以通过避免输出进入饱和区域而改善梯度弥散问题
2)池化与上采样 编码与解码模块最大的不同在于,前者通过池化缩小尺寸,后者通过上采样恢复尺寸
SegNet 中使用最大池化,并且同时输出最大点的 index。同一层次的上采样根据 index 确定池化前 max 值的点的位置,并对其他丢失的点做插值
图3. SegNet里池化和反池化的过程
关于反卷积,从这里看到一张比较形象的图片
图4. 反卷积
如图4所示,输入为2∗2,反卷积核为4∗4,一个像素被其“散射”成4∗4的结构,结构和结构之间按照stride排列,重叠的部分做累加 按照《图像语义分割(1)- FCN》里的计算公式,最终的尺寸为 (2−1)∗3+4=7
3)Softmax 输出 网络最后一层通过 Softmax 选择概率最大的为该像素的类别
贝叶斯版SegNet
标准版SegNet输出的是每个像素关于类别的先验概率,为了评价其准确性,贝叶斯SegNet利用 DropOut给出结果的置信度(后验概率)
图5. 贝叶斯版SegNet在每个卷积前加了一个dropout
传统的 DropOut 层是作为正则化技术被引入的,通过随机的将某些神经元权重置0,降低学习速率,避免模型过拟合
本质上,DropOut 是一个 二项分布,文章【2】里将概率设为0.5,相当于以这个概率对卷积结果做随机采样,然后统计 均值 和 方差,方差越大说明不确定性越大,结果越不可信
图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.