引言
Abstract
文献阅读
1、题目
Lite-HRNet: A Lightweight High-Resolution Network
2、引言
我们提出了一个高效的高分辨率网络,Lite-HRNet,用于人体姿态估计。首先,我们简单地将Shuf Chronenet中的高效shuffle块应用于HRNet(高分辨率网络),从而获得比流行的轻量级网络(如MobileNet,Shuf Chronenet和Small HRNet)更强的性能。我们发现,大量使用的逐点(1 × 1)卷积在shuffle块成为计算瓶颈。我们引入了一个轻量级的单元,条件信道加权,以取代昂贵的逐点(1 × 1)卷积在shuf?信道加权的复杂度与信道数成线性关系,低于逐点卷积的二次时间复杂度。我们的解决方案从所有通道和多个分辨率中学习权重,这些权重在HRNet的并行分支中很容易获得。它使用权重作为跨通道和分辨率交换信息的桥梁,补偿逐点(1 × 1)卷积所扮演的角色。Lite-HRNet在人体姿态估计方面表现出优于流行的轻量级网络的上级结果。此外,Lite-HRNet可以以同样的轻量级方式轻松应用于语义分割任务。
3、创新点
- 在Lite-HRNet中,通过使用轻量级的条件通道加权操作替代1×1卷积,提高了网络的性能并减少了计算复杂度。
- 通过引入空间权重和多分辨率权重,有效地提高了网络的性能,尤其是在COCO和MPII数据集上取得了显著的AP提升。
- Lite-HRNet通过交叉分辨率权重计算,实现了跨通道和分辨率的信息交换,进一步提升了网络的容量和性能
4、Motivation
人体姿态估计一般比较依赖于高分辨率的特征表示以获得较好的性能,基于对模型性能日益增长的需求,本文研究了在计算资源有限的情况下开发高效高分辨率模型的问题。HRNet有很强的表示能力,很适用于对位置敏感的应用,比如语义分割、人体姿态估计和目标检测。通过简单地将ShuffleNet中的Shuffle Block应用于Small HRNet,即可得到一个轻量级的HRNet,并且可以获得超越ShuffleNet、MobileNet的性能。Naive Lite-HRNet的shuffle block存在的大量的 1×1 卷积操作成为了计算瓶颈,因此,如何能替换掉成本较高的 1×1 Conv并且保持甚至取得超越其性能是本文要解决的核心问题。为此,作者提出名为 Lite-HRNet 的网络,在Lite-HRNet中使用conditional channel weighting模块替代1×1卷积,以进一步提高网络的计算效率。
5、naive Lite-HRNet
Shuffle blocks. ShuffleNet V2 中的 shuffle block 首先将通道分成两个分区。一个分区经过一个(1×1卷积、3×3 depthwise 卷积和1×1卷积)序列,其输出与另一个分区连接。最后,串接的通道被 shuffled,如下图 (a) 所示
HRNet. HRNet 从一个高分辨率卷积 stem 作为 first stage 开始,逐步添加一个高到低分辨率的 stream 作为新的 stage。多分辨率流是并行连接的。主体main body 由一系列 stage 组成。在每个stage,跨分辨率的信息都会反复交换。我们遵循 Small HRNet 的设计,使用更少的层和更小的宽度来形成我们的网络。Small HRNet 的 stem 由两个 stride=2 的 3×3 卷积组成。主体中的每个 stage 包含一系列残差块和一个多分辨率融合。下图显示了Small HRNet 的结构。
Simple combination. 将 shuffle block 替换 Small HRNet 主干中的第二个3×3卷积,并替换所有残差块(由两个3×3卷积形成)。多分辨率融合中的一般卷积被可分离卷积所取代,从而形成一个 naive Lite-HRNet。
6、Lite-HRNet
(1) 1×1convolution is costly.
1×1卷积在每个位置执行矩阵向量乘法:
其中 X 和 Y 是输入和输出 map,W 是1×1卷积kernel。因为shuffle操作和depthwise卷积不做跨通道的信息交换,所以1×1卷积在跨通道交换信息方面起关键作用。
C个通道的1×1卷积具有二次时间复杂度 ( ) ,3×3 depthwise 卷积具有线性时间复杂度 (
) 。在 shuffle block 中,两个1×1卷积的复杂度远高于深度卷积:
>
,通常情况下 C > 5 。表2表示了1×1卷积和depthwise卷积之间的复杂性的比较。
(2) Conditional channel weighting
为了进一步降低计算的复杂度,作者提出使用element-wise multiplication operation即Conditional channel weighting来代替 1×1 卷积,此网络命名为 Lite-HRNet。
对于Lite-HRNet中的第 s 个分支,conditional channel weighting可以表示为:
其中, 是
的矩阵,表示weight map,会从不同分辨率的feature map中计算得到,可以起到一个跨通道、跨分辨率的特征交互的作用权重矩阵,它由Cross-resolution Weight Computation和Spatial Weight Computation这两种方法进行计算。⊙表示元素乘法操作。
Conditional Channel Weighting的时间复杂度为 ,远低于1×1卷积。
使用Conditional Channel Weighting操作替换掉1×1卷积后的Shuffle Block结构如下图 (b) 所示:
(3) Cross-resolution weight computation
在网络的第 s 个Stage中有 s 个平行分支,每个分支的feature map分辨率不同,共有 s 个weight map分别与这些分支对应,将这 s 个weight map记作 。
使用 表示 s 个分支的feature map,
表示分辨率最高的feature map,相应地,
表示第 s 个分辨率的feature map,则有:
其中, 是一个轻量级的函数,它的具体实现过程为:
首先对 进行Adaptive Average Pooling(AAP)操作,输出的feature map尺寸为
,即:
将 AAP 操作得到的{ }和特征
进行Concat操作,得到
;
对 依次进行1×1卷积、ReLU、1×1卷积、sigmoid操作,将输出结果记作
,即:
通过上述操作,可以得到 s 个分支的权重矩阵。某个分支中特定位置的权重是由经过AAP操作得到的 中同样位置的值决定的,即由多个分辨率的特征得到。
之后对 使用最近邻进行上采样操作,使得权重的分辨率与它们所对应分支的feature map分辨率一致,用于随后的element-wise channel weighting。
对于第 s 个分支中位置 i 处的特征值,计算公式为:
与所有分支的feature map在位置
处对应的特征区域有关,因此
包含多种分辨率的特征,通过上式得到的
包含多尺度的特征。
在操作时,先使用AAP操作减小了 {
} 的分辨率,因此在后面的卷积运算中不会引入很大的计算量。
class CrossResolutionWeighting(nn.Module):def __init__(self,channels,ratio=16,conv_cfg=None,norm_cfg=None,act_cfg=(dict(type='ReLU'), dict(type='Sigmoid'))):super().__init__()if isinstance(act_cfg, dict):act_cfg = (act_cfg, act_cfg)assert len(act_cfg) == 2assert mmcv.is_tuple_of(act_cfg, dict)self.channels = channelstotal_channel = sum(channels)self.conv1 = ConvModule(in_channels=total_channel,out_channels=int(total_channel / ratio),kernel_size=1,stride=1,conv_cfg=conv_cfg,norm_cfg=norm_cfg,act_cfg=act_cfg[0])self.conv2 = ConvModule(in_channels=int(total_channel / ratio),out_channels=total_channel,kernel_size=1,stride=1,conv_cfg=conv_cfg,norm_cfg=norm_cfg,act_cfg=act_cfg[1])def forward(self, x):# mini_size即为当前stage中最小分辨率的shape:H_s, W_smini_size = x[-1].size()[-2:] # H_s, W_s# 将所有stage的input均压缩至最小分辨率,由于最小的一个stage的分辨率已经是最小的了# 因此不需要进行压缩out = [F.adaptive_avg_pool2d(s, mini_size) for s in x[:-1]] + [x[-1]]out = torch.cat(out, dim=1)out = self.conv1(out) # ReLu激活out = self.conv2(out) # sigmoid激活out = torch.split(out, self.channels, dim=1)out = [# s为原输入# a为权重,并通过最近邻插值还原回原输入尺度s * F.interpolate(a, size=s.size()[-2:], mode='nearest')for s, a in zip(x, out)]return out
(4) Spatial Weight Computation
本文在引入跨分辨率信息后,还引入了一个单分辨率内部空间域的增强操作:
权重矩阵 的值在所有空间域位置处都相等,其中
的实现过程为:
其中,Global Average Pooling(GAP)的作用是聚集所有位置的特征。
得到权重矩阵后,根据下式得到第 s 个分支位置 处的输出特征:
根据权重矩阵的计算过程可知,输出特征的每个元素都和该分支所有输入特征有关。
class SpatialWeighting(nn.Module):def __init__(self,channels,ratio=16,conv_cfg=None,act_cfg=(dict(type='ReLU'), dict(type='Sigmoid'))):super().__init__()if isinstance(act_cfg, dict):act_cfg = (act_cfg, act_cfg)assert len(act_cfg) == 2assert mmcv.is_tuple_of(act_cfg, dict)self.global_avgpool = nn.AdaptiveAvgPool2d(1)self.conv1 = ConvModule(in_channels=channels,out_channels=int(channels / ratio),kernel_size=1,stride=1,conv_cfg=conv_cfg,act_cfg=act_cfg[0])self.conv2 = ConvModule(in_channels=int(channels / ratio),out_channels=channels,kernel_size=1,stride=1,conv_cfg=conv_cfg,act_cfg=act_cfg[1])def forward(self, x):out = self.global_avgpool(x)out = self.conv1(out)out = self.conv2(out)return x * out
(5) 计算量分析