模型简介
模型特点
模型能力
使用案例
库名称: transformers
许可证: apache-2.0
任务标签: 关键点检测
ViTPose模型卡片

ViTPose:用于人体姿态估计的简单视觉Transformer基线,以及ViTPose++:通用人体姿态估计的视觉Transformer基础模型。该模型在MS COCO关键点测试开发集上取得了81.1 AP的成绩。
模型详情
尽管在设计中没有考虑特定的领域知识,但普通的视觉Transformer在视觉识别任务中表现出了卓越的性能。然而,很少有人揭示这种简单结构在姿态估计任务中的潜力。在本文中,我们通过一个名为ViTPose的简单基线模型,展示了普通视觉Transformer在姿态估计中的惊人能力,包括模型结构的简单性、模型规模的可扩展性、训练范式的灵活性以及模型间知识的可迁移性。具体来说,ViTPose采用普通且非分层的视觉Transformer作为骨干网络,提取给定人物实例的特征,并使用轻量级解码器进行姿态估计。通过利用Transformer的可扩展模型容量和高并行性,ViTPose可以从1亿参数扩展到10亿参数,在吞吐量和性能之间建立了新的帕累托前沿。此外,ViTPose在注意力类型、输入分辨率、预训练和微调策略以及处理多姿态任务方面非常灵活。我们还通过实验证明,大型ViTPose模型的知识可以通过简单的知识令牌轻松迁移到小型模型中。实验结果表明,我们的基础ViTPose模型在具有挑战性的MS COCO关键点检测基准上优于代表性方法,而最大模型则创下了新的最先进水平,即在MS COCO测试开发集上达到80.9 AP。代码和模型可在https://github.com/ViTAE-Transformer/ViTPose获取。
模型描述
这是🤗 transformers模型库中的一个模型卡片,该模型已推送到Hub上。此模型卡片是自动生成的。
- 开发者: Yufei Xu, Jing Zhang, Qiming Zhang, Dacheng Tao
- 资助者: 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
用途
ViTPose模型由ViTAE-Transformer团队开发,主要用于姿态估计任务。以下是该模型的一些直接用途:
- 人体姿态估计: 该模型可用于估计图像或视频中的人体姿态,包括识别头部、肩膀、肘部、手腕、臀部、膝盖和脚踝等关键身体关节的位置。
- 动作识别: 通过分析时间序列上的姿态,该模型可以帮助识别各种人类动作和活动。
- 监控: 在安全和监控应用中,ViTPose可用于监测和分析公共场所或私人场所的人类行为。
- 健康和健身: 该模型可用于健身应用程序中,跟踪和分析运动姿态,提供关于姿势和技巧的反馈。
- 游戏和动画: ViTPose可以集成到游戏和动画系统中,以创建更真实的角色动作和互动。
偏差、风险和局限性
在本文中,我们提出了一种简单而有效的视觉Transformer基线用于姿态估计,即ViTPose。尽管在结构上没有精心设计,ViTPose在MS COCO数据集上取得了最先进的性能。然而,ViTPose的潜力尚未通过更先进的技术(如复杂的解码器或FPN结构)完全探索,这些技术可能会进一步提高性能。此外,尽管ViTPose展示了简单性、可扩展性、灵活性和可迁移性等令人兴奋的特性,但还需要更多的研究工作,例如探索基于提示的调优,以进一步展示ViTPose的灵活性。此外,我们认为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-plus-small")
model = VitPoseForPoseEstimation.from_pretrained("usyd-community/vitpose-plus-small", 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数据集包含118K图像和150K人物实例,每个实例最多有17个关键点注释,用于训练。该数据集采用CC-BY-4.0许可证。MPII数据集采用BSD许可证,包含15K图像和22K人物实例用于训练。该数据集中每个实例最多有16个人体关键点注释。AI Challenger更大,包含超过200K训练图像和350个人物实例,每个实例最多有14个关键点注释。OCHuman包含严重遮挡的人物实例,仅用于验证和测试集,包括4K图像和8K实例。
训练超参数
- 训练方案:
速度、大小、时间
评估
OCHuman验证和测试集。为了评估人体姿态估计模型在严重遮挡人物实例上的性能,我们在OCHuman验证和测试集上测试了ViTPose变体和代表性模型,使用真实边界框。我们没有采用额外的人物检测器,因为并非所有人物实例都在OCHuman数据集中标注,人物检测器会导致大量“假阳性”边界框,无法反映姿态估计模型的真实能力。具体来说,使用了对应于MS COCO数据集的ViTPose解码头,因为MS COCO和OCHuman数据集的关键点定义相同。
MPII验证集。我们在MPII验证集上评估了ViTPose和代表性模型的性能,使用真实边界框。遵循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}
}
@misc{xu2023vitposevisiontransformergeneric,
title={ViTPose++: Vision Transformer for Generic Body Pose Estimation},
author={Yufei Xu and Jing Zhang and Qiming Zhang and Dacheng Tao},
year={2023},
eprint={2212.04246},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2212.04246},
}









