eg3d - CVPR2022ペーパーの公式PyTorch実装

()

Created at: 2021-12-15 17:14:49
Language: Python

効率的なジオメトリ対応の3D生成的敵対的ネットワーク(EG3D)
CVPR2022ペーパーの公式PyTorch実装

ティーザー画像

効率的なジオメトリ対応の3D生成的敵対的ネットワーク
EricR.Chan *、Connor Z. Lin *、Matthew A. Chan *、Koki Nagano *、Boxiao Pan、Shalini De Mello、Orazio Gallo、Leonidas Guibas、Jonathan Tremblay、Sameh Khamis、Tero Karras、GordonWetzstein
*同等の貢献

https://nvlabs.github.io/eg3d/

概要:シングルビュー2D写真のコレクションのみを使用して、高品質のマルチビュー整合性のある画像と3D形状を教師なしで生成することは、長年の課題でした。既存の3DGANは、計算集約型であるか、3D整合性のない近似を行います。前者は生成された画像の品質と解像度を制限し、後者はマルチビューの一貫性と形状品質に悪影響を及ぼします。この作業では、これらの近似に過度に依存することなく、3DGANの計算効率と画質を向上させます。表現力豊かなハイブリッド明示的暗黙的ネットワークアーキテクチャを紹介します。これは、他の設計上の選択肢とともに、高解像度のマルチビュー整合性のある画像をリアルタイムで合成するだけでなく、高品質の3Dジオメトリを生成します。特徴生成とニューラルレンダリングを分離することにより、私たちのフレームワークは、StyleGAN2などの最先端の2D CNNジェネレーターを活用し、その効率と表現力を継承することができます。他の実験の中でも、FFHQおよびAFHQCatsを使用した最先端の3D対応合成を示します。

ビジネスに関するお問い合わせは、当社のWebサイトにアクセスし、フォームを送信してください:NVIDIA Research Licensing

要件

  • パフォーマンスと互換性の理由から、Linuxをお勧めします。
  • 1〜8個のハイエンドNVIDIAGPU。V100、RTX3090、およびA100GPUを使用してすべてのテストと開発を行いました。
  • 64ビットPython3.8およびPyTorch1.11.0(またはそれ以降)。PyTorchのインストール手順については、 https: //pytorch.orgを参照してください。
  • CUDAツールキット11.3以降。(個別のCUDAツールキットのインストールが必要なのはなぜですか?StyleGAN3リポジトリのカスタムCUDA拡張機能を使用しています。トラブルシューティングを参照してください)。
  • Pythonライブラリ:ライブラリの正確な依存関係については、 environment.ymlを参照してください。Miniconda3で次のコマンドを使用して、Python環境を作成およびアクティブ化できます。
    • cd eg3d
    • conda env create -f environment.yml
    • conda activate eg3d

入門

事前にトレーニングされたネットワークは、

*.pkl
ローカルファイル名を使用して参照できるファイルとして保存されます。事前にトレーニングされたチェックポイントへのダウンロードリンクについては、モデルを参照してください。

メディアの生成

# Generate videos using pre-trained model

python gen_videos.py --outdir=out --trunc=0.7 --seeds=0-3 --grid=2x2 \
    --network=networks/network_snapshot.pkl

# Generate the same 4 seeds in an interpolation sequence

python gen_videos.py --outdir=out --trunc=0.7 --seeds=0-3 --grid=1x1 \
    --network=networks/network_snapshot.pkl
# Generate images and shapes (as .mrc files) using pre-trained model

python gen_samples.py --outdir=out --trunc=0.7 --shapes=true --seeds=0-3 \
    --network=networks/network_snapshot.pkl

UCSFChimeraxを使用して.mrcシェープファイルを視覚化します。

ChimeraXで形状を視覚化するには、次のようにします。

  1. .mrc
    でファイルをインポートします
    File > Open
  2. ボリュームビューアツールで選択した形状を見つけます
    1. ボリュームビューアツールは下にあります
      Tools > Volume Data > Volume Viewer
  3. ボリュームタイプを「Surface」に変更します
  4. ステップサイズを1に変更します
  5. レベルを10に設定します
    1. 最適なレベルはオブジェクトごとに異なりますが、通常は2〜20であることに注意してください。個別に調整すると、特定の形状がわずかにシャープになる場合があります。
  6. トップバーの
    Lighting
    メニューで、照明を「フル」に変更します

インタラクティブな視覚化

このリリースには、トレーニング済みモデルのさまざまな特性を調査するために使用できるインタラクティブなモデル視覚化ツールが含まれています。開始するには、次を実行します。

python visualizer.py

Visualizer Guide
重要なオプションの説明については、を参照してください。

Pythonのネットワークを使用する

次のように、独自のPythonコードで事前にトレーニングされたネットワークを使用できます。

with open('ffhq.pkl', 'rb') as f:
    G = pickle.load(f)['G_ema'].cuda()  # torch.nn.Module
z = torch.randn([1, G.z_dim]).cuda()    # latent codes
c = torch.cat([cam2world_pose.reshape(-1, 16), intrinsics.reshape(-1, 9)], 1) # camera parameters
img = G(z, c)['image']                           # NCHW, float32, dynamic range [-1, +1], no truncation

上記のコードでは、を介してアクセスできる必要が

torch_utils
あり
dnnlib
ます
PYTHONPATH
。ネットワーク自体のソースコードは必要ありません—それらのクラス定義はpickleから。を介してロードされ
torch_utils.persistence
ます。

漬物には3つのネットワークが含まれています。

'G'
'D'
はトレーニング中に取得された瞬間的なスナップショットであり
'G_ema'
、いくつかのトレーニングステップにわたるジェネレーターの重みの移動平均を表します。ネットワークはの通常のインスタンスであり
torch.nn.Module
、インポート時にCPUに配置されたすべてのパラメーターとバッファー、および勾配計算はデフォルトで無効になっています。

ジェネレーターは、別々に実行できる2つのサブモジュール

G.mapping
とで構成されます。
G.synthesis
また、さまざまな追加オプションもサポートしています。

w = G.mapping(z, conditioning_params, truncation_psi=0.5, truncation_cutoff=8)
img = G.synthesis(w, camera_params)['image]

gen_samples.py
完全なコード例については、を参照してください。

データセットの準備

データセットは、非圧縮のPNGファイルと

dataset.json
ラベルのメタデータファイルを含む非圧縮のZIPアーカイブとして保存されます。各ラベルは、浮動小数点数の25の長さのリストです。これは、フラット化された4x4カメラの外部マトリックスとフラット化された3x3カメラの固有マトリックスを連結したものです。カスタムデータセットは、画像を含むフォルダーから作成できます。詳細については、を参照
python dataset_tool.py --help
してください。または、フォルダを
dataset_tool.py
最初に実行せずにデータセットとして直接使用することもできますが、そうすると、パフォーマンスが最適化されない可能性があります。

FFHQ :次のコマンドを使用して、 Flickr-Faces-HQデータセットをダウンロードして処理します。

  1. Deep3DFaceRecon_pytorchサブモジュールが適切に初期化されていることを確認します
git submodule update --init --recursive
  1. 次のコマンドを実行します
cd dataset_preprocessing/ffhq
python runme.py

AFHQv2 :次のようにAFHQv2データセットをダウンロードして処理します。

  1. StarGANV2リポジトリからAFHQv2画像のzipファイルをダウンロードします
  2. 次のコマンドを実行します。
cd dataset_preprocessing/afhq
python runme.py "path/to/downloaded/afhq.zip"

ShapeNet Cars :次のコマンドを使用して、 ShapeNetのcarsカテゴリのレンダリングをダウンロードして処理します。 注:次のコマンドは、SceneRepresentationNetworksリポジトリからShapeNet車のレンダリングをダウンロードします。

cd dataset_preprocessing/shapenet
python runme.py

トレーニング

を使用して新しいネットワークをトレーニングできます

train.py
。例えば:

# Train with FFHQ from scratch with raw neural rendering resolution=64, using 8 GPUs.
python train.py --outdir=~/training-runs --cfg=ffhq --data=~/datasets/FFHQ_512.zip \
  --gpus=8 --batch=32 --gamma=1 --gen_pose_cond=True

# Second stage finetuning of FFHQ to 128 neural rendering resolution (optional).
python train.py --outdir=~/training-runs --cfg=ffhq --data=~/datasets/FFHQ_512.zip \
  --resume=~/training-runs/ffhq_experiment_dir/network-snapshot-025000.pkl \
  --gpus=8 --batch=32 --gamma=1 --gen_pose_cond=True --neural_rendering_resolution_final=128

# Train with Shapenet from scratch, using 8 GPUs.
python train.py --outdir=~/training-runs --cfg=shapenet --data=~/datasets/cars_train.zip \
  --gpus=8 --batch=32 --gamma=0.3

# Train with AFHQ, finetuning from FFHQ with ADA, using 8 GPUs.
python train.py --outdir=~/training-runs --cfg=afhq --data=~/datasets/afhq.zip \
  --gpus=8 --batch=32 --gamma=5 --aug=ada --neural_rendering_resolution_final=128 --gen_pose_cond=True --gpc_reg_prob=0.8

独自のデータでトレーニング実行を設定するためのガイドについては、トレーニングガイドを参照してください。

推奨されるトレーニング構成についてはモデルを、事前にトレーニングされたチェックポイントについてはダウンロードリンクを参照してください。

各トレーニング実行の結果は、たとえば、新しく作成されたディレクトリに保存されます

~/training-runs/00000-ffhq-ffhq512-gpus8-batch32-gamma1
。トレーニングループは、ネットワークピクルス(
network-snapshot-<KIMG>.pkl
)とランダム画像グリッド(
fakes<KIMG>.png
)を一定の間隔でエクスポートします(によって制御され
--snap
ます)。エクスポートされたピクルスごとに、FID(によって制御される
--metrics
)を評価し、結果をに記録し
metric-fid50k_full.jsonl
ます。また、TensorBoardがインストールされているかどうか
training_stats.jsonl
だけでなく、にさまざまな統計を記録します。
*.tfevents

品質メトリクス

デフォルトでは、

train.py
トレーニング中にエクスポートされた各ネットワークピクルスのFIDを自動的に計算します。
metric-fid50k_full.jsonl
トレーニングの進行状況を監視するために、定期的に検査(またはTensorBoard)することをお勧めします。必要に応じて、自動計算を無効にし
--metrics=none
て、トレーニングをわずかにスピードアップすることができます。

トレーニング後に、追加の品質メトリックを計算することもできます。

# Previous training run: look up options automatically, save result to JSONL file.
python calc_metrics.py --metrics=fid50k_full \
    --network=~/training-runs/network-snapshot-000000.pkl

# Pre-trained network pickle: specify dataset explicitly, print result to stdout.
python calc_metrics.py --metrics=fid50k_full --data=~/datasets/ffhq_512.zip \
    --network=ffhq-128.pkl

メトリックの計算には非常にコストがかかる可能性があり(最大1時間)、それらの多くには、新しいデータセットごとに1回限りの追加コスト(最大30分)がかかることに注意してください。また、評価は毎回異なるランダムシードを使用して行われるため、同じメトリックが複数回計算されると結果が異なることに注意してください。

参照:

  1. 2つのタイムスケール更新ルールによってトレーニングされたGANは、ローカルのナッシュ平衡に収束します、Heuseletal。2017年
  2. MMD GANの謎を解き明かす、Bińkowskietal。2018年

引用

@inproceedings{Chan2022,
  author = {Eric R. Chan and Connor Z. Lin and Matthew A. Chan and Koki Nagano and Boxiao Pan and Shalini De Mello and Orazio Gallo and Leonidas Guibas and Jonathan Tremblay and Sameh Khamis and Tero Karras and Gordon Wetzstein},
  title = {Efficient Geometry-aware {3D} Generative Adversarial Networks},
  booktitle = {CVPR},
  year = {2022}
}

発達

これはリサーチリファレンス実装であり、1回限りのコードドロップとして扱われます。そのため、プルリクエストの形での外部コードの投稿は受け付けていません。

謝辞

ドラフトに関するフィードバックを寄せてくれたDavidLuebke、Jan Kautz、Jaewoo Seo、Jonathan Granskog、Simon Yuen、Alex Evans、Stan Birchfield、Alexander Bergman、Joy Hsu、図を手伝ってくれたAlex Chan、Giap Nguyen、Trevor Chan、そしてColetteに感謝します。写真の使用を許可してくれたKressとBryanCatanzaro。このプロジェクトは、スタンフォードHAIとサムスンGROによって部分的にサポートされていました。長野幸樹とエリック・チャンは、DARPAのセマンティックフォレンジック(SemaFor)契約(HR0011-20-3-0005)によって部分的にサポートされていました。この文書に含まれる見解と結論は著者のものであり、明示または黙示を問わず、米国政府の公式の方針を表すものとして解釈されるべきではありません。配布ステートメント「A」(一般公開が承認され、配布は無制限)。