MMPose for AIGC:生成姿态骨架图,为姿态引导式 AI 图像生成提供条件输入
【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose
本文以 MMPose 官方项目projects/mmpose4aigc为主体,讲解如何用 MMPose 把一张普通人物照片转换成「姿态骨架图」,并把它作为姿态条件(pose condition)输入到 T2I-Adapter 这类文生图模型中,实现“指定姿势、生成图像”的 AIGC 工作流。读完后你可以:① 用 Python + PyTorch 流水线生成 OpenPose 风格的彩色骨架图;② 用 mmdeploy 部署包中的 C++ 可执行文件pose_tracker生成 MMPose 风格骨架图;③ 看懂骨架生成脚本背后的检测—姿态两级调用链与关键点重映射逻辑。
1. 项目定位:骨架图是姿态引导 AIGC 的“中间表示”
姿态引导的 AI 图像生成(pose guided image generation)通常需要一个轻量的中间条件:先把参考照片里的身体姿态抽成骨架图,再让扩散模型根据骨架绘制出姿势一致、外观可自由控制的人物。MMPose for AIGC 项目(见 README 与 中文说明)就是官方提供的这一环节的实现,当前支持对接的项目是T2I-Adapter。
整个项目在projects/mmpose4aigc/下只有 5 个可执行文件加两份 README,职责非常清晰:
| 文件 | 作用 |
|---|---|
| openpose_visualization.py | Python 推理脚本:检测 + 姿态估计 + OpenPose 风格骨架绘制 |
| mmpose_openpose.sh | 调用上述脚本,一键生成 OpenPose 风格骨架图 |
| download_models.sh | 下载人体检测模型与姿态估计模型的 PyTorch 权重 |
| install_posetracker_linux.sh | 安装 mmdeploy 部署包并编译pose_tracker可执行文件 |
| mmpose_style_skeleton.sh | 调用pose_tracker,生成 MMPose 风格骨架图 |
下面分别展开两条生成路线。
2. 路线一:生成 OpenPose 风格骨架图(Python + PyTorch)
2.1 准备工作
按照 README 的步骤,先安装 mmpose 与 mmdet,再下载模型:
# install mmpose mmdet pip install openmim git clone https://gitcode.com/GitHub_Trending/mm/mmpose cd mmpose mim install -e . mim install "mmdet>=3.0.0rc6" # download models bash download_models.sh其中 download_models.sh 会在当前目录创建models/文件夹,并从 OpenMMLab 的 CDN 下载两个权重文件:
- 人体检测模型
rtmdet_nano_8xb32-100e_coco-obj365-person-05d8511e.pth(RTMDet-nano,在 COCO 单人数据上训练); - 姿态估计模型
rtmpose-m_simcc-aic-coco_pt-aic-coco_420e-256x192-63eb25f7_20230126.pth(RTMPose-m,SimCC 编码)。
2.2 一键生成骨架图
# generate a skeleton image bash mmpose_openpose.sh ../../tests/data/coco/000000000785.jpg仓库自带的 tests/data/coco/000000000785.jpg 就是官方示例输入图。该命令实际执行的是 mmpose_openpose.sh 中的 Python 调用:
python openpose_visualization.py \ ../rtmpose/rtmdet/person/rtmdet_nano_320-8xb32_coco-person.py \ models/rtmdet_nano_8xb32-100e_coco-obj365-person-05d8511e.pth \ ../rtmpose/rtmpose/body_2d_keypoint/rtmpose-m_8xb256-420e_coco-256x192.py \ models/rtmpose-m_simcc-aic-coco_pt-aic-coco_420e-256x192-63eb25f7_20230126.pth \ --input $INPUT_IMAGE \ --device cuda:0 \四个位置参数依次是:检测器配置、检测权重、姿态估计器配置、姿态权重。脚本内部引用的两份模型配置分别对应仓库中的 rtmdet_nano_320-8xb32_coco-person.py 与 rtmpose-m_8xb256-420e_coco-256x192.py。
2.3 核心脚本解析:从检测到骨架图的完整调用链
openpose_visualization.py 是这条路线的全部逻辑所在,核心函数mmpose_to_openpose_visualization(L42-L114)分为五个阶段:
(1)人体检测。先用 mmdet 的inference_detector得到预测实例,再按类别 ID 与置信度双重过滤,并做 NMS:
det_result = inference_detector(detector, img_path) pred_instance = det_result.pred_instances.cpu().numpy() bboxes = np.concatenate( (pred_instance.bboxes, pred_instance.scores[:, None]), axis=1) bboxes = bboxes[np.logical_and(pred_instance.labels == args.det_cat_id, pred_instance.scores > args.bbox_thr)] bboxes = bboxes[nms(bboxes, args.nms_thr), :4](2)Top-Down 姿态估计。把过滤后的 bbox 交给 MMPose 的inference_topdown得到关键点与置信度,随后把keypoints(x, y)和keypoint_scores拼成(-1, 17, 3)的数组——注意这里输出的是17 个 COCO 人体关键点:
pose_results = inference_topdown(pose_estimator, img_path, bboxes) data_samples = merge_data_samples(pose_results)(3)17 关键点扩展为 18 关键点。OpenPose 格式的人体模型比 COCO 多一个「颈部」关节。脚本用双肩中点合成颈部,且任一肩置信度不足时将该关节置信度置 0:
neck = (keypoints[:, 5] + keypoints[:, 6]) / 2 if keypoints[:, 5, 2] < args.kpt_thr or keypoints[:, 6, 2] < args.kpt_thr: neck[:, 2] = 0 new_keypoints = np.insert(keypoints[:, ], 17, neck, axis=1)(4)MMPose 索引重映射为 OpenPose 索引。OpenPose 的 18 关节顺序与 COCO 完全不同(例如 OpenPose 的 0/1/2 是右髋、左髋、骨盆),脚本用两张索引表整体搬移:
openpose_idx = [15, 14, 17, 16, 2, 6, 3, 7, 4, 8, 12, 9, 13, 10, 1] mmpose_idx = [1, 2, 3, 4, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17] new_keypoints[:, openpose_idx, :] = new_keypoints[:, mmpose_idx, :]这一步正是“OpenPose 风格”得以成立的关键——T2I-Adapter 的 skeleton 条件是按 OpenPose 关节顺序定义的,索引不对则骨架条件整体错位。
(5)绘制骨架图。关节连线表limb_seq(L25-L27)定义了 17 条连线,colors表为每条连线/关节分配彩虹色;绘制时只画两端置信度都超过阈值kpt_thr的连线,并用cv2.ellipse2Poly画椭圆条带作为四肢骨架,最终输出黑底图,文件名为openpose_<原图名>.png。黑底正是 OpenPose 骨架条件图的典型形式,可直接喂给姿态编码器。
可调命令行参数(见main(),L117-L170):
| 参数 | 默认值 | 含义 |
|---|---|---|
--input | 必填 | 输入图片路径(按 MIME 类型判断,仅处理 image) |
--device | cuda:0 | 推理设备 |
--det-cat-id | 0 | 检测模型中“人”的类别 ID |
--bbox-thr | 0.4 | 人体框置信度阈值 |
--nms-thr | 0.3 | 人体框 NMS 的 IoU 阈值 |
--kpt-thr | 0.4 | 关键点置信度阈值,同时影响颈部合成与骨架绘制 |
另外,脚本在构建姿态估计器时显式覆盖output_heatmaps=False:
pose_estimator = init_pose_estimator( args.pose_config, args.pose_checkpoint, device=args.device, cfg_options=dict(model=dict(test_cfg=dict(output_heatmaps=False))))这样inference_topdown只返回关键点坐标而不返回 384×288 的热力图,内存占用更低,也符合“只要骨架”的需求。
2.4 姿态模型配置速览
脚本使用的 RTMPose-m 配置 rtmpose-m_8xb256-420e_coco-256x192.py 有几个与 AIGC 场景相关的关键设定,理解它们有助于按需替换模型:
num_keypoints = 17、input_size = (192, 256):COCO 17 关键点、256×192 输入,是精度与速度的均衡点,替换成同目录下的rtmpose-t/s/l/x配置即可改变精度—速度权衡;codec = dict(type='SimCCLabel', simcc_split_ratio=2.0, ...):SimCC 把坐标回归建模为 1D 分类问题,配合RTMCCHead与KLDiscretLoss使用;- 骨干为
_scope_='mmdet'的CSPNeXt(arch='P5',deepen_factor=0.67,widen_factor=0.75),权重通过init_cfg从预训练 CSPNeXt checkpoint 热启动; test_cfg=dict(flip_test=True):测试时做水平翻转增强,可小幅提升关键点稳定性。
检测侧的 rtmdet_nano_320-8xb32_coco-person.py 是单类(person)RTMDet-nano 配置,320 输入,适合在 GPU 上作为轻量级前置检测器。
3. 路线二:生成 MMPose 风格骨架图(mmdeploy 部署包 + C++ 推理)
这条路线不依赖 PyTorch 运行时,而是使用 mmdeploy 1.0.0 的 Linux x86_64 SDK 中预编译的 ONNX Runtime 推理引擎与 C++ 可执行文件pose_tracker,产物是 MMPose 风格(彩色关节点 + 骨架,黑色背景)的骨架图。
3.1 环境要求与安装
- GCC >= 7.5
- cmake >= 3.14
执行:
bash install_posetracker_linux.shinstall_posetracker_linux.sh 内部依次完成 5 件事,理解顺序有助于排错:
wget下载mmdeploy-1.0.0-linux-x86_64-cxx11abi.tar.gz并解压(对应 README 中要求的 cxx11abi 变体,与系统 libc++ ABI 必须匹配);source set_env.sh初始化 SDK 环境变量;- 若系统未装 OpenCV 3+,执行
bash install_opencv.sh(已安装则跳过); bash build_sdk.sh编译出bin/pose_tracker等可执行文件——这一步需要 GCC 与 cmake 满足上述版本要求;- 下载
rtmpose-cpu.zip并解压,得到 ONNX 格式的 RTMDet-nano 与 RTMPose-m 模型。
安装完成后目录结构如下(README 原文):
|----mmdeploy-1.0.0-linux-x86_64-cxx11abi | |----README.md | |----rtmpose-ort | | |----rtmdet-nano | | |----rtmpose-m | | |----000000147979.jpg | | |----t2i-adapter_skeleton.txt其中rtmpose-ort/下包含 ONNX 检测模型rtmdet-nano、ONNX 姿态模型rtmpose-m、示例输入图000000147979.jpg以及骨架绘制配置t2i-adapter_skeleton.txt。
3.2 生成骨架图
# generate a skeleton image bash mmpose_style_skeleton.sh \ mmdeploy-1.0.0-linux-x86_64-cxx11abi/rtmpose-ort/000000147979.jpgmmpose_style_skeleton.sh 的关键内容:
WORKSPACE=mmdeploy-1.0.0-linux-x86_64-cxx11abi export LD_LIBRARY_PATH=${WORKSPACE}/lib:${WORKSPACE}/thirdparty/onnxruntime/lib:$LD_LIBRARY_PATH ${WORKSPACE}/bin/pose_tracker \ ${WORKSPACE}/rtmpose-ort/rtmdet-nano \ ${WORKSPACE}/rtmpose-ort/rtmpose-m \ $INPUT_IMAGE \ --background black \ --skeleton ${WORKSPACE}/rtmpose-ort/t2i-adapter_skeleton.txt \ --output ./skeleton_res.jpg \ --pose_kpt_thr 0.4 \ --show -1要点说明:
- 第一个参数
LD_LIBRARY_PATH必须先导出,否则pose_tracker找不到 SDK 与 ONNX Runtime 的动态库; pose_tracker的命令行前两个参数是检测模型与姿态模型(ONNX 工程目录),第三个是输入图;--background black指定黑色背景,与 T2I-Adapter 的 skeleton 条件格式一致;--skeleton指定关节连接关系文件t2i-adapter_skeleton.txt,保证画出的拓扑符合 T2I-Adapter 约定;--pose_kpt_thr 0.4是关键点置信度阈值,与 Python 路线中的kpt_thr语义一致;--output ./skeleton_res.jpg指定输出文件,--show -1表示不开启实时窗口显示(离线批处理场景)。
README 建议更多细节参阅 RTMPose 项目文档。
3.3 两条路线如何选择
从两条脚本的实现看,Python 路线(路线一)胜在可改:阈值、设备、模型配置、绘制逻辑都可以直接在源码里调整,适合调试与批量改造;mmdeploy 路线(路线二)胜在轻:无需安装 PyTorch 与 mmpose Python 环境,推理走 ONNX Runtime CPU 引擎,适合把“照片→骨架图”做成独立可分发的预处理小工具。两者的姿态模型本质相同(都是 RTMPose-m + RTMDet-nano),只是运行时不同。
4. 对接 T2I-Adapter:骨架图的去向
生成骨架图只是手段。按 README 的“Upload to T2I-Adapter”一节,把生成的骨架图连同文本描述一起输入 T2I-Adapter 的在线 Demo,即可得到姿态与参考图一致、但外观由提示词控制的人物图像——例如“参考照片的站立姿势 + 文本描述的服装风格”。T2I-Adapter 本身是外部 AIGC 项目,本文不展开其训练与推理细节;MMPose 在本工作流中的职责到“输出一张关节顺序正确、背景干净、拓扑与 T2I-Adapter 约定一致的骨架条件图”为止。
5. 小结与延伸阅读
- 项目入口:projects/mmpose4aigc/README.md(英文)/ README_CN.md(中文);
- 核心推理脚本:projects/mmpose4aigc/openpose_visualization.py,重点看 17→18 关键点扩展(L68-L78)与 OpenPose 索引重映射;
- 模型配置:RTMDet-nano 单类检测、RTMPose-m SimCC 姿态;
- 部署路线参考 RTMPose 项目,其中包含 mmdeploy 部署与端侧推理的完整文档。
适用前提提醒:Python 路线要求 mmpose(可编辑安装)与mmdet>=3.0.0rc6,推理默认使用cuda:0;mmdeploy 路线仅覆盖 Linux x86_64(cxx11abi)环境,且需要 GCC >= 7.5、cmake >= 3.14 用于编译pose_tracker。两个模型权重均需联网下载,请确保网络可达。
【免费下载链接】mmposeOpenMMLab Pose Estimation Toolbox and Benchmark.项目地址: https://gitcode.com/GitHub_Trending/mm/mmpose
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考