見出し画像

WSL2でDreamGaussian4Dを試してみる

「4D Gaussian Splatting表現に基づいて構築された効率的な4D生成フレームワーク」である DreamGaussian4D: Generative 4D Gaussian Splatting を試します。
特徴としては、

  • Gaussian Splattingにおける空間変換の明示的なモデリングにより、暗黙的な表現と比較して、4D生成設定により適したものになる

  • 最適化時間を数時間からわずか数分に短縮。生成された3Dモーションの柔軟な制御を可能にし、3Dエンジンで効率的にレンダリングできるアニメーション・メッシュを生成する

とのことらしいですが、とりあえず試してみましょう。

使用する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. 準備

venv構築

python3.10ですと、パッケージpymeshlabのVer. 0.2.0が提供されていません。たけしの挑戦状みたく最後の方でエラーとなってしまいますので、python3.9をここでは使用します。
なお、WSL2でpython3.9を使用する方法は、以下の記事を参照ください。

では、venv、作ります。

python3.9 -m venv dreamgaussian4d-3.9
cd $_
source bin/activate

パッケージのインストール

なにはさておき、いつもの。

pip install torch transformers accelerate
pip install wheel

つづいて、git clone

git clone https://github.com/jiawei-ren/dreamgaussian4d.git
cd dreamgaussian4d

READMEの内容に従ってパッケージをインストールします。

# install customized diffusers
pip install ./diffusers

pip install -r requirements.txt

# a modified gaussian splatting (+ depth, alpha rendering)
git clone --recursive https://github.com/ashawkey/diff-gaussian-rasterization
pip install ./diff-gaussian-rasterization

# simple-knn
pip install ./simple-knn

# nvdiffrast
pip install git+https://github.com/NVlabs/nvdiffrast/

# kiuikit
pip install git+https://github.com/ashawkey/kiuikit

不足パッケージ

コードを実行するうえで不足しているパッケージがあったため、先にインストールしておきましょう。

# for main.py
pip install torchvision

# for main_4d.py
sudo apt install python3.9-tk

最終的な pip listはこちらです。

$ pip list
Package                     Version
--------------------------- ------------
accelerate                  0.25.0
aiofiles                    23.2.1
aiohttp                     3.9.1
aiosignal                   1.3.1
altair                      5.2.0
annotated-types             0.6.0
antlr4-python3-runtime      4.9.3
anyio                       3.7.1
async-timeout               4.0.3
asyncer                     0.0.2
attrs                       23.2.0
beautifulsoup4              4.12.2
certifi                     2023.11.17
chardet                     5.2.0
charset-normalizer          3.3.2
click                       8.1.7
colorama                    0.4.6
coloredlogs                 15.0.1
colorlog                    6.8.0
contourpy                   1.2.0
cycler                      0.12.1
dataclasses-json            0.6.3
Deprecated                  1.2.14
diff-gaussian-rasterization 0.0.0
diffusers                   0.24.0.dev0
docstring-parser            0.15
einops                      0.7.0
embreex                     2.17.7.post4
exceptiongroup              1.2.0
executing                   2.0.1
fastapi                     0.108.0
ffmpy                       0.3.1
filelock                    3.13.1
filetype                    1.2.0
flatbuffers                 23.5.26
fonttools                   4.47.0
frozenlist                  1.4.1
fsspec                      2023.12.2
gdown                       4.7.1
gradio                      4.12.0
gradio_client               0.8.0
h11                         0.14.0
httpcore                    1.0.2
httpx                       0.26.0
huggingface-hub             0.20.1
humanfriendly               10.0
idna                        3.6
imageio                     2.33.1
imageio-ffmpeg              0.4.9
importlib-metadata          7.0.1
importlib-resources         6.1.1
Jinja2                      3.1.2
joblib                      1.3.2
jsonschema                  4.20.0
jsonschema-specifications   2023.12.1
kiui                        0.1.12
kiwisolver                  1.4.5
kornia                      0.7.1
lazy_loader                 0.3
llvmlite                    0.41.1
lxml                        5.0.0
mapbox-earcut               1.0.1
markdown-it-py              3.0.0
MarkupSafe                  2.1.3
marshmallow                 3.20.1
matplotlib                  3.8.2
mdurl                       0.1.2
mpmath                      1.3.0
msgpack                     1.0.7
multidict                   6.0.4
mypy-extensions             1.0.0
networkx                    3.2.1
ninja                       1.11.1.1
nodeenv                     1.8.0
numba                       0.58.1
numpy                       1.26.2
nvdiffrast                  0.3.1
nvidia-cublas-cu12          12.1.3.1
nvidia-cuda-cupti-cu12      12.1.105
nvidia-cuda-nvrtc-cu12      12.1.105
nvidia-cuda-runtime-cu12    12.1.105
nvidia-cudnn-cu12           8.9.2.26
nvidia-cufft-cu12           11.0.2.54
nvidia-curand-cu12          10.3.2.106
nvidia-cusolver-cu12        11.4.5.107
nvidia-cusparse-cu12        12.1.0.106
nvidia-nccl-cu12            2.18.1
nvidia-nvjitlink-cu12       12.3.101
nvidia-nvtx-cu12            12.1.105
objprint                    0.2.3
omegaconf                   2.3.0
onnxruntime                 1.16.3
onnxruntime-gpu             1.16.3
opencv-python               4.9.0.80
opencv-python-headless      4.9.0.80
orjson                      3.9.10
packaging                   23.2
pandas                      2.1.4
Pillow                      10.1.0
pip                         23.3.2
platformdirs                4.1.0
plyfile                     1.0.2
pooch                       1.8.0
protobuf                    4.25.1
psutil                      5.9.7
pycollada                   0.7.2
pydantic                    2.5.3
pydantic_core               2.14.6
pydub                       0.25.1
pygltflib                   1.16.1
Pygments                    2.17.2
pyliblzfse                  0.4.1
PyMatting                   1.1.12
PyMCubes                    0.1.4
pymeshlab                   0.2
pyparsing                   3.1.1
PySocks                     1.7.1
python-dateutil             2.8.2
python-multipart            0.0.6
pytz                        2023.3.post1
PyYAML                      6.0.1
referencing                 0.32.0
regex                       2023.12.25
rembg                       2.0.53
requests                    2.31.0
rich                        13.7.0
rpds-py                     0.16.2
Rtree                       1.1.0
safetensors                 0.4.1
scikit-image                0.22.0
scikit-learn                1.3.2
scipy                       1.11.4
semantic-version            2.10.0
setuptools                  58.1.0
shapely                     2.0.2
shellingham                 1.5.4
shtab                       1.6.5
simple-knn                  0.0.0
six                         1.16.0
sniffio                     1.3.0
soupsieve                   2.5
starlette                   0.32.0.post1
svg.path                    6.3
sympy                       1.12
threadpoolctl               3.2.0
tifffile                    2023.12.9
tokenizers                  0.15.0
tomlkit                     0.12.0
toolz                       0.12.0
torch                       2.1.2
torchvision                 0.16.2
tqdm                        4.66.1
transformers                4.36.2
trimesh                     4.0.8
triton                      2.1.0
typer                       0.9.0
typing_extensions           4.9.0
typing-inspect              0.9.0
tyro                        0.6.3
tzdata                      2023.4
urllib3                     2.1.0
uvicorn                     0.25.0
varname                     0.12.2
viser                       0.1.17
watchdog                    3.0.0
websockets                  11.0.3
wheel                       0.42.0
wrapt                       1.16.0
xatlas                      0.0.8
xxhash                      3.4.1
yarl                        1.9.4
yourdfpy                    0.0.53
zipp                        3.17.0

2. 試してみる - Usage

READMEのUsageにある5つのコマンドを順次実行していきます。

(1) generate driving video - gen_vid.py

gen_vid.pyというpyファイルを実行します。中身を見ると、stabilityai/stable-video-diffusion-img2vid をパイプラインとして使用していました。

python gen_vid.py --name anya_rgba --seed 42 --bg white
  • --name: 指定したファイル(拡張子なし)を入力とする

  • --seed: たね

  • --bg: white、black、origのいずれかが指定可能

今回、--nameに指定したのは anya_rgba なので、

$ ls -l data/anya_rgba.png
-rw-r--r-- 1 user user 32860 Jan  1 18:43 data/anya_rgba.png

が使用されます。

anya_rgba.png

サンプルで格納されている画像は、以下です。いろいろと微妙な画像が含まれております…。

サンプル画像

さて、コマンドはエラーなく終了。
以下が実行時のログです。20秒ほどでした。

Loading pipeline components...: 100%|████████████████████████████████████████████████████████| 5/5 [00:00<00:00, 10.25it/s]
[INFO] load image from data/anya_rgba.png...
100%|██████████████████████████████████████████████████████████████████████████████████████| 25/25 [00:12<00:00,  2.04it/s]

dataディレクトリの下に *_generated.* というファイル名でファイルが生成されました。

$ ls -l data/*_generated.*
-rw-r--r-- 1 user user 713671 Jan  1 18:51 data/anya_rgba_generated.gif
-rw-r--r-- 1 user user 168107 Jan  1 18:51 data/anya_rgba_generated.mp4
$
anya_rgba_generated.gif

正面からのダンスですね。

(2) Stage I - main.py

# Stage I: train 500 iters (~2min) and export ckpt & coarse_mesh to logs
python main.py --config configs/image.yaml input=data/anya_rgba.png save_path=anya

エラーなく終了。
以下が実行時のログです。実行時間は2分55秒ほど。

PyMeshLab 0.2 based on MeshLab 2020.12d
[INFO] load image from data/anya_rgba.png...
Number of points at initialisation :  5000
[INFO] loading zero123...
Keyword arguments {'trust_remote_code': True} are not expected by Zero123Pipeline and will be ignored.
Loading pipeline components...: 100%|████████████████████████████████████████████████████████| 6/6 [00:00<00:00, 14.55it/s]
[INFO] loaded zero123!
100%|████████████████████████████████████████████████████████████████████████████████████| 500/500 [02:44<00:00,  3.05it/s]
[INFO] save model to logs/anya_model.ply.

実行結果は、vis_dataディレクトリ下に *_static.gif というファイル名で生成されます。

$ ls -l vis_data/*_static.gif
f
-rw-r--r-- 1 user user 1957374 Jan  1 19:43 vis_data/anya_static.gif
-rw-r--r-- 1 user user 2713968 Jan  1 19:43 vis_data/train_anya_static.gif
$
anya_static.gif


train_anya_static.gif

(3) Stage II - main_4d.py

# Stage II: temporal optimization stage (export meshes by default)
python main_4d.py --config configs/4d.yaml input=data/anya_rgba.png save_path=anya

CUDA OOMが発生しました。READMEのTipsに以下の記載があります。(こういうTips、とてもうれしいですね。)

CUDA OOM.
・Stage I: Reduce batch_size to 4.
・Stage II: Reduce n_views to 1.
・Stage III: Add argument oom_hack=True or disable SVD by setting lambda_svd to 0.

jiawei-ren/dreamgaussian4d: [arXiv 2023] DreamGaussian4D: Generative 4D Gaussian Splatting (github.com)

n_viewsオプションを指定するとよいとのこと。configs/4d.yamlに指定されている値は4でした。RTX 4090(24GB)の場合、この値が 3 まではOOMが発生しないことを確認しました。以下はn_views = 1~4のそれぞれのZero123パイプラインの読み込み時間です。
・n_views = 1 : 2分
・n_views = 2 : 3分30秒程度
・n_views = 3: 1時間50分程度(一部共有メモリを使用してしまうためか)
・n_views = 4: OOMで落ちる(むむむ)

今回は n_views = 2 で進めます。

python main_4d.py --config configs/4d.yaml input=data/anya_rgba.png save_path=anya n_views=2

だがしかし、ランタイムエラー発生。

RuntimeError: OpenGL 4.4 or later is required

WSL2とOpenGLは鬼門ですね。
以下のnvdiffrast開発者のコメントのとおり、WSL2ではRasterizeGLContextを使用するとエラーになるようです。

main_4d.pyとconfigs/4d.yamlを確認したところ、オプションforce_cuda_rastはFalseでした。これをTrueとして実行すると RasterizeCudaContextを強制使用できます。コマンドラインの引数にオプションを追加して実行しましょう。

python main_4d.py --config configs/4d.yaml input=data/anya_rgba.png save_path=anya n_views=2 force_cuda_rast=True

無事に終了。
以下が実行時のログです。6分16秒ほどかかりました。

PyMeshLab 0.2 based on MeshLab 2020.12d
Using zero-init and residual
feature_dim: 128
[INFO] load image from data/anya_rgba_000.png...
[INFO] load image from data/anya_rgba_001.png...
[INFO] load image from data/anya_rgba_002.png...
[INFO] load image from data/anya_rgba_003.png...
[INFO] load image from data/anya_rgba_004.png...
[INFO] load image from data/anya_rgba_005.png...
[INFO] load image from data/anya_rgba_006.png...
[INFO] load image from data/anya_rgba_007.png...
[INFO] load image from data/anya_rgba_008.png...
[INFO] load image from data/anya_rgba_009.png...
[INFO] load image from data/anya_rgba_010.png...
[INFO] load image from data/anya_rgba_011.png...
[INFO] load image from data/anya_rgba_012.png...
[INFO] load image from data/anya_rgba_013.png...
Seed: 888
[INFO] loading zero123...
Keyword arguments {'trust_remote_code': True} are not expected by Zero123Pipeline and will be ignored.
Loading pipeline components...: 100%|████████████████████████████████████████████████████████| 6/6 [00:00<00:00, 21.45it/s]
[INFO] loaded zero123!
100%|████████████████████████████████████████████████████████████████████████████████████| 200/200 [03:34<00:00,  1.07s/it]
[INFO] save model to logs/anya_4d_model.ply.
[INFO] mesh cleaning: (21804, 3) --> (10294, 3), (43564, 3) --> (20624, 3)
[INFO] marching cubes result: torch.Size([10294, 3]) (-0.6748200058937073-0.6952179074287415), torch.Size([20624, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_000.obj.
[INFO] mesh cleaning: (20220, 3) --> (10307, 3), (40444, 3) --> (20718, 3)
[INFO] marching cubes result: torch.Size([10307, 3]) (-0.6844725012779236-0.7359921336174011), torch.Size([20718, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_001.obj.
[INFO] mesh cleaning: (19524, 3) --> (9614, 3), (39012, 3) --> (19264, 3)
[INFO] marching cubes result: torch.Size([9614, 3]) (-0.6926491260528564-0.7005663514137268), torch.Size([19264, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_002.obj.
[INFO] mesh cleaning: (21890, 3) --> (9733, 3), (43780, 3) --> (19486, 3)
[INFO] marching cubes result: torch.Size([9733, 3]) (-0.6789939403533936-0.6367366313934326), torch.Size([19486, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_003.obj.
[INFO] mesh cleaning: (23684, 3) --> (10457, 3), (47348, 3) --> (20940, 3)
[INFO] marching cubes result: torch.Size([10457, 3]) (-0.667644739151001-0.6278085112571716), torch.Size([20940, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_004.obj.
[INFO] mesh cleaning: (21916, 3) --> (9842, 3), (43812, 3) --> (19708, 3)
[INFO] marching cubes result: torch.Size([9842, 3]) (-0.6720498204231262-0.6580474972724915), torch.Size([19708, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_005.obj.
[INFO] mesh cleaning: (20798, 3) --> (9711, 3), (41596, 3) --> (19458, 3)
[INFO] marching cubes result: torch.Size([9711, 3]) (-0.6751724481582642-0.6823985576629639), torch.Size([19458, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_006.obj.
[INFO] mesh cleaning: (20702, 3) --> (9584, 3), (41400, 3) --> (19204, 3)
[INFO] marching cubes result: torch.Size([9584, 3]) (-0.6758767366409302-0.687122642993927), torch.Size([19204, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_007.obj.
[INFO] mesh cleaning: (20722, 3) --> (9611, 3), (41396, 3) --> (19250, 3)
[INFO] marching cubes result: torch.Size([9611, 3]) (-0.6723244190216064-0.6988254189491272), torch.Size([19250, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_008.obj.
[INFO] mesh cleaning: (22096, 3) --> (10219, 3), (44148, 3) --> (20470, 3)
[INFO] marching cubes result: torch.Size([10219, 3]) (-0.6688713431358337-0.6902956962585449), torch.Size([20470, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_009.obj.
[INFO] mesh cleaning: (22870, 3) --> (10258, 3), (45684, 3) --> (20524, 3)
[INFO] marching cubes result: torch.Size([10258, 3]) (-0.666579008102417-0.6667375564575195), torch.Size([20524, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_010.obj.
[INFO] mesh cleaning: (23696, 3) --> (10516, 3), (47356, 3) --> (21044, 3)
[INFO] marching cubes result: torch.Size([10516, 3]) (-0.6644514799118042-0.6460138559341431), torch.Size([21044, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_011.obj.
[INFO] mesh cleaning: (23462, 3) --> (10359, 3), (46892, 3) --> (20726, 3)
[INFO] marching cubes result: torch.Size([10359, 3]) (-0.6622707843780518-0.6527732014656067), torch.Size([20726, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_012.obj.
[INFO] mesh cleaning: (22736, 3) --> (10631, 3), (45452, 3) --> (21310, 3)
[INFO] marching cubes result: torch.Size([10631, 3]) (-0.6657007336616516-0.6874297261238098), torch.Size([21310, 3])
[INFO] unwrap uv...
[INFO] save model to logs/anya_mesh_013.obj.

logsディレクトリにanyaで始まるファイルがたくさんできています。

$ ls -l logs | head
total 345696
-rw-r--r-- 1 user user   2098300 Jan  1 19:39 anya.glb
-rw-r--r-- 1 user user        94 Jan  1 19:39 anya.mtl
-rw-r--r-- 1 user user   4946942 Jan  1 19:39 anya.obj
-rw-r--r-- 1 user user   2099708 Jan  1 19:39 anya_000.glb
-rw-r--r-- 1 user user        98 Jan  1 19:39 anya_000.mtl
-rw-r--r-- 1 user user   4714936 Jan  1 19:39 anya_000.obj
-rw-r--r-- 1 user user   1556298 Jan  1 19:39 anya_000_albedo.png
-rw-r--r-- 1 user user   2159432 Jan  1 19:39 anya_001.glb
-rw-r--r-- 1 user user        98 Jan  1 19:39 anya_001.mtl
$

また、vis_dataディレクトリに、以下の3ファイルも生成されています。

-rw-r--r-- 1 user user 1963733 Jan  1 19:30 vis_data.orig/anya.gif
-rw-r--r-- 1 user user 2627375 Jan  1 19:30 vis_data.orig/train_anya.gif
-rw-r--r-- 1 user user  744139 Jan  1 19:30 vis_data.orig/train_anya.mp4
anya.gif


train_anya.gif

(4) Stage III - main2_4d.py

# Stage III: texture optimization (optional, it requires large GPU memory and we are optimzing it)
python main2_4d.py --config configs/4d_svd.yaml input=data/anya_rgba.png save_path=anya

はい、こちらも同じく、

RuntimeError: OpenGL 4.4 or later is required

となりましたので、オプションを指定して再実行です。

python main2_4d.py --config configs/4d_svd.yaml input=data/anya_rgba.png save_path=anya force_cuda_rast=True

oom_hackキー誤りとのエラーが発生しました。

omegaconf.errors.ConfigAttributeError: Missing key oom_hack
    full_key: oom_hack
    object_type=dict

Tipsにあるとおり、oom_hack=Trueを指定しないと駄目なようです。あらためて、再実行・・・。

python main2_4d.py --config configs/4d_svd.yaml input=data/anya_rgba.png save_path=anya force_cuda_rast=True oom_hack=True

無事に終了しました。
以下が実行時のログです。2分49秒ほどかかりました。

[load_obj] use texture from: logs/anya_mesh_000_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([14719, 3]), f: torch.Size([20624, 3])
[Mesh loading] vn: torch.Size([14719, 3]), fn: torch.Size([20624, 3])
[load_obj] use texture from: logs/anya_mesh_001_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([15369, 3]), f: torch.Size([20718, 3])
[Mesh loading] vn: torch.Size([15369, 3]), fn: torch.Size([20718, 3])
[load_obj] use texture from: logs/anya_mesh_002_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([13396, 3]), f: torch.Size([19264, 3])
[Mesh loading] vn: torch.Size([13396, 3]), fn: torch.Size([19264, 3])
[load_obj] use texture from: logs/anya_mesh_003_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([13273, 3]), f: torch.Size([19486, 3])
[Mesh loading] vn: torch.Size([13273, 3]), fn: torch.Size([19486, 3])
[load_obj] use texture from: logs/anya_mesh_004_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([15186, 3]), f: torch.Size([20940, 3])
[Mesh loading] vn: torch.Size([15186, 3]), fn: torch.Size([20940, 3])
[load_obj] use texture from: logs/anya_mesh_005_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([14104, 3]), f: torch.Size([19708, 3])
[Mesh loading] vn: torch.Size([14104, 3]), fn: torch.Size([19708, 3])
[load_obj] use texture from: logs/anya_mesh_006_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([14078, 3]), f: torch.Size([19458, 3])
[Mesh loading] vn: torch.Size([14078, 3]), fn: torch.Size([19458, 3])
[load_obj] use texture from: logs/anya_mesh_007_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([13656, 3]), f: torch.Size([19204, 3])
[Mesh loading] vn: torch.Size([13656, 3]), fn: torch.Size([19204, 3])
[load_obj] use texture from: logs/anya_mesh_008_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([13998, 3]), f: torch.Size([19250, 3])
[Mesh loading] vn: torch.Size([13998, 3]), fn: torch.Size([19250, 3])
[load_obj] use texture from: logs/anya_mesh_009_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([15303, 3]), f: torch.Size([20470, 3])
[Mesh loading] vn: torch.Size([15303, 3]), fn: torch.Size([20470, 3])
[load_obj] use texture from: logs/anya_mesh_010_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([14565, 3]), f: torch.Size([20524, 3])
[Mesh loading] vn: torch.Size([14565, 3]), fn: torch.Size([20524, 3])
[load_obj] use texture from: logs/anya_mesh_011_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([14680, 3]), f: torch.Size([21044, 3])
[Mesh loading] vn: torch.Size([14680, 3]), fn: torch.Size([21044, 3])
[load_obj] use texture from: logs/anya_mesh_012_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([14461, 3]), f: torch.Size([20726, 3])
[Mesh loading] vn: torch.Size([14461, 3]), fn: torch.Size([20726, 3])
[load_obj] use texture from: logs/anya_mesh_013_albedo.png
[load_obj] load texture: (1024, 1024, 3)
[Mesh loading] v: torch.Size([15588, 3]), f: torch.Size([21310, 3])
[Mesh loading] vn: torch.Size([15588, 3]), fn: torch.Size([21310, 3])
[INFO] load image from data/anya_rgba.png...
[INFO] load image from data/anya_rgba_000.png...
[INFO] load image from data/anya_rgba_001.png...
[INFO] load image from data/anya_rgba_002.png...
[INFO] load image from data/anya_rgba_003.png...
[INFO] load image from data/anya_rgba_004.png...
[INFO] load image from data/anya_rgba_005.png...
[INFO] load image from data/anya_rgba_006.png...
[INFO] load image from data/anya_rgba_007.png...
[INFO] load image from data/anya_rgba_008.png...
[INFO] load image from data/anya_rgba_009.png...
[INFO] load image from data/anya_rgba_010.png...
[INFO] load image from data/anya_rgba_011.png...
[INFO] load image from data/anya_rgba_012.png...
[INFO] load image from data/anya_rgba_013.png...
[INFO] loading SVD...
Loading pipeline components...: 100%|████████████████████████████████████████████████████████| 5/5 [00:00<00:00,  9.82it/s]
[INFO] loaded SVD!
 24%|████████████████████▋                                                                 | 12/50 [00:34<01:47,  2.83s/it]100%|██████████████████████████████████████████████████████████████████████████████████████| 50/50 [02:22<00:00,  2.84s/it]
[INFO] save model to logs/anya.glb.

vis_dataディレクトリに anya_refined.gif が生成されています。

$ ls -l vis_data/
total 11544
-rw-r--r-- 1 user user 1963733 Jan  1 19:30 anya.gif
-rw-r--r-- 1 user user 1806088 Jan  1 19:39 anya_refined.gif
-rw-r--r-- 1 user user 1957374 Jan  1 19:43 anya_static.gif
-rw-r--r-- 1 user user 2627375 Jan  1 19:30 train_anya.gif
-rw-r--r-- 1 user user  744139 Jan  1 19:30 train_anya.mp4
-rw-r--r-- 1 user user 2713968 Jan  1 19:43 train_anya_static.gif
$
anya_refined.gif

精錬…されましたかね。たぶん。

(5) to turn on viser GUI - main.py

GUIを起動します。

# to turn on viser GUI, add `gui=True`, e.g.:
python main.py --config configs/image.yaml input=data/anya_rgba.png save_path=anya gui=True

127.0.0.1:8080にアクセスすると・・・

アーニャのようなナニカ

はい、こちらドラッグしてマウスを動かすとグルグル回ります。

3. 試してみる - Blender

Blenderに、出力されたメッシュ(Stage IIで logs ディレクトリに生成されています。)を取り込んで試してみましょう。

Blenderとアドオンのインストール

WSL2ですと、Blenderがうまく動かない(Segmentation fault)ため、仕方が無いですが、Windows版で試します。

Blender 2.9.13をダウンロードして、インストールします。最新版(4.0.2)ですとエラーを吐きますので、無難に2.9.13にしましょう。
続いて、Stop-motion-OBJの Stop-motion-OBJ-v2.1.1.zip をダウンロードします。

このzipファイルを(展開せず)Blenderからアドオンとしてインストールします。
メニューから、編集 > プリファレンス を選択します。

プリファレンスのダイアログにある「アドオン」を選択し、「インストール…」をクリック。ダウンロードしたStop-motion-OBJのzipファイルを指定するとインストールされます。

これで、Blenderとアドオンのインストールは完了です。

メッシュの取り込み

Blenderのメニュー(ファイル>インポート>Mesh Sequence)を選択します。

そして、logsフォルダを指定します。右下のMaterial per Frameにレ点を付けるのを忘れずに。

を、真ん中にナニカがいる!

Blenderの真ん中

4. まとめ

Usageにある各プログラムの所要時間

timeコマンドのrealの値です。確かに速いですね。
・(1) generate driving video : 20秒
・(2) Stage I : 2分55秒
・(3) Stage II : 6分16秒
・(4) Stage III : 2分49秒

実行したプログラム

引数をアレコレ追加しましたので、まとめておきます。

#!/bin/bash

name=anya_rgba
save_path=anya
background=white

python gen_vid.py --name ${name} --seed 42 --bg ${background}
python main.py --config configs/image.yaml name=data/${name}.png save_path=${save_path}
python main_4d.py --config configs/4d.yaml name=data/${name}.png save_path=${save_path} n_views=2 force_cuda_rast=True
python main2_4d.py --config configs/4d_svd.yaml name=data/${name}.png save_path=${save_path} force_cuda_rast=True oom_hack=True
python main.py --config configs/image.yaml name=data/${name}.png save_path=${save_path} gui=True

その他

WSL2はOpenGLまわりをなんとかしてほしいですね。。。

おまけ

test.pngを入力にして生成された test_refined.gifはこちら。

test_refined.gif

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