Deep Dual-resolution Networks
BackGrounds
自动驾驶道路场景的语义分割是一个安全关键的应用,要求尽可能高质量的语义分割和低的部署计算量。
近年来,针对道路场景的语义分割提出了一些比较有竞争力的方法, 如SwiftNet,FANet,BiSeNetv2等网络结构,他们大多基于两种架构,一种是编码解码结构,一种是基于双通路的体系结构, 除了普通编码器获取语义信息的一条路径外,另一条高分辨率的浅层路径提供了丰富的空间细节作为补充。
但是,这些工作并没有显示出获得更高质量结果的潜力,由于刻意设计的架构和调优的超参数,其中一些方法可能不容易扩展。
Contributions
1.基于HRNet的启发,提出了一种新的深度双分辨率双边网络用于实时语义分割,从一个主干开始分为两个不同分辨率的平行深分支,一个深度分支生成相对高分辨率的特征图,另一个通过多次下采样操作提取丰富的上下文信息。
2. 设计了一个新的模块,通过将特征聚合与金字塔池相结合来获取丰富的上下文信息。当它与低分辨率的特征映射集成时,推理时间几乎没有增加。
3. 通过简单的增加网络的宽度和深度,DDRNet在现有的方法中实现了mIoU和FPS之间的最大权衡,在cityscape测试集上,从77.4%的mIoU在109 FPS到80.4%的mIoU在23 FPS。
DDRNets
Rethinking the HRNet
从HRNet的工作中得到启示,多尺度表示能力在目标检测中尤为重要,从这一点出发,只保留两个分支,一个分支负责维持高分辨率的特征图,而另一个分支通过重复下采样产生足够大的接受域。通过大量的实验证明,这种紧凑的结构可以大大提高推理速度,减少内存消耗。
Dual-resolution Network
整体的网络结构
整体的网络结构主要通过一个主干网络和一条深度学习分支组成。图中的黑色虚线表示卷积,黑色实线表示上、下采样操作和Bilateral fusion操作,对于高到低的融合,在逐点求和之前,高分辨率的特征图通过3×3卷积序列进行下采样,步长为2。对于低分辨率到高分辨率的特征图,首先采用1×1卷积对低分辨率特征图进行压缩,然后采用双线性插值对其进行更新采样。
作者表示,这种紧凑的结构大大提高了推理速度,减少了内存消耗。
主干网络的选择和修改
作者的主干网络主要通过使用ResNet, 其中,DDRNet23使用ResNet18, DDRNet39使用ResNet34.,对网络进行了一些修改如下图所示, 对比上图的整体网络结构可以看出,经过conv3,也就是处理到原图size的1/8之后,会增加一条深度分支,该分支比主分支有着更高的通道数和更小的size,用于增加感受野提取语义信息,并在每一个end of each branch增加了Bilateral fusion结构,用于将高分辨率的特征图和低分辨率高语义的特征图进行融合。
Bilateral fusion结构
该结构主要包括了(☞特征图处理)
- 高分辨率图的下采样
- 低分辨率图的上采样
- 采样后的图像合并
- RELU函数激活操作
Deep Aggregation Pyramid Pooling Module
本文作者提出来的新的模块,DAPPM模块。
DAPPM模块可以看作是深度特征聚合和金字塔池的结合, 其结构如下图所示。
使用不同的池化核和增加stride步数来生成输入图像分辨率为1/128、1/256、1/512的特征映射。输入1/64分辨率的特征图和由全球平均池生成的图像级别信息也被利用。
如上图所示,从左到右六条分支分辨率分别为1/64、 1/128、1/256、1/512、1 (全局池化)、1/64, 可用公式表达如下图。
C表示卷积,U表示上采样, Pi,j表示池化,i表示pooling_size, j表示stride。
在DAPPM中,将较大的池核提取的上下文与更深层次的信息流进行整合,通过对不同深度的池核与不同大小的池核进行整合形成多尺度特性。DAPPM能够提供比PPM(PSPNet)更丰富的上下文, 虽然DAPPM包含了更多的卷积层和更复杂的融合,但它几乎不影响推理速度,它本身的输入分辨率只有输入图像分辨率的1/64。以1024×1024 input为例,DAPPM的最大特征分辨率为16×16。
class DAPPM(nn.Module):
def __init__(self, inplanes, branch_planes, outplanes):
super(DAPPM, self).__init__()
self.scale1 = nn.Sequential(nn.AvgPool2d(kernel_size=5, stride=2, padding=2),
BatchNorm2d(inplanes, momentum=bn_mom),
nn.ReLU(inplace=True