新鲜出炉的ICCV Oral,由于我的工作内容是姿态估计相关,因此也在第一时间拜读了一下,以下是一些笔记和过往经验的总结。由于我自身能力有限,文章中存在错误请见谅,欢迎指正。

论文地址:https://jeffli.site/res-loglikelihood-regression/resources/ICCV21-RLE.pdf

开源地址:https://github.com/Jeff-sjtu/res-loglikelihood-regression

这两天抓紧时间看了下作者放出来的代码,发现有些地方值得注意:

  1. 本文走的是用(joint_num*3)维的FC层直接回归出坐标点的路子,可以说是非常暴力了,这和我一开始想的soft-argmax的路线还不太一样,这显得RLE更强了;

  2. 根据我过去工作的经验,用soft-argmax积分热图来回归的方法应该能取得比纯FC更好的效果,在对比实验中也没有把RLE用到Integral Pose上的实验,直觉上应该能再涨点才对。我正在自己的数据上跑实验,出了结果会在这里更新。后续:我跟作者取得了联系,根据作者的说法积分热图确实能带来轻微的提升,但增加了计算量。

Hi Tau. Actually, we did conduct experiments on the soft-argmax based method. We use ResNet-50 and usingsigmoidto predict the normalized heatmap. The original model obtains 65.7 mAP on the COCO validation set, and the model trained with RLE obtain 70.7 mAP. This is slightly better than the direct regression method (70.5 mAP without pretrained). Although using soft-argmax is better, but we think the improvement is marginal and it brings more computation.

调了几天,终于在我自己的项目上跑起来了,记录一些遇到的坑:

  1. RLE这个loss数值是可正可负的,因为L=-log p,当p>1的时候就会为负数,基本上训到后面都会是负的,这是正常现象;

  2. 这个loss对数据噪声比较敏感,很容易导致模型训崩,我之前的训练数据清洗得不够干净(自己没发现),但在L1 loss上训练没有遇到问题,在RLE上模型直接训崩了,debug了很久才发现是数据噪声问题(比如坐标值超出了图片范围);

  3. 作者的训练代码里,坐标值是经过了归一化的,在RegressionFlow模型中使用的bar_mu = (pred_jts - gt_uvd) / sigma 时,sigma也进行了sigmoid限制在0~1之间。

作者放出的源代码直接使用的话,很多人会遇到训练途中loss突然暴增然后又掉下来的现象,这个主要是训练数据中的异常值导致的,可以增大sigma上加的eps,默认用的1e-9,可以改为1e-5,这样能有效缓解以上异常,在我的实验中这样的修改不会对模型性能造成明显影响。

前言

打开网易新闻 查看精彩图片

一般来说,我们可以把姿态估计任务分成两个流派: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方法的高度,还保留了其一直以来的节省计算资源和内存资源的优点,真正做到了又快又准,简直是项目落地算法工程师的福音,接下来就让我们一起来学习一下这篇文章。

核心思想

打开网易新闻 查看精彩图片

从极大似然估计(Maximum Likelihood Estimation, MLE)的角度来看问题,损失函数的选择其实是基于我们对目标分布的假设的,如果我们假设目标分布服从高斯分布,那么损失函数就应该选择L2 loss,如果假设为拉普拉斯分布,则应该选择L1 loss。

这里其实我还延申出来一个理解,早一些时候的文章大家都选择L2 loss作为损失函数,但近来越来越多的文章选择L1 loss,并且有翔实的实验显示L1在大多数情况下都会优于L2,对于这个现象我一开始是作为一种实验得到的经验结论进行记忆的,但到这里我才理解,选择L2其实是一件很自然的事情,因为高斯分布具有大量优秀的特性:采样方便、解析的密度已知、KL距离容易计算,还有中心极限定理的保证——任何大的数据都趋近于高斯分布,所以你怎么用它几乎都是对的。但对于姿态估计任务而言,由于要精确地预测关键点位置,实际上概率分布是相对来说比较稀疏的,只有小部分区域具有概率,因此将拉普拉斯分布作为先验可能是一种更好的假设。

从这个视角来思考,我们其实可以把Heatmap-based方法看成是对模型的中间结果进行了监督,显式地要求模型学习高斯概率分布,进而得出结果;而Regression-based方法由于缺少对概率分布的监督约束,模型内部学到的分布是不稳定的,完全受到训练数据的支配,因此在性能和鲁棒性上逊于Heatmap-based方法也就不难想象了。

因此我们也可以知道,一个正确的密度函数假设对优化结果是起到主导性作用的。但在实际问题中,目标的分布是未知的,我们所掌握的数据也是有限的,模型很难单纯通过数据回归出真实的密度函数,有没有比草率地假设某一个分布更好的选择呢?有的,这里我们将引入这篇文章的核心之一,标准化流(Normalizing Flows)。

标准化流

标准化流是一类深度生成式模型,具体的数学原理有兴趣的朋友可以自行搜索,我这里比较肤浅地将其理解为,通过构造一个可逆的变换函数,能将一些基本的简单分布(如高斯分布)变换为任意的复杂分布。

这里用李宏毅老师的视频截图来进行直观展示,通过一系列可逆变换的叠加,可以将简单分布变换成任意的复杂分布:

打开网易新闻 查看精彩图片

换句话说,虽然现阶段我们条件有限,我们的回归模型只能拟合一个简单分布,但我可以对拟合出来的结果进行变换,让变换后的结果更接近真实分布,只要我的变换足够复杂,理论上我可以拟合任意的目标分布。而这里的变换,实际上也就是我们的神经网络,因为神经网络理论上可以逼近任意的函数,因此流模型中那一系列叠加的可逆变换可以通过叠加的FC层实现。也就是说,我们将网络学习的目标,从让网络直接拟合目标分布,变成了拟合简单分布+流模型变换调整两个步骤。

打开网易新闻 查看精彩图片

结果用极大似然估计法,损失函数可以表示为:

打开网易新闻 查看精彩图片

以上的描述对应图中的(a)设计。

重参数化

尽管思想上是说得通了,但在实际实现中,还需要一些技巧。

Regression-based方法是要网络直接预测坐标值的,但是(a)中的设计显然增加了步骤,而且让网络先拟合简单分布再进行变换的思路,似乎也有点绕弯路的感觉。因此作者进一步改进了方案,我们先对一个标准的基础分布进行变换,然后让网络直接学变换后的真实分布不是更好吗?

在实际操作中,作者假设所有底层分布共享相同的密度函数族,但是根据输入不同,会有不同的均值和方差(可以理解为需要对原始分布进行平移和缩放)。我们以标准正态分布为基础分布,通过流模型将基础分布变换为真实分布的原始分布,用回归网络来预测平移和缩放系数 和 。这里的平移和缩放参数,实际上就是预测值和GT的偏移量。

注意这里的符号!!带hat的是偏移量,或者说平移缩放系数,头上带overline一横的是真实目标分布。

到了这里,我们模型的学习目标也发生了改变,已经从(a)中的:回归模型学习基础分布,流模型学习将基础分布变换为真实分布;变成了:流模型学习GT的偏移量的原始分布变换,回归模型学习变换后的原始分布的平移缩放参数。

损失函数也因此可以简化为:

打开网易新闻 查看精彩图片

经过以上的简化,我们的模型已经可以端到端地进行训练了,但实际上还是存在一些问题。

不难发现,我们的回归模型的学习是完全依赖于流模型变换的结果的,而在模型训练的初期,我们学到的变换函数是非常不准的,如果让回归模型去拟合基于不正确的变换得到的目标分布,对于模型性能是有害的。但端到端训练的原则让我们不想将训练变成二阶段的(即先训练流模型,训好以后再训练回归模型),因此本文又引入了一个残差对数似然估计(Residual Log-likelihood Estimation, RLE)的概念。

残差对数似然估计

要解决上面提到的模型依赖问题,本文设计了一条梯度shortcut来降低依赖程度。

用公式表示流模型拟合的目标分布,可以构造拆分为三项:

打开网易新闻 查看精彩图片

其中第一项Q(x)是一个简单分布(如高斯分布或拉普拉斯分布),第二项我们称之为残差对数似然项,第三项是一个常数s。

我们可以假设Q(x)是大致上接近于目标分布的,只是不够完美,这在之前我们已经有眉目了,选高斯分布不会错,选拉普拉斯分布更优。残差对数似然项是对第一项的一个补充,用于填补简单分布不够完美的部分,因此目标概率分布公式可以写成:

打开网易新闻 查看精彩图片

其中G(x)是流模型所需要学习的分布。经过这样的变换后,我们可以发现,回归模型对流模型的依赖被大大减轻了,因为不论流模型学到的结果如何,都只是在简单分布的基础上进行补充。这里的简单分布恰好正是我们前人使用的baseline,所以不管怎么学,我们的回归模型都不会太差,相反,随着流模型对变换参数的预测越来越准确,回归模型所拟合的分布将比baseline更加接近真实分布。

最终得到训练的损失函数为:

打开网易新闻 查看精彩图片

而当训练结束,回归模型学到的平移缩放参数就固定了,我们的流模型也固定了,由于我们假设所有的数据都服从我们的目标分布,变换函数是不会因为输入数据的变化而受影响的。更牛逼的是,由于是在N(0, I)的标准分布上进行的变换,在测试推理阶段,平移缩放系数直接就可以看成最终预测的坐标值。

因此在推理阶段我们就不再需要运行流模型了,我们的回归网络至此已经学到了流模型变换后的真实分布。这也是本文提出的方法的妙处所在,训练时对目标分布的假设就已经确定了,剩下的就又回到了Regression-based方法的既定流程上,确定分布假设,对应设计损失函数即可。

流模型这部分的逻辑比较绕,而且(a)(b)(c)三种方案里几个mu和sigma的含义是有不同,但又能互相转化的,建议对照着那张路程图多看几遍,最好结合原文来理解,笔者才疏学浅,表达得可能不够清晰。

流模型

本文选择的基础分布为拉普拉斯分布,这也是符合前人实验结论的,大量的实验结果佐证了拉普拉斯分布应该是一个比较接近于真实目标分布的假设,只是不够完美,但这足够我们选择它作为变换的基础,有利于简化变换的难度,降低学习的难度。

而常见的可以选择流模型其实有很多种,本文经过实验对比最终选择了RealNVP,可逆变换函数用3个具有64个神经元的全连接层来表示。这样一个简单的轻量级的流模型,对训练速度的影响是几乎可以忽略的。

在文章最后的附录中,作者也对学到的分布进行了可视化:

打开网易新闻 查看精彩图片

实验结果

对所提出方法的消融实验如下:

打开网易新闻 查看精彩图片

这个实验以在Resnet50上对L1 loss进行直接回归作为baseline,通过加入重参数化后的流模型进行直接似然估计的端到端训练(Direct Likelihood Estimation, DLE)可以带来4.6mAP的提升,加入残差对数似然估计来减轻模型依赖后的提升变为12.4mAP,最后加入前人文章中用到的训练技巧,先用heatmap对backbone进行预训练,然后再用Regression-based方法进行微调,可以最终带来13.2mAP的提升。

PS:这个预训练技巧其实还蛮有用的,可以学一手

打开网易新闻 查看精彩图片

跟现有SOTA方法的对比如图,可以看到能让Regression-based方法达到媲美Heatmap-based方法的高度,其他更多的消融实验和参数选择实验我在这里就不一一贴出来了,有兴趣的朋友可以自行查阅论文。

以上是对本文进行学习后的一些记录,可能存在一些理解有误或者不够精准的地方,后续可能会进行修改,也欢迎大家进行指正,感谢阅读。

来源:知乎

作者:镜子

深延科技|

打开网易新闻 查看精彩图片

深延科技成立于2018年,是深兰科技(DeepBlue)旗下的子公司,以“人工智能赋能企业与行业”为使命,助力合作伙伴降低成本、提升效率并挖掘更多商业机会,进一步开拓市场,服务民生。公司推出四款平台产品——深延智能数据标注平台、深延AI开发平台、深延自动化机器学习平台、深延AI开放平台,涵盖从数据标注及处理,到模型构建,再到行业应用和解决方案的全流程服务,一站式助力企业“AI”化。