Pose Estimation Evaluation (Metric)
对于人体骨骼关键点算法来说,如何有效的衡量一个算法的好坏非常重要,他不像分类问题那样可以很容易采用一些常用指标,例如precise、error、F-score等进行计算。因为在衡量的过程中,我们无法有效的将预测结果与真实值一一对应,无法知道他们之前的对应关系,更加无法知道当前的某个预测结果是否出现了误检或者漏检的情况。因此,构建一个合适的人体关键点的度量指标很重要。
本文目前涉及 oks、AP、mAP、PCK、PCKh、PDJ,后续碰到新的会继续补充
一、oks
目前最为常用的就是OKS(Object Keypoint Similarity)指标,这个指标启发于目标检测中的IoU指标,目的就是为了计算真值和预测人体关键点的相似度。
OKS
其中:
表示groudtruth中,人的id
表示key point的id
表示groudtruth中每个人和预测的每个人的关键点的欧氏距离
表示当前人的尺度因子,这个值等于此人在groundtruth中所占面积的平方根,即
表示第 i 个骨骼点的归一化因子,这个因此是通过对数据集中所有groundtruth计算的标准差而得到的,反映出当前骨骼点标注时候的标准差,
越大表示这个点越难标注。
代表第p个人的第 i 个关键点是否可见
用于将可见点选出来进行计算的函数
OKS矩阵
上面介绍的OKS是计算两个人之间的骨骼点相似度的,那一张图片中有很多的人时,该怎么计算呢?这时候就是构造一个OKS矩阵了。
假设一张图中,一共有M个人(groudtruth中),现在算法预测出了N个人,那么我们就构造一个M×N的矩阵,矩阵中的位置(i,j)代表groudtruth中的第i个人和算法预测出的第j个人的OKS相似度,找到矩阵中每一行的最大值,作为对应于第i个人的OKS相似度值。
AP(Average Precision)
根据前面的OKS矩阵,已经知道了某一张图像的所有人(groundtruth中出现的)的OKS分数,现在测试集中有很多图像,每张图像又有一些人,此时该如何衡量整个算法的好坏的。这个时候就用到了AP的概念,AP就是给定一个t,如果当前的OKS大于t,那就说明当前这个人的骨骼点成功检测出来了,并且检测对了,如果小于t,则说明检测失败或者误检漏检等,因此对于所有的OKS,统计其中大于t的个数,并计算其占所有OKS的比值。即假设OKS一共有100个,其中大于阈值t的共有30个,那么AP值就是30/100=0.3.
mAP(mean Average Precision)
顾名思义,AP的均值,具体计算方法就是给定不同的阈值t,计算不同阈值情况下对应的AP,然后求个均值就ok了。(与分类的 mAP 指标不同)
二、PCK,PCKh,PDJ
MPII 中是以头部长度(head length) 作为归一化参考,即 PCKh.
FLIC 中是以躯干直径(torso size) 作为归一化参考.
1.PCK (Percentage of Correct Keypoints)
关键点正确估计的比例
计算检测的关键点与其对应的groundtruth间的归一化距离小于设定阈值的比例(the percentage of detections that fall within a normalized distance of the ground truth).
1 | function eval_pck(pred, joints, symmetry_joint_id, joint_name, name) |
1.1 PCKh
1 | % 计算 head 的长度 |
2.PDJ - Percentage of Detected Joints
检测到的关键点比例.
1 | function [accs, range] = eval_pdj(pred, joints, reference_joints_pair, symmetry_joint_id, joint_name, eval_name) |