模型简介
模型特点
模型能力
使用案例
library_name: transformers license: apache-2.0 language:
- en pipeline_tag: keypoint-detection
VitPose模型卡片

ViTPose:用于人体姿态估计的简单视觉Transformer基线模型,以及ViTPose+:通用人体姿态估计的视觉Transformer基础模型。该模型在MS COCO关键点测试开发集上取得了81.1 AP的优异表现。
模型详情
尽管在设计时未考虑特定领域知识,但普通视觉Transformer在视觉识别任务中已展现出卓越性能。然而,鲜有研究揭示这种简单结构在姿态估计任务中的潜力。本文通过名为ViTPose的简单基线模型,从模型结构简洁性、模型规模可扩展性、训练范式灵活性以及模型间知识可迁移性等多个维度,展示了普通视觉Transformer在姿态估计任务中出人意料的强大能力。具体而言,ViTPose采用平面非层级式视觉Transformer作为骨干网络提取给定人体实例的特征,并搭配轻量级解码器进行姿态估计。得益于Transformer的可扩展模型容量与高度并行性,其参数量可从1亿扩展至10亿,在吞吐量与性能之间建立了新的帕累托前沿。此外,ViTPose在注意力类型、输入分辨率、预训练与微调策略以及处理多姿态任务方面展现出高度灵活性。我们通过实验证明,大型ViTPose模型的知识可通过简单的知识令牌轻松迁移至小型模型。实验结果显示,我们的基础ViTPose模型在具有挑战性的MS COCO关键点检测基准测试中超越代表性方法,而最大模型更创下80.9 AP的新纪录(MS COCO测试开发集)。代码与模型详见https://github.com/ViTAE-Transformer/ViTPose
模型描述
这是已推送至Hugging Face Hub的🤗 transformers模型卡片。本模型卡片为自动生成。
- 开发者: 徐宇飞、张静、张启明、陶大程
- 资助方: ARC FL-170100117与IH-180100002
- 许可证: Apache-2.0
- 移植至🤗 Transformers: Sangbum Choi与Niels Rogge
模型来源
- 原始仓库: https://github.com/ViTAE-Transformer/ViTPose
- 论文: https://arxiv.org/pdf/2204.12484
- 演示: https://huggingface.co/spaces?sort=trending&search=vitpose
用途
ViTAE-Transformer团队开发的ViTPose模型主要用于姿态估计任务,其典型应用场景包括:
人体姿态估计:可识别图像/视频中人体关键关节(如头、肩、肘、腕、髋、膝、踝)的空间位置。
行为识别:通过时序姿态分析识别人类各种动作行为。
安防监控:在公共/私人场所监测分析人类行为模式。
健康健身:用于健身APP中追踪分析训练姿势,提供动作规范性反馈。
游戏动画:集成至游戏动画系统实现更逼真的角色动作交互。
偏差、风险与局限
本文提出的ViTPose虽以简洁结构在MS COCO数据集实现SOTA性能,但其潜力仍有待挖掘:如采用复杂解码器或FPN结构可能进一步提升性能。尽管ViTPose展现出简洁性、可扩展性、灵活性和可迁移性等优势,未来可探索提示调优等方向深化研究。此外,该模型还可拓展至动物姿态估计、面部关键点检测等场景,这些将作为后续研究方向。
快速开始
以下代码演示模型使用方法:
import torch
import requests
import numpy as np
from PIL import Image
from transformers import (
AutoProcessor,
RTDetrForObjectDetection,
VitPoseForPoseEstimation,
)
device = "cuda" if torch.cuda.is_available() else "cpu"
url = "http://images.cocodataset.org/val2017/000000000139.jpg"
image = Image.open(requests.get(url, stream=True).raw)
# ------------------------------------------------------------------------
# 阶段1:人体检测
# ------------------------------------------------------------------------
# 可自由选择检测器
person_image_processor = AutoProcessor.from_pretrained("PekingU/rtdetr_r50vd_coco_o365")
person_model = RTDetrForObjectDetection.from_pretrained("PekingU/rtdetr_r50vd_coco_o365", device_map=device)
inputs = person_image_processor(images=image, return_tensors="pt").to(device)
with torch.no_grad():
outputs = person_model(**inputs)
results = person_image_processor.post_process_object_detection(
outputs, target_sizes=torch.tensor([(image.height, image.width)]), threshold=0.3
)
result = results[0] # 取首张图片结果
# COCO数据集中人体标签索引为0
person_boxes = result["boxes"][result["labels"] == 0]
person_boxes = person_boxes.cpu().numpy()
# 将边界框从VOC(x1,y1,x2,y2)转为COCO(x1,y1,w,h)格式
person_boxes[:, 2] = person_boxes[:, 2] - person_boxes[:, 0]
person_boxes[:, 3] = person_boxes[:, 3] - person_boxes[:, 1]
# ------------------------------------------------------------------------
# 阶段2:关键点检测
# ------------------------------------------------------------------------
image_processor = AutoProcessor.from_pretrained("usyd-community/vitpose-base")
model = VitPoseForPoseEstimation.from_pretrained("usyd-community/vitpose-base", device_map=device)
inputs = image_processor(image, boxes=[person_boxes], return_tensors="pt").to(device)
with torch.no_grad():
outputs = model(**inputs)
pose_results = image_processor.post_process_pose_estimation(outputs, boxes=[person_boxes], threshold=0.3)
image_pose_result = pose_results[0] # 首张图片结果
for i, person_pose in enumerate(image_pose_result):
print(f"人物#{i}")
for keypoint, label, score in zip(
person_pose["keypoints"], person_pose["labels"], person_pose["scores"]
):
keypoint_name = model.config.id2label[label.item()]
x, y = keypoint
print(f" - {keypoint_name}: x={x.item():.2f}, y={y.item():.2f}, score={score.item():.2f}")
输出示例:
人物#0
- 鼻子: x=428.25, y=170.88, score=0.98
- 左眼: x=428.76, y=168.03, score=0.97
- 右眼: x=428.09, y=168.15, score=0.82
- 左耳: x=433.28, y=167.72, score=0.95
- 右耳: x=440.77, y=166.66, score=0.88
- 左肩: x=440.52, y=177.60, score=0.92
- 右肩: x=444.64, y=178.11, score=0.70
- 左肘: x=436.64, y=198.21, score=0.92
- 右肘: x=431.42, y=201.19, score=0.76
- 左腕: x=430.96, y=218.39, score=0.98
- 右腕: x=419.95, y=213.27, score=0.85
- 左髋: x=445.33, y=222.93, score=0.77
- 右髋: x=451.91, y=222.52, score=0.75
- 左膝: x=443.31, y=255.61, score=0.83
- 右膝: x=451.42, y=255.03, score=0.84
- 左踝: x=447.76, y=287.33, score=0.68
- 右踝: x=456.78, y=286.08, score=0.83
人物#1
- 鼻子: x=398.23, y=181.74, score=0.89
- 左眼: x=398.31, y=179.77, score=0.84
- 右眼: x=395.99, y=179.46, score=0.91
- 右耳: x=388.95, y=180.24, score=0.86
- 左肩: x=397.35, y=194.22, score=0.73
- 右肩: x=384.50, y=190.86, score=0.58
训练详情
训练数据
数据集说明:我们使用MS COCO[28]、AI Challenger[41]、MPII[3]和CrowdPose[22]数据集进行训练评估。OCHuman[54]数据集仅用于评估模型在遮挡场景下的性能。MS COCO数据集(CC-BY-4.0许可)包含11.8万张训练图像和15万个人体实例(每实例最多17个关键点标注)。MPII数据集(BSD许可)含1.5万训练图像和2.2万实例(每实例最多16个关键点)。AI Challenger规模更大,包含20万+训练图像和350个实例(每实例最多14个关键点)。OCHuman专用于验证/测试集,包含4000张图像和8000个严重遮挡实例。
训练超参数
- 训练方案:
速度、规模与耗时
评估
OCHuman验证/测试集:为评估模型在严重遮挡场景下的性能,我们在提供真实边界框的条件下测试ViTPose变体与代表性模型。由于OCHuman未标注全部人体实例,故未采用额外人体检测器以避免假阳性干扰。
MPII验证集:使用PCKh指标评估模型性能,遵循该数据集默认设置。
结果
模型架构与目标
硬件配置
基于mmpose代码库在8块A100 GPU上完成训练
引用
BibTeX:
@article{xu2022vitposesimplevisiontransformer,
title={ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation},
author={Yufei Xu and Jing Zhang and Qiming Zhang and Dacheng Tao},
year={2022},
eprint={2204.12484},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2204.12484}
}









