目录

端侧姿态估计实战:用 MediaPipe Pose Landmarker 给应用装上骨架追踪

为什么要在端侧做姿态估计

健身 App 的深蹲计数、体感游戏的角色控制、运动康复的关节角度分析、儿童体态监测——这些场景的共同点是需要实时追踪人体骨架,而画面里全是敏感的身体信息。把姿态估计模型跑在设备端,视频不出手机,延迟低到能跟上 30fps 的视频流,还不用为每次推理付云服务费。这就是端侧姿态估计(On-Device Pose Estimation)的价值。

过去这类能力门槛很高,但 2026 年的今天,一个 5.8MB 的模型就能在普通手机上实时输出人体 33 个关键点坐标。这篇文章带你从模型选型到完整代码跑通全流程。

方案选型:MoveNet 还是 Pose Landmarker

端侧单人姿态估计有两大主流开源方案,都是 Google 出品:

方案 关键点 模型体积 输入尺寸 特点
MoveNet Lightning 17 点 约 4.5MB 192x192 轻量优先,帧率高
MoveNet Thunder 17 点 约 12.6MB 256x256 精度优先
Pose Landmarker Lite 33 点 5.8MB 256x256 含脸部 6 点,轻量
Pose Landmarker Full 33 点 9.4MB 256x256 精度/速度均衡
Pose Landmarker Heavy 33 点 30.7MB 256x256 最高精度,桌面端

MoveNet 只有 17 个关键点(躯干加四肢),而 Pose Landmarker 基于 BlazePose 架构输出 33 个关键点,多了眼睛、耳朵、嘴巴等面部点位,还附带每个点的可见度和世界坐标,做健身计数、动作比对都更从容。体积只差 1MB,我推荐直接用 Pose Landmarker,三个档位按设备性能挑。

以上体积数据来自 Google 官方模型仓库(storage.googleapis.com 的 float16 版本),实测下载确认。

实战:Python 十分钟跑通

先安装依赖并下载 Lite 模型:

1
2
pip install mediapipe
wget https://storage.googleapis.com/mediapipe-models/pose_landmarker/pose_landmarker_lite/float16/1/pose_landmarker_lite.task

推理代码只有二十几行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import cv2
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

# 加载模型
base_options = python.BaseOptions(model_asset_path="pose_landmarker_lite.task")
options = vision.PoseLandmarkerOptions(
    base_options=base_options,
    running_mode=vision.RunningMode.VIDEO,   # 视频流模式
    num_poses=1,
    min_pose_detection_confidence=0.5,
)
landmarker = vision.PoseLandmarker.create_from_options(options)

cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame)
    result = landmarker.detect_for_video(mp_image, int(cap.get(cv2.CAP_PROP_POS_MSEC)))
    if result.pose_landmarks:
        # 每个关键点: x, y, z, visibility(归一化坐标 0-1)
        lm = result.pose_landmarks[0]
        print(f"左肩: ({lm[11].x:.3f}, {lm[11].y:.3f}) 可见度 {lm[11].visibility:.2f}")
    cv2.imshow("pose", frame)
    if cv2.waitKey(1) == 27:
        break

关键点索引是固定枚举:0 鼻子、11 左肩、12 右肩、13 左肘、14 右肘、15 左腕、16 右腕、23 左髋、24 右髋、25 左膝、26 右膝、27 左踝、28 右踝。坐标全部归一化到 0-1,乘以画面宽高即得像素位置。

应用实战:深蹲计数

有了关键点坐标,做健身计数就只剩三角函数。深蹲的核心特征是髋膝踝三点夹角小于某个阈值:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import math

def angle(a, b, c):
    """计算三点夹角(度),b 为顶点"""
    ab = (a.x - b.x, a.y - b.y)
    bc = (c.x - b.x, c.y - b.y)
    dot = ab[0]*bc[0] + ab[1]*bc[1]
    mag = math.hypot(*ab) * math.hypot(*bc)
    return math.degrees(math.acos(max(-1, min(1, dot / mag))))

# 每帧调用:右髋(24)、右膝(26)、右踝(28)
knee = angle(lm[24], lm[26], lm[28])
# 膝盖夹角 < 100 度 记为下蹲,恢复 > 160 度 记为站起,状态机计数

配合一个简单的状态机(下蹲-站起翻转一次计一个数),50 行代码就能做出可用的深蹲计数器,全程本地推理、无网络依赖。

端侧性能与集成建议

按 Google 官方文档数据,Pose Landmarker 在移动 GPU 上:Lite 模型可达 100fps 以上,Full 模型 60fps 左右,Heavy 模型约 30fps(手机 CPU 上会明显下降)。实际体验中,中端 Android 手机跑 Lite 用 CPU delegate 也能稳定 30fps,完全满足实时视频流需求。

集成到不同端侧框架:

  • Android:官方 AAR 包,PoseLandmarker.createFromFile 一行加载,支持 CPU/GPU delegate
  • iOS:MediaPipe Tasks Swift API,模型转 Core ML 后可配合 Vision 框架(参考本站 YOLOv8 转 Core ML 一文的方法)
  • 桌面/树莓派:Python API 开箱即用,Heavy 模型在桌面 CPU 约 15-25fps

开源方案推荐

项目 适用场景
MediaPipe Tasks(官方) 跨端生产级方案,Android/iOS/Python/Web 全覆盖
MoveNet(TFLite) 极致轻量,低端设备首选
mmpose(OpenMMLab) 学术研究、自定义训练,精度上限高
Ultralytics YOLOv8-pose 想用 YOLO 统一检测+姿态管线时

小结

端侧姿态估计已经不是高不可攀的算法题,而是一个下载模型、二十行代码就能落地的工程活。选 Pose Landmarker Lite 起步,用关键点夹角做业务逻辑,Android 直接集成官方 SDK,iOS 走 Core ML 转换——这套路径从原型到上线都走得通。下一篇可以聊聊用姿态关键点序列训练动作分类模型,把"计数"升级成"动作识别"。