(五十四)论文阅读 | 人体姿态估计之 Lite-HRNet


简介

在这里插入图片描述

文中摘要第一段提到 Lite-HRNet 用于人体姿态估计,而其 baseline HRNet 稍加改动即可用于目标检测、语义分割等,所以 Lite-HRNet 也可以轻易扩展至类似的视觉任务。

论文地址 代码地址


0. Abstract

作者发现,shuffle 模块中频繁使用的 1×1 卷积成为了计算瓶颈。文中提出 conditional channel weighting 的轻量级单元来代替 shuffle 模块中的 1×1 卷积,其计算复杂度与通道数成线性关系。思路是从 HRNet 中具有不同分辨率的特征图及其通道中学习权重,通过该权重实现不同分辨率和通道之间的信息交互。


1. Introduction

人体姿态估计需要高分辨率的特征图来获得更好的性能,文中探讨了在计算资源受限的情况下设计高效的高分辨率模型,即轻量级模型。当前轻量级网络主要从两个方面设计:基于分类网络,其中卷积占据了大部分计算量;通过编解码结构或分支结构调节空间信息的流动。

作者首先通过 shuffle 结构和 HRNet 的高分辨率设计得到一个轻量模型,直接结合即可达到比 ShuffleNet、MobileNet 和 Small HRNet 更好的结果。为达到更好的效果,引入 conditional channel weighting 模块来代替 shuffle 模块中的 1×1 卷积。不同于常规卷积的权重作为模型参数学习,该模块的权重以输入特征图为基础,通过轻量级模块跨通道计算得到。通过 HRNet 的分支结构,该模块不仅具有跨通道的信息,还具有不同分辨率的信息。


2. Related Work

前面部分介绍了当前轻量级模型以及注意力机制等。后面部分介绍具有条件结构的网络,如 SkipNet 通过门控单元来决定是否跳过当前层计算,以及 STN 和 DCN。


3. Approach

3.1 Naive Lite-HRNet

本节介绍将 ShuffleNet 中的 shuffle 模块和 HRNet 的并行分支结构直接结合得到的结果,首先是 shuffle 模块:
请添加图片描述
首先,将特征图按通道划分为两部分。一部分依次通过 1×1 卷积、3×3 深度卷积和 1×1 卷积,结果与另一部分拼接。最后,做通道混洗操作。然后是 Small HRNet 的结构:
在这里插入图片描述

该结构分为多个阶段,每个新的阶段加入低分辨率的特征图。在每个阶段,通过上采样和下采样实现不同分辨率特征图的信息交互。使用 shuffle 模块替换 Small HRNet 中某些 3×3 卷积即得到 Naive Lite-HRNet。下图是本文结合 shuffle 模块和 HRNet 提出的 Lite-HRNet 模块:
请添加图片描述
图中虚线表示来自和流入其他分辨率的特征图的信息, H \mathcal H H 表示基于不同分辨率产生权重特征图, F \mathcal F F 表示基于不同通道产生权重特征图。两幅图对比可知,相当于使用该两个模块代替原 shuffle 模块中的 1×1 卷积。

3.2 Lite-HRNet

1×1 convolution is costly. 首先探讨 1×1 卷积的计算量问题,1×1 卷积在特征图上的每个位置都执行依次卷积,表示为:
Y = W ⊗ X {\rm Y}={\bold W}\otimes{\rm X} Y=WX

X {\rm X} X Y {\rm Y} Y 分别表示输入和输出特征图, W {\bold W} W 表示 1×1 的卷积核,1×1 卷积能够有效地跨通道交互信息。假设输入输出特征图通道数为 C,则 1×1 卷积的时间复杂度为 O ( C 2 ) O(C^2) O(C2),而 3×3 深度卷积的时间复杂度为 O ( 3 C ) O(3C) O(3C)。在 shuffle 模块中,对于 C>5,两个 1×1 卷积的复杂度高于一个 3×3 卷积。

Conditional channel weighting. 先看后面两个模块的定义及实现,然后将其和一个 3×3 深度卷积串起来即可。

def forward(self, x):
    def _inner_forward(x):
    	// 在通道维度切分特征图
        x = [s.chunk(2, dim=1) for s in x]
        x1 = [s[0] for s in x]
        x2 = [s[1] for s in x]
		// Cross-resolution weight computation.部分得到的模块
        x2 = self.cross_resolution_weighting(x2)
        // 3x3的深度卷积
        x2 = [dw(s) for s, dw in zip(x2, self.depthwise_convs)]
        // Spatial weight computation.部分得到的模块,即SE模块
        x2 = [sw(s) for s, sw in zip(x2, self.spatial_weighting)]
		// 在通道维度拼接两个分支
        out = [torch.cat([s1, s2], dim=1) for s1, s2 in zip(x1, x2)]
        // 通道混洗
        out = [channel_shuffle(s, 2) for s in out]
        return out
	// 一种训练时间换显存的技术
    if self.with_cp and x.requires_grad:
        out = cp.checkpoint(_inner_forward, x)
    else:
        out = _inner_forward(x)
	// 返回结果
    return out

Cross-resolution weight computation. 在 HRNet 中,第 s s s 个阶段有 s s s 个并行的分支,以及对应的 s s s 个权重图 W 1 , W 2 , . . . , W s {\rm W_1,W_2,...,W}_s W1,W2,...,Ws。通过轻量级模块 H \mathcal H H 跨通道计算这些权重图,表示为:
( W 1 , W 2 , . . . , W s ) = H s ( X 1 , X 2 , . . . , X s ) ({\rm W_1,W_2,...,W}_s)=\mathcal H_s({\rm X_1,X_2,...,X}_s) (W1,W2,...,Ws)=Hs(X1,X2,...,Xs)

其中 X {\rm X} X 表示输入特征图, X 1 {\rm X}_1 X1 的分辨率最大、 X s {\rm X}_s Xs 的分辨率最小。输入特征图首先通过自适应平均池化产生特定大小的输出 X ′ {\rm X'} X,拼接后通过以下步骤得到权重特征图:
( X 1 ′ , X 2 ′ , . . . , X ′ s ) → C o n v . → R e L U → C o n v . → S i g m o i d → ( W 1 ′ , W 2 ′ , . . . , W ′ s ) ({\rm X'_1,X'_2,...,X'}_s)\rightarrow{\rm Conv.}\rightarrow{\rm ReLU}\rightarrow{\rm Conv.}\rightarrow{\rm Sigmoid}\rightarrow({\rm W'_1,W'_2,...,W'}_s) (X1,X2,...,Xs)Conv.ReLUConv.Sigmoid(W1,W2,...,Ws)

这里两个连续 3×3 卷积对应了本节第一部分的内容。最后,通过切分和上采样由 ( W 1 ′ , W 2 ′ , . . . , W ′ s ) ({\rm W'_1,W'_2,...,W'}_s) (W1,W2,...,Ws) 得到 ( W 1 , W 2 , . . . , W s ) ({\rm W_1,W_2,...,W}_s) (W1,W2,...,Ws)

def forward(self, x):
	# 最小特征图的大小
    mini_size = x[-1].size()[-2:]
    # 通过AAP产生固定大小的结果,列表大小比输入小1
    out = [F.adaptive_avg_pool2d(s, mini_size) for s in x[:-1]] + [x[-1]]
    # 在通道维度拼接
    out = torch.cat(out, dim=1)
    # Conv+ReLU
    out = self.conv1(out)
    # Conv+Sigmoid
    out = self.conv2(out)
    # 在通道维度切分特征图,共切分为self.channels份
    out = torch.split(out, self.channels, dim=1)
    # 上采样调整尺寸,并且乘法加权
    out = [
        s * F.interpolate(a, size=s.size()[-2:], mode='nearest')
        for s, a in zip(x, out)
    ]
    # 返回结果
    return out

Spatial weight computation. 由代码可知,该部分就是 SE 模块。

def forward(self, x):
	# 设输入x.shape=(n,c,h,w),out.shape=(n,c,1,1)
    out = self.global_avgpool(x)
    # 两个1×1的卷积
    out = self.conv1(out)
    out = self.conv2(out)
    # 乘法加权,该模块相当于SE模块的通道注意力机制
    return x * out

Instantiation. 文中给出 18 层和 30 层的 Lite-HRNet 网络结构。

在这里插入图片描述

Connection. 该部分讲了本文与其他相关工作的联系和区别。


4. Experiments

在 COCO 测试集上人体姿态估计任务与其他方法的对比:

在这里插入图片描述
由图可知,Lite-HRNet 在模型计算量、参数量和精度上都达到了不错的结果。文章的最大亮点是使用提出的模块替换 1×1 卷积,实验部分也给出了相关的消融实验:

在这里插入图片描述

由第三、四、五行可知,直接去掉 1×1 卷积在减少计算量和参数量的同时,也会降低模型精度。由第六行,使用本文提出的模块替换 1×1 卷积后在增加少量参数的情况下(与第五行相比),大幅提高了模型精度。


5. Conclusion

本文结合 HRNet 的结构特点,以及 1×1 卷积在 shuffle 模块中占据较大计算的情况下,提出 conditional channel weighting 代替 shuffle 模块中的两个 1×1 卷积。实验结果表明,在弃用 1×1 卷积后会大幅减小模型的计算量和参数量,同时本文提出的模块也提高了模型的精度。


参考

【1】Yu C, Xiao B, Gao C, et al. Lite-hrnet: A lightweight high-resolution network[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2021: 10440-10450.

【2】https://github.com/HRNet/Lite-HRNet


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值