对于DeepLab系列的文章它们想解决的问题都是一致的
分辨率被降低(主要由于下采样stride>1的层导致)
目标的多尺度问题
针对于上边的问题,在DeepLab V3出现了一些相较于V2的一些优化,比如去掉了CRF,因为CRF虽然是有提升,但是提升已经是非常小了,但是它的花费相对于其他的不是一个数量级,下边讲对于模型和优化进行详细的说明。
作者整理了目前已经出现的几种多尺度的方法:
在本文中作者提出了两种不同的结构,而且在后边进行的实验的结果中也会有两种不同模型的一个性能对比,第一种模型叫做cascaded model,第二种叫ASPP model,目前在github复现的代码中,主要还是ASPP model,而且作者对于两个网络的评价也是ASPP model的性能要比cascaded model效果更佳的好。
在这篇文章中,大部分实验都是围绕这个模型来做的,如下图所示(文章中的model指的是b),对于下图的Block1,2,3,4都是ResNet网络中原始的模块(Block4 中第一个残差结构里的3 * 3的卷积层和捷径分支上的1 * 1的卷积层的 stride从2变成了1这样图片就不会下采样,后续是额外新增加的一些模块,不过对于Block5,6,7它们的结构都是Block是一样的,不过它们的卷积都换成了膨胀卷积。另外说明一下,图中的rate=2并不代表最后的膨胀系数是2, 真正采用的膨胀系数应该是图中的rate乘上Multi-Grid参数,比如Block4中rate=2,Multi-Grid=(1, 2, 4)那么真正采用的膨胀系数是2 x (1, 2, 4)=(2, 4, 8)。关于Multi-Grid参数后面会提到。
作者将output_stride从8到256都设置,但是将output_stride设置太大,效果就会变差,但是可能是当时的显存不足,原论文中将output_stride设置为16(训练设置为16,测试是8),但是目前Github复现都将output_stride设置为8(训练和测试都是8)。
对于ASPP model和上边那个模型同样的问题,对于output_stirde都是设置为8。
对于ASPP的改进详情参考下边。
作者测试了不同的Multi-Grid,看看如何设置更加的合理(炼丹),上表是以cascaded model(ResNet101作为Backbone为例)为实验对象,研究采用不同的Multi-Grid参数的效果。注意,刚刚在讲cascaded model时有提到,blocks中真正采用的膨胀系数应该是图中的rate乘上这里的Multi-Grid参数。通过实验发现,当采用三个额外的Block时(即额外添加Block5,Block6和Block7)将Multi-Grid设置成(1, 2, 1)效果最好。另外如果不添加任何额外Block(即没有Block5,Block6和Block7)将Multi-Grid设置成(1, 2, 4)效果最好,因为在ASPP model中是没有额外添加Block层的,后面讲ASPP model的消融实验时采用的就是Multi-Grid等于(1, 2, 4)的情况。
对比V2和V3中的ASPP结构。V3中的ASPP结构有5个并行分支,分别是一个1x1的卷积层,三个3x3的膨胀卷积层,以及一个全局平均池化层(后面还跟有一个1x1的卷积层,然后通过双线性插值的方法还原回输入的W和H)。关于最后一个全局池化分支作者说是为了增加一个全局上下文信息global context information。然后通过Concat的方式将这5个分支的输出进行拼接(沿着channels方向),最后在通过一个1x1的卷积层进一步融合信息。
对于上图中发现DeepLab V3比V2提高了接近6个点,在论文中的 Effect of hyper-parameters 部分中提到了一些询问的小细节:
推荐视频讲解: 霹雳