Spatial Computing 进阶 20m
用 Vision 检测动物姿态
Detect animal poses in Vision
2023年6月5日
一句话判断
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