DEKR 解构式关键点回归(一):算法思想与原理
前言
CW前阵子玩了下人体姿态估计,用上了微软新鲜出炉的算法——DEKR: Bottom-Up Human Pose Estimation Via Disentangled Keypoint Regression。 这个工作挺大胆的,它采用直接回归关键点坐标的方法,在COCO和CrowdPose两个数据集上干掉了此前那些基于关键点热度图(heatmap)检测并组合的方法。
DEKR的个性在于,它独立地对每个关键点进行特征提取和回归,实现了关键点之间的解耦,犹如其名——解构式关键点回归,而这种做法的成功则得益于其中的重要思想:回归关键点坐标的特征必须集中注意到关键点周围的区域!
https://github.com/HRNet/DEKR

以往方法存在的问题
吾以为,想要产出一个经得住考验的优秀工作,一个重大前提就是要深刻认识以往方法存在的缺陷。只有懂得发现问题,明白痛点在哪里,才能针对性地去改善,甚至创造。因此,一起和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。
Preview
下一部分,CW将分享下DEKR的标签制作过程,先明确模型学习的目标。
作者:cw