DensePose-COCO / DensePose-PoseTrack データセットについて
本資料は、DensePose-COCO および DensePose-PoseTrack データセットの概要、アノテーションの内容、入手方法、および学習済みモデルによる推論の実行方法をまとめたものである。実装は、現在開発が継続している Detectron2 版 DensePose(facebookresearch/detectron2 の projects/DensePose)を用いる。
1. DensePose とは
DensePose は、RGB 画像に写る人物のすべての画素を、人体表面を表す3次元サーフェスモデル(SMPL モデル)上の座標に対応付ける手法およびデータセットである。 Rıza Alp Güler、Natalia Neverova、Iasonas Kokkinos らにより提案され、2018年の CVPR で発表された。
関節位置のみを求めるキーポイント推定とは異なり、人体表面全体の対応を求める点が特徴である。関節位置だけが必要な場合は、YOLO26-pose のようなキーポイント推定の手法のほうが導入・実行とも容易である。
この対応付けを学習させるために構築されたのが DensePose-COCO データセットであり、COCO データセットの画像中の約 5 万人分の人物に、人体表面との対応関係が人手でアノテーションされている。
2. アノテーションの種類
DensePose のアノテーションは COCO アノテーション形式(JSON)に準拠しており、pycocotools で読み込める。アノテーションには次の 2 種類がある。
2.1 チャートベースのアノテーション
人体の3次元モデルを複数のチャート(部位)に分割し、各チャート内の 2 次元座標 U, V(値域はおおむね 0〜1)で表面上の位置を表す方式である。フィールドは次のとおりである。
dp_x,dp_y:アノテーション点の座標。バウンディングボックスの左上を原点とし、ボックスの大きさを 256×256 として正規化した値であるdp_I:その点が属する細分割チャートのインデックスdp_U,dp_V:チャート内での表面座標dp_masks:14 パーツの粗いセグメンテーション。RLE 符号化され、バウンディングボックス内を 256×256 で表す
14 パーツの順序は、Torso、Right Hand、Left Hand、Left Foot、Right Foot、Upper Leg Right、Upper Leg Left、Lower Leg Right、Lower Leg Left、Upper Arm Left、Upper Arm Right、Lower Arm Left、Lower Arm Right、Head である。1 インスタンスあたり約 100 点がアノテーションされている。
2.2 連続表面埋め込み(Continuous Surface Embeddings, CSE)のアノテーション
画像上の点を、3次元モデルの頂点に直接対応付ける方式である。フィールドは dp_x, dp_y(座標)、dp_vertex(対応する 3D モデルの頂点インデックス)、ref_model(参照する 3D モデル名)である。DensePose-COCO の CSE 版アノテーションには、チャートベースのアノテーションも併せて収録されている。
3. データセットの入手
3.1 DensePose-COCO
アノテーション(JSON)は下表の URL から取得する。画像本体はアノテーションに含まれないため、COCO データセットの公式ダウンロードページから train2014、val2014 を別途取得する。
| 分割名 | 用途 | インスタンス数 / 画像数 | アノテーション |
|---|---|---|---|
densepose_train2014 | 学習用 | 39210 / 26437 | densepose_train2014.json(526MB) |
densepose_valminusminival2014 | 学習用 | 7297 / 5984 | densepose_valminusminival2014.json(105MB) |
densepose_minival2014 | 検証用 | 2243 / 1508 | densepose_minival2014.json(31MB) |
CSE 版のアノテーションは、同じ分割について densepose_train2014_cse.json、densepose_valminusminival2014_cse.json、densepose_minival2014_cse.json の名前で https://dl.fbaipublicfiles.com/densepose/annotations/coco_cse/ の下に置かれている。
画像は、train2014.zip、val2014.zip から取得する。学習を行う場合のディレクトリ構成は次のとおりである。
datasets/coco/
annotations/
densepose_{train,minival,valminusminival}2014.json
{train,val}2014/
(JSON に記載された画像ファイル)
3.2 DensePose-PoseTrack
DensePose-PoseTrack は、複数人物が映る画像シーケンスにアノテーションを付与したデータセットである。速い動き、オクルージョン(隠れ)、スケール変化を含む。アノテーションの内容は DensePose-COCO のチャートベース形式と同じである。 画像本体は PoseTrack のダウンロードページの案内に従って取得する。
| 分割名 | 用途 | インスタンス数 / 画像数 / トラック数 | アノテーション |
|---|---|---|---|
posetrack_train2017 | 学習用 | 8274 / 1680 / 36 | densepose_posetrack_train2017.json(118MB) |
posetrack_val2017 | 検証用 | 4753 / 782 / 46 | densepose_posetrack_val2017.json(59MB) |
3.3 その他のデータセット
Detectron2 版 DensePose では、チンパンジーを対象とした DensePose Chimps、および LVIS データセットの動物 9 カテゴリ(bear, cow, cat, dog, elephant, giraffe, horse, sheep, zebra)を対象とした DensePose LVIS も提供されている。いずれも CSE 形式のアノテーションを含む。
4. Detectron2 版 DensePose のインストール
実行には Python 3.7 以上、PyTorch 1.7 以上、および PyTorch に対応するバージョンの torchvision が必要である。
管理者権限でコマンドプロンプトを起動する
(手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。次のコマンドを実行する。
pip install -U --no-user pip setuptools
pip install -U --no-user torch torchvision opencv-python
pip install --no-user "git+https://github.com/facebookresearch/detectron2@main#subdirectory=projects/DensePose"
インストール後、densepose パッケージとしてインポートできる。detectron2 は C++ 拡張のビルドを伴うため、Windows では Visual Studio の C++ ビルドツールが必要である。
5. アノテーションと3次元モデルの確認
Detectron2 版 DensePose には、データセット中のアノテーションを表示・可視化するツール query_db が用意されている。
コマンドプロンプトを起動する
(手順:Windowsキーまたはスタートメニュー → cmd と入力)。次のコマンドを実行する。
py -3.12 query_db.py show densepose_coco_2014_minival image,dp_segm --output image_segm.png
アノテーションは COCO 形式であるため、pycocotools を用いて直接読み込むこともできる。
from pycocotools.coco import COCO
coco = COCO("densepose_minival2014.json")
ids = coco.getAnnIds(catIds=coco.getCatIds(catNms=["person"]))
anns = coco.loadAnns(ids)
for a in anns:
if "dp_x" in a:
print(len(a["dp_x"]), a["dp_I"][:5], a["dp_U"][:5], a["dp_V"][:5])
break
6. 2次元画像から3次元モデル表面への推定(推論)
学習済みの DensePose-RCNN モデルを用いて、入力画像中の人物画素を3Dモデル表面座標へ対応付ける推論を行う。Detectron2 版では apply_net.py を使用する。モデルと設定ファイルの組み合わせは、DensePose のモデルズー(DENSEPOSE_IUV.md、DENSEPOSE_CSE.md)から選ぶ。
6.1 結果を画像として保存する
コマンドプロンプトを起動する
(手順:Windowsキーまたはスタートメニュー → cmd と入力)。次のコマンドを実行する。
py -3.12 apply_net.py show configs/densepose_rcnn_R_50_FPN_s1x.yaml densepose_rcnn_R_50_FPN_s1x.pkl c:\image\bus.jpg dp_contour,bbox --output c:\image\bus_densepose.png
- 第 1 引数
show:可視化画像を出力するモード。推定結果をデータとして保存する場合はdumpを指定する - 第 2 引数:モデル構成を定義する YAML 設定ファイルへのパス
- 第 3 引数:学習済み重みファイル(
.pkl)のパスまたは URL。URL を指定した場合は自動でダウンロード・キャッシュされる - 第 4 引数:入力画像 1 枚へのパス、または
c:\image\*.jpgのようなワイルドカードによる複数画像の指定 - 第 5 引数:可視化の種類。
dp_contour(UV 座標の等高線)、dp_segm(パーツ分割)、dp_u、dp_v、bboxをカンマ区切りで指定する --output:出力ファイル名。複数画像の場合は連番が付与される
6.2 推定結果をデータとして保存する
コマンドプロンプトを起動する
(手順:Windowsキーまたはスタートメニュー → cmd と入力)。次のコマンドを実行する。
py -3.12 apply_net.py dump configs/densepose_rcnn_R_50_FPN_s1x.yaml densepose_rcnn_R_50_FPN_s1x.pkl c:\image\bus.jpg --output c:\image\results.pkl
出力される results.pkl には、画像ごとにバウンディングボックス(pred_boxes_XYXY)と DensePose の推定結果(パーツインデックス labels と UV 座標 uv)が格納される。次の Python プログラムで内容を確認できる。
import torch
data = torch.load("c:/image/results.pkl", weights_only=False)
for entry in data:
print(entry["file_name"])
print(entry["pred_boxes_XYXY"])
for result in entry["pred_densepose"]:
print(result.labels.shape, result.uv.shape)
7. 学習と評価
学習には train_net.py を使用する。設定ファイルは 8 GPU での学習を前提としているため、1 GPU で学習する場合は線形スケーリング則に従い、バッチサイズと学習率を合わせて変更する。
コマンドプロンプトを起動する
(手順:Windowsキーまたはスタートメニュー → cmd と入力)。次のコマンドを実行する。
py -3.12 train_net.py --config-file configs/densepose_rcnn_R_50_FPN_s1x.yaml SOLVER.IMS_PER_BATCH 2 SOLVER.BASE_LR 0.0025
学習済みモデルの評価は、--eval-only と重みファイルの指定を追加して行う。
py -3.12 train_net.py --config-file configs/densepose_rcnn_R_50_FPN_s1x.yaml --eval-only MODEL.WEIGHTS model.pth