模型概述
模型特點
模型能力
使用案例
🚀 VitPose模型卡片
ViTPose是用於人體姿態估計的簡單視覺Transformer基線模型,ViTPose+則是用於通用人體姿態估計的視覺Transformer基礎模型。該模型在MS COCO關鍵點測試開發集上達到了81.1的平均精度(AP)。
🚀 快速開始
使用以下代碼開始使用該模型:
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關鍵點檢測基準測試中,基礎的ViTPose模型優於代表性方法,最大的模型在MS COCO測試開發集上達到了80.9的AP,創造了新的最優性能。
- 結構簡單:採用簡單且非分層的視覺Transformer作為骨幹網絡來提取給定人物實例的特徵,並使用輕量級解碼器進行姿態估計。
- 可擴展性強:利用Transformer可擴展的模型容量和高並行性,模型參數可以從1億擴展到10億,在吞吐量和性能之間建立了新的帕累託前沿。
- 靈活性高:在注意力類型、輸入分辨率、預訓練和微調策略以及處理多個姿態任務方面都非常靈活。
- 知識可遷移:通過簡單的知識令牌,大型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}")
高級用法
文檔未提供高級用法示例,故跳過該部分。
📚 詳細文檔
模型詳情
儘管在設計中沒有考慮特定的領域知識,但簡單的視覺Transformer在視覺識別任務中已經顯示出了出色的性能。然而,很少有人努力揭示這種簡單結構在姿態估計任務中的潛力。在本文中,我們通過一個名為ViTPose的簡單基線模型,從多個方面展示了簡單視覺Transformer在姿態估計方面驚人的良好能力,即模型結構的簡單性、模型大小的可擴展性、訓練範式的靈活性以及模型之間知識的可遷移性。具體來說,ViTPose採用簡單且非分層的視覺Transformer作為骨幹網絡,為給定的人物實例提取特徵,並使用輕量級解碼器進行姿態估計。通過利用Transformer可擴展的模型容量和高並行性,它可以將參數從1億擴展到10億,在吞吐量和性能之間建立了新的帕累託前沿。此外,ViTPose在注意力類型、輸入分辨率、預訓練和微調策略以及處理多個姿態任務方面都非常靈活。我們還通過實驗證明,大型ViTPose模型的知識可以通過簡單的知識令牌輕鬆遷移到小型模型。實驗結果表明,我們的基礎ViTPose模型在具有挑戰性的MS COCO關鍵點檢測基準測試中優於代表性方法,而最大的模型則創造了新的最優性能,即在MS COCO測試開發集上達到了80.9的AP。代碼和模型可在GitHub倉庫獲取。
模型描述
這是一個已發佈到Hugging Face Hub的🤗 transformers模型的卡片,該模型卡片是自動生成的。
屬性 | 詳情 |
---|---|
開發者 | 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
用途
由ViTAE - Transformer團隊開發的ViTPose模型主要用於姿態估計任務,以下是該模型的一些直接應用:
- 人體姿態估計:該模型可用於估計圖像或視頻中人體的姿態,包括識別頭部、肩部、肘部、手腕、臀部、膝蓋和腳踝等關鍵身體關節的位置。
- 動作識別:通過分析一段時間內的姿態,該模型可以幫助識別各種人體動作和活動。
- 監控:在安全和監控應用中,ViTPose可用於監控和分析公共場所或私人場所中的人體行為。
- 健康與健身:該模型可用於健身應用程序,以跟蹤和分析運動姿態,提供關於姿勢和技巧的反饋。
- 遊戲和動畫:ViTPose可以集成到遊戲和動畫系統中,以創建更逼真的角色動作和交互。
偏差、風險和侷限性
在本文中,我們提出了一個簡單而有效的用於姿態估計的視覺Transformer基線模型,即ViTPose。儘管在結構上沒有精心設計,但ViTPose在MS COCO數據集上取得了最優性能。然而,ViTPose的潛力尚未通過更先進的技術(如複雜的解碼器或FPN結構)得到充分挖掘,這些技術可能會進一步提高其性能。此外,儘管ViTPose展示了諸如簡單性、可擴展性、靈活性和可遷移性等令人興奮的特性,但還可以進行更多的研究工作,例如探索基於提示的微調以進一步展示ViTPose的靈活性。另外,我們相信ViTPose也可以應用於其他姿態估計數據集,例如動物姿態估計和麵部關鍵點檢測。我們將這些作為未來的工作。
評估
- OCHuman驗證集和測試集:為了評估人體姿態估計模型在嚴重遮擋的人體實例上的性能,我們在OCHuman驗證集和測試集上使用真實邊界框對ViTPose變體和代表性模型進行了測試。我們沒有采用額外的人體檢測器,因為OCHuman數據集中並非所有人體實例都有標註,人體檢測器會產生大量的“誤報”邊界框,無法反映姿態估計模型的真實能力。具體來說,使用了對應於MS COCO數據集的ViTPose解碼器頭,因為MS COCO和OCHuman數據集中的關鍵點定義是相同的。
- MPII驗證集:我們在MPII驗證集上使用真實邊界框評估了ViTPose和代表性模型的性能。遵循MPII的默認設置,我們使用PCKh作為性能評估指標。
評估結果
模型架構和目標
硬件
模型基於mmpose代碼庫在8個A100 GPU上進行訓練。
🔧 技術細節
訓練數據
我們使用MS COCO、AI Challenger、MPII和CrowdPose數據集進行訓練和評估。OCHuman數據集僅用於評估階段,以衡量模型在處理遮擋人體時的性能。
- MS COCO數據集:包含118K張圖像和150K個人體實例,每個實例最多有17個關鍵點標註,用於訓練。該數據集遵循CC - BY - 4.0許可證。
- MPII數據集:遵循BSD許可證,包含15K張圖像和22K個人體實例,用於訓練。該數據集中每個實例最多標註16個人體關鍵點。
- AI Challenger數據集:規模更大,包含超過200K張訓練圖像和350個人體實例,每個實例最多標註14個關鍵點。
- OCHuman數據集:包含嚴重遮擋的人體實例,僅用作驗證集和測試集,包括4K張圖像和8K個實例。
訓練超參數
- 訓練機制:
速度、大小和時間
📄 許可證
該模型使用Apache - 2.0許可證。
📖 引用
@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}
}









