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の欄に、学習とレンダリングのステップが説明されています。
ということらしいので、ステップバイステップで実行していきます。
(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分ほどかかります。
この記事が気に入ったらサポートをしてみませんか?