見出し画像

WSL2でGaussianObjectを試してみる

「Gaussian splattingを使用して3Dオブジェクトを表現およびレンダリングするためのフレームワーク。わずか 4 つの入力画像で高いレンダリング品質を実現」するらしいGaussianObjectを試してみます。

使用するPCはドスパラさんの「GALLERIA UL9C-R49」。スペックは
・CPU: Intel® Core™ i9-13900HX Processor
・Mem: 64 GB
・GPU: NVIDIA® GeForce RTX™ 4090 Laptop GPU(16GB)
・GPU: NVIDIA® GeForce RTX™ 4090 (24GB)
・OS: Ubuntu22.04 on WSL2(Windows 11)
です。

1. 準備

環境構築

python3 -m venv gaussianobject
cd $_
source bin/activate

リポジトリをサブモジュール含めて、クローン。

git clone https://github.com/GaussianObject/GaussianObject.git --recursive
cd GaussianObject

パッケージのインストールです。
PyTorch(11.7)なのにCUDA versionが12.3だー!とエラーとなるので、

PATH=/usr/local/cuda-11/bin:$PATH

としてから、インストールします。

# setup pip packages
pip install -r requirements.txt

# setup submodules
pip install -e submodules/diff-gaussian-rasterization
pip install -e submodules/simple-knn
pip install -e submodules/pytorch3d
pip install -e submodules/minLoRA
pip install -e submodules/CLIP
#
pip install gdown

データセットのダウンロード

Google Driveにあるので、gdownコマンドでダウンロードしてきます。

gdown --folder https://drive.google.com/drive/folders/1Q5duwHO3jECWK_khLnPM088BxUa3zhko

ダウンロードができたらdataディレクトリ配下にunzipしましょう。

mkdir data
unzip ./GaussianObject\ Dataset/mip360.zip -d data
unzip ./GaussianObject\ Dataset/omni3d.zip -d data

ControlNetモデルのダウンロード

用意されたスクリプトでダウンロードします。

python download_hf_models.py

2. 試してみる

READMEのRun the Codeの欄に、学習とレンダリングのステップが説明されています。

VIsual Hullを生成し、
Coarse 3DGS表現を学習させ、
leave-one-out 戦略で粗いモデルの統計的規則性を解析し、
LoRA でガウス修復モデルを微調整し、
3DGS 表現を段階的に修復します。

ということらしいので、ステップバイステップで実行していきます。

(1) Visual Hullの生成

Visual ullとは、多視点から撮影された物体のシルエットとカメラの光学中心によって形成される錐体の積集合空間のことです。

python visual_hull.py \
    --sparse_id 4 \
    --data_dir data/mip360/kitchen \
    --reso 2 --not_vis

実行ログ。

Using resized images in data/mip360/kitchen/images_2...
Reading camera 279/279
Generating ellipse path from 279 camera infos ...
theta[0] 0.0
Converting point3d.bin to .ply, will happen only the first time you open the scene.
the sparse id is 4, with 4 frames
the camera center is: tensor([-0.0710, -0.0025,  0.0700], device='cuda:0')
100%|███████████████████████████████████████████████████████████████████████████████████| 200/200 [00:00<00:00, 699.59it/s]
visual hull is Okay, with 22537 points
100%|████████████████████████████████████████████████████████████████████████████████████| 64/64 [00:00<00:00, 1034.86it/s]
visual hull is Okay, with 8616 points

これを使って、以後進めます。

(2) Coarse 3DGSで学習

python train_gs.py -s data/mip360/kitchen \
    -m output/gs_init/kitchen \
    -r 4 --sparse_view_num 4 --sh_degree 2 \
    --init_pcd_name visual_hull_4 \
    --white_background --random_background

学習時の実行ログ。

Optimizing output/gs_init/kitchen
Listening on 127.0.0.1:6009 [22/02 01:30:49]
Output folder: output/gs_init/kitchen [22/02 01:30:49]
Using resized images in /mnt/data/user/venv/gaussianobject/GaussianObject/data/mip360/kitchen/images_4... [22/02 01:30:50]
Reading camera 279/279 [22/02 01:30:51]
Generating ellipse path from 279 camera infos ... [22/02 01:30:51]
theta[0] 0.0 [22/02 01:30:51]
Sparse view, only 4 images are used for training, others are used for eval. [22/02 01:30:52]
Loading training cameras with 1.219653844833374s [22/02 01:30:53]
Loading test cameras with 0.3743317127227783s [22/02 01:30:53]
Loading render cameras with 0.5358924865722656s [22/02 01:30:54]
Number of points at initialisation :  8616 [22/02 01:30:54]
Training progress:  70%|█████████████████████████▏          | 7000/10000 [01:10<00:26, 113.30it/s, Loss=0.0020614, n=42563]
[ITER 7000] Evaluating test: L1 0.019178977209542477 PSNR 21.890646961757113 [22/02 01:32:05]

[ITER 7000] Evaluating train: L1 0.0014793353388085962 PSNR 38.76823348999024 [22/02 01:32:05]

[ITER 7000] Saving Gaussians [22/02 01:32:05]
Training progress: 100%|███████████████████████████████████| 10000/10000 [01:38<00:00, 101.87it/s, Loss=0.0014751, n=42563]

[ITER 10000] Saving Gaussians [22/02 01:32:32]

Training complete. [22/02 01:32:32]

そして、レンダリングします。まずは test set。

# render the test set
python render.py \
    -m output/gs_init/kitchen \
    --sparse_view_num 4 --sh_degree 2 \
    --init_pcd_name visual_hull_4 \
    --white_background --skip_all --skip_train

./output/gs_init/kitchen/test/ours_10000に出力されます。

続いて path。

python render.py \
    -m output/gs_init/kitchen \
    --sparse_view_num 4 --sh_degree 2 \
    --init_pcd_name visual_hull_4 \
    --white_background --render_path

output/gs_init/kitchen/render/ours_10000に保存された動画だと、再生ができなかったので、

ffmpeg -r 30 -pattern_type glob -i 'ours_10000/renders/*.png' -vcodec libx264 -acodec copy -pix_fmt yuv420p -r 30 render_ours_10000.mp4

として生成した動画がこちらです。


(3) Leave One Out戦略

データセットを要素数で分割して、1つだけ残して学習し、残った1つを評価に使う。それをシャッフルしながら繰り返す。そんな戦略。

python leave_one_out_stage1.py -s data/mip360/kitchen \
    -m output/gs_init/kitchen_loo \
    -r 4 --sparse_view_num 4 --sh_degree 2 \
    --init_pcd_name visual_hull_4 \
    --white_background --random_background

python leave_one_out_stage2.py -s data/mip360/kitchen \
    -m output/gs_init/kitchen_loo \
    -r 4 --sparse_view_num 4 --sh_degree 2 \
    --init_pcd_name visual_hull_4 \
    --white_background --random_background

実行結果は、以下のディレクトリ配下に出力されています。

$ ls -rtl output/gs_init/ki
tchen_loo/
total 16
drwxr-xr-x 4 user user 4096 Feb 22 01:51 leave_14
drwxr-xr-x 4 user user 4096 Feb 22 01:52 leave_70
drwxr-xr-x 4 user user 4096 Feb 22 01:53 leave_171
drwxr-xr-x 4 user user 4096 Feb 22 01:53 leave_196
$

その中にある最後の1枚がこちら。

ずいぶん綺麗になってきた

(4) LoRA Fine-Tuning

ファインチューニングを実施します。

python train_lora.py --exp_name controlnet_finetune/kitchen \
    --prompt xxy5syt00 --sh_degree 2 --resolution 4 --sparse_num 4 \
    --data_dir data/mip360/kitchen \
    --gs_dir output/gs_init/kitchen \
    --loo_dir output/gs_init/kitchen_loo \
    --bg_white --sd_locked --train_lora --use_prompt_list \
    --add_diffusion_lora --add_control_lora --add_clip_lora

結果は、以下に出力されています。

$ find output/controlnet_finetune/kitchen/ -type f
output/controlnet_finetune/kitchen/image_log/train/conditioning_gs-001799_e-000449_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/samples_gs-000599_e-000149_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/reconstruction_gs-001199_e-000299_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/samples_cfg_scale_9.00_gs-001199_e-000299_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/reconstruction_gs-000599_e-000149_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/conditioning_gs-000599_e-000149_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/denoise_row_gs-001799_e-000449_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/reconstruction_gs-001799_e-000449_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/denoise_row_gs-001199_e-000299_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/control_gs-000599_e-000149_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/denoise_row_gs-000599_e-000149_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/conditioning_gs-001199_e-000299_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/diffusion_row_gs-001799_e-000449_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/samples_gs-001799_e-000449_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/diffusion_row_gs-001199_e-000299_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/samples_cfg_scale_9.00_gs-000599_e-000149_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/control_gs-001799_e-000449_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/diffusion_row_gs-000599_e-000149_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/samples_gs-001199_e-000299_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/samples_cfg_scale_9.00_gs-001799_e-000449_b-000002.png
output/controlnet_finetune/kitchen/image_log/train/control_gs-001199_e-000299_b-000002.png
output/controlnet_finetune/kitchen/ckpts-lora/lora-step=1199.ckpt
output/controlnet_finetune/kitchen/ckpts-lora/lora-step=1799.ckpt
output/controlnet_finetune/kitchen/ckpts-lora/lora-step=599.ckpt
output/controlnet_finetune/kitchen/tf_logs/lightning_logs/version_0/events.out.tfevents.1708534582.XXXX.326385.0
output/controlnet_finetune/kitchen/tf_logs/lightning_logs/version_0/hparams.yaml
$

学習中の画像はこちら。

(5) Gaussian Repair

まず、学習。

python train_repair.py \
    --config configs/gaussian-object.yaml \
    --train --gpu 0 \
    tag="kitchen" \
    system.init_dreamer="output/gs_init/kitchen" \
    system.exp_name="output/controlnet_finetune/kitchen" \
    system.refresh_size=8 \
    data.data_dir="data/mip360/kitchen" \
    data.resolution=4 \
    data.sparse_num=4 \
    data.prompt="a photo of a xxy5syt00" \
    data.refresh_size=8 \
    system.sh_degree=2
学習中の画像

そして、最後のレンダリング。plyの名前が last になっているのがイカします。

# render the test set
python render.py \
    -m output/gs_init/kitchen \
    --sparse_view_num 4 --sh_degree 2 \
    --init_pcd_name visual_hull_4 \
    --white_background --skip_all --skip_train \
    --load_ply output/gaussian_object/kitchen/save/last.ply

# render the path
python render.py \
    -m output/gs_init/kitchen \
    --sparse_view_num 4 --sh_degree 2 \
    --init_pcd_name visual_hull_4 \
    --white_background --render_path \
    --load_ply output/gaussian_object/kitchen/save/last.ply

こちらの生成動画も再生できなかったので、

ffmpeg -r 30 -pattern_type glob -i 'ours_None/renders/*.png' -vcodec libx264 -acodec copy -pix_fmt yuv420p -r 30 render_ours_None.mp4

として作成した動画がこちら。

まとめ

・VRAM 16GBあれば動きました。
・全工程を流すのに1時間30分ほどかかります。

この記事が気に入ったらサポートをしてみませんか?