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

    • 摘要
    • 评价指标
  • oks(object keypoint similarity)
  • AP(Average Precision)平均准确率
  • mAP(mean Average Precision)
  • PCK(Percentage of Correct Keypoints)

摘要

人体姿态估计可以细分成四个任务:单人姿态估计 (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:
O K S p = ∑ i e x p { − d p i 2 / 2 S p 2 σ i 2 } δ ( v p i > 0 ) ∑ i δ ( v p i > 0 ) {OKS_{p}}=\frac{\sum_{i}exp\{-d_{pi}^{2}/2S_{p}^{2}\sigma_{i}^{2}\}\delta(v_{pi}>0)}{\sum_{i}\delta(v_{pi}>0)} OKSp​=∑i​δ(vpi​>0)∑i​exp{−dpi2​/2Sp2​σi2​}δ(vpi​>0)​
参数详细解释,其中:
p p p 表示当前图片所有groundtruth行人中id为p的人, p ∈ ( 0 , M ) p\in(0,M) p∈(0,M), M M M表示当前图中共有行人的数量
i i i 表示id为 i i i的keypoint
d p i d_{pi} dpi​ 表示当前检测的一组关键点中id为 i i i的关键点与groundtruth行人中id为 p p p的人的关键点中id为 i i i的关键点的欧式距离, d p i = ( x i ′ − x p i ) ( y i ′ − y p i ) d_{pi}=\sqrt{(x_{i}^{\prime}-x_{pi})(y_{i}^{\prime}-y_{pi})} dpi​=(xi′​−xpi​)(yi′​−ypi​) ​, ( x i ′ , y i ′ ) (x_{i}^{\prime},y_{i}^{\prime}) (xi′​,yi′​)为当前的关键点检测结果, ( x p i , y i ) (x_{pi},y_{i}) (xpi​,yi​)为groundtruth
S p S_{p} Sp​ 表示groundtruth行人中id为p的人的尺度因子,其值为行人检测框面积的平方根: S p = w h S_{p}=\sqrt{wh} Sp​=wh ​, w w w、 h h h为检测框的宽和高
σ i \sigma_{i} σi​ 表示id为 i i i类型的关键点归一化因子,这个因子是通过对所有的样本集中的groundtruth关键点由人工标注与真实值存在的标准差, σ \sigma σ越大表示此类型的关键点越难标注。根据[1]中所述,对coco数据集中的5000个样本统计出17类关键点的归一化因子, σ \sigma σ的取值可以为:{鼻子:0.026,眼睛:0.025,耳朵:0.035,肩膀:0.079,手肘:0.072,手腕:0.062,臀部:0.107,膝盖:0.087,脚踝:0.089},因此此值可以当作常数看待,但是使用的类型仅限这个里面。如果使用的关键点类型不在此当中,可以使用另外一种统计方法计算此值,详细见下文
v p i v_{pi} vpi​ 表示groundtruth中id为 p p p的行人第 i i i个关键点的可见性,其中 v p i = 0 v_{pi}=0 vpi​=0表示关键点未标记,可能的原因是图片中不存在,或者不确定在哪, v p i = 1 v_{pi}=1 vpi​=1表示关键点无遮挡并且已经标注, v p i = 2 v_{pi}=2 vpi​=2表示关键点有遮挡但已标注。同样,预测的关键点有两个属性: v p i ′ = 0 v_{pi}^{\prime}=0 vpi′​=0表示未预测出, v p i ′ = 1 v_{pi}^{\prime}=1 vpi′​=1表示预测出
δ ( ∗ ) \delta(*) δ(∗) 表示如果条件 ∗ * ∗成立,那么 δ ( ∗ ) = 1 \delta(*)=1 δ(∗)=1,否则 δ ( ∗ ) = 0 \delta(*)=0 δ(∗)=0,在此处的含义是:仅计算groundtruth中已标注的关键点 o k s oks oks
此指标计算的相关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 - xgdy = yd - yge = (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]

详细情况参考相关代码: coco benchmark
注意事项:
对于参数 σ i \sigma_{i} σi​的取值问题,如果增加了新的关键点类型或者用于其它物体的关键点检测,也可以根据自己的样本集进行设定,具体为:
σ i = σ ( d i / S ) \sigma_{i}=\sigma(d_{i}/S) σi​=σ(di​/S)
σ ( d i / S ) = ∑ p M ( d p i S p − E ( d p i S p ) ) 2 M \sigma(d_{i}/S)=\sqrt{\frac{\sum_{p}^{M}(\frac{d_{pi}}{S_{p}}-E(\frac{d_{pi}}{S_{p}}))^{2}}{M}} σ(di​/S)=M∑pM​(Sp​dpi​​−E(Sp​dpi​​))2​ ​
d p i S p = ( x p i ′ − x p i ) 2 + ( y p i ′ − y p i ) 2 w p h p \frac{d_{pi}}{S_{p}}=\sqrt{\frac{(x_{pi}^{\prime}-x_{pi})^{2}+(y_{pi}^{\prime}-y_{pi})^{2}}{w_{p}h_{p}}} Sp​dpi​​=wp​hp​(xpi′​−xpi​)2+(ypi′​−ypi​)2​ ​
E ( d i S ) = ∑ p M d p i S p M E(\frac{d_{i}}{S})=\frac{\sum_{p}^{M}\frac{d_{pi}}{S_{p}}}{M} E(Sdi​​)=M∑pM​Sp​dpi​​​

AP(Average Precision)平均准确率

此指标用于计算测试集的精度百分比,单人姿态估计多人姿态估计的计算方式不同。
单人姿态估计AP:
单人姿态估计,一次仅对一个行人进行估计,即在oks指标中 M = 1 M=1 M=1,因此一张图片中groundtruth为一个行人(GT),对此行人进行关键点检测后会获得一组关键点(DT),最后会计算出GT与DT的相似度oks为一个标量,然后人为的给定一个阈值T,然后可以通过所有图片的oks计算AP:
A P = ∑ p δ ( o k s p > T ) ∑ p 1 AP=\frac{\sum_{p}\delta(oks_{p}>T)}{\sum_{p}1} AP=∑p​1∑p​δ(oksp​>T)​
多人姿态估计AP:
多人姿态估计,如果采用的检测方法是自顶向下,先把所有的人找出来再检测关键点,那么其AP计算方法如同单人姿态估计AP; 如果采用的检测方法是自底向上,先把所有的关键点找出来然后再组成人,那么假设一张图片中共有M个人,预测出N个人,由于不知道预测出的N个人与groundtruth中的M个人的一一对应关系,因此需要计算groundtruth中每一个人与预测的N个人的oks,那么可以获得一个大小为 M × N {M}\times{N} M×N的矩阵,矩阵的每一行为groundtruth中的一个人与预测结果的N个人的oks,然后找出每一行中oks最大的值作为当前GToks。最后每一个GT行人都有一个标量oks,然后人为的给定一个阈值T,然后可以通过所有图片中的所有行人计算AP:
A P = ∑ m ∑ p δ ( o k s p > T ) ∑ m ∑ p 1 AP=\frac{\sum_{m}\sum_{p}\delta(oks_{p}>T)}{\sum_{m}\sum_{p}1} AP=∑m​∑p​1∑m​∑p​δ(oksp​>T)​

多人姿态估计 M × N {M}\times{N} 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 objectfor 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] * 2y0 = bb[1] - bb[3]; y1 = bb[1] + bb[3] * 2for 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 visibledx = xd - xgdy = yd - ygelse:# 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)) / 2if k1 > 0:e=e[vg > 0]oks_mat[i, j] = np.sum(np.exp(-e)) / e.shape[0]return oks_mat

mAP(mean Average Precision)

mAP是常用检测指标,具体就是给AP指标中的人工阈值T设定不同的值,然后会获得多个AP指标,最后再对多个AP指标求平均,最终获得mAP
T ∈ [ 0.5 : 0.05 : 0.95 ] T\in[0.5:0.05:0.95] T∈[0.5:0.05:0.95]

PCK(Percentage of Correct Keypoints)

正确估计出的关键点比例。这是比较老的人体姿态估计指标,在17年比较广泛使用,现在基本不再使用,但是如果仅是工程项目使用来评价训练的模型好坏还是蛮方便的,因此这里也记录下。
PCK:
P C K i k = ∑ p δ ( d p i d p d e f ≤ T k ) ∑ p 1 PCK_{i}^{k}=\frac{\sum_{p}\delta(\frac{d_{pi}}{d_{p}^{def}}\leq{T_{k}})}{\sum_{p}1} PCKik​=∑p​1∑p​δ(dpdef​dpi​​≤Tk​)​
P C K m e a n k = ∑ p ∑ i δ ( d p i d p d e f ≤ T k ) ∑ p ∑ i 1 PCK_{mean}^{k}=\frac{\sum_{p}\sum_{i}\delta(\frac{d_{pi}}{d_{p}^{def}}\leq{T_{k}})}{\sum_{p}\sum_{i}1} PCKmeank​=∑p​∑i​1∑p​∑i​δ(dpdef​dpi​​≤Tk​)​
其中:
i i i 表示id为 i i i的关键点
k k k 表示第 k k k个阈值 T k T_{k} Tk​
p p p 表示第 p p p个行人
d p i d_{pi} dpi​ 表示第 p p p个人中id为 i i i的关键点预测值与人工标注值的欧式距离
d p d e f d_{p}^{def} dpdef​ 表示第 p p p个人的尺度因子,此因子不同公开数据集使用的计算方法不一样,FLIC数据集是以当前人的躯干直径作为尺度因子,即左肩到右臀的欧式距离或者右键到左臀的欧式距离;MPII数据集是以当前人的头部直径作为尺度因子,即头部Rect的左上点LT与右下点RB的欧式距离,使用此尺度因子的姿态估计指标也称PCKh
T k T_{k} Tk​ 人工设定的阈值, T k ∈ [ 0 : 0.01 : 0.1 ] T_{k}\in{[0:0.01:0.1]} Tk​∈[0:0.01:0.1] 
P C K i k PCK_{i}^{k} PCKik​ 表示 T k T_{k} Tk​阈值下id为i的关键点的PCK指标
P C K m e a n k PCK_{mean}^{k} PCKmeank​ 表示 T k T_{k} Tk​阈值下的算法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 distscale=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 pckpck = 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 pckpck[idh,-1] = 100*np.mean(dist <= trh)return pck

人体姿态估计-评价指标(一)相关推荐

  1. 3D 人体姿态估计简述

    0 前言 3D Human Pose Estimation(以下简称 3D HPE )的目标是在三维空间中估计人体关键点的位置.3D HPE 的应用非常广泛,包括人机交互.运动分析.康复训练等,它也可 ...

  2. Human Pose Estimation人体姿态估计综述调研

    给定一幅图像或一段视频,人体姿态估计就是去恢复其中人体关节点位置的过程. 数据集 LSP 地址:http://sam.johnson.io/research/lsp.htm 样本数:2K 关节点个数: ...

  3. ICCV 2019 | 基于无标签单目视频序列的单帧三维人体姿态估计算法

    作者丨王璇 学校丨西安交通大学 研究方向丨人体姿态估计 我们都知道,要训练一个准确的三维人体姿态估计深度神经网络,需要大量有三维标签的数据,越多越好.而在现实生活中,我们很难得到很多有标签数据,而无标 ...

  4. 3D人体姿态估计论文汇总(CVPR/ECCV/ACCV/AAAI)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:Vegetabird | 来源:知乎 https://zhuanlan.zhihu.com/p/ ...

  5. 3D 人体姿态估计简述【转】

    0 前言 3D Human Pose Estimation(以下简称 3D HPE )的目标是在三维空间中估计人体关键点的位置.3D HPE 的应用非常广泛,包括人机交互.运动分析.康复训练等,它也可 ...

  6. 论文阅读笔记--Monocular Human Pose Estimation: A Survey of Deep Learning-based Methods 人体姿态估计综述

    趁着寒假有时间,把之前的论文补完,另外做了一点点笔记,也算是对论文的翻译,尝试探索一条适合自己的论文阅读方法. 这篇笔记基本按照原文的格式来,但是有些地方翻译成中文读起来不太顺,因此添加了一些自己的理 ...

  7. 【7班】【笔记】人体姿态估计与MMPose-卢策吾

    人体姿态估计的介绍与应用 概念:从给定的图像中识别人脸.手部.身体等关键点 人脸68关键点.手势21关键点.人体18关键点 3D姿态估计:预测人体关键点在三维空间中的 坐标,可以在3D空间中还原人体的 ...

  8. 3D 人体姿态估计简述[转]

    [转自]3D 人体姿态估计简述 - 知乎 0 前言 3D Human Pose Estimation(以下简称 3D HPE )的目标是在三维空间中估计人体关键点的位置.3D HPE 的应用非常广泛, ...

  9. 3D人体姿态估计综述 - 《3D Human pose estimation: A review of the literature and analysis of covariates》

    <3D Human pose estimation: A review of the literature and analysis of covariates> CVIU 2016 论文 ...

最新文章

  1. 一张“黑洞”需要拍两年?有了它或许就不会让大家等那么久了
  2. Mercurial入门学习
  3. LinkedHashMap 实现缓存(LRU、FIFO、weakhashMap)
  4. 1.3 Java二维数组详解
  5. 最靠谱的解决 Ubuntu 18.04 / Linux mint 19 安装网易云音乐 不能正常点击启动问题
  6. 云计算与springCloud概念上的区别
  7. 网关Ocelot功能演示完结,久等了~~~
  8. 你需要掌握的事件分发高阶知识
  9. C++---布隆过滤器
  10. 推荐系统入门实践:世纪佳缘会员推荐
  11. Linux组件封装(三)使用面向对象编程封装Thread
  12. 排序算法专题-希尔排序
  13. 木门怎么打_装门框,只打发泡剂一点不牢固!如今门套下沉,气得邻居直跺脚!...
  14. ssm框架逻辑删除mysql_mysql字段类型 - osc_mzx9t9jk的个人空间 - OSCHINA - 中文开源技术交流社区...
  15. South by Southwest任命Brightcove为2021年线上活动官方视频合作伙伴
  16. 牛!各大公司【薪资待遇】一览,我心动了
  17. linux安装网卡驱动make报错,linux 安装网卡驱动详解
  18. 部署asp.net mvc_在ASP.NET 2.0上部署ASP.NET MVC
  19. win11安卓子系统WSA的安装和使用
  20. 黄梅一中高考2021成绩查询,2020年黄冈高考成绩出炉!这些高分考生太棒了!

热门文章

  1. 2007最牛X网站收集-From bolm
  2. win10不能访问samba共享问题的解决
  3. html padding顺序,html中padding用法
  4. 功能测试报告的编写(版本测试报告与总结测试报告的应用)
  5. maven { url ‘https://www.jitpack.io‘ }在新版Android Studio中的位置
  6. 【C语言】案例五十 歌曲管理系统
  7. Pytorch求张量的倒数
  8. Kaggle赛题解析:Google手语识别
  9. Windows定时开关机
  10. 升米恩斗米仇,做人要敢说“不”