Convolution综述——res2net

Convolution综述——res2net

简介: 由南开大学,牛津大学,加州大学美熹德分校提出的一种提高网络对多尺度信息表达的方案

摘要: 对于许多视觉任务来说,在多个尺度上表示特征是非常重要的。近年来,背骨神经网络(CNNs)的发展不断显示出更强的多尺度表示能力,从而在广泛的应用中获得一致的性能提升。然而,大多数现有的方法都是在一个层中表示多尺度特征明智的方式。在本文中,我们提出了一种新的CNNs构建块,即Res2Net,通过在一个残差块内构造层次残差类连接。Res2Net代表了粒度级别的多尺度特性,并增加了每个网络层的接受域范围。建议的Res2Net块可以插入到最先进的CNN骨干模型,例如。、ResNet、ResNeXt和DLA。我们在所有这些模型上评估了Res2Net块,并展示了一致的性能改进在广泛使用的数据集(如CIFAR-100和ImageNet)上建立超过基线的模型。针对典型的计算机视觉任务,如目标检测、类激活映射和突出目标检测,进一步的消融研究和实验结果进一步验证了Res2Net相对于最先进的基线方法的优越性。源代码和经过训练的模型将公开可用。

论文不像SSD或特征金字塔网络(FPN)采用层间多尺度特征表达的方式,而是在resnet的基础上,对resnet的block串行的滤波器堆叠结构改进,增加了多尺度融合,提高了网络的复杂度和性能

模型结构

多尺度表示对于各种视觉任务都是必不可少的,比如感知目标对象的边界、区域和语义类别。即使是最简单的识别对于理解部件、对象(例如,本例中的沙发、桌子和杯子)及其周围的上下文(例如,“在桌子上”上下文有助于识别黑色斑点)来说,从非常不同的尺度感知信息是至关重要的。
在这里插入图片描述

res2net的模型结构block如下图所示:
在这里插入图片描述

网络将原来串行的方式,通过在通道上进行拆分,不同尺度特征的提取,在融合特征,提高网络的复杂度和表达能力。上图表示在一个block中有4个尺度。

同时,参考Squeeze-and-excitation networks,作者在原有的基础上加了一个SE block,能够自适应的矫正通道之间的权重,也即是不同尺度特征信息之间的权重。于是新的模型为:
在这里插入图片描述

整个block的代码为:

self.conv1 = conv1x1(inplanes, bottleneck_planes, stride)
self.bn1 = norm_layer(bottleneck_planes)
self.conv2 = nn.ModuleList([conv3x3(bottleneck_planes // scales, bottleneck_planes // scales, groups=groups) for _ in range(scales-1)])
self.bn2 = nn.ModuleList([norm_layer(bottleneck_planes // scales) for _ in range(scales-1)])
self.conv3 = conv1x1(bottleneck_planes, planes * self.expansion)
self.bn3 = norm_layer(planes * self.expansion)
self.relu = nn.ReLU(inplace=True)
self.se = SEModule(planes * self.expansion) if se else None
self.downsample = downsample
self.stride = stride
self.scales = scales

def forward(self, x):
identity = x

out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)

xs = torch.chunk(out, self.scales, 1)
ys = []
for s in range(self.scales):            # 不同尺度信息的计算和融合
    if s == 0:
        ys.append(xs[s])
    elif s == 1:
        ys.append(self.relu(self.bn2[s-1](self.conv2[s-1](xs[s]))))
    else:
        ys.append(self.relu(self.bn2[s-1](self.conv2[s-1](xs[s] + ys[-1]))))
out = torch.cat(ys, 1)

out = self.conv3(out)
out = self.bn3(out)

if self.se is not None:
    out = self.se(out)

if self.downsample is not None:
    identity = self.downsample(identity)

out += identity
out = self.relu(out)

整个流程为:

  1. 通道拆分
  2. 不同通道不同尺度的特征计算和融合
  3. SE block进行在channel上自适应权重调整
  4. 残差连接

实验结果

  1. 在Imagenet上的实验
    在这里插入图片描述

可以看到平均有1%左右的提升

  1. 同时在目标检测数据集上的结果
    在这里插入图片描述
    基本上是2%左右的提升

  2. 语义分割
    在这里插入图片描述
    在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值