图像人体姿态估计(DWPose)
更新时间:2026-09-14
简介
图像人体全身关键点估计算子,走两段式 ONNX 推理链路:yolox_l 人体检测 + dw-ll_ucoco_384(RTMPose 架构的 COCO-WholeBody 模型),复用仓库已有的 embodied/perception/dwpose_func.py,与 VideoWholeBodyPoseEstimation 共用同一套权重,不引入 mmpose / mmcv / mmdet。
功能描述
- 两段式推理:先用 yolox_l 检测人体(输入 640×640,NMS IoU 0.45,只保留 class 0 且分数 > 0.3 的框,框为原图像素坐标的 xyxy),再对每个框跑 DWPose 关键点
- 关键点布局是 134 点:COCO-WholeBody 133 点在 index 17 处插入 neck(两肩中点),并把前若干点按 openpose 顺序重排;
keypoint_layout字段固定为dwpose_coco_wholebody_134,下游按该布局取点 - 检测不到人体时按「无人」返回空结构:底层
Wholebody在无框时会退化成对整帧做单框推理,直接采信会得到虚假关键点 kpt_thr > 0时把分数低于阈值的关键点坐标置 0(keypoint_scores原样保留),默认 0 表示不过滤bbox_scores恒为空列表:检测后处理只回传过滤后的框、不回传分数;不输出点位名,改用keypoint_layout标明布局- 图像统一转 RGB 后按 BGR ndarray 送前处理(与
VideoWholeBodyPoseEstimation口径一致) - 构造期校验
image_src_type合法、kpt_thr ∈ [0, 1],并检查两个 ONNX 权重都存在 - GPU 需要
num_gpus > 0且 onnxruntime 报告CUDAExecutionProvider可用,否则回落 CPU - 输入为 null 或行级异常时返回空结构(前四个字段为空列表 +
keypoint_layout字符串),不中断整列
算子参数
输入
| 输入 | 含义 |
|---|---|
| image | 图像输入,内容类型由 image_src_type 决定(本地/BOS/HTTP 路径、Base64 字符串、二进制数据) |
输出
输出列类型为 struct,字段如下:
| 输出 | 含义 |
|---|---|
| pose.keypoints | list<list<list |
| pose.keypoint_scores | list<list |
| pose.bboxes | list<list |
| pose.bbox_scores | list |
| pose.keypoint_layout | large_string:固定 "dwpose_coco_wholebody_134" |
参数
| 参数名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| image_src_type | str | "image_url" | 图像输入类型:image_url / image_base64 / image_binary |
| model_path | str | "/opt/aihc/model/dwpose" | 存放两个 ONNX 权重的目录 |
| det_onnx | str | "yolox_l.onnx" | 人体检测 ONNX 文件名 |
| pose_onnx | str | "dw-ll_ucoco_384.onnx" | 姿态 ONNX 文件名(COCO-WholeBody) |
| kpt_thr | float | 0.0 | 关键点置信度阈值,取值 [0, 1],低于该值的点坐标置 0;0 表示不过滤 |
| rank | int | 0 | 多卡场景 worker 序号(onnxruntime CUDA provider 用) |
注意事项
- 检测与姿态两个 ONNX 权重(
det_onnx、pose_onnx)必须放在同一个model_path目录下,任一缺失都在构造期抛FileNotFoundError,不会自动联网下载。 - 用 GPU 需要装
onnxruntime-gpu。CUDA provider 起不来时算子会静默回落 CPU(速度差一个量级);常见原因是LD_LIBRARY_PATH没带 pip 安装的 nvidia 库路径(缺 libcufft 等),而不是没装库。 bbox_scores恒空,需要按检测置信度过滤的场景拿不到分数。- 图上没有人时
keypoints/bboxes都是空列表,属正常返回而非失败。
调用示例
Python
1from __future__ import annotations
2
3import os
4
5import daft
6from daft import col
7
8from daft.aihc.common.udf import aihc_udf
9from daft.aihc.functions.image.image_mmpose import ImageMmpose
10
11if __name__ == "__main__":
12 if os.getenv("DAFT_RUNNER", "native") == "ray":
13 import ray
14 ray.init(dashboard_host="0.0.0.0", ignore_reinit_error=True)
15 daft.set_runner_ray()
16 daft.set_execution_config(actor_udf_ready_timeout=6000, min_cpu_per_task=0)
17
18samples = {"image": ["bos://your-bucket/sample.jpg"]}
19 ds = daft.from_pydict(samples)
20 ds = ds.with_column(
21 "pose",
22 aihc_udf(
23 ImageMmpose,
24 construct_args={
25 "image_src_type": "image_url",
26 "model_path": "/path/to/models/dwpose",
27 "det_onnx": "yolox_l.onnx",
28 "pose_onnx": "dw-ll_ucoco_384.onnx",
29 "kpt_thr": 0.0,
30 },
31 num_cpus=1,
32 num_gpus=1,
33 concurrency=1,
34 batch_size=1,
35 )(col("image")),
36 )
37 ds.show()
评价此篇文章
