「スプラッター イメージ: 超高速シングルビュー 3D 再構成」の正式実装 (CVPR 2024)
[2024 年 4 月 16 日] 最初のリリース以降、プロジェクトに対するいくつかの大きなアップデート:
オンラインデモをチェックしてください。デモをローカルで実行すると、多くの場合さらに高速になり、(アーティファクトが表示される可能性がある抽出された .ply オブジェクトとは対照的に) ガウス スプラッティングでレンダリングされたループを確認できます。デモをローカルで実行するには、以下のインストール手順に従い、その後、次のコマンドを呼び出します。
python gradio_app.py
conda create --name splatter-image
conda activate splatter-image
公式の手順に従って Pytorch をインストールします。動作することが確認された Pytorch / Python / Pytorch3D の組み合わせは次のとおりです。
他の要件をインストールします。
pip install -r requirements.txt
Gaussian Splatting レンダラ、つまりガウス点群を画像にレンダリングするためのライブラリをインストールします。これを行うには、Gaussian Splatting リポジトリをプルし、conda 環境をアクティブにして、 pip install submodules/diff-gaussian-rasterization
実行します。ハードウェアとソフトウェアの要件を満たす必要があります。すべての実験は NVIDIA A6000 GPU で行い、速度測定は NVIDIA V100 GPU で行いました。
CO3D データでトレーニングしたい場合は、Pytorch3D 0.7.2 をインストールする必要があります。ここの手順を参照してください。事前に構築されたバイナリから pip を使用してインストールすることをお勧めします。ここで互換性のあるバイナリを見つけて、 pip
でインストールします。たとえば、Python 3.8、Pytorch 1.13.0、CUDA 11.6 ではpip install --no-index --no-cache-dir pytorch3d -f https://anaconda.org/pytorch3d/pytorch3d/0.7.2/download/linux-64/pytorch3d-0.7.2-py38_cu116_pyt1130.tar.bz2
を実行します。 pip install --no-index --no-cache-dir pytorch3d -f https://anaconda.org/pytorch3d/pytorch3d/0.7.2/download/linux-64/pytorch3d-0.7.2-py38_cu116_pyt1130.tar.bz2
。
ShapeNet-SRN クラス (車、椅子) でトレーニング/評価するには、PixelNeRF データ フォルダーから srn_*.zip (* = 車または椅子) をダウンロードしてください。データ ファイルを解凍し、 datasets/srn.py
内のSHAPENET_DATASET_ROOT
解凍したフォルダーの親フォルダーに変更します。たとえば、フォルダー構造が/home/user/SRN/srn_cars/cars_train
の場合、 datasets/srn.py
でSHAPENET_DATASET_ROOT="/home/user/SRN"
を設定します。追加の前処理は必要ありません。
CO3D でトレーニング/評価するには、CO3D リリースから消火栓クラスとテディベア クラスをダウンロードします。これを行うには、次のコマンドを実行します。
git clone https://github.com/facebookresearch/co3d.git
cd co3d
mkdir DOWNLOAD_FOLDER
python ./co3d/download_dataset.py --download_folder DOWNLOAD_FOLDER --download_categories hydrant,teddybear
次に、 CO3D_RAW_ROOT
data_preprocessing/preoprocess_co3d.py
のDOWNLOAD_FOLDER
に設定します。 CO3D_OUT_ROOT
、前処理されたデータを保存する場所に設定します。走る
python -m data_preprocessing.preprocess_co3d
CO3D_DATASET_ROOT:=CO3D_OUT_ROOT
を設定します。
マルチカテゴリ ShapeNet の場合、DVR 作者がホストする NMR の ShapeNet 64x64 データセットを使用します。このデータセットは、ここからダウンロードできます。フォルダーを解凍し、 NMR_DATASET_ROOT
、解凍後にサブカテゴリ フォルダーが含まれるディレクトリに設定します。つまり、 NMR_DATASET_ROOT
ディレクトリには、フォルダー02691156
、 02828884
、 02933112
などが含まれている必要があります。
Objaverse でのトレーニングには、次のコマンドでダウンロードできる Zero-1-to-3 のレンダリングを使用しました。
wget https://tri-ml-public.s3.amazonaws.com/datasets/views_release.tar.gz
免責事項: レンダリングは Objaverse を使用して生成されることに注意してください。レンダリング全体は ODC-By 1.0 ライセンスに基づいてリリースされています。個々のオブジェクトのレンダリングのライセンスは、Objaverse と同じライセンス クリエイティブ コモンズに基づいてリリースされます。
さらに、モデル リポジトリからlvis-annotations-filtered.json
をダウンロードしてください。この JSON は、LVIS サブセットからのオブジェクトの ID のリストを保持します。これらのアセットは高品質です。
datasets/objaverse.py
のOBJAVERSE_ROOT
を、レンダリングが含まれる解凍されたフォルダーのディレクトリに設定し、同じファイル内のOBJAVERSE_LVIS_ANNOTATION_PATH
、ダウンロードした.json
ファイルのディレクトリに設定します。
Objaverse データセットはトレーニングと検証のみを目的としていることに注意してください。テストサブセットはありません。
Objaverse でトレーニングされたモデルを評価するために、トレーニング セットと重複しないように Google Scanned Objects データセットを使用します。 Free3D が提供するレンダリングをダウンロードします。ダウンロードしたフォルダーを解凍し、 datasets/gso.py
のGSO_ROOT
解凍したフォルダーのディレクトリに設定します。
Google Scanned Objects データセットはトレーニング用ではないことに注意してください。これは、Objaverse でトレーニングされたモデルをテストするために使用されます。
すべてのデータセットの事前トレーニング済みモデルが、Huggingface Models 経由で利用できるようになりました。定性的/定量的評価を実行したいだけの場合は、それらを手動でダウンロードする必要はありません。評価スクリプト (以下を参照) を実行すると自動的に使用されます。
必要に応じて、Huggingface モデル ファイル ページのダウンロード ボタンを手動でクリックして、手動でダウンロードすることもできます。構成ファイルを一緒にダウンロードし、モデルがどのようにロードされるかについてはeval.py
参照してください。
関連するデータセットをダウンロードしたら、次のコマンドを使用して評価を実行できます。
python eval.py $dataset_name
$dataset_name
データセットの名前です。私たちは以下をサポートします:
gso
(Google スキャン オブジェクト)、objaverse
(Objaverse-LVIS)、nmr
(マルチカテゴリー ShapeNet)、hydrants
(CO3D 消火栓)、teddybears
(CO3Dテディベア)、cars
(ShapeNet 車)、chairs
(シェイプネットチェア)。コードは、要求されたデータセットに関連するモデルを自動的にダウンロードします。独自のモデルをトレーニングして評価することもできます。
python eval.py $dataset_name --experiment_path $experiment_path
$experiment_path
model_latest.pth
ファイルと、その中にconfig.yaml
を含む.hydra
フォルダーが保持されている必要があります。
検証分割で評価するには、オプション--split val
を使用して呼び出します。
カメラがループ内で移動するオブジェクトのレンダリングを保存するには、オプション--split vis
を使用して呼び出します。このオプションを使用すると、グラウンド トゥルース画像がすべてのデータセットで利用できるわけではないため、定量的スコアは返されません。
オプション--save_vis
を使用して、レンダリングを保存するオブジェクトの数を設定できます。オプション--out_folder
を使用して、レンダリングを保存する場所を設定できます。
シングルビュー モデルは 2 段階でトレーニングされます。最初は LPIPS を使用せず (ほとんどのトレーニング)、次に LPIPS を使用して微調整します。
python train_network.py +dataset=$dataset_name
opt.pretrained_ckpt
に配置します (デフォルトでは null に設定されます)。 python train_network.py +dataset=$dataset_name +experiment=$lpips_experiment_name
$lpips_experiment_name
使用するかは、データセットによって異なります。 $dataset_name が [cars,windrants,teddybears] にある場合は、lpips_100k.yaml を使用します。 $dataset_name が椅子の場合は、lpips_200k.yaml を使用します。 $dataset_name が nmr の場合は、lpips_nmr.yaml を使用します。 $dataset_name が objaverse の場合は、lpips_objaverse.yaml を使用します。第 2 ステージを起動する前に、第 1 ステージのモデルのディレクトリを適切な .yaml ファイルに忘れずに配置してください。2 ビュー モデルをトレーニングするには、次の手順を実行します。
python train_network.py +dataset=cars cam_embd=pose_pos data.input_images=2 opt.imgs_per_obj=5
トレーニング ループはtrain_network.py
に実装され、評価コードはeval.py
に実装されます。データセットはdatasets/srn.py
およびdatasets/co3d.py
に実装されています。モデルはscene/gaussian_predictor.py
に実装されています。レンダラーの呼び出しはgaussian_renderer/__init__.py
にあります。
ガウス ラスタライザは、剛体変換行列の行優先順序、つまり位置ベクトルが行ベクトルであると仮定します。また、COLMAP/OpenCV 規約に従ったカメラ、つまり、x が右、y が下、z がカメラから離れる方向 (前方) にあることも必要です。
@inproceedings{szymanowicz24splatter,
title={Splatter Image: Ultra-Fast Single-View 3D Reconstruction},
author={Stanislaw Szymanowicz and Christian Rupprecht and Andrea Vedaldi},
year={2024},
booktitle={The IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
}
S. シマノヴィッチは、EPSRC Doctoral Training Partnerships Scholarship (DTP) EP/R513295/1 およびオックスフォード・アシュトン奨学金によって支援されています。 A. Vedaldi は ERC-CoG UNION 101001212 によってサポートされています。インストール要件について支援してくれた Eldar Insafutdinov に感謝します。