Pose Estimation
姿态估计会定位关节等关键点,以描述人体或物体的姿态。涵盖自顶向下、自底向上和单阶段方法,以及 OKS。
姿态估计是计算机视觉任务,旨在定位人体或物体上预先定义的一组关键点,例如人的肩部、肘部和膝盖,并将它们连接成描述姿势的骨架。模型会输出每个关键点在图像中的坐标或其 3D 位置,以及对应的置信度分数,以便应用测量关节角度、统计重复次数或识别动作。姿态估计描述每个人的站姿或动作;目标检测得到的边界框或实例分割得到的掩码都无法捕捉这些信息。
姿态估计的工作原理#
多人的 2D 姿态估计器采用以下三种策略之一,其中第三种与单阶段目标检测器类似:
- 自顶向下: 人体检测器会找出图像中的所有人,然后单人模型在每个裁剪区域内预测关键点,例如 HRNet(2019)和 ViTPose(2022)。这种方法对体型较大且清晰可见的人准确率很高,但计算开销会随人数增加。
- 自底向上: 网络会一次性找出图像中的所有关键点,然后将它们分组为不同的人。OpenPose(2017)会使用部位亲和场连接关节;部位亲和场是沿肢体方向指向的 2D 向量,因此在人群密集时,其计算开销仍基本不变。
- 单阶段: 网络会在一次前向处理中,从同一个网格位置预测一个人的边界框和该人的所有关键点,无需裁剪或分组步骤。YOLO-Pose(2022)将这种设计引入 YOLO。
关键点位置可以通过热力图得到,即每个关键点对应一张概率图,峰值代表该关键点的位置;也可以直接回归坐标。多年来,热力图在基准测试中表现领先,但会占用内存,且受限于热力图分辨率。2021 年,残差对数似然估计 (RLE)通过正规化流学习预测误差的分布,缩小了回归方法之间的差距。YOLO26姿态模型是使用 RLE 训练的单阶段回归器:训练时,额外分支会预测每个关键点的不确定性,并由 RealNVP 流评估误差;模型融合以供推理时,这两者都会被移除,因此不会增加推理开销。
from ultralytics import YOLO
# 加载一个使用 COCO 的 17 个身体关键点训练的 YOLO26 nano 姿态模型
model = YOLO("yolo26n-pose.pt")
# 一次前向处理找出所有人及其关键点
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# 形状为 (人数, 关键点数, xy);保存绘制了骨架的图像
print(result.keypoints.xy.shape)
result.save(filename="pose_result.jpg")打印出的形状表示检测到的人数、17 个关键点以及 2 个像素坐标;保存的图像会在每个人身上绘制对应的骨架。
2D 和 3D 姿态估计#
2D 估计器会返回像素坐标。3D 人体姿态估计会使用第二个网络从一系列 2D 关键点恢复关节的空间位置,例如 VideoPose3D;也可以通过三角测量多个经过校准的摄像头所看到的关键点,或者将 SMPL 等参数化人体网格拟合到图像上来实现。物体姿态估计是另一项任务:它会恢复刚性物体的 3D 旋转和平移,通常依据物体表面的关键点,用于机器人抓取和增强现实。
姿态估计评估#
COCO Keypoints基准包含约 25 万个人体标注,每人标注 17 个关键点;它使用目标关键点相似度(OKS)评估预测结果,这是交并比(IoU)在关键点任务中的对应指标。对于每个已标注关键点,预测位置与标注位置间的距离 d 会转换为相似度 exp(-d²/(2s²k²)),其中 s² 是该人物分割区域的面积,k 是根据标注者放置该关键点的一致程度测得的每个关键点的常数。OKS 对所有已标注关键点的相似度取平均,而平均精度均值(mAP)则对 0.50 到 0.95 之间的 OKS 阈值取平均。
import numpy as np
# COCO falloff constants: annotators place eyes far more consistently than hips
sigmas = {"eye": 0.025, "hip": 0.107}
area = 20_000 # person's segmented area in pixels (s squared)
error = 5.0 # predicted keypoint lies 5 pixels from its label
# Per-keypoint OKS term: exp(-d^2 / (2 s^2 k^2)) with k = 2 * sigma
for name, sigma in sigmas.items():
similarity = np.exp(-(error**2) / (2 * area * (2 * sigma) ** 2))
print(f"{name}: {similarity:.2f}")同样偏差 5 个像素,在眼睛上的评分为 0.78,在髋部上的评分为 0.99。其他基准测试会使用不同的指标:MPII 报告 PCKh,即位于标签半个头部大小范围内的关键点占比;Human3.6M 等 3D 基准测试则报告以毫米为单位的关节平均位置误差。










