Detect animal poses in Vision
Spatial Computing 进阶 20m

用 Vision 检测动物姿态

Detect animal poses in Vision

2023年6月5日

在 Apple 官方观看视频

一句话判断

Vision 框架现在能检测猫狗的 25 个身体关节点——包括耳朵、尾巴、四肢,配合实时视频流可以做动物行为分析、AR 贴纸、智能宠物设备,宠物类 App 开发者应该立刻关注。

这场 Session 讲了什么

Session 介绍了 Vision 框架新增的 Animal Body Pose API。

核心能力

  • DetectAnimalBodyPoseRequest:检测猫和狗的 25 个身体关节点。
  • 六个关节组:Head(耳朵、眼睛、鼻子)、Forelegs(前腿)、Hindlegs(后腿)、Trunk(颈部)、Tail(三个尾部关节)、All(全部)。
  • 支持静态图片和视频流输入。
  • 每张图片最多检测两只动物。
  • 最小输入图片尺寸 64x64 像素。
  • 利用 Neural Engine,性能足以支撑实时相机流。
  • 可用平台:iOS 17、iPadOS 17、tvOS 17、macOS Sonoma。

应用场景

  • 静态图片姿态识别:拉伸、站立、乞食、奔跑、蜷缩。
  • 视频行为分析:追踪动物运动轨迹,判断活动类型。
  • AR 贴纸:在关节点位置放置表情/装饰(Demo 展示了给狗戴头盔和墨镜)。
  • 智能设备联动:配合 DockKit 电机支架追踪动物移动。
  • 组合 Animal Recognition(识别动物种类)+ Animal Body Pose(检测姿态)做更完整的分析。

其他 Vision 更新

  • VNTargetedImage-based 请求现在支持 Stateful Request(有状态请求),命名中使用”Track”动词。
  • Vision 支持 MLComputeDevice,可以查询和指定请求在哪个计算设备上执行。
  • Core ML 和 Create ML 多标签分类增强。

值得深挖的点

25 个关节点包含尾巴和耳朵是区分 Animal Body Pose 和 Human Body Pose 的关键。人类姿态检测只有 19 个关节,动物有 25 个——因为动物的耳朵和尾巴是行为表达的重要组成部分。猫的尾巴位置能告诉你它的情绪状态,狗的耳朵角度能反映它的注意力。

Animal Recognition + Animal Body Pose 的组合提供了从”这是什么动物”到”它在做什么”的完整信息链。单独用 Recognition 只能知道”画面中有一只猫”,加上 Body Pose 才能知道”这只猫在伸懒腰”。Session 用”谁弄乱了餐桌”的例子展示了这个组合的实际价值。

实时视频流中的 EKF 滤波器用于平滑关节点追踪。原始推理结果可能有噪声和间隙(比如动物被部分遮挡),统计滤波器能修正这些错误并保持追踪连续性。这个技术同样适用于 Human Body Pose。

代码片段

检测动物姿态的基本流程:

import Vision

// 创建动物姿态检测请求
let request = VNDetectAnimalBodyPoseRequest()

// 创建请求处理器
let handler = VNImageRequestHandler(cgImage: sourceImage)

// 执行检测
try handler.perform([request])

// 获取结果
if let observation = request.results?.first as? VNAnimalBodyPoseObservation {
    // 获取所有关节点
    let allPoints = try observation.recognizedPoints(.all)

    // 获取特定关节组(比如只看头部)
    let headPoints = try observation.recognizedPoints(.head)

    // 遍历关节点
    for (jointName, point) in allPoints {
        guard point.confidence > 0.5 else { continue }
        let location = point.location  // 归一化坐标
        print("关节 \(jointName)\(location)")
    }
}

在相机流中实时检测:

// 从相机捕获的 CMSampleBuffer 中检测
func captureOutput(_ output: AVCaptureOutput,
                   didOutput sampleBuffer: CMSampleBuffer,
                   from connection: AVCaptureConnection) {
    let request = VNDetectAnimalBodyPoseRequest()

    guard let handler = try? VNImageRequestHandler(
        cmSampleBuffer: sampleBuffer
    ) else { return }

    try? handler.perform([request])

    // 获取关节点并绘制骨架
    if let observation = request.results?.first {
        let points = try? observation.recognizedPoints(.all)
        drawSkeleton(points)
    }
}

在关节点位置放置 AR 贴纸:

// 给宠物戴头盔——在耳朵关节点上方放置emoji
func addHelmet(to observation: VNAnimalBodyPoseObservation) {
    let earPoints = try? observation.recognizedPoints(.head)

    // 获取耳朵位置,在其上方放置头盔emoji
    guard let leftEar = earPoints?["leftEar"],
          let rightEar = earPoints?["rightEar"] else { return }

    let helmetPosition = calculatePosition(above: leftEar, rightEar)
    placeEmoji("⛑️", at: helmetPosition, size: 40)
}

最佳实践

  • 检查关节点的 confidence 值,低于 0.5 的点可能不准确,不要用于关键逻辑。
  • 如果只需要特定部位的数据,使用对应的关节组而非 .all,减少不必要的计算。
  • 实时场景中利用 Neural Engine 保证性能,避免在 CPU 上处理。
  • 最多检测两只动物,如果画面中有更多动物,只返回前两只。
  • 组合 Animal Recognition 和 Animal Body Pose 获取更完整的分析结果。
  • 视频追踪中利用 EKF 滤波器的平滑特性,不要直接使用原始关节点位置。

还有什么值得关注

  • Vision 的 Stateful Request(带 Track 动词的请求)对视频追踪场景更友好。
  • MLComputeDevice API 让你可以指定请求在 GPU、Neural Engine 或 CPU 上执行。
  • DockKit 框架可以配合 Animal Body Pose 做动物追踪——电动支架自动跟随宠物移动。
  • 动物行为分析是一个很有潜力的方向——结合关节点时间序列数据可以做活动分类。
  • 目前只支持猫和狗,未来可能扩展到更多动物种类。
WWDC 2023