Explore 3D body pose and person segmentation in Vision
Spatial Computing 进阶 20m

探索 Vision 框架中的 3D 人体姿态与人物分割

Explore 3D body pose and person segmentation in Vision

2023年6月5日

在 Apple 官方观看视频

一句话判断

Vision 框架从 2D 人体姿态检测升级到了 3D——新的 VNDetectHumanBodyPose3DRequest 返回真实世界坐标系中的骨骼关节点,配合人物实例分割,为健身、AR 交互等场景打开了新的可能性。

这场 Session 讲了什么

Session 介绍了 Vision 框架的三项新能力:3D 人体姿态检测、深度信息在人物检测中的应用、以及基于实例分割的人物提取。

3D 人体姿态检测。新的 VNDetectHumanBodyPose3DRequest 返回包含 17 个关节点的 3D 骨骼。与 2D 版本不同,关节点位置以真实世界的米为单位返回,坐标系以根关节(髋部中心)为原点。骨骼分为头部、躯干、左臂、右臂、左腿、右腿六个组,每个组包含对应的关节点。当前版本每次请求只返回最突出的人物骨骼。

深度辅助的人物检测。Vision 框架现在可以利用深度信息来增强人物检测的准确性,特别是在人物重叠或遮挡场景中。

实例分割的人物提取。新的实例分割能力可以区分画面中的不同人物,为每个人物生成独立的分割掩码。这意味着你可以把图像中的多个人物分别”提取”出来,用于背景替换、人物高亮等效果。

值得深挖的点

3D 坐标系的实际意义:2D 姿态返回的是归一化的像素坐标(0-1 范围),3D 姿态返回的是物理世界的米制坐标。这意味着你不仅知道关节在哪里,还知道它们之间的物理距离。对于健身应用来说,这让你可以测量动作的幅度和角度,而不需要额外的传感器。

单人物限制:当前 3D 姿态检测只返回最突出(通常是最近、最大)的人物。如果你需要多人场景,目前只能用 2D 版本或结合实例分割分批处理。

关节分组的重合设计:某些关节属于多个组(比如肩关节同时属于躯干和手臂组)。这种设计方便你按组查询关节,但需要注意不要重复计算。

代码片段

执行 3D 人体姿态检测:

import Vision

// 创建 3D 人体姿态检测请求
let bodyPoseRequest = VNDetectHumanBodyPose3DRequest()

// 在图像或视频帧上执行
let handler = VNImageRequestHandler(url: imageURL)
try handler.perform([bodyPoseRequest])

// 获取结果
guard let observation = bodyPoseRequest.results?.first else { return }

// 按组获取关节点
let torsoJoints = try observation.recognizedJointGroup(.torso)
for joint in torsoJoints {
    // 位置以米为单位,相对于根关节(髋部中心)
    print("\(joint.name): \(joint.position)")
}

// 获取特定关节
let rightShoulder = try observation.recognizedPoint(.rightShoulder)
let rightElbow = try observation.recognizedPoint(.rightElbow)
let rightWrist = try observation.recognizedPoint(.rightWrist)

最佳实践

  • 3D 姿态适合健身动作分析、运动测量等需要物理尺度的场景
  • 多人场景中,先用实例分割定位人物区域,再对每个人物分别做姿态检测
  • 利用关节分组(torso、arms、legs)简化特定身体部位的分析逻辑
  • 深度信息在遮挡场景中提升准确性,优先使用带深度数据的输入
  • 视频流中持续检测时注意性能优化,合理设置请求频率

还有什么值得关注

  • 3D 姿态检测在 visionOS 上的实时性能表现
  • 实例分割掩码的精度和边缘质量
  • 从 2D 姿态 API 迁移到 3D 姿态 API 的路径
  • 与 ARKit 骨骼追踪的能力对比和互补关系
WWDC 2023