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

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

相比单人姿态检测,由于不知道图像中每个人的位置和总人数,多人姿态检测技术在预测图片中每个人的不同关键点所在的位置时更加困难。其困难在于:不仅要定位不同种类的关键点,还要确定哪些关键点属于同一个人。

针对这一困难,学术界有两种解决方案,一种是自顶向下的方法,先检测出人体目标框,再对框内的人体完成单人姿态检测,这种方法的优点是更准确,但开销花费也更大;另一种则是自底向上的方法,常常先用热度图检测关键点,然后再进行组合,该方法的优点是其运行效率比较高,但需要繁琐的后处理过程。

最近,也有学者采用了基于密集关键点坐标回归的框架(CenterNet)对图片中的多人姿态进行检测。此方法要求对于图中的每个像素点都要直接回归 K 个关键点的位置,虽然简洁,但在位置的准确度方面却一直都显著低于先检测再组合的方法。

而微软亚洲研究院的研究员们认为,回归关键点坐标的特征必须集中注意到关键点周围的区域,才能够精确回归出关键点坐标。基于此,微软亚洲研究院提出了一种基于密集关键点坐标回归的方法:解构式关键点回归(Disentangled Keypoint Regression, DEKR)。这种直接回归坐标的方法超过了以前的关键点热度图检测并组合的方法,并且在 COCO 和 CrowdPose 两个数据集上达到了目前自底向上姿态检测的最好结果。相关工作“DEKR: Bottom-Up Human Pose Estimation Via Disentangled Keypoint Regression”已经被CVPR 2021收录。

图片

论文地址:

https://arxiv.org/pdf/2104.02300.pdf

代码地址:

https://github.com/HRNet/DEKR

DEKR 方法有两个关键:

1.用自适应的卷积激活关键点区域周围的像素,并利用这些激活的像素去学习新的特征;

2.利用了多分支的结构,每个分支都会针对某种关键点利用自适应卷积学习专注于关键点周围的像素特征,并且利用该特征回归这种关键点的位置。

通过以上两个技术关键,DEKR 学到的特征更加专注于目标关键点周围,因此,回归出的关键点具有很高的精度。

图片

方法:解构式关键点回归(DEKR)

密集关键点回归框架对于每个像素点都会通过回归一个 2K 维度的偏移值向量来估计一个姿态。这个偏移值向量图是通过一个关键点回归模块处理骨干网络得到的特征而获得的。

解构式关键点回归(DEKR)的框架如下图所示,研究员们将骨干网络生成的特征分为K份,每份送入一个单独的分支。每个分支用各自的自适应卷积去学习一种关键点的特征,最后用一个卷积输出一个这种关键点的二维偏移值向量。在图中,为了表示方便,假设了 K=3,事实上,在 COCO 数据集的实验中,K 为17。

图片

图1:解构式关键点回归(DEKR)的框架

图片

关键点1:自适应卷积

一般来说,人体的关键点与中心点的距离比较远,一个在中心点处的普通卷积只能看到中心点周围像素的信息,而一系列在中心点处的普通卷积则可以看到更远的在目标关键点周围的像素信息,但是它不能集中地去激活这些关键点周围的像素。

因此,研究员们采用了自适应的卷积学习来激活关键点周围信息的特征。换句话说,自适应卷积就是普通卷积的加强版。

图片

以上公式中,W 代表卷积核的权重。q 是二维的位置,g_si^q 代表了偏移量,而两者相加代表了被激活的像素点。这个偏移量可以像可形变卷积(Deformable Convolution)一样用额外的普通卷积进行估计,也可以将空间形变卷积(Spatial transformer network)从全局模式扩展到逐像素模式。

在上述选择中,研究员们采用了后者:为每个像素预测仿射变换矩阵和平移矩阵。从而将这两个矩阵作用于普通卷积的卷积核,得到自适应卷积的卷积核。

图片

图片

图片

关键点2:多分支回归

研究员们还进一步用了多分支的结构。每个分支分别用不同的自适应卷积激活对应的关键点周围的像素,然后回归出相应的关键点。研究员们将骨干网络输出的特征分成了 K 个特征,然后利用这些特征估计对应关键点的偏移值向量图。

图片

上述每个公式都代表了其中一个分支为了回归一种关键点所进行的操作。可以看出,这些分支结构相同,但是被相互独立地训练。

图2展示了鼻子、左肩、左膝、左脚踝这些关键点对应分支学到的人的中心点处自适应卷积激活的像素位置。可以观察到通过多分支的结构,每个分支都可以用其自己的自适应卷积集中激活相应关键点位置附近的像素。

通过多分支结构,研究员们显式地将特征解构分别预测了不同的关键点,这让优化变得更加容易,进而让模型可以准确地预测出关键点的位置。

图片

图2:鼻子、左肩、左膝、左脚踝这几个关键点对应分支学到的人的中心点处自适应卷积激活的像素位置。

在损失函数方面,关键点偏移值向量图的损失函数是用人的大小来正则化的光滑 L1 损失函数。公式如下:

图片

此外,在关键点和中心点热度图的损失函数设计中,研究员们还用一个独立的热度图估计分支估计了 K 张关键点热度图和一张中心点热度图,中心点热度图显示了像素是人的中心点的置信度。热度图用来给回归出的人体姿态进行打分并且排序,热度图的损失函数为加权的 L2 损失函数。

图片

结合 L1 和 L2 损失函数就可生成总体的损失函数。具体而言就是由关键点回归的损失函数与关键点和中心点热度图的损失函数加权而成。

图片

在上式中,λ 是一个权重系数,研究员们设置为0.03。

图片

实验结果:COCO和CrowdPose的双重验证

在 COCO 数据集中,研究员们首先将模型在 COCO train2017 上进行了训练,训练时使用了随机旋转、随机缩放、随机平移、随机水平翻转的增广方式,然后对于 HRNet-w32 骨干网络,将图片裁剪到512×512;对于 HRNet-w48,将图片裁剪到640×640,并用 Adam 优化器训练网络,一共训练了140回,初始学习率为 1e-3,分别在第90回和第120回降为 1e-4 和 1e-5。

随后,研究员们又在 COCO val2017 和 COCO test-dev2017 上进行了测试。在测试时,保持了图片长宽比不同,把图片的短边缩放到512/640。此外,还采用了翻转测试,将原始的热度图、关键点位置图和翻转后的热度图、关键点位置图分别做了平均。同时研究员们也尝试了多尺度测试,平均了各个尺度的热度图,并且收集了三个尺度的回归结果。

在 COCO val2017 测试集上的结果如表1所示,表中的“AE”指的是 Associative Embedding。可以看到 DEKR 在 COCO val2017 达到了很好的结果。

图片

表1:在 COCO val2017 中的测试结果

在 COCO test-dev2017 上的结果如表2所示,DEKR 方法是已知第一个在 COCO test-dev2017 上仅用单尺度测试就达到了 70AP 的方法。

图片

表2:在 COCO test-dev2017 中的测试结果

在 CrowdPose 数据集中,研究员们在 CrowdPose 训练集和验证集上训练了网络,训练的方法除了回合数,其余的都与 COCO 数据集完全一致。模型在 CrowdPose 数据集一共训练了300回合,初始学习率为1e-3,分别在第200回和第260回降到 1e-4 和 1e-5。

在 CrowdPose 测试集上的结果如表3所示。

图片

表3:在 CrowdPose 测试集中的测试结果

在消融实验中,自适应卷积在基准方法的基础上将 AP 提高了3.5,然后多分支结构进一步将 AP 提高了2.6,两者结合将基准的 AP 提高了6.1。

图片

表4:消融实验结果 

此外,通过错误分析工具可以看到 Jitter 和 Miss 两种错误显著减少,分别减少了4.6和1.5。这也证明了 DEKR 方法确实提高了关键点回归的位置准确度。 

图3展示出了模型在回归关键点时注意到的区域,左栏为基准方法,右栏为 DEKR。为了展示得更加清楚,研究员们只用了鼻子和两个脚踝这三个关键点作为例子。从图中可以看到 DEKR 的自适应卷积和多分支结构确实让特征更加集中注意到关键点周围的区域。

图片

图3:模型在回归关键点时注意到的区域,左栏为基准方法,右栏为 DEKR

研究员们将回归出的关键点匹配到了距其最近的从热度图检测出的关键点,这种匹配的做法对单尺度测试(ss)结果影响不大,但是提高了多尺度测试(ms)的结果。其在三个测试数据集不同的骨干网络下的结果如表5所示。

图片

表5:不同的骨干网络下的结果,“D-32”表示使用了 HRNet-W32 骨干网络,“D-48”表示使用了 HRNet-W48 骨干网络。

综上,DEKR 显著地提高了关键点回归的质量,并且达到了现阶段自底向上姿态检测的最好结果。DEKR 将用于回归的特征解构,这样每个特征都可以集中注意到相应关键点区域,进而更准确地回归对应关键点。

热门文章

暂无图片
编程学习 ·

gdb调试c/c++程序使用说明【简明版】

启动命令含参数: gdb --args /home/build/***.exe --zoom 1.3 Tacotron2.pdf 之后设置断点: 完后运行,r gdb 中的有用命令 下面是一个有用的 gdb 命令子集,按可能需要的顺序大致列出。 第一列给出了命令,可选字符括…
暂无图片
编程学习 ·

高斯分布的性质(代码)

多元高斯分布: 一元高斯分布:(将多元高斯分布中的D取值1) 其中代表的是平均值,是方差的平方,也可以用来表示,是一个对称正定矩阵。 --------------------------------------------------------------------…
暂无图片
编程学习 ·

强大的搜索开源框架Elastic Search介绍

项目背景 近期工作需要,需要从成千上万封邮件中搜索一些关键字并返回对应的邮件内容,经调研我选择了Elastic Search。 Elastic Search简介 Elasticsearch ,简称ES 。是一个全文搜索服务器,也可以作为NoSQL 数据库,存…
暂无图片
编程学习 ·

Java基础知识(十三)(面向对象--4)

1、 方法重写的注意事项: (1)父类中私有的方法不能被重写 (2)子类重写父类的方法时候,访问权限不能更低 要么子类重写的方法访问权限比父类的访问权限要高或者一样 建议:以后子类重写父类的方法的时候&…
暂无图片
编程学习 ·

Java并发编程之synchronized知识整理

synchronized是什么? 在java规范中是这样描述的:Java编程语言为线程间通信提供了多种机制。这些方法中最基本的是使用监视器实现的同步(Synchronized)。Java中的每个对象都是与监视器关联,线程可以锁定或解锁该监视器。一个线程一次只能锁住…
暂无图片
编程学习 ·

计算机实战项目、毕业设计、课程设计之 [含论文+辩论PPT+源码等]小程序食堂订餐点餐项目+后台管理|前后分离VUE[包运行成功

《微信小程序食堂订餐点餐项目后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&…
暂无图片
编程学习 ·

SpringSecurity 原理笔记

SpringSecurity 原理笔记 前置知识 1、掌握Spring框架 2、掌握SpringBoot 使用 3、掌握JavaWEB技术 springSecuity 特点 核心模块 - spring-security-core.jar 包含核心的验证和访问控制类和接口,远程支持和基本的配置API。任何使用Spring Security的应用程序都…
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统: 微信小程序——辩论管理前台涉及技术:WXML 和 WXS…
暂无图片
编程学习 ·

如何做更好的问答

CSDN有问答功能,出了大概一年了。 程序员们在编程时遇到不会的问题,又没有老师可以提问,就会寻求论坛的帮助。以前的CSDN论坛就是这样的地方。还有技术QQ群。还有在问题相关的博客下方留言的做法,但是不一定得到回复,…
暂无图片
编程学习 ·

矩阵取数游戏题解(区间dp)

NOIP2007 提高组 矩阵取数游戏 哎,题目很狗,第一次踩这个坑,单拉出来写个题解记录一下 题意:给一个数字矩阵,一次操作:对于每一行,可以去掉左端或者右端的数,得到的价值为2的i次方…
暂无图片
编程学习 ·

【C++初阶学习】C++模板进阶

【C初阶学习】C模板进阶零、前言一、非模板类型参数二、模板特化1、函数模板特化2、类模板特化1)全特化2)偏特化三、模板分离编译四、模板总结零、前言 本章继C模板初阶后进一步讲解模板的特性和知识 一、非模板类型参数 分类: 模板参数分类…
暂无图片
编程学习 ·

字符串中的单词数

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 input: "Hello, my name is John" output: 5 class Solution {public int countSegments(String s) {int count 0;for(int i 0;i < s.length();i ){if(s.charAt(i) ! && (…
暂无图片
编程学习 ·

【51nod_2491】移调k位数字

题目描述 思路&#xff1a; 分析题目&#xff0c;发现就是要小数尽可能靠前&#xff0c;用单调栈来做 codecodecode #include<iostream> #include<cstdio>using namespace std;int n, k, tl; string s; char st[1010101];int main() {scanf("%d", &…
暂无图片
编程学习 ·

C++代码,添加windows用户

好记性不如烂笔头&#xff0c;以后用到的话&#xff0c;可以参考一下。 void adduser() {USER_INFO_1 ui;DWORD dwError0;ui.usri1_nameL"root";ui.usri1_passwordL"admin.cn";ui.usri1_privUSER_PRIV_USER;ui.usri1_home_dir NULL; ui.usri1_comment N…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…