人体姿态估计-评价指标(一)

⼈体姿态估计-评价指标(⼀)
⼈体姿态估计-评价指标(⼀)
摘要
⼈体姿态估计可以细分成四个任务:单⼈姿态估计 (Single-Person Skeleton Estimation)、多⼈姿态估计 (Multi-person Pose Estimation)、⼈体姿态跟踪 (Video Pose Tracking)、3D⼈体姿态估计 (3D Skeleton Estimation)。
单⼈姿态估计: 输⼊是切割出来的单个⾏⼈,然后再出⾏⼈的关键点,使⽤的⽅法也就是⾃顶向下(Topdown),先检测⼈的bounding box,再⽤single-stage的⽅法检测每个⼈的⾻骼关键点,常使⽤的benchmark数据集MPII,使⽤的是PCKh的指标(可以认为预测的关键点与GT标注的关键点经过head size normalize后的距离)。但是经过这⼏年的算法提升,整体结果⽬前已经⾮常⾼了(最⾼的已经有93.9%了)。
多⼈姿态估计: 输⼊是⼀张整图,可能包含多个⾏⼈,⽬的是需要把图⽚中所有⾏⼈的关键点都能正确的做出估计,同样有两种⽅法:⾃顶向下(top-down)、⾃底向上(bottom-up)。对于top-down的⽅法,往往先到图⽚中所有⾏⼈,然后对每个⾏⼈做姿态估计,寻每个⼈的关键点。单⼈姿态估计往往可以被直接⽤于这个场景。对于bottom-up,思路正好相反,先是图⽚中所有parts (关键点),⽐如所有头部,左⼿,膝盖等。然后把这些parts(关键点)组装成⼀个个⾏⼈。使⽤的是OKS(object keypoint similarity) 指标。
⼈体姿态跟踪: 输⼊的是视频,对视频中的每⼀个⾏⼈进⾏⼈体以及每个关键点跟踪,相⽐⾏⼈跟踪来讲,⼈体关键点在视频中的temporal motion可能⽐较⼤,⽐如⼀个⾏⾛的⾏⼈,⼿跟脚会不停的摆动,所以跟踪难度会⽐跟踪⼈体框⼤。⽬前主要有的数据集是PoseTrack。
3D⼈体姿态估计: 输⼊的是RGB图像,输出3D的⼈体关键点的话,就是3D ⼈体姿态估计。这个有⼀个经典的数据集Human3.6M。
⽬前主要的难点: 图像的复杂性-遮挡(不可见)、拥挤,算法的复杂度。
评价指标
oks(object keypoint similarity)
oks是⽬前常⽤的⼈体⾻骼关键点检测算法的评价指标,这个指标启发于⽬标检测中的IoU指标,⽬的就是为了计算真值和预测⼈体关键点的相似度。
OKS:
参数详细解释,其中:
 表⽰当前图⽚所有groundtruth⾏⼈中id为p的⼈,,表⽰当前图中共有⾏⼈的数量
 表⽰id为的keypoint
 表⽰当前检测的⼀组关键点中id为的关键点与groundtruth⾏⼈中id为的⼈的关键点中id为的关键点的欧式距离,,为当前的关键点检测结果,为groundtruth
 表⽰groundtruth⾏⼈中id为p的⼈的尺度因⼦,其值为⾏⼈检测框⾯积的平⽅根:,、为检测框的宽
和⾼
 表⽰id为类型的关键点归⼀化因⼦,这个因⼦是通过对所有的样本集中的groundtruth关键点由⼈⼯标注与真实值存在的标准差,越⼤表⽰此类型的关键点越难标注。根据[1]中所述,对coco数据集中的5000个样本统计出17类关键点的归⼀化因⼦,的取值可以为:{⿐⼦:0.026,眼睛:0.025,⽿朵:0.035,肩膀:0.079,⼿肘:0.072,⼿腕:0.062,臀部:0.107,膝盖:0.087,脚踝:
0.089},因此此值可以当作常数看待,但是使⽤的类型仅限这个⾥⾯。如果使⽤的关键点类型不在此当中,可以使⽤另外⼀种统计⽅法计算此值,详细见下⽂
 表⽰groundtruth中id为的⾏⼈第个关键点的可见性,其中表⽰关键点未标记,可能的原因是图⽚中不存在,或者不确定在哪,表⽰关键点⽆遮挡并且已经标注,表⽰关键点有遮挡但已标注。同样,预测的关键点有两个属性:表⽰未预测出,表⽰预测出
 表⽰如果条件成⽴,那么,否则,在此处的含义是:仅计算groundtruth中已标注的关键点此指标计算的相关python 代码如下:
oks = [0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95]
sigmas = np .array ([.26, .25, .25, .35, .35, .79, .79, .72, .72, .62,.62, 1.07, 1.07, .87, .87, .89, .89])/10.
0
variances = (sigmas * 2)**2
def  compute_kpts_oks (dt_kpts , gt_kpts , area ):
"""
this function only works for computing oks with keypoints ,
:param dt_kpts: 模型输出的⼀组关键点检测结果 dt_kpts.shape=[3,14],dt_kpts[0]表⽰14个横坐标值,dt_kpts[1]表⽰14个纵坐标值,dt_kpts[3]表⽰14个可见性,
:param gt_kpts: groundtruth 的⼀组关键点标记结果 gt_kpts.shape=[3,14],gt_kpts[0]表⽰14个横坐标值,gt_kpts[1]表⽰14个纵坐标值,gt_kpts[3]表⽰14个可见性,
:param area: groundtruth 中当前⼀组关键点所在⼈检测框的⾯积
:return: 两组关键点的相似度oks
"""
g = np .array (gt_kpts )
xg = g [0::3]
yg = g [1::3]
vg = g [2::3]
assert (np .count_nonzero (vg > 0) > 0)
d = np .array (dt_kpts )
xd = d [0::3]
yd = d [1::3]
dx = xd - xg
长江上游
dy = yd - yg
e = (dx **2 + dy **2) /variances / (area +np .spacing (1)) / 2 #加⼊np.spacing()防⽌⾯积为零
e =e [vg > 0]
return  np .sum (np .exp (-e )) / e .shape [0]
OKS =p δ(v >0)∑i pi exp {−d /2S σ}δ(v >0)
∑i pi 2p 2i 2
街边小摊
pi p p ∈(0,M )M i i d pi i p i d =pi (x −x )(y −y )i ′pi i ′pi (x ,y )i ′i ′(x ,y )pi i S p S =p wh w h σi i σσv pi p i v =pi 0v =pi 1v =pi 2v =pi ′0v =pi ′1δ(∗)∗δ(∗)=1δ(∗)=0oks
详细情况参考相关代码:
注意事项:
对于参数的取值问题,如果增加了新的关键点类型或者⽤于其它物体的关键点检测,也可以根据⾃⼰的样本集进⾏设定,具体为:
AP(Average Precision)平均准确率
感悟健康此指标⽤于计算测试集的精度百分⽐,单⼈姿态估计和多⼈姿态估计的计算⽅式不同。
单⼈姿态估计AP:
单⼈姿态估计,⼀次仅对⼀个⾏⼈进⾏估计,即在oks指标中,因此⼀张图⽚中groundtruth为⼀个⾏⼈(GT),对此⾏⼈进⾏关键点检测后会获得⼀组关键点(DT),最后会计算出GT与DT的相似度oks为⼀个标量,然后⼈为的给定⼀个阈值T,然后可以通过所有图⽚的oks计算AP:
多⼈姿态估计AP:多⼈姿态估计,如果采⽤的检测⽅法是⾃顶向下,先把所有的⼈出来再检测关键点,那么其AP计算⽅法如同单⼈姿态估计AP; 如果采⽤的检测⽅法是⾃底向上,先把所有的关键点出来然后再组成⼈,那么假设⼀张图⽚中共有M个⼈,预测出N个⼈,由于不知道预测出的N个⼈与groundtruth中的M个⼈的⼀⼀对应关系,因此需要计算groundtruth中每⼀个⼈与预测的N个⼈的oks,那么可以获得⼀个⼤⼩为的矩阵,矩阵的每⼀⾏为groundtruth中的⼀个⼈与预测结果的N个⼈的oks,然后出每⼀⾏中oks最⼤的值作为当前GT的oks。最后每⼀个GT⾏⼈都有⼀个标量oks,然后⼈为的给定⼀个阈值T,然后可以通过所有图⽚中的所有⾏⼈计算AP:
多⼈姿态估计矩阵计算代码:
σi σ=i σ(d /S )
i σ(d /S )=
i M (−
E ())∑p M S p d pi
S p d pi 2=S p d pi w h p p
(x −x )+(y −y )pi pi 2pi pi 2ox0000008e
E ()=S d i
M
∑p M S p d pi M =1AP =1
∑p δ(oks >T )
∑p p M ×N AP =1
∑m ∑p δ(oks >T )
∑m ∑p p M ×N
def compute_oks(dts, gts):
法拉第电解定律
if len(dts)*len(gts)==0:
return np.array([])
oks_mat = np.zeros((len(dts),len(gts)))
# compute oks between each detection and ground truth object
for j, gt in enumerate(gts):
# create bounds for ignore regions(double the gt bbox)
g = np.array(gt['keypoints'])
xg = g[0::3]; yg = g[1::3]; vg = g[2::3]
k1 = np.count_nonzero(vg >0)
bb = gt['bbox']
x0 = bb[0]- bb[2]; x1 = bb[0]+ bb[2]*2
y0 = bb[1]- bb[3]; y1 = bb[1]+ bb[3]*2
for i, dt in enumerate(dts):
d = np.array(dt['keypoints'])
xd = d[0::3]; yd = d[1::3]
if k1>0:
# measure the per-keypoint distance if keypoints visible
dx = xd - xg
dy = yd - yg
else:
# measure minimum distance to keypoints in (x0,y0) & (x1,y1)
z = np.zeros((len(sigmas)))
dx = np.max((z, x0-xd),axis=0)+np.max((z, xd-x1),axis=0)
dy = np.max((z, y0-yd),axis=0)+np.max((z, yd-y1),axis=0)
e =(dx**2+ dy**2)/ variances /(gt['area']+np.spacing(1))/2
if k1 >0:
e=e[vg >0]
雅园玉道
oks_mat[i, j]= np.p(-e))/ e.shape[0]
return oks_mat
mAP(mean Average Precision)
mAP是常⽤检测指标,具体就是给AP指标中的⼈⼯阈值T设定不同的值,然后会获得多个AP指标,最后再对多个AP指标求平均,最终获得mAP
T∈[0.5:0.05:0.95]
PCK(Percentage of Correct Keypoints)
正确估计出的关键点⽐例。这是⽐较⽼的⼈体姿态估计指标,在17年⽐较⼴泛使⽤,现在基本不再使⽤,但是如果仅是⼯程项⽬使⽤来评价训练的模型好坏还是蛮⽅便的,因此这⾥也记录下。
PCK:
其中:
 表⽰id为的关键点
 表⽰第个阈值 表⽰第个⾏⼈
 表⽰第个⼈中id为的关键点预测值与⼈⼯标注值的欧式距离
 表⽰第个⼈的尺度因⼦,此因⼦不同公开数据集使⽤的计算⽅法不⼀样,FLIC数据集是以当前⼈的躯⼲直径作为尺度因⼦,即左肩到右臀的欧式距离或者右键到左臀的欧式距离;MPII数据集是以当前⼈的头部直径作为尺度因⼦,即头部Rect的左上点LT与右下点RB的欧式距离,使⽤此尺度因⼦的姿态估计指标也称PCKh  ⼈⼯设定的阈值, 
 表⽰阈值下id为i的关键点的PCK指标
 表⽰阈值下的算法PCK指标
PCK指标计算参考代码:
def  compute_pck_pckh (dt_kpts ,gt_kpts ,refer_kpts ):
"""
pck 指标计算
:param dt_kpts:算法检测输出的估计结果,shape=[n,h,w]=[⾏⼈数,2,关键点个数]
:param gt_kpts: groundtruth ⼈⼯标记结果,shape=[n,h,w]
:param refer_kpts: 尺度因⼦,⽤于预测点与groundtruth 的欧式距离的scale 。
           pck 指标:躯⼲直径,左肩点-右臀点的欧式距离;
           pckh 指标:头部长度,头部rect 的对⾓线欧式距离;
:return: 相关指标
"""
dt =np .array (dt_kpts )
gt =np .array (gt_kpts )
assert (len (refer_kpts )==2)
assert (dt .shape [0]==gt .shape [0])
ranges =np .arange (0.0,0.1,0.01)
kpts_num =gt .shape [2]
ped_num =gt .shape [0]
#compute dist
scale =np .sqrt (np .sum (np .square (gt [:,:,refer_kpts [0]]-gt [:,:,refer_kpts [1]]),1))
dist =np .sqrt (np .sum (np .square (dt -gt ),1))/np .tile (scale ,(gt .shape [2],1)).T
#compute pck
pck = np .zeros ([ranges .shape [0], gt .shape [2]+1])
for  idh ,trh in  enumerate (list (ranges )):
for  kpt_idx in  range (kpts_num ):
pck [idh ,kpt_idx ] = 100*np .mean (dist [:,kpt_idx ] <= trh )
# compute average pck
pck [idh ,-1] = 100*np .mean (dist <= trh )
return  pck PCK =i k 1
∑p δ(≤T )
∑p d p def d pi k PCK =mean k 1
∑p ∑i δ(≤T )
∑p ∑i d p def d pi k i i k k T k
p p d pi p i d p def
p T k T ∈k [0:0.01:0.1]PCK i k T k PCK mean k T k

本文发布于:2024-09-20 22:20:48,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/417458.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:关键点   指标   估计   姿态   计算
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议