文中摘要第一段提到 Lite-HRNet 用于人体姿态估计,而其 baseline HRNet 稍加改动即可用于目标检测、语义分割等,所以 Lite-HRNet 也可以轻易扩展至类似的视觉任务。
论文地址 代码地址
作者发现,shuffle 模块中频繁使用的 1×1 卷积成为了计算瓶颈。文中提出 conditional channel weighting 的轻量级单元来代替 shuffle 模块中的 1×1 卷积,其计算复杂度与通道数成线性关系。思路是从 HRNet 中具有不同分辨率的特征图及其通道中学习权重,通过该权重实现不同分辨率和通道之间的信息交互。
人体姿态估计需要高分辨率的特征图来获得更好的性能,文中探讨了在计算资源受限的情况下设计高效的高分辨率模型,即轻量级模型。当前轻量级网络主要从两个方面设计:基于分类网络,其中卷积占据了大部分计算量;通过编解码结构或分支结构调节空间信息的流动。
作者首先通过 shuffle 结构和 HRNet 的高分辨率设计得到一个轻量模型,直接结合即可达到比 ShuffleNet、MobileNet 和 Small HRNet 更好的结果。为达到更好的效果,引入 conditional channel weighting 模块来代替 shuffle 模块中的 1×1 卷积。不同于常规卷积的权重作为模型参数学习,该模块的权重以输入特征图为基础,通过轻量级模块跨通道计算得到。通过 HRNet 的分支结构,该模块不仅具有跨通道的信息,还具有不同分辨率的信息。
前面部分介绍了当前轻量级模型以及注意力机制等。后面部分介绍具有条件结构的网络,如 SkipNet 通过门控单元来决定是否跳过当前层计算,以及 STN 和 DCN。
本节介绍将 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 卷积。
1×1 convolution is costly. 首先探讨 1×1 卷积的计算量问题,1×1 卷积在特征图上的每个位置都执行依次卷积,表示为:
Y = W ⊗ X {\rm Y}={\bold W}\otimes{\rm X} Y=W⊗X
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′,...,X′s)→Conv.→ReLU→Conv.→Sigmoid→(W1′,W2′,...,W′s)
这里两个连续 3×3 卷积对应了本节第一部分的内容。最后,通过切分和上采样由 ( W 1 ′ , W 2 ′ , . . . , W ′ s ) ({\rm W'_1,W'_2,...,W'}_s) (W1′,W2′,...,W′s) 得到 ( 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. 该部分讲了本文与其他相关工作的联系和区别。
在 COCO 测试集上人体姿态估计任务与其他方法的对比:
由图可知,Lite-HRNet 在模型计算量、参数量和精度上都达到了不错的结果。文章的最大亮点是使用提出的模块替换 1×1 卷积,实验部分也给出了相关的消融实验:
由第三、四、五行可知,直接去掉 1×1 卷积在减少计算量和参数量的同时,也会降低模型精度。由第六行,使用本文提出的模块替换 1×1 卷积后在增加少量参数的情况下(与第五行相比),大幅提高了模型精度。
本文结合 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