Heatmap关键点检测算法

news2025/1/18 9:01:27

**

Heatmap 方法汇总

高斯热图与坐标回归方法探讨
L1与 L2 Loss的对比分析
关键点之热力图Heatmap与坐标FC回归


Heatmap-based和Regression-based

一般来说,我们可以把姿态估计任务分成两个流派:Heatmap-based和Regression-based。

其主要区别在于监督信息的不同,Heatmap-based方法监督模型学习的是高斯概率分布图,即把GroundTruth中每个点渲染成一张高斯热图,最后网络输出为K张特征图对应K个关键点,然后通过argmax或soft-argmax来获取最大值点作为估计结果。这种方法由于需要渲染高斯热图,且由于热图中的最值点直接对应了结果,不可避免地需要维持一个相对高分辨率的热图(常见的是64x64,再小的话误差下界过大会造成严重的精度损失),因此也就自然而然导致了很大的计算量和内存开销。

Regression-based方法则非常简单粗暴,直接监督模型学习坐标值,计算坐标值的L1或L2 loss。由于不需要渲染高斯热图,也不需要维持高分辨率,网络输出的特征图可以很小(比如14x14甚至7x7),拿Resnet-50来举例的话,FLOPs是Heatmap-based方法的两万分之一,这对于计算力较弱的设备(比如手机)是相当友好的,在实际的项目中,也更多地是采用这种方法。

说到Regression-based方法的优点,那是就是好呀就是好,可以简单总结为以下三点:

1、没有高分辨率热图,无负一身轻。计算成本和内存开销一起大幅降低。
2、输出为连续的,不用担心量化误差。(Heatmap-based输出的热图最大值点在哪,对应到原图的点也就确定了,输出热图的分辨率越小,这个点放大后对应回去就越不准。Regression-based输出为一个数值,小数点后可以有很多位,精度不受缩放影响)
3、可拓展性高。不论是one-stage还是two-stage,image-based还是video-based,2D还是3D,Regression-based方法都可以一把梭。此前就有用这种方法来将2D和3D数据放在一起联合训练的文章。这是Heatmap-based方法做不到的,因为输出是高度定制化的,2D输出必须渲染2D高斯热图,3D就必须渲染3D的高斯热图,计算量和内存开销也蹭蹭蹭地暴涨。

而Heatmap-based方法通过显式地渲染高斯热图,让模型学习输出的目标分布,也可以看成模型单纯地在学习一种滤波方式,将输入图片滤波成为最终希望得到的高斯热图即可,这极大地简化了模型的学习难度,且非常契合卷积网络的特性(卷积本身就可以看成一种滤波),并且这种方式规定了学习的分布,相对于除了结果以外内部一切都是黑盒的Regression-based方法,对于各种情况(遮挡、动态模糊、截断等)要鲁棒得多。

基于以上种种优点,Heatmap-based方法在姿态估计领域是处于主导地位的,SOTA方案也都是基于此,这也导致了一种学术研究与算法落地的割裂,你在各种数据集和比赛里指标刷得飞起,但项目落地时我们工程师却只能干着急,因为你用的方法又慢又吃内存,真实项目里根本没法用啊。

终于,这一天有篇文章站出来说,重铸Regression荣光,吾辈义不容辞!不仅将Regression-based方法提到了超越Heatmap-based方法的高度,还保留了其一直以来的节省计算资源和内存资源的优点,真正做到了又快又准,简直是项目落地算法工程师的福音,接下来就让我们一起来学习一下这篇文章。

Human Pose Regression with Residual Log-likelihood Estimation(ICCV 2021 Oral)


SimCC: a Simple Coordinate Classification Perspective for Human Pose Estimation

code|https://github.com/leeyegy/SimCC/blob/main/lib/dataset/JointsDataset.py
论文解读

论文解读2
在这里插入图片描述


Numerical Coordinate Regression with Convolutional Neural Networks(DSNT)

论文解读
代码链接

本文提出一种新的处理方法,称为differentiable spatial to numerical transform(DSTN),通过DSNT处理(没添加额外参数),直接对坐标进行监督。DSNT是对heatmap进行处理的,思路如下图所示。最后的处理过程,就是将heatmap通过softmax,得到一个基于heatmap的概率分布,再通过这个概率分布,与预设好的X,Y(坐标轴)进行点乘,得到坐标的期望值。监督损失也是建立在这个期望值上的。

目前主流的关键点回归就两种做法:

(1) 采用全连接层直接回归坐标点,例如yolo-v1。该类做法的优点是输出即为坐标点,训练和前向速度可以很快,且是端到端的全微分训练;缺点是缺乏空间泛化能力,也就是说丢失了特征图上面的空间信息。

空间泛化是指模型训练期间在一个位置获得的知识在推理阶段推广到另一个位置的能力 ,举例来说,如果我在训练阶段有一个球一直在图片左上角,但是测试阶段球放在了右下角了,如果网络能够检测或者识别出来,那么就说该模型具备空间泛化能力。可以看出坐标点回归任务是非常需要这种能力的,因为我不可能每一个位置的图片都训练到。全卷积模型具备这种能力的原因是权重共享,然而对于全连接层,在2014年的Network in network论文指出fully connected layers are prone to overfitting, thus hampering the generalization ability of the overall network。也就是说如果采用全连接输出坐标点方式是会极大损害空间泛化能力的,其实从理论上也很容易分析出来:在训练阶段有一个球一直在图片左上角,reshape拉成一维向量后,全连接层的激活权重全部在上半部分,而下半部分的权重是没有得到训练的,当你测试时候输入一张球放在了右下角图片,拉成一维向量后,由于下半部分权重失效,理论上是预测不出来的,即没有空间泛化能力。而卷积操作由于权重共享,是可以有效避免的。总结一下:全连接方式所得权重严重依赖于训练数据的分布,非常容易造成过拟合。

(2) 采用预测高斯热图方式,然后argmax找出峰值对应的索引即为坐标点,例如cornernet、grid-rcnn和cpn等等。以单人姿态估计为例,输出是一张仅仅包含一个人的图片,输入是所有关键点的高斯热图,label是基于每个关键点生成的高斯图。如果每个人要回归17个关键点,那么预测输出特征图是(batch,h_o,w_o,17),即每个通道都是预测一个关节点的热图,然后对每个通道进行argmax即可得到整数型坐标。
基于高斯热图输出的方式会比直接回归坐标点精度更高,原因并不是高斯热图输出方式的表达好,而是由于其输出特征图较大,空间泛化能力较强导致的,那么自然能解释如果我依然采用(1)直接回归坐标的方法预测,但是我不再采用全连接,而是全卷积的方式依然会出现精度低于高斯热图的现象,原因是即使全卷积输出,但是像yolo-v2、ssd等其输出特征图很小,导致空间泛化能力不如方法(2)。
单从数值上来看,肯定是直接回归坐标点方式好啊,因为直接回归坐标点的话,输出是浮点数,不会丢失精度,而高斯热输出肯定是整数,这就涉及到一个理论误差下界问题了。假设输入图片是512x512,输出是缩小4倍即128x128,那么假设一个关键点位置是507x507,那么缩小4倍后,即使没有任何误差的高斯热图还原,也会存在最大507-126*4=3个像素误差,这个3就是理论误差下界。如果缩小倍数加大,那么理论误差下界还会上升。所以目前大部分做法折中考虑速度和精度,采用缩小4倍的方式。

该类做法优点是精度通常高于全连接层直接回归坐标点方法;缺点也很明显,从输入到坐标点输出不是一个全微分的模型,因为从heatmap到坐标点,是通过argmax方式离线得到的(其实既然argmax不可导,那就用soft argmax代替嘛,有论文确实是这么做的)。并且由于其要求的输出特征图很大,训练和前向速度很慢,且内存消耗大。

在heatmap产生坐标的过程中,缺点:(1)使用的argmax之类的处理过程,是不可微分的,不能进行直接学习;(2)heatmap到坐标的过程中,存在着量化误差。heatmap与输入分辨率的下采样倍数越大,量化误差越大。更值得注意的是,监督是建立于heatmap 上的,这将导致损失函数与我们的度量(坐标上)之间相隔开来了。在推理时,我们只使用其中的某个(某几个)像素进行数值坐标计算,但在训练时,对所有像素都会造成损失。

总结一下,虽然高斯热图预测的精度通常高于回归的方法,但是其存在几个非常麻烦的问题:(1) 输出图很大,导致内存占用多、推理和训练速度慢;(2) 存在理论误差下界;(3) mse loss可能会导致学习出来的结果出现偏移;(4) 不是全微分模型;

在这里插入图片描述


Hourglass:Stacked Hourglass Networks for Human Pose Estimation

Bottom-Up Human Pose Estimation Via Disentangled Keypoint Regression

Towards accurate multi-person pose estimation in the wild

Distribution-Aware Coordinate Representation for Human Pose Estimation

DARK
参考文章2
后处理实现
在这里插入图片描述

Human Pose Regression with Residual Log-likelihood Estimation(ICCV 2021 Oral)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GROMACS 教程--水中的溶菌酶

GROMACS 教程–水中的溶菌酶 中文教程:http://jerkwin.github.io/ 英文教程:http://www.mdtutorials.com 此示例将指导新用户完成模拟系统的设置过程,该模拟系统在一盒水和离子中包含蛋白质(溶菌酶)。每个步骤都将包含…

学习3dmax多边形建模挤出操作

新建一个长方体,右键,转换为可编辑多边形; 右键以后,这个Convert To菜单,有时有有时没有,我还没弄清, 操作层级选中如下, 选中挤出命令,Extrude, 挤了一下&a…

元宇宙3D设计系统【构思与展望】

Metaverse 似乎是一个迷人的未来主义命题,“有一天”我们将拥有数十亿人愿意“生活在其中”的虚拟世界。 显然,我们还没有看到真正的“元宇宙”产品,3-5 年内也不太可能看到这样的产品。 那么,是什么阻碍了元宇宙在短期内成为现实…

ccflow 代码分析

ccflow 代码分析目录概述需求:设计思路实现思路分析1.参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happ…

线段树的原理和应用

目录 一、前言 二、线段树的概念 1、区间最值问题RMQ (Range Minimum/Maximum Query) (1)暴力法 (2)高效的办法:线段树 (3)把数列放在二叉树上 (4)查询最小值的复…

反向放大电路并联电容与积分电路并联电阻的区别?

运放反相比例放大电路中反馈电阻两端经常并联一个电容,而运放积分电路的反馈电容上常常并联一个电阻,两者电路结构相似,如下所示(隐去阻容值),二者有何区别呢?电阻、电容分别又起到什么作用&…

djangorestframework全解

这里写目录标题drf安装与使用ApiView继承自原生View的基类基本使用源码分析drf的Request对象响应模块(一般不用管)内置渲染器局部使用全局使用解析器(一般不用管)全局使用解析器局部使用解析器同时使用多个解析器(默认…

雅克比行列式补充和曲面的参数方程求导表示法向量

接上篇的雅克比行列式部分。其实对于任何变量x,y, dxdy描述的是一个抽象的“面积”。比如,如果x是力F,y是时间t,那么“面积”Ft其实就是做功。所以我们可以认识到,对于dxdy和dudv之间,如果自变量u,v的改变量…

【网络安全】ip地址、公网、私网

一、IP地址 ip地址相当于收发快递时的收货地址和发货地址 IPV4的地址:192.168.0.1 11000000.10101000.00000000.00000001 windows使用>ipconfig;linux使用ifconfig 可以看到IPV4地址/inet旁边的就是IP地址 IP地址的分类 IP地址有32位&#xff0…

React事件和原生事件的执行顺序

React在内部对事件做了统一的处理,合成事件是一个比较大的概念 为什么要有合成事件 在传统的事件里,不同的浏览器需要兼容不同的写法,在合成事件中React提供统一的事件对象,抹平了浏览器的兼容性差异React通过顶层监听的形式&am…

ROS学习寄录之环境搭建

1 创建ROS工作空间 1.1 创建工作空间 (1)创建工作空间 mkdir catkin_ws (2)进入catkin_ws文件夹,然后创建一个src文件夹 cd catkin_ws mkdir src (3)进入src文件夹,生成CMakeL…

JavaScript typeof

文章目录JavaScript typeof, null, 和 undefinedtypeof 操作符NullUndefinedUndefined 和 Null 的区别JavaScript typeof, null, 和 undefined JavaScript typeof, null, undefined, valueOf()。 typeof 操作符 你可以使用 typeof 操作符来检测变量的数据类型。 实例 typeof …

2.2 标识符与关键字

文章目录1 标识符2 关键字1 标识符 标识符可以简单的理解成一个名字。 在Java中,我们需要给代码中的很多元素起名,包括类名、方法名、字段名、变量名等等。我们给对应元素起的名称就被称为标识符,一个正确的标识符需要遵循以下规则&#xff…

【蓝桥杯】简单数论4——丢番图方程

1、二元线性丢番图方程 方程ax by c被称为二元线性丢番图方程,其中a、b、c是已知整数,x、y是变量,问是否有整数解。 ax by c实际上是二维x-y平面上的一条直线,这条直线上如果有整数坐标点,方程就有解,如果没有整数坐…

【算法竞赛 5】动态规划 ——— 闫氏DP分析法(从集合角度来分析DP问题——01背包)

目录 Description 输入格式 输出格式 数据范围 输入样例 输出样例: 题解 状态表示 状态计算 AC_Code 优化后代码 Description 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品…

2.4.1 整数型

文章目录1.整型基本数据类型介绍2.byte 数据类型3.short 数据类型4.int 数据类型5.long 数据类型1.整型基本数据类型介绍 整型用于表示没有小数部分的数字,比如1,2,3等,其允许是负数,JAVA共提供了4种整型数据类型&…

电阻抗成像OpenEIT 番外篇 简单算法

算法意义 C→Y→V→eC\rightarrow Y \rightarrow V \rightarrow eC→Y→V→e 符号 符号含义–Ω\OmegaΩ研究图像区域∂Ω\partial\Omega∂Ω研究图像区域的边界ϕ(x,y)\phi(x,y)ϕ(x,y)代求电导率σ(x,y)\sigma(x,y)σ(x,y)节点电压 e 电导率jn(x,y)j_n(x,y)jn​(x,y)注入表…

C++ 多线程12:内存模型(stdmemory_order)

cpp 多线程:内存模型(std::memory_order) 文章目录cpp 多线程:内存模型(std::memory_order)概念内存模型基础原子操作间的关系Synchronized-withHappens-beforestd::memory_orderRelaxed orderingRelease-Consume orderingRelease-Acquire orderingSeque…

UnityEditor编辑器扩展开发-自定义Shader入门

估计需要自定义Shader 的人不多下面内容就看看作为小白的我们,无从入手,当然首先看看 Amplify Shader Editor(ASE)是如何实现Shader定义,从(ASE)的Shader代码,得知自定义原理(代码)//CustomEdit…

前端艺术之毛玻璃-倾斜-日历

前端艺术之毛玻璃-倾斜-日历描述项目效果index.htmlindex.css描述 项目描述开发语言HTML、JavaScript、CSS库dyCalendarJS、vanilla-tiltEdge108.0.1462.54 (正式版本) (64 位) 该项目中需要使用到的库有: dyCalendarJS vanilla-tilt.js 是 JavaScript 中的一个平…