本文也用了vgg16的结构改造的,和U-Net对比,U-Net没有用到conv5和pool5,但是SegNet用到了所有预训练的卷积层权重。
当时现有的semantic segmentation的问题在于:最大池化和下采样会降低feature map的分辨率。
因而SegNet的新颖之处在于decoder的上采样方式:decoder时上采样使用了encoder阶段下采样的最大池化的索引(indices),考虑到上采样是稀疏的,再配合滤波器产生最后的分割图。SegNet的这种方法将低分辨率的feature map映射到高分辨率的方法,从而产生精确边界的分割结果。
网络设计:
1.在encoder和decoder的卷积层后都用了BN层;
2.所有的卷积层都没有偏置;
3.decoder网络没有ReLU。
4.encoder部分使用vgg16的前13层
5.decoder对应encoder的每一层,decoder的上采样使用的是encoder时候下采样的索引
- 优点1:改善边界描述
- 减少end2end的训练参数
- 这种形式可以用于多种encoder-decoder架构
网络结构:
编码网络:由13个卷基层组成,该部分提取输入特征,用于目标分类。丢弃FC层,为了保持更高的分辨率,同时减小参数。
解码网络:每个encoder会对应一个decoder,所以decoder有13层,将低分辨率的feature map映射回和输入一样大小的分类器(mask)
像素分类器:decoder的输出会送到分类层,最终为每个像素独立的产生类别概率。
和原始的vgg的区别是,本文encoder使用的卷积层是Conv+BN+ReLU,而原vgg16使用的为Conv+ReLU。decoder网络没有ReLU,decoder的block由Upsampling+Conv+BN组成。
分类层是decoder加一个卷积层,卷积和的个数为分类的通道数,每个通道代表每一类分割结果。
感受野的计算公式:,RF是感受野,是kernel的size,
Training:
使用固定学习率0.1和动量0.9的随机梯度下降(SGD),使用Caffe实现SegNet-Basic。在每个epoch之前都shuffle一次,然后按顺序构成minibatch(batchsize=12),从而确保每个图像在一个epoch中只被使用一次。使用交叉熵损失。
可以大概看到SegNet的结构:
layer {
name: "upsample4"
type: "Upsample"
bottom: "conv5_1_D"
top: "pool4_D"
bottom: "pool4_mask"
upsample_param {
scale: 2
}
}
在upsample层可以看到,其输入是有两个,输出有一个。其中第二个输入,即bottom[1]是用来存储mask信息的,根据存储的mask的idx信息,恢复成top的输出。