3.9 KiB
3.9 KiB
OpenPose — 人体姿态估计
概述
OpenPose 是卡耐基梅隆大学(CMU)提出的开源实时多人姿态估计框架,采用多阶段、多分支网络结构,通过 Part Affinity Fields (PAFs) 和关键点热力图实现多人姿态的精准检测与关联。
核心特性
| 特性 | 说明 |
|---|---|
| 模型类型 | 多人 2D 姿态估计 |
| 输入形式 | 单张 RGB 图像 |
| 输出形式 | 关键点坐标 + 骨架连接 + 置信度 |
| 关键点数量 | 19 个身体关键点 |
| 核心思想 | PAFs (Part Affinity Fields) + 关键点热力图 |
模型架构
graph LR
A[输入图像] --> B[轻量骨干网络]
B --> C[Stage 1: 热力图分支]
B --> D[Stage 1: PAF 分支]
C --> E[Stage 2: 精细化热力图]
D --> F[Stage 2: 精细化PAF]
E --> G[关键点热力图]
F --> H[部位亲和场]
- 热力图分支(Heatmap) — 预测每个关键点(关节)的位置概率分布
- PAF 分支(Part Affinity Fields) — 预测关键点之间的连接方向和置信度
- 多阶段细化(Multi-stage Refinement) — 多个 stage 逐级优化预测质量
目标应用场景
- 运动分析 — 运动员动作捕捉与分析
- 人机交互 — 手势控制、AR/VR 应用
- 康复医疗 — 患者姿态评估与康复训练
- 安防监控 — 行人姿态分析与异常行为检测
参考来源
输入 / 输出规格
模型接口
| 方向 | 名称 | 数据类型 | 维度 | 尺寸 | 说明 |
|---|---|---|---|---|---|
| 输入 | INPUT:0 | UINT8 | 4D | 1 × 1 × 256 × 1272 | 输入灰度图 (H×W=256×1272) |
| 输出 | OUTPUT:0 | FP32 | 4D | 1 × 19 × 32 × 53 | 热力图 (19 个关键点) |
| 输出 | OUTPUT:1 | FP32 | 4D | 1 × 38 × 32 × 53 | PAF (19×2 个连接方向) |
| 输出 | OUTPUT:2 | FP32 | 4D | 1 × 19 × 32 × 53 | 细化热力图 |
| 输出 | OUTPUT:3 | FP32 | 4D | 1 × 38 × 32 × 53 | 细化 PAF |
19 个身体关键点包括:鼻子、颈部、双肩、双肘、双手腕、双髋、双膝、双脚踝等。
后处理流程
flowchart TD
A[热力图] --> B[NMS 非极大值抑制]
B --> C[定位候选关键点]
C --> D{置信度 > 阈值?}
D -->|是| E[保留关键点候选]
D -->|否| F[丢弃]
A --> G[PAF 部位亲和场]
E --> H[基于 PAF 连接评分]
G --> H
H --> I[构建骨架候选边]
I --> J[筛选高置信度连接]
J --> K[组装完整姿态]
K --> L[多人聚类与去重]
L --> M[最终多人姿态]
步骤说明
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | NMS | 从热力图中定位候选关键点位置(非极大值抑制) |
| 2 | 关键点对齐 | 基于坐标形成潜在的骨架连线候选 |
| 3 | PAF 评分 | 利用部位亲和场筛选高置信度连接 |
| 4 | 姿态组装 | 将筛选出的骨架连接组装成完整姿态 |
| 5 | 多人聚类 | 将属于不同人的骨架分配到各自的姿态条目 |
执行与性能
运行方式
python openpose.py
性能指标
| 指标 | 数值 |
|---|---|
| 推理平台 | 边缘板卡(NPU) |
| 推理时间 | ~60.35 ms |
| 输出 2 FE 均值误差 | 0.001579 |
| 输出 2 FE 最大误差 | 0.350395 |
| 输出 3 FE 均值误差 | 0.000503 |
| 输出 3 FE 最大误差 | 0.209612 |
FE 相似度反映板卡输出与 PC 端参考输出的偏差,数值越低一致性越好。
输出示例
姿态估计结果
图中骨骼线表示检测到的人体姿态,不同颜色区分不同个体。结果图保存路径:
../resource/openpose/result.jpg
