论文地址:Pyramid Scene Parsing Network
网络结果如上图所示,主体网络由ResNet101构成,使用了残差网络、空洞卷积和降维卷积的方法(先使用1*1降低维度,然后使用3*3卷积,再用1*1恢复维度)。网络中一共出现三次特征图缩小,一次使用maxpool,两次使用conv,每次减少二分之一大小,最终得到的特征图是原尺寸的1/8,最后使用双线性插值恢复原尺寸。具体网络结构见下文源码分析
文章为了解决深层网络训练梯度传递难的问题,还提到了使用auxiliary loss,也就是训练的时候一共有两个loss,一个在res4b22层之后,一个在最后输出的地方,两个loss有不同的权重提供给反向传播进行训练
http://ethereon.github.io/netscope/#/editor 可以进行prototxt文件的在线可视化,推荐使用
PSPNet源码阅读 pspnet101_cityscapes_713.prototxt
输入数据为3*713*713(三通道图像尺寸为713*713)
conv1_1_3x3_s2:num_output: 64 pad: 1 kernel_size: 3 stride: 2 输出为64*357*357
conv1_2_3x3:num_output: 64 pad: 1 kernel_size: 3 stride: 1 输出为64*357*357
conv1_3_3x3:num_output: 128 pad: 1 kernel_size: 3 stride: 1 输出为128*357*357
pool1_3x3_s2:pool: MAX kernel_size: 3 stride: 2 pad: 1 输出为128*179*179
conv2_1:(conv2_1_1x1_reduce、conv2_1_3x3、conv2_1_1x1_increase) 输出为256*179*179
conv2_2:(同上都是使用1*1减小维度再用3*3卷积再用1*1恢复维度) 输出为256*179*179
conv2_3:(同上都是使用1*1减小维度再用3*3卷积再用1*1恢复维度) 输出为256*179*179
conv3_1:(同上都是使用1*1减小维度再用3*3卷积再用1*1恢复维度)pad: 1 kernel_size: 3 stride: 2 输出为512*90*90
conv3_2、conv3_3、conv3_4:(同上都是使用1*1减小维度再用3*3卷积再用1*1恢复维度) 输出为512*90*90
conv4_1(dila):(同上都是使用1*1减小维度再用3*3卷积再用1*1恢复维度)pad: 2 dilation: 2 kernel_size: 3 stride: 1 输出为1024*90*90
conv4_2....23(dila):(同上都是使用1*1减小维度再用3*3卷积再用1*1恢复维度)pad: 2 dilation: 2 kernel_size: 3 stride: 1 输出为1024*90*90
conv5_1(dila):(同上都是使用1*1减小维度再用3*3卷积再用1*1恢复维度)pad: 4 dilation: 4 kernel_size: 3 stride: 1 输出为2048*90*90
conv5_2(dila)、conv5_3(dila):(同上都是使用1*1减小维度再用3*3卷积再用1*1恢复维度)pad: 4 dilation: 4 kernel_size: 3 stride: 1 输出为2048*90*90
--------------------------------------------------
#特征图缩小90倍为1*1
输入为conv5_3(2048*90*90)
conv5_3_pool1:pool: AVE kernel_size: 90 stride: 90 输出为2048*1*1
conv5_3_pool1_conv:num_output: 512 kernel_size: 1 stride: 1 输出为512*1*1
conv5_3_pool1_interp(使用双线性插值恢复分辨率):height: 90 width: 90 输出为512*90*90
--------------------------------------------------
--------------------------------------------------
#特征图缩小45倍为2*2
输入为conv5_3(2048*90*90)
conv5_3_pool2:pool: AVE kernel_size: 45 stride: 45 输出为2048*2*2
conv5_3_pool2_conv:num_output: 512 kernel_size: 1 stride: 1 输出为512*2*2
conv5_3_pool2_interp(使用双线性插值恢复分辨率):height: 90 width: 90 输出为512*90*90
--------------------------------------------------
--------------------------------------------------
#特征图缩小30倍为3*3
输入为conv5_3(2048*90*90)
conv5_3_pool3:pool: AVE kernel_size: 30 stride: 30 输出为2048*3*3
conv5_3_pool3_conv:num_output: 512 kernel_size: 1 stride: 1 输出为512*3*3
conv5_3_pool3_interp(使用双线性插值恢复分辨率):height: 90 width: 90 输出为512*90*90
--------------------------------------------------
--------------------------------------------------
#特征图缩小15倍为6*6
输入为conv5_3(2048*90*90)
conv5_3_pool6:pool: AVE kernel_size: 15 stride: 15 输出为2048*6*6
conv5_3_pool6_conv:num_output: 512 kernel_size: 1 stride: 1 输出为512*6*6
conv5_3_pool6_interp(使用双线性插值恢复分辨率):height: 90 width: 90 输出为512*90*90
--------------------------------------------------
conv5_3_concat:conv5_3、conv5_3_pool6_interp、conv5_3_pool3_interp、conv5_3_pool2_interp、conv5_3_pool1_interp
将这五个特征图拼接在一起 输出为4096*90*90
conv5_4:num_output: 512 kernel_size: 3 stride: 1 pad: 1 输出为512*90*90
conv6:num_output: 19 kernel_size: 1 stride: 1 输出为19*90*90
conv6_interp(使用双线性差值恢复特征图分辨率):zoom_factor: 8 输出为19*720*720
-------------------------------------------------------------------------------------------------------
也就是说将conv5_3(2048*90*90)的特征图分别使用ave pooling压缩为1*1、2*2、3*3、6*6的特征图,随后对这些特征图再使用双线性插值恢复到90*90,然后再将这五个特征图(conv5_3、1*1、2*2、3*3、6*6的特征图)concat到一起,随后再进行类别输出,最后再恢复到原图像的分辨率