1. PCK - Percentage of Correct Keypoints

关键点正确估计的比例
计算检测的关键点与其对应的groundtruth间的归一化距离小于设定阈值的比例(the percentage of detections that fall within a normalized distance of the ground truth).

FLIC 中是以躯干直径(torso size) 作为归一化参考.
MPII 中是以头部长度(head length) 作为归一化参考,即 PCKh.

function eval_pck(pred, joints, symmetry_joint_id, joint_name, name)
% PCK 的实现
% torso height: || left_shoulder - right hip ||
% symmetry_joint_id: 具有对称关系的关键点 ID
% joint_name: 具有对称关系的关键点名字range = 0:0.01:0.1;
show_joint_ids = (symmetry_joint_id >= 1:numel(symmetry_joint_id));% compute distance to ground truth joints
dist = get_dist_pck(pred, joints(1:2,:,:));% 计算 PCK
pck_all = compute_pck(dist,range);
pck = pck_all(end, :);
pck(1:end-1) = (pck(1:end-1) + pck(symmetry_joint_id))/2;% 可视化结果
pck = [pck(show_joint_ids) pck(end)];
fprintf('------------ PCK Evaluation: %s -------------\n', name);
fprintf('Parts '); fprintf('& %s ', joint_name{:}); fprintf('& Mean\n');
fprintf('PCK   '); fprintf('& %.1f  ', pck); fprintf('\n');% -------------------------------------------------------------------------
function dist = get_dist_pck(pred, gt)
assert(size(pred,1) == size(gt,1) && size(pred,2) == size(gt,2) && size(pred,3) == size(gt,3));dist = nan(1,size(pred, 2), size(pred,3));for imgidx = 1:size(pred,3)% torso diameter 躯干直径if size(gt, 2) == 14refDist = norm(gt(:,10,imgidx) - gt(:,3,imgidx));elseif size(gt, 2) == 10 % 10 joints FLICrefDist = norm(gt(:,7,imgidx) - gt(:,6,imgidx));elseif size(gt, 2) == 11 % 11 joints FLICrefDist = norm(gt(:,4,imgidx) - gt(:,11,imgidx));elseerror('Number of joints should be 14 or 10 or 11');end% 预测的关键点与 gt 关键点的距离dist(1,:,imgidx) = sqrt(sum((pred(:,:,imgidx) - gt(:,:,imgidx)).^2,1))./refDist;end% -------------------------------------------------------------------------
function pck = compute_pck(dist,range)
pck = zeros(numel(range),size(dist,2)+1);for jidx = 1:size(dist,2)% 计算每个设定阈值的 PCKfor k = 1:numel(range)pck(k,jidx) = 100*mean(squeeze(dist(1,jidx,:)) <= range(k));end
end% 计算平均 PCK
for k = 1:numel(range)pck(k,end) = 100*mean(reshape(squeeze(dist(1,:,:)),size(dist,2)*size(dist,3),1) <= range(k));
end

输出结果如下:

------------ PCK Evaluation: Single_People -------------
Parts & Ankle & Knee & Hip & Wris & Elbo & Shou & Head & Mean
PCK   & 93.2  & 88.3  & 70.4  & 92.1  & 92.6  & 94.6  & 95.9  & 89.6

1.1 PCKh

% 计算 head 的长度
headSize = getHeadSizeAll(annolist_test_flat(single_person_test_flat == 1));% 计算预测的关键点与 gt 关键点间的归一化距离
dist = getDistPCKh(pred,gt,headSize);% 计算 PCKh
pck = computePCK(dist,range);function headSizeAll = getHeadSizeAll(annolist)
headSizeAll = nan(length(annolist),1);
for imgidx = 1:length(annolist)rect = annolist(imgidx).annorect;headSizeAll(imgidx) =  util_get_head_size(rect);
end
endfunction headSize = util_get_head_size(rect)
SC_BIAS = 0.6; % 0.8*0.75
headSize = SC_BIAS*norm([rect.x2 rect.y2] - [rect.x1 rect.y1]); # head 的两个点间的距离
endfunction dist = getDistPCKh(pred,gt,refDist)
assert(size(pred,1) == size(gt,1) && size(pred,2) == size(gt,2) && size(pred,3) == size(gt,3));
assert(size(refDist,1) == size(gt,3));dist = nan(1,size(pred,2),size(pred,3));
for imgidx = 1:size(pred,3)% pred joints 与 gt joints 的归一化距离dist(1,:,imgidx) = sqrt(sum((pred(:,:,imgidx) - gt(:,:,imgidx)).^2,1))./refDist(imgidx);
endfunction pck = computePCK(dist,range)
pck = zeros(numel(range),size(dist,2)+2);
for jidx = 1:size(dist,2)% 计算各阈值的 PCKfor k = 1:numel(range)d = squeeze(dist(1,jidx,:));% dist is NaN if gt is missing; ignore dist in this casepck(k,jidx) = 100*mean(d(~isnan(d))<=range(k));end
end% 计算上半身关键点的平均 PCK
for k = 1:numel(range)d = reshape(squeeze(dist(1,7:12,:)),6*size(dist,3),1);pck(k,end-1) = 100*mean(d(~isnan(d))<=range(k));
end% 计算全身关键点的 PCK
for k = 1:numel(range)d = reshape(squeeze(dist(1,:,:)),size(dist,2)*size(dist,3),1);pck(k,end) = 100*mean(d(~isnan(d))<=range(k));
end
end

2. PDJ - Percentage of Detected Joints

检测到的关键点比例.

function [accs, range] = eval_pdj(pred, joints, reference_joints_pair, symmetry_joint_id, joint_name, eval_name)
% 设定选定的参考点:reference_joints_pair = [3, 10];     % 右肩点到左臀点
% symmetry_joint_id: 具有对称关系的关键点 ID
assert(numel(reference_joints_pair) == 2);
show_joint_ids = find(symmetry_joint_id >= 1:numel(symmetry_joint_id));
range = 0:0.01:0.5;num = size(pred, 3);
assert(num >= 1);
% the number of joints
joint_n = size(joints, 2);scale = zeros(1, num);
for ii = 1:numscale(ii) = norm( joints(:,reference_joints_pair(1), ii) - joints(:,reference_joints_pair(2), ii) );%scale(ii) = 100;
enddists = zeros(num, joint_n);
for ii = 1:numdists(ii,:) = sqrt(sum( (pred(:, :, ii) - joints(:,:,ii)).^2, 1 ));dists(ii,:) = dists(ii,:) / scale(ii);
endaccs = zeros(numel(range), joint_n);
for ii = 1:numel(range)accs(ii,:) = mean(dists <= range(ii),1);
endaccs = (accs + accs(:,symmetry_joint_id)) / 2;
accs = accs(:, show_joint_ids);
% print
fprintf('-------------- PDJ Evaluation ---------------\n')
fprintf('Joints    '); fprintf('& %s ', joint_name{:}); fprintf('\n');
sample_pdj_thresholds = [0.1, 0.2, 0.3, 0.4];
for ii = 1:length(sample_pdj_thresholds)t = sample_pdj_thresholds(ii);idx = (range == t);fprintf('PDJ@%.2f  ', t); fprintf('& %.1f ', accs(idx,:)*100); fprintf('\n');
end% plot
line_width = 2;
p_color = {'g','y','b','r','c','k','m'};% visualize
figure; hold on; grid on;
for ii = 1:numel(show_joint_ids)plot(range, accs(:, ii), p_color{mod(ii, numel(p_color))+1}, 'linewidth', line_width);
end
leg_str = cell(numel(show_joint_ids), 1);
for ii = 1:numel(show_joint_ids)leg_str{ii} = sprintf('%s', joint_name{ii});
end
h_leg = legend(leg_str, 'FontSize', 12);
set(h_leg, 'location', 'southeast', 'linewidth', 1);axis([range(1),range(end), 0, 1]);
set(gca,'ytick', 0:0.1:1);
set(gca, 'linewidth', 1);% --- titles
xlabel('Normalized  Threshold') % x-axis label
ylabel('Detection Rate') % y-axis labeltitle([eval_name ' PDJ']);
hold off;

输出结果为:

-------------- PDJ Evaluation ---------------
Joints    & Ankle & Knee & Hip & Wris & Elbo & Shou & Head
PDJ@0.10  & 93.3 & 87.6 & 66.4 & 91.8 & 92.6 & 95.5 & 96.1
PDJ@0.20  & 97.5 & 94.7 & 93.4 & 96.8 & 97.9 & 98.8 & 99.1
PDJ@0.30  & 97.9 & 95.7 & 97.6 & 97.8 & 98.4 & 99.1 & 99.2
PDJ@0.40  & 98.1 & 96.1 & 98.4 & 98.1 & 98.6 & 99.2 & 99.2 

PCK - Percentage of Correct Keypoints相关推荐

  1. 【姿态估计】PCK(Percentage of Correct Keypoints)指标及代码实现

    PCK(Percentage of Correct Keypoints)指标及python代码实现 姿态估计任务中,常用的评价指标有AP值.PCK等. PCK指标定义 PCK指标指正确检测的关键点所占 ...

  2. mmpose关键点(一):评价指标(PCK,OKS,mAP)

    由于,近期项目需要引入关键点做一些方向逻辑的判断,在此记录一些实验与经典论文方法.首先,我们先了解一下关键点估计的评价指标. 1.PCK - Percentage of Correct Keypoin ...

  3. 关键点估计之 PCK, PCKh, PDJ 评价度量

    原文 - https://www.aiuai.cn/aifarm449.html - AIUAI 关键点估计 - 人体关键点(姿态估计) 和服饰关键点(FashionAI/DeepFashion). ...

  4. 人体关键点检测的评价度量PCK, PCKh, PDJ

    1.PCK - Percentage of Correct Keypoints -----关键点正确估计的比例 计算检测的关键点与其对应的groundtruth间的归一化距离小于设定阈值的比例(the ...

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

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

  6. 经典论文复现 | PyraNet:基于特征金字塔网络的人体姿态估计

    过去几年发表于各大 AI 顶会论文提出的 400 多种算法中,公开算法代码的仅占 6%,其中三分之一的论文作者分享了测试数据,约 54% 的分享包含"伪代码".这是今年 AAAI ...

  7. Human Pose Estimation姿态估计调研

    介绍 姿态估计的目标是在RGB图像或视频中描绘出人体的形状,这是一种多方面任务,其中包含了目标检测.姿态估计.分割等等.有些需要在非水平表面进行定位的应用可能也会用到姿态估计,例如图形.增强现实或者人 ...

  8. 姿态估计目标检测论文整理(1)

    一.姿态估计 1. 现阶段人体姿态识别主流的通常有2个思路: Top-Down(自上而下)方法:将人体检测和关键点检测分离,在图像上首先进行人体检测,找到所有的人体框,对每个人体框图再使用关键点检测, ...

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

    人体姿态估计-评价指标(一) 摘要 评价指标 oks(object keypoint similarity) AP(Average Precision)平均准确率 mAP(mean Average P ...

最新文章

  1. 教程 | 以太坊智能合约编程之菜鸟教程
  2. MTM:matlab实现1
  3. 2015 10月21日 工作计划与执行
  4. csdn 用户 蚂蚁翘大象_用户界面设计师房间里的大象
  5. vert.x_使用vert.x 2.0,RxJava和mongoDB创建simpe RESTful服务
  6. [TypeScript] Export public types from your library
  7. Oracle 安装 检查操作系统版本 必须是 5.0 5.1 的解决办法
  8. mysql select 效能_MYSQL的联合查询最好是少用,效能差异巨大
  9. html基本结构(头部需加上样式表),HTML基本结构、头部、注释(示例代码)
  10. Just a Hook(线段树区间更新)
  11. C# 代码调整屏幕分辨率
  12. 卡饭里的云计算机,微云可以在电脑用吗
  13. 精选的 Go 框架,库和软件的精选清单
  14. ahocorasick使用
  15. 苹果留给 iOS 开发者的时间不多了:30 天内必须更新旧版本!
  16. 组合计数——车的放置(逆元)+数三角形+序列统计(lucas定理)
  17. 实现嵌入式linux自动同步网络时间---NTP
  18. react-redux——使用redux——使用react-redux这个扩展简化操作
  19. Zabbix监控之监控项
  20. Vbs中sendKeys

热门文章

  1. 中国移动10086客服中心工作人员的血和泪
  2. Python股票盯盘助手
  3. Android动画学习笔记(二)——动画插值器Interpolator
  4. SaaS、PaaS、IaaS、aPaaS、iPaaS、RaaS、RPAaaS,傻傻分不清楚?
  5. 关于 iOS 开发者账号
  6. 软件架构图的艺术与从单体架构到异地多活,开心的学java架构
  7. Mysql的增删改查语句
  8. 远程代码托管平台--GitHub、Gitee的使用
  9. 2.2.2 处理器(CPU)资源
  10. The located assembly's manifest definition does not match the assembly reference