前言

CW前阵子玩了下人体姿态估计,用上了微软新鲜出炉的算法——DEKR: Bottom-Up Human Pose Estimation Via Disentangled Keypoint Regression。 这个工作挺大胆的,它采用直接回归关键点坐标的方法,在COCO和CrowdPose两个数据集上干掉了此前那些基于关键点热度图(heatmap)检测并组合的方法。

DEKR的个性在于,它独立地对每个关键点进行特征提取和回归,实现了关键点之间的解耦,犹如其名——解构式关键点回归,而这种做法的成功则得益于其中的重要思想:回归关键点坐标的特征必须集中注意到关键点周围的区域!

https://github.com/HRNet/DEKR​github.com

以往方法存在的问题

吾以为,想要产出一个经得住考验的优秀工作,一个重大前提就是要深刻认识以往方法存在的缺陷。只有懂得发现问题,明白痛点在哪里,才能针对性地去改善,甚至创造。因此,一起和CW先来看看以往的一些方法存在哪些问题吧~

多人姿态检测任务不仅要定位不同类型的关键点,还得确定哪些关键点属于同一个人。目前的解决方案大致分为自顶向下(Top-Down)和自底向上(Bottom-Up)两类,前者先检测出包含人的目标框,再基于框内的人体进行关键点检测,类似于目标检测中的2-stage算法,先定位出一个大致的候选,再精准回归。这种做法通常更准,但同时开销也更大;后者则是通常先用热度图(heatmap)预测出关键点位置,然后再对它们进行组合,类似于目标检测的1-stage算法,效率高,但后处理可能比较繁琐。

还有一些“个性玩家”,如CenterNet之流,其对图中的每个像素点都直接回归K个关键点的位置,是很简洁,但准确度却不够6。

由上可知,主流的两类做法都有各自的痛点,2-stage不用说了,还分阶段,听起来就不爽快;1-stage的预测过程虽然很顺溜,但事后还要很费脑子。至于个性玩家们嘛,就像个不及格考生..

既然各流派独立玩都玩不好,那么把它们组合一下?不过,该如何选择呢..

先排除自顶向下,2-stage开销太大,老百姓耗不起,于是果断选择自底向上。但是自底向上中先热度图后组合的方式又太繁琐,不如向个性玩家们学习下,采用密集关键点坐标回归的形式。

OK,大体方案已确立,即:自底向上+密集关键点回归。然而,仅仅这样岂不是白嫖别人的劳动果实..而且这样简单粗暴地进行组合,效果也得不到保证。于是,还必须加点料才能work,至于是什么料,且看下文揭晓~

成功的关键因素

前言说到,DEKR的一个重要思想是认为回归关键点坐标的特征必须集中注意到关键点周围的区域,那么如何做到呢?我们知道,传统卷积只能激活中心像素及其周围的邻域点,于是,DEKR设计了一种自适应卷积,它能够使得像素点的激活范围不再局限于其邻域,而是集中在关键点周围!这,便是DEKR加的第一味儿料~

其次,为了使得每个关键点的预测更加精准,就应该更有针对性地对各个关键点进行特征提取和回归。于是,DEKR采用了多分支结构,每个分支与每个关键点一一对应,利用自适应卷积专心学习关键点特征,然后基于这些特征去回归关键点的位置。这,实现了各个关节点之间的解耦,是DEKR加的第二味儿料,真香!

解耦多分支回归关键点位置

多分支结构如上图所示,首先将backbone输出的特征按通道划分为K份,每份送入一个独立的分支,对各关键点进行解耦。对于COCO数据集来说,K=17。

其中,每个分支都会用自适应卷积去学习对应的关键点特征,最后基于学到的特征去回归关键点的二维偏移值向量,也就是使用卷积将通道数映射为2。

这些并行的分支结构都是一样的,但是各自有独立的参数,互相“井水不犯河水”。

自适应卷积提取关键点特征

自适应卷积与可变形卷积是一家,先对像素点生成与核大小数量对应的偏移量,得到与卷积核操作的各个像素点位置后,再进行卷积。只不过,这里生成偏移量的方式并非可变形卷积那种额外使用一个卷积来完成,而是采用仿射变换的方式,具体做法是:

1.使用卷积将特征通道数映射为4,置换到最后1维并拆分成2x2(增加了一个维度),得到仿射变换矩阵 (B,H,W,2,2);

2.将 与代表3x3常规卷积位移的矩阵进行点乘,得到的结果最后两维是2x9(B,H,W,2,9),2对应x和y坐标,9对应着3x3位置个偏移量,合并这两维并置换回第1维(B,18,H,W);

3.使用卷积将特征通道数映射为2(B,2,H,W),代表2d位移向量t,每一维分别对应x坐标和y坐标;

4.将 (共9个)相加(B,0::2,H,W + B,0:1,H,W; B,1::2,H,W + B,1:2,H,W)得到最终的偏移量 (B,18,H,W)

其中,的形式如下,每一行对应着x/y坐标的偏移:

多尺度特征双向融合

DEKR的成功主要得益于以上两点:解构式多分支&自适应卷积。但是,CW认为其backbone中的多尺度特征双向融合也是有一定功劳的,因此也给它个名分。

这里的做法继承自HRNet,低分辨率向高分辨率特征融合时,先采用1x1卷积将通道数映射为一致,然后再采用最近邻(注意不是双线性)插值一次性上采样到高分辨率大小;而高分辨率向低分辨率特征融合时,则是分段采用3x3卷积进行2倍下采样,直至达到目的低分辨率大小,并且,只在最后一个3x3卷积改变通道数。至于特征融合的方式,均是element-wise add。

思考

前文也提到,DEKR和CenterNet一样都是使用密集关键点回归的好兄弟,但是这兄弟倆有个区别:

CenterNet在回归出关键点位置之后,需要将关键点匹配到距其最近的从热度图中检测出的关键点位置。也就是说,如果回归出来的关键点位置是,而在热度图检测出的所有关键点位置中有一个 距离它最近,那么最终这个关键点的位置就为 ,当然,还有个额外条件就是 要在 所在的那个实例(人)的bbox里;

然而,DEKR却没有那么“婆妈”,直接回归完关键点位置就完事儿,别不信,回归出来的位置即最终的关键点位置,就是那么爽快~

作者也尝试了在DEKR中将关键点位置像它的兄弟CenterNet一样分配到heatmap中最近的位置,结果显示,这种做法在单尺度测试时几乎没有影响,而在多尺度测试时则会有少许性能提升(以下 'ss' 表示单尺度,'ms' 表示多尺度,'D-32' 表示使用 HRNet-W32 骨干网络,'D-48' 表示使用 HRNet-W48 骨干网络):

这就说明,DEKR 本身的关键点回归质量就很高,优秀!

明明是两兄弟,为何CenterNet就不能像DEKR一样豪爽且优秀呢?

最主要的原因,就是DEKR对各关键点的回归进行了解耦,同时使用自适应卷积让网络提取的特征点位置集中在关键点附近,就有点“一对一辅导”的味道,而CenterNet相对来说就是那种“大班教育”,针对性较弱,效果也就没有那么好了,因此它最终需要使用heatmap去refine。

那么你可能会问了,为何heatmap的预测就是比较准的,而回归的预测就是粗略的呢?凭什么说heatmap可以refine回归的结果?

你仔细想想heatmap是干啥的?人家就是“一对一”针对各个关键点去学习的啊,在每个关键点附近分配正样本去训练模型,人家主业就是做识别的;而回归,是基于物体中心点的位置计算其到各个关键点的offset,然后去学习,是“一对多”的关系。而且,使用的是常规卷积,感受野受限,特征针对性不强,基于一个中心点位置去同时回归多个关键点位置,太难了..

当然,DEKR这种爽快也是有“代价”的,那就是其必须针对各类关键点设置独立的预测头部,同时还得结合自适应卷积去较好地提取各关键点特征,这无疑使网络结构复杂化、更重载;而CenterNet在这个阶段就显得相当“简便”了,所有关键点共享预测头部,也没有用什么花里胡哨的结构。

所以说,各路英雄豪杰都有自己的招,孰高孰下还得结合当下的时局去分析判断。

作者:cw

DEKR 解构式关键点回归(一):算法思想与原理相关推荐

  1. CVPR 2021 | 微软提出解构式关键点回归, 刷新COCO自底向上多人姿态检测记录!...

    本文转载自微软研究院AI头条. 编者按:在拥挤的人群的场景下,由于人群过于密集,重合程度太高,所以每个人的位置难以用人体检测框表示,而传统的一些自下而上的人体姿态估计算法也很难检测到人物的关键点.因此 ...

  2. CVPR 2021 | 微软提出“解构式关键点回归“, 刷新COCO自底向上多人姿态检测记录!

    随着深度学习的发展,运用计算机视觉中的人体姿态估计技术已经能够高精度地从人体的图片中检测出人体关键点,并恢复人体位姿.在应用端,此技术也已经在人机交互.影视制作.运动分析.游戏娱乐等各领域大放异彩. ...

  3. DEKR 解构式人体关键点回归(二):标签分配(Label Assignment)

    前言 上一期 DEKR 解构式人体关键点回归(一):算法思想与原理 解析了DEKR的算法与工作原理,这期本文将聚焦于标签分配.当然,首先得了解标签是什么,明确模型的学习目标,然后再进一步看看如何制作与 ...

  4. DEKR 解构式人体关键点回归(三):损失函数

    前言 损失函数是一项工作里很重要的部分,它意在每个训练阶段告诉模型有多"犯傻".离"正确答案"还有多远,然后基于损失反向传播回去使得各模型参数获得相应的梯度,于 ...

  5. 展开运算符解构赋值_解构式展开式搜索栏

    展开运算符解构赋值 View demo 查看演示Download Source 下载源 Maybe you have noticed the little adjustments that we di ...

  6. 数据结构和算法详解(四)——五大基本算法思想

    更多例子可参考:https://blog.csdn.net/Aidam_Bo/article/details/86715865 一.穷举算法思想 穷 举 算 法 (ExhaustiveA ttack ...

  7. es6学习 -- 解构赋值

    ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. let a = 1; let b = 2; let c ...

  8. python分类算法的应用_07-机器学习_(lineage回归分类算法与应用) ---没用

    机器学习算法day04_Logistic回归分类算法及应用 课程大纲 Logistic回归分类算法原理 Logistic回归分类算法概述 Logistic回归分类算法思想 Logistic回归分类算法 ...

  9. JAVA工程师常用算法_算法工程师必须要知道的8种常用算法思想

    算法思想有很多,业界公认的常用算法思想有8种,分别是枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟.当然8种只是一个大概的划分,是一个"仁者见仁.智者见智"的问题. 1.1 ...

最新文章

  1. 高效查看MySQL帮助文档的方法
  2. Java将异常入库_Exception异常库
  3. opencv精要(1)-opencv简介
  4. 小白2分钟学会Visual Studio将引用包打包到NuGet上
  5. 简单介绍日志的发展历史
  6. dedecms怎么改php版本_玩转Termux:手把手教你在手机上安装php与nginx!
  7. 什么使软件程序员成为专业人士?
  8. 【每日算法Day 77】LeetCode 第 181 场周赛题解
  9. java random()_JAVA的Random类的用法详解
  10. 2022最新《人工智能入门指南》全套学习教程,全网阅读量10w+
  11. gxf------阿里云学生机部署Django项目2020
  12. [渝粤教育] 西南科技大学 管理学原理 在线考试复习资料(6)
  13. 手游传奇刷元宝_战神传奇手游刷元宝方法技巧大全
  14. javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not prep
  15. 建筑力学与结构【10】
  16. 生日悖论与Hash函数的攻击
  17. 基于51单片机的俄罗斯方块小游戏
  18. 域控制器故障恢复手记
  19. ES聚合查询详解(二):桶聚合
  20. 灵活就业人员怎样参加企业职工基本养老保险

热门文章

  1. java rf14bug_hadoop2.7.0集群,使用中遇到的bug及解决办法
  2. 球球大作战显示中国服务器较差,球球大作战延迟卡顿原因分析及解决方法
  3. android 图片操作,Android图片操作(Bitmap)
  4. 模板 - 数论 - (新)
  5. springboot整合activemq加入会签,自动重发机制,持久化
  6. spring boot: 支持jsp,支持freemarker
  7. 洛谷 P1183 多边形的面积
  8. EF 线程内唯一对象
  9. 【leetcode dp】629. K Inverse Pairs Array
  10. FFmpeg数据结构:AVPacket解析