Pose Detection:什么是姿态检测、模型及工作原理

作者: IT Sectr 发布日期: 2026-07-19 阅读时间: 9 分钟

Pose Detection — 一种计算机视觉技术,通过关键点(landmarks)确定人体位置:头部、肩膀、肘部、手腕、臀部、膝盖、脚踝。每个点在2D空间中具有坐标(x, y),而扩展模型(MediaPipe BlazePose 3D)添加了z坐标以表示深度。在移动应用中,Pose Detection用于健身追踪器、瑜伽应用、AR滤镜、康复计划和运动分析系统。根据Google ML Kit, 2025,设备端Pose Detection每秒可处理多达30帧,准确率达94% PCK。

要点

  • Pose Detection — 从图像中确定身体关键点(landmarks)
  • ML Kit Pose Detection — 33个关键点,30 FPS,准确率94% PCK
  • MediaPipe BlazePose — 33个关键点 + 3D,GPU上可达60 FPS
  • MoveNet Lightning — 17个关键点(COCO),30+ FPS,8 MB,INT8
  • On-device — 隐私保护、实时处理、无需将视频发送到服务器

什么是Pose Detection:基础与指标

Pose Detection(又称Pose Estimation)是指从图像或视频中确定人体语义关键点的任务。Top-down方法首先检测人体(Object Detection),然后确定其姿态。Bottom-up方法在图像中找到所有关键点,然后按人物进行分组(OpenPose)。对于移动设备,使用bottom-up方法——当画面中有多人时速度更快。ML Kit和BlazePose使用single-stage方法——检测和姿态在一个过程中完成。

COCO Keypoints — 标准17点集:鼻子、眼睛(2)、耳朵(2)、肩膀(2)、肘部(2)、手腕(2)、臀部(2)、膝盖(2)、脚踝(2)。MediaPipe BlazePose使用33个点,增加了:脚趾、脚跟、躯干中心、面部点。点越多,姿态分析越精确,但计算负载也越高。对于健身应用,17–20个点就足够了。对于完整分析(瑜伽、舞蹈)——33个点。对于AR滤镜——33个点 + 468个面部点(MediaPipe Face Mesh)。

PCK(Percentage of Correct Keypoints) — Pose Detection的精度指标。计算在ground truth距离范围内预测的点比例(通常为人体边界框大小的0.05–0.15)。ML Kit Pose Detection:94% PCK@0.1。BlazePose Full:96% PCK@0.1。MoveNet Lightning:91% PCK@0.1。OKS(Object Keypoint Similarity)——COCO中使用的指标,考虑人体比例和点的难度。mAP@OKS——基准测试的标准指标。

模型关键点PCK@0.1延迟(GPU)大小
ML Kit Pose Acc3394%15–30 ms14 MB
BlazePose Full33 + 3D96%10–20 ms12 MB
BlazePose Lite3391%5–10 ms5 MB
MoveNet Lightning1791%8–15 ms8 MB
MoveNet Thunder1795%25–40 ms13 MB

Keypoint Visibility:每个关键点都有一个置信度分数(0..1),表示模型对该点的确信程度以及该点是否可见。分数< 0.5的点被视为不可见(被遮挡、在画面外)。对于姿态分析,只使用可见点。对于对齐评估——计算置信度加权距离,其中低分数的点在指标中权重较小。

Android和iOS上的ML Kit Pose Detection

ML Kit Pose Detection — Google提供的设备端姿态检测库。支持33个关键点,包括面部点、脚趾和脚跟。模式:Accurate Mode(14 MB模型,15–30 ms,高精度)和Streaming Mode(5 MB,5–10 ms,用于实时)。Streaming Mode使用轻量级模型进行跟踪——在第一帧后跟踪运动而无需重新检测精确位置,从而提供高达60 FPS。

ML Kit Pose Detection API:PoseDetector(选项:setDetectorMode, setPerformanceMode)→ InputImage → Pose(List<PoseLandmark>)。每个PoseLandmark包含:landmarkType(38种类型)、position(PointF3D)、inFrameLikelihood(0..1)。Pose还提供:人体边界框、关键点列表、getLandmark(type)方法。对于姿态分类,使用骨骼之间的角度:shoulderAngle、elbowAngle、hipAngle——通过相邻关键点之间的Vector3D计算。

kotlin
val options = PoseDetectorOptions.Builder()
    .setDetectorMode(PoseDetectorOptions.STREAM_MODE)
    .setPerformanceMode(PoseDetectorOptions.PERFORMANCE_MODE_FAST)
    .build()

val detector = PoseDetection.getClient(options)

detector.process(inputImage)
    .addOnSuccessListener { pose ->
        val leftElbow = pose.getLandmark(PoseLandmark.LEFT_ELBOW)
        val leftShoulder = pose.getLandmark(PoseLandmark.LEFT_SHOULDER)
        val leftWrist = pose.getLandmark(PoseLandmark.LEFT_WRIST)
        val elbowAngle = calculateAngle(
            leftShoulder.position, leftElbow.position, leftWrist.position
        )
    }

iOS上的ML Kit:Pose Detection通过ML Kit CocoaPods提供。API与Android相同:PoseDetector → UIImage → Pose → PoseLandmark。在iOS上,ML Kit使用Core ML和ANE(A12+),在iPhone 15 Pro的Accurate Mode下提供10–20 ms延迟。Streaming Mode — 3–8 ms,高达120 FPS。在iOS上,ML Kit Pose Detection比MediaPipe BlazePose运行更快(Core ML加速),但在较旧设备(iPhone X–11)上落后于BlazePose。

MediaPipe BlazePose:架构与3D

MediaPipe BlazePose — Google Research的高性能Pose Detection模型。使用混合架构:基于MobileNetV2 + Feature Pyramid Network的检测器-解码器流程。BlazePose Full:33个关键点 + 3D坐标(深度z)。BlazePose Lite:33个关键点(2D),无深度。两种模型均在MediaPipe Tasks Vision中提供,支持Android、iOS、Python和Web。BlazePose Full在GPU上处理30–60 FPS,Lite — 60+ FPS。

使用BlazePose进行3D姿态估计:模型为每个关键点预测z坐标,从而无需立体相机即可评估深度(肢体的接近/远离)。z坐标在度量空间(米)中相对于相机计算。BlazePose 3D精度:在公开基准测试中为37 mm MPJPE(Mean Per Joint Position Error)——对健身和AR足够,对医疗诊断不足。对于ARKit/ARFoundation,BlazePose 3D提供自然深度。

kotlin
// MediaPipe姿态检测视觉任务
val options = PoseLandmarkerOptions.Builder()
    .setBaseOptions(BaseOptions.builder()
        .setModelAssetPath("pose_landmarker_full.task")
        .build())
    .setDelegate(Delegate.GPU)
    .build()

val landmaker = PoseLandmarker.createFromOptions(context, options)

val result = landmaker.detect(MPImage.fromBitmap(bitmap))
result.landmarks.forEach { pose ->
    pose.forEach { landmark ->
        drawLandmark(landmark.x, landmark.y, landmark.z)
    }
}

BlazePose vs ML Kit Pose Detection:BlazePose更快(60+ FPS对比30 FPS),支持3D坐标,通过MediaPipe实现跨平台。ML Kit集成更简单(无需MediaPipe SDK),包含预训练模型,精度高。对于iOS原生项目——ML Kit Pose Detection(针对ANE的最佳优化)。对于跨平台项目(Flutter、React Native)——MediaPipe BlazePose(所有平台的统一模型)。对于复杂场景的精度——两种模型相当。

MoveNet:TensorFlow的Lightning和Thunder

MoveNet — TensorFlow的Pose Detection模型家族,针对TFLite优化。Lightning(8 MB,INT8 — 4 MB):17个COCO关键点,91% PCK,8–15 ms延迟,30+ FPS。Thunder(13 MB,INT8 — 6 MB):17个关键点,95% PCK,25–40 ms延迟,20+ FPS。MoveNet使用CenterNet架构 + 双线性插值实现高分辨率热图。MoveNet支持多人体检测(最多6人)。模型在TensorFlow Hub中提供。

MoveNet Lightning vs Thunder:Lightning — 用于高FPS的实时应用(健身、AR滤镜)。Thunder — 用于GPU设备上的精确姿态分析(康复、运动分析)。两种模型均可通过tf-coreml转换为Core ML用于iOS。MoveNet也通过TFLite Task Vision PoseLandmarker API提供。建议:从Lightning开始,如果精度不足——切换到Thunder(仅增加+15 ms延迟)。

java
// 使用TFLite进行MoveNet推理
Interpreter interpreter = new Interpreter(loadModel(context));
TensorImage image = TensorImage.fromBitmap(bitmap);
image.load(Bitmap.createScaledBitmap(bitmap, 192, 192, true));

float[][] output = new float[1][51];
interpreter.run(image.getTensorBuffer(), output);

float[] keypoints = output[0];
for (int i = 0; i < 17; i++) {
    float y = keypoints[i * 3];
    float x = keypoints[i * 3 + 1];
    float score = keypoints[i * 3 + 2];
    drawKeypoint(x, y, score);
}

MoveNet Multi-Pose:检测画面中最多6人。MoveNet不是使用标准热图方法,而是使用人体检测 + 姿态细化:首先检测人物(基于质心),然后估计每个人的姿态。Multi-pose模式比single-pose慢2–3倍:Lightning — 25–50 ms(6人)。对于单人健身应用,使用single-pose。对于团体活动(瑜伽、CrossFit)——使用multi-pose并限制帧率以节省电池。

姿态分类:从点到动作

Pose Classification — 检测后的阶段:将landmarks转换为语义动作(站立、坐下、举手、下蹲)。方法:Rule-based(手动规则——骨骼之间的角度)、ML-based(对landmark向量进行逻辑回归或随机森林)、DL-based(基于帧的姿态序列LSTM分类器)。Rule-based — 50–80%准确率,简单快速。ML-based — 85–95%准确率,需要200+标注样本。LSTM — 90–98%准确率,基于时间序列(视频)。

骨骼之间的角度:为每个点计算与相邻点的角度。示例:右肘角度(shoulder → elbow → wrist)、右膝角度(hip → knee → ankle)、躯干角度(肩膀中点 → 臀部中点)。角度不受比例和人物在屏幕上位置的影响。将角度归一化到[0, 1]范围,可以使用简单的阈值规则对姿态进行分类:如果elbowAngle < 30°——手臂弯曲,如果> 150°——手臂伸直。

kotlin
// 基于规则的下蹲分类器
fun classifySquat(pose: Pose): SquatPhase {
    val kneeAngle = angle(
        pose.getLandmark(PoseLandmark.LEFT_HIP),
        pose.getLandmark(PoseLandmark.LEFT_KNEE),
        pose.getLandmark(PoseLandmark.LEFT_ANKLE)
    )
    return when {
        kneeAngle > 140f -> SquatPhase.STANDING
        kneeAngle < 90f  -> SquatPhase.SQUAT
        else           -> SquatPhase.TRANSITION
    }
}

MediaPipe Pose Classification — MediaPipe Tasks中的预训练分类器:下蹲、俯卧撑、平板支撑、抬腿。分类器接收landmarks列表并返回动作 + 置信度。包括时间平滑(temporal filter):HED(Holt Exponential Double Smoothing)用于姿态之间的平滑过渡。对于自定义动作——通过MediaPipe Model Maker(TensorFlow Lite + metadata)在100–500个样本上训练分类器。

Pose Detection在健身和康复中的应用

带技术纠正的健身追踪器 — 应用分析用户在锻炼过程中的姿态并给出语音提示:“放低骨盆”、“不要倾斜躯干”。ML Kit Pose Detection + 基于规则的分类器计算重复次数并评估质量。深蹲:膝角< 90°——正确深蹲,背角< 45°——危险的躯干倾斜。俯卧撑:最低点时肘角< 90°——完整俯卧撑。引体向上:下巴超过横杆水平。

康复与物理治疗 — Pose Detection用于远程监控物理治疗练习。医生设定参考姿态(例如肩外展45°),应用测量当前角度和偏差。BlazePose 3D提供±3°的角度精度——足以进行临床评估。频率:每3–5秒1帧(省电)。设备端——保护患者医疗数据的隐私。中风后康复:追踪手到肩、肘伸展、髋屈曲。

AR滤镜和特效 — Pose Detection是社交媒体(TikTok、Instagram、Snapchat)AR滤镜的基础。头部、肩膀和手部的关键点用于叠加面具、动画和装饰元素。MediaPipe BlazePose Full + Face Mesh(468个点)在旗舰设备上提供120+ FPS。ARKit/ARCore面部跟踪 + Pose Detection——全身AR的组合。要求:FPS > 30,运动到光子延迟< 20 ms。

swift
// 基于姿态地标的AR滤镜
let request = VNDetectHumanBodyPoseRequest { req, _ in
    guard let observation = req.results?.first as? VNHumanBodyPoseObservation else { return }
    let keypoints = try observation.recognizedPoints(.all)
    let rightShoulder = keypoints[VNHumanBodyPoseObservation.JointName.rightShoulder]
    DispatchQueue.main.async {
        arView.placeFilter(at: rightShoulder?.location ?? .zero)
    }
}

运动分析 — 专业技术评估:跑步的生物力学分析(步频、步幅、摆臂对称性)、游泳(身体滚动、划水时的肘角)、网球(肩部旋转、手腕动作)。MoveNet Thunder配合后处理为非专业分析提供了足够的精度。对于专业运动,需要3D动作捕捉(Vicon、OptiTrack),但手机上的Pose Detection为大众市场提供了可负担的替代方案。帧间角度同步是关键组成部分。

常见问题

如何稳定相机抖动时的Pose Detection?

使用时间平滑(temporal smoothing):One Euro Filter(1€ filter)——为每个关键点单独设置截止频率,抑制高频噪声(抖动),同时保持真实运动(低延迟)。MediaPipe BlazePose包含内置的HED(Holt Exponential Double Smoothing)——带运动预测的自适应平滑。对于ML Kit自行实现1€ filter:滤波器有两个参数——beta(速度)和minCutoff(频率阈值)。推荐值:beta = 0.04,minCutoff = 0.5(Android)。

Pose Detection可以检测画面中的多少人?

ML Kit Pose Detection — 检测一个人(single-pose)。MoveNet Lightning — 最多6人(multi-pose)。MediaPipe BlazePose — 通过MediaPipe Tasks检测最多2–3人(multi-pose)。对于团体活动应用,使用MoveNet Lightning或BlazePose。对于单人健身应用——ML Kit(更简单的集成、更高的single-pose精度)。对于带AR滤镜的视频通话——BlazePose Lite with multi-pose就足够了(高FPS)。

如何计算骨骼角度以进行姿态分类?

两骨骼之间的角度:取三个关键点——关节A、关节B(角顶点)、关节C。计算向量BA = (A - B)和BC = (C - B)。角度 = atan2(cross(BA, BC), dot(BA, BC))。Math.toDegrees(acos(dot(BA, BC) / (len(BA) * len(BC))))。角度范围为0–180°。对于三维坐标(BlazePose 3D)使用Vector3D。将角度归一化到[0,1]范围用于ML分类器。

能否同时检测双手的姿态?

是的,所有主要模型(ML Kit、BlazePose、MoveNet)同时检测双手的关键点:LEFT_SHOULDER、LEFT_ELBOW、LEFT_WRIST、RIGHT_SHOULDER、RIGHT_ELBOW、RIGHT_WRIST。要额外检测手部(手部追踪),请结合Pose Detection + Hand Landmarker(每只手21个点)。MediaPipe Hands + BlazePose是全身+手部的标准组合。在iOS上——VNDetectHumanHandPoseRequest + VNDetectHumanBodyPoseRequest。

Pose Detection对画面中人的最小尺寸要求?

ML Kit Pose Detection:最小人体边界框——100x100像素(宽高比~1:1)。MoveNet Lightning:120x120像素。BlazePose:80x160像素(垂直边界框)。对于距离相机3米处站立的人(1920x1080)——大约250x600 px,这足够了。距离> 5米时精度下降——使用Multi-Pose + 高分辨率输入。对于远距离对象,最好使用Object Detection + Pose Estimation(two-stage)。

总结

  • Pose Detection — 确定17–33个身体关键点,准确率91–96% PCK
  • ML Kit Pose Detection — 33个关键点,高达30 FPS,简单API,GPU/ANE上运行
  • BlazePose (MediaPipe) — 33个关键点 + 3D,高达60 FPS,跨平台
  • MoveNet Lightning/Thunder — 17个COCO关键点,30+ FPS,TFLite,多人检测
  • Pose Classification — 通过基于规则或ML从关键点识别动作
  • On-device — 隐私保护、实时处理、3 ms–30 ms延迟
  • 应用 — 健身、康复、AR滤镜、运动分析

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读