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)で表面上の位置を表す方式である。フィールドは次のとおりである。

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 / 26437densepose_train2014.json(526MB)
densepose_valminusminival2014学習用7297 / 5984densepose_valminusminival2014.json(105MB)
densepose_minival2014検証用2243 / 1508densepose_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 / 36densepose_posetrack_train2017.json(118MB)
posetrack_val2017検証用4753 / 782 / 46densepose_posetrack_val2017.json(59MB)

3.3 その他のデータセット

Detectron2 版 DensePose では、チンパンジーを対象とした DensePose Chimps、および LVIS データセットの動物 9 カテゴリ(bear, cow, cat, dog, elephant, giraffe, horse, sheep, zebra)を対象とした DensePose LVIS も提供されている。いずれも CSE 形式のアノテーションを含む。

利用条件について: DensePose のアノテーションは、非営利目的での利用に限定するライセンス条件で配布されている。利用に先立ち、配布元が定める最新の利用規約・ライセンス条件を確認すること。

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

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