百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

换个角度理解关键点定位的Heatmap和Regression方法

toyiye 2024-06-06 22:12 12 浏览 0 评论

作者丨Tau

编辑丨极市平台

论文地址:2003.03771.pdf (arxiv.org)

开源地址:jhb86253817/PIPNet: Efficient facial landmark detector (github.com)

0. 前言

从广泛意义上讲,不论是人体姿态估计、手部姿态估计这样的姿态估计任务,还是人脸关键点检测,甚至于目标检测任务中的BBox定位,其实都可以看成是一种关键点定位任务。对于这一类任务,目前大家的做法也基本上达成了共识,大致上可分为Heapmap-based和Regression-Based两派,在细节处理上,根据监督信息不同,又衍生出了用Heatmap监督Heatmap,用坐标值监督坐标值,以及用坐标点来监督Heatmap的Soft-argmax流派。

由于不同下游任务上数据的特性不同,根据对性能和精度的取舍不同,大家在细节方法的选择上也各有不同,但往往都是立足于讨论一个不足之处,并提出解决方案,近年比较多的工作是在于提升Regression方法的精度,让其逼近或超越Heatmap。而对于Heatmap和Regression的优劣产生的原因,我暂时没有读到分析得特别让我满意的。

这篇工作是立足于人脸关键点任务的,但由于人脸近似于刚体这样的性质,会要求网络能尽量保证所有关键点的排布尽量连续,全局形状尽量稳定,不要有太大的变形。所以在Heatmap和Regression在全局形状保持能力上,进行了实验,分析了两种方法优劣产生的原因,其分析让我比较认同,因此写了这篇笔记进行记录。

由于我认为这篇工作有意思的地方在于对两种流派特性的分析,而不是本文提出的方法本身有多novel,因此这并不是一篇文章解读类的笔记,我会更多地关注分析的部分。

1. 文章贡献

从贡献而言,本工作提出了一个新的模型结构,形似于anchor-free目标检测模型中对bbox预测的做法;外加提出一种新的训练策略,运用课程学习(Curriculem Learning)的思想来进行迭代式半监督训练。

但是说实话,我读完之后觉得模型结构并不算新颖,提出的训练策略也很麻烦,除非是需要高强度调参刷点数,或者打比赛,否则估计在实际业务中价值是比较有限的。

这篇文章引起我兴趣的地方在于,Heatmap和Regression方法对于关键点连续性、全局形状的保持、极端视角下鲁棒性的实验的分析,得出了一些我比较认同的结论,并启发出了我的一些思考,促使我写这篇笔记。

2. 从人脸关键点定位说起

跟人体、手部相比,人脸有一个特性——近似于刚体,换句话说,大部分的关键点形状是比较固定的,彼此之间相对位置也比较固定,偏移和自遮挡的情况较为单一,不同于人体、人手的高自由度。因此,我们也会期望在任何情况下,模型预测的关键点轮廓是比较连续的,不会出现大的变形,不会预测出明显的离群点:

那么从预测的关键点形状的稳定性来看,Heatmap和Regression方法各自表现如何呢?本文从这里入手进行了实验对比:

通过对比我们可以发现,Regression方法存在着大量点位不够贴合,对于眨眼、咧嘴等细微动作反馈不到位的问题。

尽管在平均误差指标上,Heatmap方法比起Regression方法有优势,但对于关键点的连续性、相对位置的稳定性,表现却是不如Regression方法的,尤其是在一些比较极端的视角或遮挡下,关键点之间出现了明显的不连续,而Regression依然能保持一个较好的整体形状,换句话说,Regression方法具有更好的鲁棒性。

很自然地,我们就会开始思索,造成这两种方法鲁棒性差异的原因是什么呢?

从定位的原理上来看,Heatmap和Regression两种方法差异是很大的:

Heatmap方法实际上是在空间维度上做特征匹配,是卷积核在特征图平面上“滑动”,更多地关注和利用的是局部信息,而定位实际上是特征匹配的“副产品”,是我们通过求响应最大点索引(Argmax)的方式获得的,相对来说,每一个关键点的计算是独立的

而Regression方法则不同,所有的关键点计算是同时完成的,共享了同一份特征信息

本文作者认为,这是影响定位点鲁棒性的关键。

这种鲁棒性,实际上可以看成是一种隐式先验信息,就像对于人来说,我们都会知道嘴巴长在鼻子下面,这种隐式先验强大到,我们即使闭上眼睛吃饭,手依然可以准确地把食物送到嘴里。模型通过训练,同样学习到了这样的隐式先验。

从直觉上不难理解,回归方法基于共享的特征,从先天上就擅长对这种隐式先验的学习。可是Heatmap方法又是怎么做到准确定位的呢?要知道对于分类网络而言,即使眼睛和嘴巴位置互换,网络也还是会预测为人脸,那么为什么Heatmap方法不会出现左右眼的定位点混乱呢?光靠特征匹配的话,左右脸上可是有大量的点特征是高度相似的。

关于这一点,在2020年其实学术界已早有研究发现,卷积网络实际上通过zero padding同样也学到了位置信息。为了验证这一点,本文将在人脸数据集上训练好的Heatmap和Regression模型,分别在纯黑图片、非人脸图片上进行了实验:

让我们暂时忽略PIPNet的结果,我们可以看到,Heatmap方法在纯黑图片上,同样能输出具有正常轮廓的人脸形状,这说明模型确实记住了关键点之间的位置关系。

但在非人脸图像上,Heatmap方法预测的关键点形状明显崩坏了不少,这与我们关于“特征匹配的特性会破坏形状的连续”的推测相吻合。

反观Regression方法的结果,在非人脸图像上依然能保持较好的人脸形状,本文作者认为这说明Regression具有更好的鲁棒性,我觉得从某种程度上来讲,这也可以解释为回归方法对训练数据的过拟合。

那么很自然地,作者给出了一个折中方案,希望能同时从Heatmap和Regression方法中获益,吸取二者的优势,顺带还解决了Heatmap方法普遍存在的上采样计算量过大的问题。

2. 折中方案

之所以我称之为折中方案,是因为本文提出的所谓Pixel-in-Pixel(PIP)模块是这样的:用Backbone对图片提取下采样的特征图,特征图上的每一格都同时预测关键点的存在性(文中称为score)和关键点关于本格左上角的偏移(offset)。

明眼人一看就会感觉非常眼熟,这不就是目标检测头部一贯的做法吗?

模型相当于同时在做Heatmap和Regression,靠Heatmap特征匹配来确定关键点的粗略位置,再在小范围内依靠Regression补充出精确位置,如此一来,既省去了Heatmap上采样补足精度的步骤,又比纯粹依靠Regression得出所有点来得灵活。

更具体地分析,由于下采样得到的特征图分辨率是小于输入图片的,因此不可避免地,会有一些关键点落在Heatmap的同一格里,这使得这些点在Regression时依赖了同一块区域特征,从而获得了形状的鲁棒

这个思路听上去很美好,但是真的没有问题吗?要知道Heatmap既然是在做特征匹配,那完全有可能相邻的点匹配到了相隔较远的地方,这样就又没有共享特征的说法了。

而实验结果也是如此,尽管PIP确实相较于纯Heatmap方法,连续性问题缓解了一些,但依然是存在的。

于是作者又提出了一个邻居节点回归模块(NRM, Neighbor Regression Module)来进一步缓和这个问题。我这里用的词是“缓和”,因为我认为这种方法并不算高明,也没有真正解决这个问题。

所谓NRM,其实就是让原本每一格预测一个关键点,变成了预测多个关键点,也就是说,一块特征除了预测自己那个点外,还要预测周围最近的关键点。

这种思路有点类似于:既然Heatmap可能跑偏,导致邻近点无法共享特征,那我干脆让每块特征都预测邻近点,这样一来,就保证了所有邻近点必然都能享受到共享特征带来的鲁棒性。

这个思想其实挺符合直觉的,但我总觉得有点暴力,而且本文对于邻近点的定义也非常粗暴,是从平均脸型上用欧氏距离计算得到的。这当然是不太合理的,且不谈平均脸上的邻近点跟特殊姿态下有差异,本文用同一个超参数C来要求每块区域预测相同数量的邻近点,这个做法也不是很优雅,而最终的预测结果是所有点预测结果取平均,这更是和稀泥和到姥姥家了=。=

这样的操作就像强行对邻近点做了平均滤波,以此来获得连续性上的提升,也可以理解成在模型头部进行了一个小参数量模块的模型集成,从结果来看,PIP+NRM的确获得了不错的连续性。

3. 换个角度理解PIP+NRM

尽管上面吐槽归吐槽,这一套照搬目标检测思想搞出来的关键点检测结构,确实取得了不错的效果,所以还是值得我们细品一番的。

对目标检测算法有一些了解的小伙伴应该都知道,目标检测算法大致是Backbone+FPN+Head的结构,而Head部分分成了两个头部,一个负责做分类,一个负责回归计算BBox。

对应到本文中,PIP分成了score和offset两个头部,用Heatmap的方式监督score,用Regression方式监督offset。

Heatmap方法在监督时有两种做法,一种是渲染一个二维高斯分布,另一种是在二维平面上取one-hot,当然,后一种可以看成前一种的特例,在损失函数的选择上,分成了MSE Loss和CrossEntropy Loss两种,背后对应的思想都是拟合一种概率分布,也是在做分类问题。

Regression部分,PIP只预测了一个点,因此缺乏对邻近点隐式先验的学习,我们联系目标检测想一想,目标检测的回归头一般会回归四个值(x, y, w, h),是不是一下就有NRM预测邻近点内味儿了?

在进一步思考,传统的Heatmap和Regression方法,实际上可以看成是这种目标检测结构的两种特例

我们很容易理解到,PIP的收益,一部分来源于下采样特征图压缩了分辨率,使得一部分邻近点可以共享特征。随着下采样率的提升,分辨率会越来越小,分类任务的难度会降低,回归任务的难度在提升。在极端情况下,输入图片可以被下采样成一个像素,在这个情况下,分类任务退化成了一个0-1分类问题,彻底丧失了空间信息;回归头变成了标准Regression方法的形式,在整张图片尺度上预测关键点坐标。

在另一种极端情况下,输入图片不进行任何下采样(或者通过上采样将特征还原到输入分辨率),此时的score特征图,是在做一个HxW类的分类任务,或者说,在预测一个HxW维的概率分布,分类头退化成标准Heatmap方法的形式,而回归头失去了意义。

因此,可以发现,PIP+NRM实际上是对Heatmap和Regression两种形式的统一,虽然看上去是在照搬目标检测的东西,但这背后的思想是很深刻的。

4. 结语

本文后面还提出了一种基于Curriculum learning思想的半监督学习策略,能从数据层面提升模型的表现,但说实话我觉得不太实用,也不太吸引我,因此不在这里进行介绍了,有兴趣的小伙伴可以自行阅读原文。

对于C个邻近点的选择,本文也进行了实验调参,得出了一个在特定数据集上最优的数字,但说实话价值有限,我也不太认同基于平均脸上的欧氏距离确定邻近点的做法。

关于最终模型输出的坐标,所有输出点取平均的做法也有待商榷,感觉上用加权的形式,或者类似于GFL用分布的形式来学习。

以上都是一些本文我觉得有待探索的部分,但本文的分析让我对Heatmap和Regression两种流派有了更多的理解,在实际业务中,在工程上,很多时候我们算法工程师其实也只是在寻找一种折中方案罢了,其实没有那么多的“无痛涨点”和“即插即用”,我们只是一群在天平上小心翼翼trade-off的人。

感谢相伴,希望本文对你有所帮助,能在下次trade-off时更加有迹可循,找到属于你的rich reward~

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码