点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

作者丨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)。

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

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

下载2

在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

下载3

在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近3000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

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

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

    作者丨happy 审稿丨邓富城 编辑丨极市平台 极市导读 本文从HRNet与轻量化网络ShuffleNet的组合出发,针对置换模块存在的计算瓶颈问题,提出了一种高效条件通道加权单元替换1x1卷积,并得 ...

  2. 厚积薄发--一文带您了解阿里云 RocketMQ 轻量版消息队列(MNS)

    作者: 周新宇&陈涛&李凯 阿里云 RocketMQ 轻量版(MNS)消息队列是一个轻量.可靠.可扩展且完全托管的分布式消息队列服务.MNS 能够帮助应用开发者在他们应用的分布式组件上 ...

  3. 轻量版verilog仿真平台:icarus verilog使用简介

    作为一名系统软件工程师,需要对verilog语言有一定的了解,学习verilog过程中免不了要进行仿真.工程上常见的verilog仿真软件基本就是国外EDA三大厂的:Mentor公司的ModelSim ...

  4. 谷歌联合印企狙击华为鸿蒙OS:推出轻量版安卓系统打造智能手机

    众所周知,华为鸿蒙OS2.0版在发布短短的几个月时间里,用户数直接突破了1.5亿,成为世界上发展最快的手机操作系统. 即使是苹果IOS.谷歌Android系统也只能望尘莫及,但是对于华为来说,研发鸿蒙 ...

  5. OpenGauss 3.0.0 (Lite 版)轻量版部署

    背景 openGauss 3.0.0 版本是openGauss社区继2.0.0之后发布的又一个Release版本,版本维护生命周期为3.5年.3.0.0版本在高性能.高可用.高安全.高智能.工具链等方 ...

  6. 腾讯云轻量服务器为什么便宜?轻量和云服务器有什么区别?

    腾讯云轻量应用服务器为什么便宜?轻量应用服务器和云服务器相比性能一样吗?腾讯云服务器网告诉大家轻量应用服务器与同规格的标准型云服务器CVM 相比,轻量应用服务器的CPU.内存性能与其处于同一水准.所以 ...

  7. 阿里云轻量应用服务器/腾讯云轻量应用服务器如何安装宝塔面板?

    目录 一.阿里云轻量应用服务器如何安装宝塔面板? 第一种方式:重置为宝塔面板应用镜像 第二种方式:安装CentOS系统,用命令安装宝塔面板 二.腾讯云轻量应用服务器如何安装宝塔面板? 第一种方式:重置 ...

  8. android地图画线,绘制折线-在地图上绘制-开发指南-Android 轻量版地图SDK | 高德地图API...

    地图上绘制的线是由 Polyline 类定义实现的,线由一组经纬度(LatLng对象)点连接而成. 绘制一条线 与点标记一样,Polyine的属性操作集中在PolylineOptions类中,添加一条 ...

  9. steam创建账号一直验证人工操作_绝地求生轻量版即将登陆STEAM:预约送M416皮肤...

    早在去年九月份,<绝地求生:轻量版>(PUBG LITE)就在泰国开启了测试.近日,PUBG LITE项目又发布了更多的信息. 目前官方已经放出了预约活动(阅读原文),在测试开启后,预约玩 ...

最新文章

  1. wxWidgets:wxHtml 测试示例
  2. ecies算法c语言实现,Bouncy Castle算法库中ECIES算法调用示例
  3. unix高级编程apue.h问题
  4. 【DB2学习文档之七】SQL for DB2
  5. 【渝粤题库】广东开放大学 传播学理论与实务 形成性考核
  6. 使用rancher-2.5.5部署单节点kubernetes集群
  7. 《天天数学》连载13:一月十三日
  8. 数据结构 顺序串笔记
  9. 使用OpenResty搭建高性能服务端
  10. mysql网上图书销售_PHP+MySQL网上书店|网上图书销售系统
  11. matlab指派问题论文,数学建模指派问题论文.doc
  12. 校园多媒体直播系统方案
  13. Windows网络共享方式
  14. 代码可读性为什么重要啊....人家读不出来不是更安全吗?
  15. 卷积神经网络的训练过程
  16. 自然数因式分解最小和
  17. 2021年Q1微信视频号生态趋势调查报告 | 友望数据
  18. 也谈般若波罗密多心经与计算机世界
  19. MySQL-高级语句
  20. python爬取豆瓣排名前250部电影封面

热门文章

  1. Maven - Dynamic Web Module 3.0 requires Java 1.6 or newer.
  2. loadrunner用javavuser进行接口测试
  3. 进程内存分配和/proc/xxx/maps简单分析
  4. DataRow判断列名是否存在
  5. MyEclipse 9.x Professional/blue/spring/bling 下载与破解
  6. Windows和Linux组成双系统的最简单办法
  7. 迄今为止程序员写过的最大Bug:亏损30亿、致6人死亡,甚至差点毁灭世界
  8. 95后程序员业余帮人鉴定毒蘑菇,竟成百万粉丝的网络大V!
  9. 昨天晚上,亲眼目睹了我一哥们的崩溃,被空降90后上司鄙视,说他这种人在公司......
  10. 石墨文档技术总监:敏捷思想在产品周期的延伸