赞
踩
目录
本周阅读了一篇关于人体姿态估计的文献,人体姿势估计需要高分辨率表示以实现高性能,过去的高效网络设计主要从两个角度出发,一个是从分类网络中借鉴设计,另一个是通过各种技巧中介空间信息损失,鉴于对模型效率的不断增加需求,研究了在计算资源有限的情况下开发高效的高分辨率模型的问题。
This week, I read a literature on human pose estimation. Human pose estimation requires high-resolution representation to achieve high performance. In the past, efficient network design was mainly based on two perspectives: one was to borrow design from classification networks, and the other was to mediate spatial information loss through various techniques. Given the increasing demand for model efficiency, I studied the problem of developing efficient high-resolution models in the context of limited computing resources.
Lite-HRNet: A Lightweight High-Resolution Network
我们提出了一个高效的高分辨率网络,Lite-HRNet,用于人体姿态估计。首先,我们简单地将Shuf Chronenet中的高效shuffle块应用于HRNet(高分辨率网络),从而获得比流行的轻量级网络(如MobileNet,Shuf Chronenet和Small HRNet)更强的性能。我们发现,大量使用的逐点(1 × 1)卷积在shuffle块成为计算瓶颈。我们引入了一个轻量级的单元,条件信道加权,以取代昂贵的逐点(1 × 1)卷积在shuf?信道加权的复杂度与信道数成线性关系,低于逐点卷积的二次时间复杂度。我们的解决方案从所有通道和多个分辨率中学习权重,这些权重在HRNet的并行分支中很容易获得。它使用权重作为跨通道和分辨率交换信息的桥梁,补偿逐点(1 × 1)卷积所扮演的角色。Lite-HRNet在人体姿态估计方面表现出优于流行的轻量级网络的上级结果。此外,Lite-HRNet可以以同样的轻量级方式轻松应用于语义分割任务。
人体姿态估计一般比较依赖于高分辨率的特征表示以获得较好的性能,基于对模型性能日益增长的需求,本文研究了在计算资源有限的情况下开发高效高分辨率模型的问题。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卷积,以进一步提高网络的计算效率。
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。
(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) == 2
- assert mmcv.is_tuple_of(act_cfg, dict)
- self.channels = channels
- total_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_s
- mini_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) == 2
- assert 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) 计算量分析
假设网络中的某个Stage包含2个分支,输入特征为X1和X2,X1的尺寸为64×64×40,X2的尺寸为32×32×80。则:1×1卷积、3×3的Depthwise卷积、不同类型的Conditional Channel Weighting(CCW)操作的计算量如下表所示:
由上图可知,CCW的计算量远小于1×1卷积。再由(3)和(4)中权重矩阵的计算过程可知,CCW也可以完成多个通道的信息融合,说明了CCW代替1×1卷积以减少网络的计算需求的有效性。
(6) 实例 Lite-HRNet
在stem中,有1个步长为2的3×3卷积和1个Shufflt Block。接下来的3个Stage中,每个Stage均包含2个CCW模块和1个融合模块。上表中“resolution branch”一栏中表示该Stage包含的feature map的分辨率信息。在上表的最后两列中,Lite-HRNet-N中的N表示网络的层数。
在COCO与MPII数据集上对所提方法的性能进行了评估,参照主流top-down框架,直接估计K个热图。
上图给出了COCO验证集上的性能对比,从中可以看到:
上表给出了COCO-test-dev数据集上的性能对比,可以看到:
上表给出了MPII验证集上的性能对比,可以看到:
最后,所提方法迁移到语义分割任务上的效果,见上表。可以看到:
通过本周阅读文献和代码的结合,初步对该文献有了一定的了解,接下来会对其深入理解,并且对代码的复现。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。