作者丨happy

审稿丨邓富城

编辑丨极市平台

极市导读

本文从HRNet与轻量化网络ShuffleNet的组合出发,针对置换模块存在的计算瓶颈问题,提出了一种高效条件通道加权单元替换1x1卷积,并得到了本文的Lite-HRNet,本文已被CVPR2021收录。

Lite-HRNet

paper: https://arxiv.org/abs/2104.06403

code: https://github.com/HRNet/Lite-HRNet

本文是MSRA的研究员针对HRNet的轻量化设计,已被CVPR2021接收。从HRNet与轻量化网络ShuffleNet的组合出发,针对置换模块存在的计算瓶颈问题,提出了一种高效条件通道加权单元替换1x1卷积,并得到了本文的Lite-HRNet。所提Lite-HRNet在人体姿态估计方面取得了最佳的精度-速度均衡,比如在COCO数据集上,Lite-HRNet-30仅需0.7GFLOPs即可取得69.7AP指标;Lite-HRNet-30仅需0.42GFLOPs即可取得87.0 PCKh@0.5的指标。

Abstract

本文提出一种针对人体姿态估计的高效高分辨率网络:Lite-HRNet。我们通过简单的将ShuffleNet中的高效置换模块嵌入到HRNet即可比主流轻量化网络(比如MobileNet、ShuffleNet、Small HRNet)更强的性能。

我们发现:置换模块中重度使用的卷积是其计算瓶颈。我们引入一种轻量化单元(条件通道加权)替换置换模块中计算代价昂贵的卷积。所提通道加权的复杂度与通道数成线性关系,低于卷积的二次时间复杂度关系(比如,在与多分辨率特征方面,所提单元可以减少置换模块总体计算量的80%)。该方案从多个并行分支的所有通道、所有分辨率学习加权值,采用该权值进行通道、分辨率之间的信息交换,补偿卷积所扮演的角色。

实验表明:在人体姿态估计应用方面,相比主流轻量化网络,所提Lite-HR具有更强的性能;更重要的是,所提Lite-HRNet可以以相同方式轻易嵌入到语义分割任务中。

本文主要贡献包含以下几点:

  • 通过简单的将ShuffleNet中的置换模块嵌入到HRNet即可得到性能优于其他轻量化方案的基础版Lite-HRNet;

  • 通过引入一种高效条件通道加权单元替换置换模块的卷积得到本文所提改进版高效网络Lite-HRNet;

  • 在COCO与MPII人体姿态估计方面,所提Lite-HR取得了最佳的复杂度-精度均衡,且可以轻易的推广到语义分割任务中。

Method

Naive Lite-HRNet

Shuffle Block 上图a给出了ShuffleNetV2中的置换模块示意图,它将输入通道拆分为两部分:一部分经过等卷积处理,一部分不做处理,最后对前述两部分concate结果进行通道置换。

HRNet 上图给出了Small HRNet的网络架构示意图,它采用了渐进式添加高-低分辨率特征并进行不同分辨率特征的融合。

Simple Combination 我们采用置换模块替换Small HRNet的stem部分的第二个卷积,替换所有的残差模块,多分辨率融合部分的卷积采用分离卷积替换,即可得到了基础班Lite-HRNet。

Lite-HRNet

convolution is costly  卷积在每个点进行矩阵-向量乘的计算,描述如下:

由于置换模块中的depthwise卷积(深度卷积)不进行通道间信息交换,故它在置换模块中扮演通道见信息交换的作用。

卷积的计算复杂度是通道数的二次关系,而深度卷积则是线性关系。在置换模块中,两个卷积的复杂度要比深度卷积的更高:。下表给出了卷积与深度卷积的复杂度对比。

Conditional Channel Weighting  我们提出采用元素级加权操作替换基础版Lite-HRNet中的卷积。对于第s分辨率分支的元素加权操作可以描述如下:

该计算单元的复杂度与通道数成线性关系,要低于卷积的复杂度。实现code如下:

class ConditionalChannelWeighting(nn.Module):    def __init__(self,                 in_channels,                 stride,                 reduce_ratio,                 conv_cfg=None,                 norm_cfg=dict(type='BN'),                 with_cp=False):        super().__init__()        self.with_cp = with_cp        self.stride = stride        assert stride in [1, 2]branch_channels = [channel // 2 for channel in in_channels]self.cross_resolution_weighting = CrossResolutionWeighting(            branch_channels,            ratio=reduce_ratio,            conv_cfg=conv_cfg,            norm_cfg=norm_cfg)self.depthwise_convs = nn.ModuleList([            ConvModule(                channel,                channel,                kernel_size=3,                stride=self.stride,                padding=1,                groups=channel,                conv_cfg=conv_cfg,                norm_cfg=norm_cfg,                act_cfg=None) for channel in branch_channels        ])self.spatial_weighting = nn.ModuleList([            SpatialWeighting(channels=channel, ratio=4)            for channel in branch_channels        ])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]x2 = self.cross_resolution_weighting(x2)            x2 = [dw(s) for s, dw in zip(x2, self.depthwise_convs)]            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 outif self.with_cp and x.requires_grad:            out = cp.checkpoint(_inner_forward, x)        else:            out = _inner_forward(x)return out

Cross-resolution weight computation  考虑到第s阶段有s个并行分辨率,我们需要计算s个权值图。我们采用轻量函数对不同分辨率的所有通道计算权值图:

我们通过如下方式实现轻量函数:在上先进行自适应均值池化得到,AAP可以将任意输入尺寸池化到给定输出尺寸;我们将上述所得拼接得到,并经由卷积、ReLU、卷积、Sigmoid生成不同分辨率的加权图。

在这里,每个分辨率每个位置的加权值依赖于均值池化后多分辨率特征同位置的通道特征。这就是为什么我们将该机制称之为跨分辨率权值计算的原因。上采样到对应的分辨率得到用于后续的元素级加权。

这里所提的元素级加权图将起着跨分辨率、通道信息交换的作用。每个位置的加权向量从所有输入接受信息,并与原始的通道进行加权, 描述如下:

换句话说,通道加权机制起着与卷积相同的作用:信息交换。另一方面,函数在是小分辨率上实现的,故而其计算复杂度非常小。实现code如下:

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 = x[-1].size()[-2:]        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)        out = self.conv2(out)        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,见下面的code)。此时的特征加权方式将调整为:

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

Instantiation  Lite-HRNet包含高分辨率Stem和主体两部分,stem由一个stride=2的卷积+置换模块构成;主体部分由一些列模块化的单元构成,每个单元包含两个条件通道加权模块与一个多分辨率融合,每个分辨率对应特征的通道维度为。Lite-HRNet的架构信息见下表。

Connection  本文所提条件加权机制具有与CondConv、动态滤波器、SE等相似的思想:数据自适应性。区别在于:CondConv、动态滤波器以及SE采用自网络学习卷积核或者混合权值并提升模型的容量;而本文方法则探索了额外的作用:采用所学习到的权值对不同分辨率、不同通道见的信息交换进行桥接。它可以用于替换轻量化网络中的耗时的卷积,除此之外,我们还引入了多分辨率信息提升加权学习。

Experiments

我们在COCO与MPII数据集上对所提方法的性能进行了评估,参照主流top-down框架,我们直接估计K个热图。

Dataset COCO具有200K图像,250K具有17个关键点的人体示例。我们在train2017数据集(包含57K图像,150K人体示例)上进行训练,在val2017与test-dev2017数据集上验证;MPII包含25K个全身姿态标注的图像,超40K人体示例,其中12K用于测试,其他用于训练。

Training  人体检测框扩展为比例后裁剪,COCO数据的图像缩放到或者;MPII数据的图像缩放到。此外每个图像还会进行一系列的数据增广:随机旋转、随机缩放、随机镜像等。

Testing 对于COCO数据,我们采用双阶段的top-down框架:即先检测再预测;对于MPII数据,我们采用标准的测试策略(预提供人体框)。

Evaluation 我们采用基于OKS的mAP对COCO进行度量:;对于MPII,我们采用标准度量PCKH@0.5进行性能评估。

上图给出了COCO验证集上的性能对比,从中可以看到:

  • 输入为条件下,Lite-HRNet-30取得了67.2AP指标,优于其他轻量化方案。

  • 相比MobileNetV2,性能提升2.6AP,且仅需20%GFLOOs与参数量;

  • 相比ShuffleNetV2,Lite-HRNet-18与Lite-HRNet-30分别获得了4.9与7.3指标提升,同时具有更低的计算量;

  • 相比Small HRNet-W16,Lite-HRNet指标提升超10AP;

  • 相比大网络(比如Hourglass、CPN),所提方法可以取得相当的AP指标且具有极低复杂度。

  • 输入为条件下,Lite-HRNet-18与Lite-HRNet-30分别取得了67.6与70.4AP指标;

  • 受益于所提高效条件通道加权模块,Lite-HRNet取得了更佳的精度-计算复杂度均衡,可参考下图。

上表给出了COCO-test-dev数据集上的性能对比,可以看到:

  • Lite-HRNet-30取得了69.7AP指标,显著优于其他轻量网络,同时具有更低FLOPs和参数量;

  • Lite-HRNet-30取得了优于Mask-RCNN、G_RMI、IPR等大网络的性能;

  • 尽管相比其他大网络,所提方法仍存在性能差异,但所提方法具有超低的GFLOPs与参数量。

上表给出了MPII验证集上的性能对比,可以看到:

  • 相比MobileNet2、MobileNetV3、ShuffleNetV2、Small HRNet等轻量化模型,所提Lite-HRNet-18取得了更高的精度,同时具有更低的计算复杂度;

  • 继续提升模型大小可以进一步提升模型的精度,比如Lite-HRNet-30取得了87.0 PCKh@0.5的指标。

最后,我们再看一下所提方法迁移到语义分割任务上的效果,见上表。可以看到:

  • Lite-HRNet-18以1.95GFLOPs计算量取得72.8%的mIoU指标;

  • Lite-HRNet-30以3.02GFLOPs计算量取得了75.3%的mIoU指标。

  • 所提方法优于手工设计网络(如ICNet、BiSeNet、DFANet等)与NAS网络(比如CAS、GAS、FasterSeg等),同时与SwiftNetRN-18性能相当,但具有更低的计算量(3.02 vs 104)。

全文到此结束,更多消融实验与分析建议查看原文。


往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑温州大学《机器学习课程》视频
本站qq群851320808,加入微信群请扫码:

【论文解读】突破置换模块计算瓶颈,MSRA开源轻量版HRNet,超越主流轻量化网络!|CVPR2021...相关推荐

  1. 突破置换模块计算瓶颈,MSRA开源轻量版HRNet,超越主流轻量化网络!|CVPR2021...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨happy 审稿丨邓富城 编辑丨极市平台 极市导读 本文从HRNet与轻量化网络ShuffleN ...

  2. ICLR 2019论文解读:量化神经网络

    https://www.toutiao.com/a6701879235964830212/ 今年五月举办 ICLR 2019 会议共接收论文 502 篇,本文将解读其中两篇有关量化神经网络的研究. U ...

  3. Amazon Aurora 论文解读

    Amazon Aurora 论文解读 复制与一致性 计算与存储分离架构 存储引擎 基本操作 Writes Commits Reads Replicas 总结 Aurora是一个OLTP的分布式数据库. ...

  4. bsp模型适用于图计算_【论文解读】目标检测之RFBnet模型

    原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不能用于商业目的. 其它机器学习.深度学习算法的全面系统讲解可以阅读<机器学习-原理.算法与应用>,清华大学出版社,雷明 ...

  5. 论文解读丨无参数的注意力模块SimAm

    摘要:本文提出了一个概念简单但对卷积神经网络非常有效的注意力模块. 本文分享自华为云社区<论文解读系列三十:无参数的注意力模块SimAm论文解读>,作者:谷雨润一麦. 摘要 本文提出了一个 ...

  6. 【论文解读】打破常规,逆残差模块超强改进,新一代移动端模型MobileNeXt来了!精度速度双超MobileNetV2...

    文章来源于极市平台,作者Happy 导语:该文是依图科技&新加坡国立大学颜水成团队提出的一种对标MobileNetV2的网络架构MobileNeXt.它针对MobileNetV2的核心模块逆残 ...

  7. 论文解读:《i6mA-stack: 基于堆叠框架的蔷薇科基因组DNA N6-甲基腺嘌呤(6mA)位点的计算预测》

    论文解读:<i6mA-stack: A stacking ensemble-based computational prediction of DNA N6-methyladenine (6mA ...

  8. 论文解读丨基于局部特征保留的图卷积神经网络架构(LPD-GCN)

    本文分享自华为云社区<论文解读:基于局部特征保留的图卷积神经网络架构(LPD-GCN)>,原文作者:PG13 . 近些年,很多研究者开发了许多基于图卷积网络的方法用于图级表示学习和分类应用 ...

  9. 论文解读 Receptive Field Block Net for Accurate and Fast Object Detection

    其它机器学习.深度学习算法的全面系统讲解可以阅读<机器学习-原理.算法与应用>,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造. 书的购买链接 书的勘误,优化,源代码资源 PDF全 ...

最新文章

  1. https和http的主要区别
  2. android 解决getColor()方法过时
  3. 企业实战_24_MyCat实现读写分离
  4. 3DMAX安装包及近百GB素材资源,以及3D游戏建模教程
  5. 9、MySQL逻辑架构介绍
  6. 架构师速成8.3-可用性之分库分表
  7. mvc 在视图中调用别的视图
  8. NEC学习 ---- 布局 -两列, 右侧定宽,左侧自适应
  9. python中print输出格式_Python print格式化输出
  10. Linux下opengl性能更高,OpenGL超级宝典学习笔记——性能比较
  11. CLIP Learning Transferable Visual Models From Natural Language Supervision
  12. 微信公众号文章爬取下载各种格式
  13. Java SE 059 类型安全的枚举
  14. Windows下进程占用CPU过大的解决方案
  15. Colorful Image Colorization原理及源码详解
  16. 计算机硬件图标准画法,机械制图培训中剖视图的画法详解
  17. 我们一起学linux之V4L2摄像头应用流程
  18. matlab dock什么意思,dock栏是什么意思
  19. 叮咚!您有一份2017杭州云栖大会参会指南待签收【持续更新中】
  20. 犬夜叉日本漫画Mac动态壁纸

热门文章

  1. php session 跨页失效问题
  2. #ifdef #else #endif #fi #ifndef 的用法
  3. BZOJ1085 [SCOI2005] 骑士精神
  4. Android项目笔记整理(1)
  5. jquery validation remote进行唯一性验证时只使用自定义参数,不使用默认参数
  6. sql2008 查询某个表被那些存储过程用到
  7. 孝敬父母 天经地义 |有人这么疑问?
  8. 编写自己的Shell解释器-3[转]
  9. 如何测试机房的速度和带宽?
  10. ajax请求提示html状态码302,快速解决ajax请求出错状态码为0的问题