一、说明
fcn的开源代码:https://github.com/shelhamer/fcn.berkeleyvision.org
论文地址:fully convolutional networks for semantic segmentation
其中,pascalcontext-fcn语义分割,算上背景,一共分割为60类。
pascalcontext-fcn全卷积神经网络主要使用了三种技术:
1. 卷积化(Convolutional)
2. 上采样(Upsample)
3. 跳跃结构(Skip Layer)
二、网络结构概况
1、FCN-32s
通过前五段的卷积层,直接从第五个最大池化层通过32倍上采样,得到和原图高宽一致的多通道预测label;
2、FCN-16s
pool5通过两倍上采样,得到预测label,与pool4 的预测label求和,再进行16倍上采样,得到和原图高宽一致的多通道预测label;
3、FCN-8s
pool5通过两倍上采样,得到预测label,与pool4 的预测label求和,再将求和结果进行2倍上采样,与pool3的预测label求和,最终进行8倍上采样,得到和原图高宽一致的多通道预测label。
4、训练过程
使用vgg16初始化FCN-32s网络结构;再将训练好的FCN-32s去初始化FCN-16s;再将训练好的FCN-16s去初始化FCN-8s。
三、各阶段网络结构
1、pascalcontext-fcn32s
原vgg16的最后三层全连接层,都改为卷积层,通过上采样得到upscore,再进行crop得到和原图宽高一致的预测label(score层)。
2、pascalcontext-fcn16s
将scrore_fr进行两倍上采样得到预测标签upscore2;将pool4的预测s标签core_pool4进行crop,得到和upscore2一样尺寸的预测标签score_pool4c;然后将upscore2与score_pool4c求和,得到fuse_pool4;再进行16倍上采样,再crop,就得到预测标签score。
3、pascalcontext-fcn8s
将fuse_pool4进行两倍上采样得到upscore_pool4;将pool3的预测标签score_pool3进行crop(宽高与upscore_pool4一致),得到score_pool3c;将upscore_pool4与score_pool3c求和得到fuse_pool3;然后进行8倍上采样,crop,得到预测标签score。
四、其他说明
1、查看网络结构的在线工具:http://ethereon.github.io/netscope/#/editor
2、pool4、pool3的上采样,有进行了crop操作,会造成信息的损失,该网络结构有一个巧妙的处理,在第一层卷积层四周添加pad为100,再进行卷积操作,即先扩展图片,之后再进行crop。裁切
的区域也是补出来的区域,这样就能无损地像素级分割。读者可试着计算pad的最小值。
layer { name: "conv1_1" type: "Convolution" bottom: "data" top: "conv1_1" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 64 pad: 100 kernel_size: 3 stride: 1 } }
end