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
が使用されます。
サンプルで格納されている画像は、以下です。いろいろと微妙な画像が含まれております…。
さて、コマンドはエラーなく終了。
以下が実行時のログです。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
$
正面からのダンスですね。
(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
$
(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、とてもうれしいですね。)
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
(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
$
精錬…されましたかね。たぶん。
(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にレ点を付けるのを忘れずに。
を、真ん中にナニカがいる!
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はこちら。
この記事が気に入ったらサポートをしてみませんか?