作者原创,代码免费公开,多多支持。
一、介绍
正确关键点百分比(Percentage of Correct Keypoint, PCK)是在深度学习领域做人体姿态估计中,常用的指标,许多文献都用了PCK作为模型评价指标。如Can WiFi Estimate Person Pose?
二、公式
其中I(·)是一个二进制指示符,当为真时输出1,当为假时输出0。
N是测试帧的个数。i为人体关节指数。rh和lh分别代表右肩和左髋的位置。因此,2根号 rh2 + lh2可视为上肢长度,用于对预测误差||pdi−gti|| 进行归一化,其中pd为预测坐标,gt为真值(真实坐标)。
简单理解,PCK@10就是归一化预测误差在10以内的点的帧数占总帧数的百分比,显然这个值越高越好。
上述论文的pck指标结果如下图,可以参考参考:
PCK结果的R和L分别代表左和右,共18个关键点。
三、代码
'''
作者:淳
声明:代码实现求PCK指标,但每个人输入数据shape不一样,可能自己需要改成自己需要的数据维度
'''
import numpy as np
import math
#欧式距离
def cal_distance(p1, p2):
return math.sqrt(math.pow((p2[0] - p1[0]), 2) + math.pow((p2[1] - p1[1]), 2))
#求pck指标,公式见我的博客
def pck(p,g,a,N):
#p是预测坐标,g是真值,N是总帧数
length = 0.8 #上肢长度
total = 0
for i in range(N):
d = cal_distance(p[i],g[i])
# print(d/length)
I = bool(d/length<=a)
total = total+int(I)
# print(total)
return total/N
if __name__ == '__main__':
np.random.seed(10) #这里改换随机种子,得到不同的pck
batch = 16
a = 0.7
#这里只是随机数,之后可以换成自己需要的预测值和真值
pred = np.random.rand(batch,2)
ground = np.random.rand(batch,2)
out = pck(pred,ground,a,batch)
print('pck = ',out)
可以自己试一试。