前言
上一期 DEKR 解构式人体关键点回归(一):算法思想与原理 解析了DEKR的算法与工作原理,这期本文将聚焦于标签分配。当然,首先得了解标签是什么,明确模型的学习目标,然后再进一步看看如何制作与分配标签。
https://leetcode-cn.com/problems/distinct-subsequences/
目录
I. 定义标签
II. 标签分配
定义标签
通过上一期,我们了解到DEKR会针对每类关键点解构式地回归出它们的位置,因此容易想到标签必须含有关键点的位置。于是,这就是回归任务对应的标签。但是回归位置并非是直接预测关键点的坐标,而是基于偏移(offset)的形式。
除此之外,既然我们利用网络提取了关键点特征,那么这些特征就应该利用起来对关键点进行识别。因此,还需要设置一个分类标签,而对关键点进行识别通常基于热度图(heatmap)的形式。
综上,训练的标签包含两种:
一种对应于分类任务,是heatmap的形式,在其中只有关键点所在位置才有非0值,这种是最直观的hard形式,而在实际操作中通常会采用soft形式:以关键点位置为中心,中心值为1向四周逐渐衰减,最经典的莫过于高斯核;
而另一种则对应于回归任务,是offset的形式,即:每个特征点位置都计算当前位置与各关键点的距离(坐标差值)。但是,直接这样做是会出问题的,因为一幅图像中往往有多个人,那么如果一个特征点去回归所有人的关键点位置那明显模型会不好学习,而且计算量也大。因此,一种更合理的方式应当是:特征点选择距离其最近的人的关键点进行回归。然而,DEKR实际是如何实现的呢?CW在下一节为大家揭晓。
标签分配
Heatmap
其实在上一节已经大致揭晓答案了,就是采用高斯核的方式:在每个关键点位置 ,以其为中心向四周扩散,只有处于核半径范围内的位置 (x,y) 才属于正样本,对应的标签值根据高斯函数计算:
至于负样本嘛,它们的标签值当然就是0啦,你是不是这样想?这里还真不是,DEKR“宽宏大量”——给了它们值为0.1的权重。
那么问题来了,如果一个正样本 (x,y) 处于多个关键点的高斯核半径范围内,那么它应该负责预测哪个关键点?标签值该如何设置?
最直接拍脑袋的做法——选择最近的那个关键点去预测。那么,对应的标签值就是最大的那个。因为由高斯函数的公式可知,距离中心越近函数值越大。
另外,还有个重点需要说明下,就是DEKR不仅为各类关键点(COCO是17类)制作了heatmap,而且还为一种被称为中心点的虚拟关键点(后简称虚拟中心点)制作了heatmap。这种虚拟中心点与人一一对应,其坐标值就是每个人所有关键点的坐标均值。
这个虚拟中心点很关键,因为接下来的offset标签主要是基于它进行分配的。
这样,heatmap的shape最终将是 (b,num\_joints+1,h,w) ,其中 num\_joints 指的是有几种关键点(COCO的话就是17种),+1就是加上了虚拟中心点, h,w 即输出特征图的高和宽。
Offset
其实这部分的思想和以上Heatmap那里的差不多,只不过不是基于高斯核的方式,而是直接设定一个距离 r ,以虚拟中心点为中心, 横、纵坐标与虚拟中心点的距离都不超过 r 的位置 (x,y) 则为正样本,其标签值由该位置坐标与各个关键点 (COCO的话就是17个)的坐标作差计算得出:
这时,问题又来了(CW是问题少年/女吗..):如果一个正样本 (x,y) 处于多个虚拟中心点(也就是对应多个人)的有效范围内,那么它该回归哪个人的关键点位置呢?
DEKR的做法是:选择面积最小的人去回归。至于每个人的面积,则是根据其中关键点之间的最远距离来计算。
可能有靓仔靓女们会问:为何这里不能像上述Heatmap部分那样选择最近的关键点进行回归呢?如果那样的话,一个正样本就可能回归多个人的关键点位置,而正样本是要被模型看作(学习)虚拟中心点的位置,其与人是一一对应的,也是就说,在宏观意义上,它被视作一个人。
因此,DEKR的做法,就能保证正样本回归的关键点都是属于同一个人的。
另外,由于在图像中,远近高低各人的尺度不一,因此直接回归绝对坐标的差值是不理智的,易造成模型倾向于大(尺度)人物(大尺度容易有大差值,大差值产生大loss,大大大..)。
于是,上述提到的人物面积就该“出场”(寂寞了吧)了!面积大小即尺度大小,于是可以使用面积对坐标差值进行归一化,这样就消除了尺度带来的影响。当然,由于面积是距离的二次方,因此还需要先对它开个根号。
Preview
下一期,CW将携手损失函数与大家见面。