资讯动态

人体骨骼关键点数据集深度解析:从数据探查到模型训练全流程

发布时间:2026/8/29 12:59:31 来源:尧图企业网站定制
简介人体姿态估计是计算机视觉领域的核心任务其目标是从图像或视频中精准定位人体关节位置。其技术原理通常基于深度学习模型通过回归关键点坐标或预测热力图来实现。这项技术的核心价值在于将抽象的坐标点转化为对人体姿态、行为乃至意图的数字化理解是构建智能感知系统的重要基石。在工程实践中一个高质量、标注规范的骨骼关键点数据集是算法成功的决定性因素。此类数据集广泛应用于健身与运动分析、人机交互与虚拟现实、安防监控以及动画制作等多个高价值场景。本文将以一个典型的人体骨骼关键点检测数据集为例系统阐述从数据解压、结构解析、质量评估到数据预处理、增强策略定制以及模型训练准备的完整工程化流程为相关领域的开发者和研究者提供一套可复用的实战方法论。1. 项目概述一份骨骼关键点数据集的深度解构最近在整理硬盘里的陈年资料翻到了一个名为“人体骨骼关键点检测数据集_20251123_004453.zip”的文件包。这名字一看就是典型的“项目产物”带着时间戳透着一种“做完实验随手一存准备日后复盘”的意味。对于从事计算机视觉特别是人体姿态估计、动作识别或者人机交互方向的朋友来说这类数据集就是我们的“弹药库”。今天我就以这个数据集为引子和大家深入聊聊当我们拿到一个这样的“裸数据包”时应该如何去理解它、评估它并最终让它为我们的模型训练服务。这不仅仅是解压文件那么简单而是一个从数据认知到工程实践的全流程。一个优秀的数据集是算法成功的基石。但“优秀”二字往往隐藏在文件的命名规则、标注格式、数据分布这些细节里。这个数据集标题已经透露了几个关键信息核心任务是“人体骨骼关键点检测”文件格式是“.zip”压缩包并且有一个精确到秒的生成时间“20251123_004453”。我们将围绕这些线索一步步拆解看看如何像侦探一样从零散的图片和标注文件中还原出数据集的完整面貌和应用潜力。2. 数据集核心价值与典型应用场景解析2.1 骨骼关键点检测的任务本质人体骨骼关键点检测通俗讲就是从一张图片或一段视频中精准地定位出人体关节的位置比如头顶、鼻子、左右肩、左右肘、左右腕、左右髋、左右膝、左右踝等。这些点连起来就构成了人体的骨骼框架。这项技术是许多高级应用的“前哨站”。它的价值不在于画出几个点而在于将这些抽象的坐标点转化为对人体姿态、行为乃至意图的理解。2.2 核心应用场景深度剖析基于骨骼关键点数据我们可以解锁非常丰富的应用场景这也是此类数据集备受追捧的原因。2.2.1 健身与运动分析这是目前非常火热的落地方向。通过摄像头捕捉用户的运动姿态实时计算出关节角度、动作幅度和运动轨迹。例如在智能健身镜或健身APP中系统可以判断深蹲时膝盖是否超过脚尖、瑜伽动作是否标准、高尔夫挥杆的姿势是否合理。数据集的质量直接决定了分析的准确性。一个包含各种体型、穿着和光照条件下健身动作的数据集其价值远超一个只在实验室白背景下采集的简单数据集。2.2.2 人机交互与虚拟现实让机器理解人的动作是实现自然交互的关键。比如通过手势控制智能电视、隔空操作PPT或者在VR游戏中玩家的每一个弯腰、跳跃都能被精准映射到虚拟角色上。这类应用对检测的实时性和鲁棒性要求极高数据集需要包含大量快速运动、肢体遮挡如手在身体前方以及复杂背景下的样本。2.2.3 安防与异常行为识别在公共场所通过分析行人的行走姿态、奔跑、摔倒、打架等骨骼关键点序列可以及时发现异常情况并预警。例如识别老人摔倒的“突然倒地”姿态模式。这要求数据集不仅有关键点还要有连续的时间序列视频帧并且标注了各类异常行为标签。2.2.4 动画与游戏制作传统动画制作中动作捕捉需要演员穿着专业设备在特定场地完成。而基于视觉的动捕技术仅用普通摄像头就能驱动数字角色大大降低了成本。相关数据集需要非常高精度的关键点标注通常包含更多细节关节点如手指关节并且动作范围要覆盖常见的行走、奔跑、跳跃、舞蹈等。拿到“人体骨骼关键点检测数据集_20251123_004453.zip”时我们首先要思考它可能服务于以上哪个或哪些场景这决定了我们后续评估数据集的侧重点。3. 数据集的初步探查与结构解析3.1 文件解压与目录结构观察第一步永远是解压。解压后一个清晰、规范的目录结构是好数据集的第一个标志。通常我们会看到类似以下的布局HumanSkeletonDataset_20251123/ ├── images/ │ ├── train/ │ │ ├── 000001.jpg │ │ ├── 000002.jpg │ │ └── ... │ └── val/ │ ├── 000501.jpg │ └── ... ├── annotations/ │ ├── train.json │ ├── val.json │ └── keypoint_definitions.txt └── README.mdimages/: 存放所有图像文件通常按训练集train、验证集val甚至测试集test分开放置。这体现了数据划分的规范性。annotations/: 存放标注文件。这是核心中的核心。标注可能以JSON、XML如PASCAL VOC格式或TXT格式存在。README.md: 一个优秀的数据集必备的“说明书”。它会说明数据来源、标注规范、关键点定义、许可证等信息。如果这个文件缺失或过于简陋我们就要花更多功夫去“猜”。实操心得解压后第一件事不是急着写代码而是用眼睛看。数一图片大概有多少张看看图片的尺寸是否统一打开几张图片看看内容人物场景、清晰度、光照。然后立刻寻找README文件。如果找不到就去annotations文件夹里用文本编辑器打开一个标注文件尝试理解其结构。3.2 标注格式深度解读骨骼关键点的标注格式有多种主流标准识别格式是正确使用数据的前提。3.2.1 COCO Keypoints 格式这是目前最流行的格式之一源自MS COCO数据集。其标注JSON文件结构复杂但信息完整。{ info: {...}, licenses: [...], images: [ {id: 1, file_name: 000001.jpg, height: 480, width: 640, ...}, ... ], annotations: [ { id: 1, image_id: 1, category_id: 1, keypoints: [x1, y1, v1, x2, y2, v2, ...], num_keypoints: 17, area: 3672.56, bbox: [x, y, width, height], iscrowd: 0 }, ... ], categories: [ { id: 1, name: person, supercategory: person, keypoints: [nose, left_eye, ..., right_ankle], skeleton: [[16, 14], [14, 12], ...] // 关节点连接关系 } ] }keypoints列表按顺序存储每个关键点的[x坐标, y坐标, 可见性v]。可见性v通常为2已标注且可见1已标注但被遮挡0未标注。bbox人物的检测框对于两阶段姿态估计模型非常重要。num_keypoints该人物实例中已标注的关键点数量。skeleton定义了哪些关键点之间可以连线用于可视化。3.2.2 MPII Human Pose 格式另一个经典数据集MPII的格式常见于学术研究。它通常为每个图像提供一个独立的MAT文件或整合在一个MAT文件中包含丰富的元信息如活动标签、躯干尺寸、缩放因子等更适合进行2.5D或3D姿态分析的研究。3.2.3 自定义简单格式有些项目自用的数据集可能采用更简单的格式比如每张图片对应一个同名的TXT文件里面每一行记录一个关键点的(x, y)坐标和类别ID。排查技巧实录如果标注文件是JSON先用json.load()读入Python打印它的顶层键keys()。如果是COCO格式你一定会看到images,annotations,categories这几个键。然后打印第一个annotation条目查看keypoints数组的长度。如果是17*351那很可能就是标准的COCO 17关键点格式。这一步的快速判断能节省大量时间。4. 数据集质量评估与清洗实战4.1 关键质量维度分析确定了格式接下来就要评估数据集的“成色”。主要从以下几个维度入手数据量级与划分训练集、验证集分别有多少张图片、多少个标注的人体实例通常一个能训练稳健模型的数据集训练实例数应在万级以上。划分比例是否合理常见如8:2或9:1标注完整性是否存在大量v0未标注的关键点计算所有实例的平均num_keypoints。如果这个数字远小于总关键点数如17说明标注缺失严重可能需要清洗或采用能处理部分标注的损失函数。标注准确性需要人工抽样检查。随机选取几十张图片将标注的关键点可视化在原图上观察点是否准确落在关节处。常见的标注错误包括点标偏、左右混淆左肩标成右肩、严重遮挡时胡乱猜测。数据多样性场景多样性室内、室外、街道、健身房、办公室等。人物多样性不同年龄、体型、身高、穿着紧身衣、宽松衣、裙子。姿态多样性常见站、坐、走、跑以及各种运动、舞蹈等复杂姿态。挑战性因素遮挡人物被物体或其他人物遮挡、光照变化逆光、暗光、运动模糊、多人密集场景。定义一致性关键点的解剖学定义是否清晰且一致例如“左髋”是指大腿骨与骨盆连接处的中心点这个定义在所有标注员中是否统一keypoint_definitions.txt文件或categories中的keypoints列表就是标准。4.2 自动化评估脚本编写我们可以编写Python脚本进行快速量化评估。以下是一个基于COCO格式的评估示例import json from collections import Counter import matplotlib.pyplot as plt # 加载标注文件 with open(‘annotations/train.json‘, ‘r‘) as f: coco_data json.load(f) # 1. 统计基础信息 num_images len(coco_data[‘images‘]) num_annotations len(coco_data[‘annotations‘]) print(f“图像数量 {num_images}“) print(f“人体实例数量 {num_annotations}“) # 2. 分析关键点可见性 all_keypoints [] missing_keypoints_per_person [] for ann in coco_data[‘annotations‘]: kps ann[‘keypoints‘] # kps是[x1,y1,v1, x2,y2,v2, ...]的扁平列表 visibility [kps[i2] for i in range(0, len(kps), 3)] # 取出所有v值 all_keypoints.extend(visibility) missing_count visibility.count(0) # 统计未标注点 missing_keypoints_per_person.append(missing_count) # 统计可见性分布 vis_counter Counter(all_keypoints) print(f“关键点可见性分布 {vis_counter}“) # v2:可见 v1:遮挡 v0:缺失 # 3. 统计每人的标注关键点数量 avg_keypoints sum([ann[‘num_keypoints‘] for ann in coco_data[‘annotations‘]]) / num_annotations print(f“平均每人标注关键点数 {avg_keypoints:.2f}“) # 4. 可视化缺失情况分布 plt.figure(figsize(10, 4)) plt.subplot(1, 2, 1) plt.hist(missing_keypoints_per_person, binsrange(0, 18, 1), edgecolor‘black‘) plt.xlabel(‘每人缺失关键点数量‘) plt.ylabel(‘频数‘) plt.title(‘缺失关键点分布‘) plt.subplot(1, 2, 2) plt.boxplot([ann[‘area‘] for ann in coco_data[‘annotations‘]]) plt.ylabel(‘人体框面积 (像素)‘) plt.title(‘人体尺寸分布‘) plt.tight_layout() plt.show()这个脚本能快速给出数据集的宏观健康状况。注意事项评估时一定要区分“验证集”和“测试集”。验证集用于训练时调参和监控过拟合我们可以随意查看和分析。但真正的“测试集”在学术上应该只用于最终评估其标注通常是不可见的只有图片或者即使有标注在模型开发过程中也应“盲用”以避免无意中在测试集上过拟合。检查你的数据集划分是否包含了独立的测试集。5. 数据预处理与增强策略定制5.1 数据读取与解析管道搭建在模型训练前需要构建一个高效的数据加载管道DataLoader。以PyTorch为例我们需要自定义一个Dataset类。import torch from torch.utils.data import Dataset, DataLoader from PIL import Image import json import cv2 import numpy as np class CocoKeypointsDataset(Dataset): def __init__(self, annotation_path, img_dir, transformNone): with open(annotation_path, ‘r‘) as f: self.coco json.load(f) self.img_dir img_dir self.transform transform # 创建图像ID到标注列表的映射加速查找 self.img_id_to_anns {} for ann in self.coco[‘annotations‘]: img_id ann[‘image_id‘] if img_id not in self.img_id_to_anns: self.img_id_to_anns[img_id] [] self.img_id_to_anns[img_id].append(ann) # 创建图像ID到图像信息的映射 self.img_id_to_info {img[‘id‘]: img for img in self.coco[‘images‘]} def __len__(self): return len(self.coco[‘images‘]) def __getitem__(self, idx): img_info self.coco[‘images‘][idx] img_id img_info[‘id‘] img_path os.path.join(self.img_dir, img_info[‘file_name‘]) # 读取图像 image Image.open(img_path).convert(‘RGB‘) original_size image.size # (width, height) # 获取该图像对应的所有人体标注 anns self.img_id_to_anns.get(img_id, []) # 准备目标这里以单个主要人物为例实际可能需要处理多人 # 我们取面积最大的人体实例假设每图一人或关注主要人物 if anns: main_ann max(anns, keylambda x: x[‘area‘]) keypoints np.array(main_ann[‘keypoints‘]).reshape(-1, 3) # (17, 3) bbox main_ann[‘bbox‘] # [x, y, width, height] # 将bbox转换为 [x1, y1, x2, y2] 格式 bbox [bbox[0], bbox[1], bbox[0]bbox[2], bbox[1]bbox[3]] else: # 如果没有标注可以返回空或进行特殊处理 keypoints np.zeros((17, 3)) bbox [0, 0, original_size[0], original_size[1]] sample { ‘image‘: image, ‘keypoints‘: keypoints, # (17, 3) ‘bbox‘: bbox, ‘image_id‘: img_id } if self.transform: sample self.transform(sample) return sample这个Dataset类完成了最基础的读取工作返回图像、关键点坐标和边界框。5.2 针对姿态估计的数据增强策略数据增强是提升模型泛化能力的关键但对于关键点检测增强必须考虑空间几何一致性。随机水平翻转这是最常用且有效的增强。翻转图像时关键点坐标和边界框也要相应翻转并且必须交换左右成对的关键点索引如左肩和右肩。如果关键点顺序是固定的如COCO顺序需要在代码中预定义一个左右对称映射关系进行交换。随机旋转与缩放在合理范围内如旋转±30度缩放0.75~1.25进行仿射变换。变换后关键点坐标需要通过相同的变换矩阵进行计算。颜色抖动调整亮度、对比度、饱和度和色调这对关键点位置无影响可以增强模型对光照变化的鲁棒性。CutOut/RandomErasing随机遮挡图像的一小块矩形区域可以模拟部分遮挡迫使模型不过度依赖局部上下文。MixUp 或 Mosaic更高级的增强将多张图像混合能极大地增加数据的复杂性和多样性但对数据加载管道的要求更高。实操心得在实现增强时我强烈建议使用albumentations库。它专门为计算机视觉任务设计对关键点、边界框的支持非常友好而且速度快。下面是一个增强管道的示例import albumentations as A from albumentations.pytorch import ToTensorV2 def get_train_transform(): return A.Compose([ A.HorizontalFlip(p0.5), A.Rotate(limit30, p0.5, border_modecv2.BORDER_CONSTANT, value0), A.RandomScale(scale_limit0.25, p0.5), # 缩放 A.PadIfNeeded(min_height512, min_width512, border_modecv2.BORDER_CONSTANT, value0), A.RandomCrop(height512, width512), A.ColorJitter(brightness0.2, contrast0.2, saturation0.2, hue0.1, p0.5), A.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ToTensorV2(), ], keypoint_paramsA.KeypointParams(format‘xyv‘, remove_invisibleFalse)) # 注意格式匹配 # 在Dataset的__getitem__中应用 if self.transform: # 将关键点从 (17, 3) 转换为albumentations需要的列表格式 [(x1,y1,v1), ...] kps_list [tuple(kp) for kp in keypoints] transformed self.transform(imagenp.array(image), keypointskps_list, bboxes[bbox]) image transformed[‘image‘] keypoints np.array(transformed[‘keypoints‘]).reshape(-1, 3) # bbox 可能也需要处理...使用albumentations可以确保图像和标注的变换是同步且正确的避免了自己实现变换矩阵时容易出现的错误。6. 模型训练准备与标签生成6.1 从坐标到热图标签的生成逻辑大多数现代姿态估计模型如HRNet HigherHRNet SimpleBaseline并不直接回归关键点的 (x, y) 坐标而是预测一个“热图”Heatmap。对于每个关键点类型生成一个和输入图像尺寸成比例如下采样4倍或8倍的二维矩阵。在关键点坐标对应的位置放置一个以该点为中心的高斯核热图该处的值最高如1.0并向四周衰减。模型的任务就是学习预测出这些高斯热图。为什么用热图而不是直接回归坐标学习更简单回归精确的坐标值是一个困难的回归问题而热图将问题转化为在特征图上寻找峰值更符合卷积网络提取空间特征的优势。提供空间不确定性高斯核的方差sigma可以调节。对于难以标注的模糊点或遮挡点可以使用更大的sigma让标签更“软”传递一种不确定性信息。处理多人更自然通过热图不同人的同一类关键点会在图上形成多个峰值便于区分。生成热图标签的代码示例def generate_heatmap(keypoints, output_size, sigma2): “”“ keypoints: (num_kps, 3) [x, y, visibility] output_size: (H, W) 输出热图尺寸 sigma: 高斯核标准差 ”“” num_kps keypoints.shape[0] heatmaps np.zeros((num_kps, output_size[0], output_size[1]), dtypenp.float32) for i in range(num_kps): x, y, v keypoints[i] if v 2: # 如果关键点不可见或未标注热图全为0 continue # 将原图坐标映射到输出特征图坐标 x int(x * output_size[1] / original_img_width) y int(y * output_size[0] / original_img_height) # 生成二维高斯分布 # 这里使用一个更高效的方法先创建坐标网格 # 实际实现中为了效率常使用更优化的方式例如利用广播机制 # 以下为示意代码 xx, yy np.meshgrid(np.arange(output_size[1]), np.arange(output_size[0])) d2 (xx - x)**2 (yy - y)**2 exponent d2 / (2 * sigma * sigma) heatmap np.exp(-exponent) heatmap[heatmap 0.01] 0 # 阈值化减少计算量 heatmaps[i] heatmap return heatmaps # (17, H, W)在实际训练中这个生成过程会集成到数据加载管道里。sigma是一个重要超参数通常设置为output_stride / 6左右output_stride是网络下采样倍数需要根据任务调整。6.2 损失函数的选择与权衡对于热图预测最常用的损失函数是均方误差MSE Loss或带权重的MSE。因为热图上大部分区域都是0背景只有关键点附近有小区域是非零值这会导致正负样本极度不平衡。常见的改进是使用MSELoss结合焦点损失Focal Loss的思想或者直接使用自适应加权MSE给正样本区域高斯核区域更高的权重。以带权重的MSE为例import torch.nn as nn import torch.nn.functional as F class KeypointMSELoss(nn.Module): def __init__(self, use_target_weightFalse): super().__init__() self.criterion nn.MSELoss(reduction‘mean‘) self.use_target_weight use_target_weight # 是否对每个关键点使用不同的权重 def forward(self, output, target, target_weightNone): “”“ output: (B, K, H, W) 网络预测的热图 target: (B, K, H, W) 真实热图 target_weight: (B, K, 1) 每个关键点的权重根据可见性等计算 ”“” batch_size output.shape[0] num_keypoints output.shape[1] # 计算每个关键点、每个样本的损失 losses [] for i in range(num_keypoints): pred_i output[:, i].reshape(batch_size, -1) # (B, H*W) gt_i target[:, i].reshape(batch_size, -1) if self.use_target_weight and target_weight is not None: # 例如对v0缺失的关键点权重设为0不参与损失计算 weight target_weight[:, i].unsqueeze(-1) # (B, 1) loss_i self.criterion(pred_i * weight, gt_i * weight) else: loss_i self.criterion(pred_i, gt_i) losses.append(loss_i) # 对所有关键点的损失取平均 total_loss sum(losses) / num_keypoints return total_loss对于存在大量遮挡或标注不全的数据集合理利用target_weight至关重要。我们可以将可见性v为0的关键点权重设为0v为1遮挡的权重设为0.5v为2可见的权重设为1.0这样模型就不会强行去学习那些根本没有标注信息的位置。7. 训练流程中的关键技巧与问题排查7.1 学习率策略与优化器选择姿态估计模型通常较大如HRNet-W48训练需要谨慎。AdamW 优化器目前是很多工作的首选它结合了Adam的自适应学习率和权重衰减。初始学习率可以设得小一些例如3e-4或1e-3。学习率调度策略推荐使用余弦退火Cosine Annealing或带热重启的余弦退火Cosine Annealing with Warm Restarts。这能让学习率平滑下降并在后期进行小幅“重启”有助于模型跳出局部最优。PyTorch中调用torch.optim.lr_scheduler.CosineAnnealingLR或CosineAnnealingWarmRestarts非常方便。注意事项在训练初期前几个epoch可以使用线性热身Linear Warmup策略将学习率从0逐渐增加到初始值。这能稳定训练防止初期梯度爆炸。许多开源代码库如MMPose都内置了这个功能。7.2 多尺度训练与测试为了提升模型对不同分辨率人物的检测能力多尺度训练是标准操作。在数据加载时随机将输入图像缩放到一个尺寸范围内如[256, 288, 320, 352, 384, 416, 448, 480, 512]中的某个尺寸。同时保持输入图像的长宽比通过填充Padding到正方形。在测试推理时通常采用多尺度测试和翻转测试。即将同一张图像缩放到多个尺度如[256, 384, 512]并分别进行水平翻转将所有预测结果进行平均或取最大值能显著提升最终精度AP但会成倍增加计算时间。在工程部署时需要权衡精度和速度。7.3 常见训练问题与排查表在训练你自己的模型时很可能会遇到以下问题。这里提供一个快速排查指南问题现象可能原因排查与解决思路Loss不下降或震荡剧烈学习率过高。数据标注噪声太大。数据增强过于激进导致标签“失真”。1. 大幅降低学习率如降到1e-4尝试。2. 可视化一批训练数据检查增强后的图像和关键点是否还合理。3. 关闭所有数据增强用原始数据训练几轮看Loss是否正常下降。模型预测所有关键点都在图像中心标签处理错误导致热图全为0或中心有固定模式。损失函数权重失衡背景主导。1. 检查热图生成函数确保高斯核中心坐标计算正确。2. 可视化生成的热图标签看高斯斑点是否出现在正确位置。3. 在损失函数中增加正样本区域的权重。验证集精度远低于训练集严重过拟合。训练集和验证集数据分布差异大。1. 增加数据增强特别是CutOut, MixUp。2. 使用更强的正则化如Dropout, Weight Decay。3. 检查验证集标注质量是否比训练集难很多某些关键点如手腕、脚踝精度始终很低这些关键点在数据集中本身被遮挡多、标注少或模糊。模型容量不足或感受野不够大。1. 统计数据集中各关键点的可见性比例对低可见性关键点使用更高的损失权重。2. 考虑使用注意力机制或非局部网络模块增强模型对长距离依赖的建模能力。3. 尝试更大的backbone或更高分辨率的特征图。训练速度非常慢输入图像尺寸过大。数据加载管道是瓶颈未使用多进程。模型太大。1. 适当减小输入尺寸如从512x512降到384x384。2. 在DataLoader中设置num_workers为CPU核心数如8并启用pin_memoryTrue。3. 使用混合精度训练AMP可以大幅加速并减少显存占用。实操心得训练初期我习惯先在一个非常小的子集比如100张图上过拟合。如果模型能在这个小数据集上快速达到接近0的训练损失说明整个数据管道、模型前向传播、损失计算、反向传播的流程基本是正确的。然后再放到全量数据上训练这样能尽早排除代码层面的低级错误。8. 模型评估与指标解读模型训练完成后我们需要用验证集或测试集进行定量评估。骨骼关键点检测最核心的评估指标是OKSObject Keypoint Similarity基础上的APAverage Precision和ARAverage Recall。8.1 OKS关键点相似度OKS类似于目标检测中的IoU它衡量预测关键点与真实关键点的相似程度。计算公式为OKS Σ_i [exp(-d_i^2 / (2 * s^2 * κ_i^2)) * δ(v_i 0)] / Σ_i [δ(v_i 0)]d_i第i个关键点预测坐标与真实坐标的欧氏距离。s人物尺度的平方根sqrt(area)面积越大允许的误差范围也越大。κ_i第i个关键点的归一化常数反映该关键点标注的难易程度如眼睛比髋部更容易标。这个值通常由数据集提供方根据标注者的一致性计算得出。δ(v_i 0)指示函数当真实关键点可见v0时为1否则为0。OKS值在0到1之间越接近1表示预测越准确。8.2 AP与AR基于OKS我们可以设定一个阈值如0.5, 0.75。对于一个预测的人体实例如果其与某个真实实例的OKS大于阈值则认为该预测是正确匹配True Positive。然后像目标检测一样计算不同置信度下的 Precision-Recall 曲线。AP (Average Precision)通常指OKS阈值设为0.5时的平均精度AP0.5或者更常用的在多个OKS阈值如0.5, 0.55, 0.6, ..., 0.9, 0.95上取平均记为AP有时叫AP^0.5:0.95 COCO的主要指标。AR (Average Recall)在每张图片中限定最多检测K个人如K20的情况下计算的平均召回率。在COCO数据集的评估中你会看到诸如AP,AP0.5,AP0.75,AP (medium),AP (large),AR等指标。对于你自己的数据集如果标注格式与COCO兼容可以直接使用官方的pycocotools库进行评估这是最权威的方式。排查技巧实录如果评估时AP异常低比如低于0.1首先不要怀疑模型而是检查评估代码和预测结果的格式。确保你生成的预测结果JSON文件完全符合COCO评估API要求的格式。一个常见的错误是坐标未归一化或归一化错了尺度应该是相对于原图而不是输入网络的缩放后图像。另一个错误是关键点顺序与数据集的定义不匹配。务必仔细对照categories中的keypoints列表顺序。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价