Pose Detection — 一种计算机视觉技术,通过关键点(landmarks)确定人体位置:头部、肩膀、肘部、手腕、臀部、膝盖、脚踝。每个点在2D空间中具有坐标(x, y),而扩展模型(MediaPipe BlazePose 3D)添加了z坐标以表示深度。在移动应用中,Pose Detection用于健身追踪器、瑜伽应用、AR滤镜、康复计划和运动分析系统。根据Google ML Kit, 2025,设备端Pose Detection每秒可处理多达30帧,准确率达94% PCK。
要点
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 Acc | 33 | 94% | 15–30 ms | 14 MB |
| BlazePose Full | 33 + 3D | 96% | 10–20 ms | 12 MB |
| BlazePose Lite | 33 | 91% | 5–10 ms | 5 MB |
| MoveNet Lightning | 17 | 91% | 8–15 ms | 8 MB |
| MoveNet Thunder | 17 | 95% | 25–40 ms | 13 MB |
Keypoint Visibility:每个关键点都有一个置信度分数(0..1),表示模型对该点的确信程度以及该点是否可见。分数< 0.5的点被视为不可见(被遮挡、在画面外)。对于姿态分析,只使用可见点。对于对齐评估——计算置信度加权距离,其中低分数的点在指标中权重较小。
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计算。
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 — 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提供自然深度。
// 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的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延迟)。
// 使用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°——手臂伸直。
// 基于规则的下蹲分类器
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个样本上训练分类器。
带技术纠正的健身追踪器 — 应用分析用户在锻炼过程中的姿态并给出语音提示:“放低骨盆”、“不要倾斜躯干”。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。
// 基于姿态地标的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为大众市场提供了可负担的替代方案。帧间角度同步是关键组成部分。
常见问题
使用时间平滑(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)。
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。
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)。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。