あらためて、WSL2でGPS-Gaussianを試してみる
年をまたいで、GPS-Gaussianです。
以下の記事で試してみたものの、RTX 4090 Laptop GPU(16GB)では、stage1の訓練に270時間かかることが分かり、にんともかんともの状況へ。
この状況を打破すべく、某所での某お方の「まあ●●万円なら安い」というお言葉に後押しされ、、、
を2023年大晦日に入手してしまいました。早速こちらで試します。
使用する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. 準備
前回の記事の「1. 準備」「2. モデルなどのダウンロード」と内容が重複していますが、記事を切り替えながら読みのは面倒かと思いますので、こちらにも転記しておきます。
venv環境
python3 -m venv gps-gaussian
cd $_
source bin/activate
GPS-Gaussianのダウンロード
git clone https://github.com/ShunyuanZheng/GPS-Gaussian.git
インストール
torchを忘れずに。
pip install torch
続いて、diff-gaussian-rasterizationのコンパイルとインストールです。
git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive
cd gaussian-splatting/
pip install -e submodules/diff-gaussian-rasterization
cd ..
「任意」と書いていますが、モデルの高速化のためのRAFT-Stereoもインストールしておきます。
git clone https://github.com/princeton-vl/RAFT-Stereo.git
cd RAFT-Stereo/sampler && python setup.py install && cd ../..
2. モデルなどのダウンロード
ダウンロード
OneDriveにデータがアップロードされていますので、これをダウンロードしましょう。
3ファイルありました。
これらをコマンドラインでダウンロードしようと試行錯誤しましたが、アレコレしないとダウンロードできないため、ブラウザ経由でダウンロードします。
ファイルの格納と展開
まずは、cloneしたGPS-Gaussianにカレントディレクトリを移動します。
cd GPS-Gaussian
ブラウザ経由でダウンロードした3ファイルを展開するディレクトリを、作成しておきましょう。ここではdataとしました。
mkdir data
続いて、ダウンロードしてきたファイルをカレントディレクトリ(GPS-Gaussian)にコピーします。
$ pwd
/path/to/venv/gps-gaussian/GPS-Gaussian
$ ls -l
$ ls -l *.pth *.zip
-rw-r--r-- 1 user user 54118869 Dec 26 23:06 GPS-GS_stage2_final.pth
-rw-r--r-- 1 user user 2350810694 Dec 26 23:10 real_data.zip
-rw-r--r-- 1 user user 11466169026 Dec 26 23:31 render_data.zip
$
この状態で各ファイルを移動、展開します。
$ mv GPS-GS_stage2_final.pth data
$ unzip -d data real_data.zip
$ unzip -d data render_data.zip
展開されたファイルの確認
real_dataには、撮影写真ママ(img)と白抜きマスク画像(mask)が含まれていました。
$ find ./data/real_data/ -maxdepth 1 -type d
./data/real_data/
./data/real_data/img
./data/real_data/parm
./data/real_data/mask
$
render_dataには、訓練データと検証データがそれぞれ格納されているようです。
$ find ./data/render_data/ -maxdepth 2 -type d
./data/render_data/
./data/render_data/train
./data/render_data/train/img
./data/render_data/train/parm
./data/render_data/train/mask
./data/render_data/train/depth
./data/render_data/val
./data/render_data/val/img
./data/render_data/val/parm
./data/render_data/val/mask
./data/render_data/val/depth
ファイル展開はこれで完了です。
3. 提供されているデータセット
提供データセット
「2台のカメラ設定で、GPS-Gaussianトレーニング用にレンダリングされたTHuman0.16データセット」が render_data.zip として提供されています。
render_data配下のディレクトリ構成は、上記2.でも書いたとおり、こんな感じです。
$ find data/render_data/ -maxdepth 2 -type d
data/render_data/
data/render_data/train
data/render_data/train/img
data/render_data/train/parm
data/render_data/train/mask
data/render_data/train/depth
data/render_data/val
data/render_data/val/img
data/render_data/val/parm
data/render_data/val/mask
data/render_data/val/depth
格納されているファイルは、JPEG、PNG、Numpy配列のセットです。参考までにファイル数を見てみましょう。
train/img, *.jpg: 54528
train/img, *.png: 68160
train/img, *.npy: 68160
train/parm, *.jpg: 54528
train/parm, *.png: 68160
train/parm, *.npy: 68160
train/mask, *.jpg: 54528
train/mask, *.png: 68160
train/mask, *.npy: 68160
train/depth, *.jpg: 54528
train/depth, *.png: 68160
train/depth, *.npy: 68160
val/img, *.jpg: 12800
val/img, *.png: 16000
val/img, *.npy: 16000
val/parm, *.jpg: 12800
val/parm, *.png: 16000
val/parm, *.npy: 16000
val/mask, *.jpg: 12800
val/mask, *.png: 16000
val/mask, *.npy: 16000
val/depth, *.jpg: 12800
val/depth, *.png: 16000
val/depth, *.npy: 16000
参考: ファイル数を確認するShell Scriptはこちら。
base_dir=./data/render_data
for d in train val; do
for s in img parm mask depth; do
for ext in jpg png npy; do
count=$(find ${base_dir}/${d} -type f -name "*.${ext}" | wc -l)
if [[ ${count} > 0 ]]; then
echo "${d}/${s}, *.${ext}: ${count}"
fi
done
done
done
より堅牢なモデルを訓練するために
READMEを読むに「より堅牢なモデルを訓練するには、以下を試してください」とのこと。
より多くの訓練用人体スキャンを収集することをオススメする(例:Twindom、Render People、2K2K)
カメラの数やシーンの半径などを含む訓練データをターゲットシナリオとしてレンダリングする
※人体スキャンから訓練データを生成するためのレンダリングコードはこちら。<GPS-Gaussian/prepare_data/MAKE_DATA.md at main · ShunyuanZheng/GPS-Gaussian (github.com)>
4. 訓練を試してみる - stage1
それでは「深度予測モデル」を事前訓練しましょう。
設定ファイルの修正
config/stage1.yamlの data_root の値を適切に修正します。弊環境では、data/render_dataにレンダリング画像を展開したので、それを指定しています。
・data_root : data/render_data
diff --git a/config/stage1.yaml b/config/stage1.yaml
index 8f69e05..9d3bf2e 100644
--- a/config/stage1.yaml
+++ b/config/stage1.yaml
@@ -9,7 +9,7 @@ num_steps: 40000
dataset:
source_id: [0, 1]
use_processed_data: True
- data_root: 'PATH/TO/RENDER_DATA'
+ data_root: 'data/render_data'
raft:
mixed_precision: False
プログラムの実行
続いてプログラムの実行です。
$ python train_stage1.py
24GBの力はすばらしい。たったの(?)7時間で終わりました。
2023-12-31 10:26:27,754 INFO [human_loader.py:127] Using local data in data/render_data/rectified_local/train ...
2023-12-31 10:26:29,176 INFO [human_loader.py:127] Using local data in data/render_data/rectified_local/val ...
5%|███████▏ | 2000/40000 [20:44<6:29:33, 1.63it/s]2023-12-31 10:47:18,973 INFO [train_recoder.py:42] Training Metrics (2000): [ 2000, 0.0001980] 0.3187, 0.6249, 7.7379,
2023-12-31 10:47:18,991 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 10:48:40,600 INFO [train_stage1.py:103] Validation Metrics (2000): epe 1.8844, 1pix 0.5386
10%|██████████████▎ | 4000/40000 [42:32<6:06:56, 1.64it/s]2023-12-31 11:09:06,799 INFO [train_recoder.py:42] Training Metrics (4000): [ 4000, 0.0001939] 0.5972, 0.8995, 1.6696,
2023-12-31 11:09:06,817 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 11:10:29,380 INFO [train_stage1.py:103] Validation Metrics (4000): epe 1.4658, 1pix 0.6394
15%|█████████████████████▏ | 6000/40000 [1:04:24<5:51:28, 1.61it/s]2023-12-31 11:30:58,599 INFO [train_recoder.py:42] Training Metrics (6000): [ 6000, 0.0001899] 0.6589, 0.9217, 1.3926,
2023-12-31 11:30:58,617 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 11:32:21,070 INFO [train_stage1.py:103] Validation Metrics (6000): epe 1.2958, 1pix 0.6842
20%|████████████████████████████▏ | 8000/40000 [1:26:10<5:19:08, 1.67it/s]2023-12-31 11:52:44,676 INFO [train_recoder.py:42] Training Metrics (8000): [ 8000, 0.0001859] 0.6947, 0.9322, 1.2459,
2023-12-31 11:52:44,693 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 11:54:07,758 INFO [train_stage1.py:103] Validation Metrics (8000): epe 1.2709, 1pix 0.692
25%|███████████████████████████████████ | 10000/40000 [1:47:30<4:58:01, 1.68it/s]2023-12-31 12:14:05,009 INFO [train_recoder.py:42] Training Metrics (10000): [ 10000, 0.0001818] 0.7196, 0.9385, 1.1574,
2023-12-31 12:14:05,030 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 12:15:27,296 INFO [train_stage1.py:103] Validation Metrics (10000): epe 1.1344, 1pix 0.7272
30%|██████████████████████████████████████████ | 12000/40000 [2:08:50<4:38:45, 1.67it/s]2023-12-31 12:35:24,696 INFO [train_recoder.py:42] Training Metrics (12000): [ 12000, 0.0001778] 0.7370, 0.9432, 1.0920,
2023-12-31 12:35:24,713 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 12:36:47,338 INFO [train_stage1.py:103] Validation Metrics (12000): epe 1.0999, 1pix 0.7415
35%|█████████████████████████████████████████████████ | 14000/40000 [2:30:11<4:18:39, 1.68it/s]2023-12-31 12:56:45,271 INFO [train_recoder.py:42] Training Metrics (14000): [ 14000, 0.0001738] 0.7517, 0.9470, 1.0328,
2023-12-31 12:56:45,291 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 12:58:09,572 INFO [train_stage1.py:103] Validation Metrics (14000): epe 1.0967, 1pix 0.7363
40%|████████████████████████████████████████████████████████ | 16000/40000 [2:51:33<3:59:30, 1.67it/s]2023-12-31 13:18:08,091 INFO [train_recoder.py:42] Training Metrics (16000): [ 16000, 0.0001697] 0.7620, 0.9496, 0.9947,
2023-12-31 13:18:08,107 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 13:19:31,798 INFO [train_stage1.py:103] Validation Metrics (16000): epe 1.0388, 1pix 0.758
45%|███████████████████████████████████████████████████████████████ | 18000/40000 [3:12:55<3:39:26, 1.67it/s]2023-12-31 13:39:29,457 INFO [train_recoder.py:42] Training Metrics (18000): [ 18000, 0.0001657] 0.7693, 0.9512, 0.9673,
2023-12-31 13:39:29,475 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 13:40:54,875 INFO [train_stage1.py:103] Validation Metrics (18000): epe 1.0149, 1pix 0.7671
50%|██████████████████████████████████████████████████████████████████████ | 20000/40000 [3:34:23<3:27:55, 1.60it/s]2023-12-31 14:00:57,923 INFO [train_recoder.py:42] Training Metrics (20000): [ 20000, 0.0001617] 0.7791, 0.9540, 0.9273,
2023-12-31 14:00:57,943 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 14:02:21,165 INFO [train_stage1.py:103] Validation Metrics (20000): epe 0.9871, 1pix 0.7713
55%|█████████████████████████████████████████████████████████████████████████████ | 22000/40000 [3:56:09<3:06:43, 1.61it/s]2023-12-31 14:22:43,807 INFO [train_recoder.py:42] Training Metrics (22000): [ 22000, 0.0001576] 0.7859, 0.9560, 0.9009,
2023-12-31 14:22:43,824 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 14:24:08,049 INFO [train_stage1.py:103] Validation Metrics (22000): epe 0.9773, 1pix 0.7758
60%|████████████████████████████████████████████████████████████████████████████████████ | 24000/40000 [4:17:32<2:39:10, 1.68it/s]2023-12-31 14:44:06,584 INFO [train_recoder.py:42] Training Metrics (24000): [ 24000, 0.0001536] 0.7890, 0.9562, 0.8927,
2023-12-31 14:44:06,602 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 14:45:29,961 INFO [train_stage1.py:103] Validation Metrics (24000): epe 0.9517, 1pix 0.7826
65%|███████████████████████████████████████████████████████████████████████████████████████████ | 26000/40000 [4:38:53<2:20:03, 1.67it/s]2023-12-31 15:05:27,729 INFO [train_recoder.py:42] Training Metrics (26000): [ 26000, 0.0001495] 0.7973, 0.9588, 0.8557,
2023-12-31 15:05:27,749 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 15:06:52,051 INFO [train_stage1.py:103] Validation Metrics (26000): epe 0.9573, 1pix 0.7808
70%|██████████████████████████████████████████████████████████████████████████████████████████████████ | 28000/40000 [5:00:15<1:59:40, 1.67it/s]2023-12-31 15:26:50,011 INFO [train_recoder.py:42] Training Metrics (28000): [ 28000, 0.0001455] 0.8014, 0.9599, 0.8409,
2023-12-31 15:26:50,028 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 15:28:14,993 INFO [train_stage1.py:103] Validation Metrics (28000): epe 0.9461, 1pix 0.7836
75%|█████████████████████████████████████████████████████████████████████████████████████████████████████████ | 30000/40000 [5:21:39<1:39:54, 1.67it/s]2023-12-31 15:48:13,276 INFO [train_recoder.py:42] Training Metrics (30000): [ 30000, 0.0001415] 0.8046, 0.9605, 0.8301,
2023-12-31 15:48:13,293 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 15:49:37,307 INFO [train_stage1.py:103] Validation Metrics (30000): epe 0.9371, 1pix 0.7867
80%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 32000/40000 [5:43:06<1:19:54, 1.67it/s]2023-12-31 16:09:40,261 INFO [train_recoder.py:42] Training Metrics (32000): [ 32000, 0.0001374] 0.8091, 0.9617, 0.8145,
2023-12-31 16:09:40,278 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 16:11:05,255 INFO [train_stage1.py:103] Validation Metrics (32000): epe 0.9301, 1pix 0.7906
85%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 34000/40000 [6:04:28<59:50, 1.67it/s]2023-12-31 16:31:03,092 INFO [train_recoder.py:42] Training Metrics (34000): [ 34000, 0.0001334] 0.8125, 0.9625, 0.8002,
2023-12-31 16:31:03,107 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 16:32:26,090 INFO [train_stage1.py:103] Validation Metrics (34000): epe 0.9286, 1pix 0.7905
90%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 36000/40000 [6:25:49<39:59, 1.67it/s]2023-12-31 16:52:24,084 INFO [train_recoder.py:42] Training Metrics (36000): [ 36000, 0.0001294] 0.8170, 0.9640, 0.7825,
2023-12-31 16:52:24,103 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 16:53:48,981 INFO [train_stage1.py:103] Validation Metrics (36000): epe 0.9087, 1pix 0.7953
95%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 38000/40000 [6:47:12<19:55, 1.67it/s]2023-12-31 17:13:46,546 INFO [train_recoder.py:42] Training Metrics (38000): [ 38000, 0.0001253] 0.8189, 0.9644, 0.7742,
2023-12-31 17:13:46,562 INFO [train_stage1.py:85] Doing validation ...
2023-12-31 17:15:10,299 INFO [train_stage1.py:103] Validation Metrics (38000): epe 0.9212, 1pix 0.794
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 40000/40000 [7:08:34<00:00, 1.56it/s]
FINISHED TRAINING
2023-12-31 17:35:07,773 INFO [train_stage1.py:141] Save checkpoint to experiments/GPS-GS_stage1_1231/ckpt/GPS-GS_stage1_final.pth ...
作成されたファイルを確認しましょう。こういうときはfindコマンドが便利です。ログとチェックポイントのファイルが作成されています。
$ find experiments/ -type f -mmin -180 -ls
1164220 8 -rw-r--r-- 1 user user 5436 Dec 31 17:15 experiments/GPS-GS_stage1_1231/logs/events.out.tfevents.1703985989.foobar.580.0
401410 38020 -rw-r--r-- 1 user user 38928826 Dec 31 17:35 experiments/GPS-GS_stage1_1231/ckpt/GPS-GS_stage1_final.pth
339465 38020 -rw-r--r-- 1 user user 38929306 Dec 31 17:13 experiments/GPS-GS_stage1_1231/ckpt/GPS-GS_stage1_latest.pth
$
最終的に生成されたチェックポイントのファイルパスは 'experiments/GPS-GS_stage1_1231/ckpt/GPS-GS_stage1_final.pth' です。こちらを使って、stage2へ進みます。
5. 訓練を試してみる - stage2
stage1の結果をベースとして完全なモデルを訓練する、それがstage2です。
設定ファイルの修正
config/stage2.yamlの stage1_ckptとdata_rootの値を適切に修正します。
・stage1_ckpt : stage1で生成されたチェックポイントのファイルパス
・data_root : stage1と同じパス(data/render_data)
をそれぞれ指定します。
diff --git a/config/stage2.yaml b/config/stage2.yaml
index 015b296..28269f2 100644
--- a/config/stage2.yaml
+++ b/config/stage2.yaml
@@ -1,6 +1,6 @@
name: 'GPS-GS_stage2'
-stage1_ckpt: 'PATH/TO/GPS-GS_stage1_final.pth'
+stage1_ckpt: 'experiments/GPS-GS_stage1_1231/ckpt/GPS-GS_stage1_final.pth'
restore_ckpt: None
lr: 0.0002
wdecay: 1e-5
@@ -13,7 +13,7 @@ dataset:
val_novel_id: [3]
use_hr_img: True
use_processed_data: True
- data_root: 'PATH/TO/RENDER_DATA'
+ data_root: 'data/render_data'
raft:
mixed_precision: True
プログラムの実行
いざ実行!
$ python train_stage2.py
stage2の訓練は15時間、2023年と2024年をまたいで無事に実行終了しました。以下が実行時のログです。計算機はとても健気です。
2023-12-31 19:48:07,398 INFO [human_loader.py:127] Using local data in data/render_data/rectified_local/train ...
2023-12-31 19:48:08,626 INFO [human_loader.py:127] Using local data in data/render_data/rectified_local/val ...
2023-12-31 19:48:10,976 INFO [train_stage2.py:51] Using checkpoint from stage1
2023-12-31 19:48:10,976 INFO [train_stage2.py:163] Loading checkpoint from experiments/GPS-GS_stage1_1231/ckpt/GPS-GS_stage1_final.pth ...
2023-12-31 19:48:11,498 INFO [train_stage2.py:166] Parameter loading done
5%|███████ | 5000/100000 [45:19<13:59:05, 1.89it/s]2023-12-31 20:33:31,592 INFO [train_recoder.py:42] Training Metrics (5000): [ 5000, 0.0001919] 0.0043, 0.0333, 0.8025, 0.9591, 0.8507,
2023-12-31 20:33:31,871 INFO [train_stage2.py:105] Doing validation ...
2023-12-31 20:36:36,248 INFO [train_stage2.py:138] Validation Metrics (5000): epe 1.0408, 1pix 0.7683, psnr 31.1354
10%|█████████████▊ | 10000/100000 [1:32:40<13:21:44, 1.87it/s]2023-12-31 21:20:52,376 INFO [train_recoder.py:42] Training Metrics (10000): [ 10000, 0.0001818] 0.0038, 0.0307, 0.8007, 0.9584, 0.8590,
2023-12-31 21:20:52,647 INFO [train_stage2.py:105] Doing validation ...
2023-12-31 21:23:55,642 INFO [train_stage2.py:138] Validation Metrics (10000): epe 0.9533, 1pix 0.7804, psnr 31.9818
15%|████████████████████▋ | 15000/100000 [2:19:47<12:43:55, 1.85it/s]2023-12-31 22:07:59,324 INFO [train_recoder.py:42] Training Metrics (15000): [ 15000, 0.0001717] 0.0034, 0.0285, 0.8066, 0.9602, 0.8342,
2023-12-31 22:07:59,589 INFO [train_stage2.py:105] Doing validation ...
2023-12-31 22:11:06,000 INFO [train_stage2.py:138] Validation Metrics (15000): epe 0.9469, 1pix 0.7917, psnr 32.7836
20%|███████████████████████████▌ | 20000/100000 [3:05:48<11:17:21, 1.97it/s]2023-12-31 22:54:00,621 INFO [train_recoder.py:42] Training Metrics (20000): [ 20000, 0.0001617] 0.0027, 0.0230, 0.8111, 0.9614, 0.8147,
2023-12-31 22:54:00,885 INFO [train_stage2.py:105] Doing validation ...
2023-12-31 22:57:00,740 INFO [train_stage2.py:138] Validation Metrics (20000): epe 0.916, 1pix 0.7978, psnr 33.0699
25%|██████████████████████████████████▌ | 25000/100000 [3:51:12<10:53:10, 1.91it/s]2023-12-31 23:39:24,856 INFO [train_recoder.py:42] Training Metrics (25000): [ 25000, 0.0001516] 0.0026, 0.0220, 0.8181, 0.9632, 0.7890,
2023-12-31 23:39:25,144 INFO [train_stage2.py:105] Doing validation ...
2023-12-31 23:42:25,190 INFO [train_stage2.py:138] Validation Metrics (25000): epe 0.9096, 1pix 0.7981, psnr 33.1323
30%|█████████████████████████████████████████▋ | 30000/100000 [4:36:54<9:50:04, 1.98it/s]2024-01-01 00:25:05,880 INFO [train_recoder.py:42] Training Metrics (30000): [ 30000, 0.0001415] 0.0025, 0.0215, 0.8225, 0.9645, 0.7725,
2024-01-01 00:25:06,147 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 00:28:04,941 INFO [train_stage2.py:138] Validation Metrics (30000): epe 0.9059, 1pix 0.7997, psnr 33.1431
35%|████████████████████████████████████████████████▋ | 35000/100000 [5:22:37<9:12:23, 1.96it/s]2024-01-01 01:10:49,358 INFO [train_recoder.py:42] Training Metrics (35000): [ 35000, 0.0001314] 0.0025, 0.0216, 0.8267, 0.9655, 0.7561,
2024-01-01 01:10:49,622 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 01:13:48,112 INFO [train_stage2.py:138] Validation Metrics (35000): epe 0.9057, 1pix 0.798, psnr 33.2958
40%|███████████████████████████████████████████████████████▌ | 40000/100000 [6:09:01<8:29:23, 1.96it/s]2024-01-01 01:57:13,216 INFO [train_recoder.py:42] Training Metrics (40000): [ 40000, 0.0001213] 0.0025, 0.0212, 0.8298, 0.9662, 0.7443,
2024-01-01 01:57:13,482 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 02:00:13,570 INFO [train_stage2.py:138] Validation Metrics (40000): epe 0.8676, 1pix 0.8108, psnr 33.4733
45%|██████████████████████████████████████████████████████████████▌ | 45000/100000 [6:54:19<8:36:41, 1.77it/s]2024-01-01 02:42:31,775 INFO [train_recoder.py:42] Training Metrics (45000): [ 45000, 0.0001112] 0.0025, 0.0210, 0.8346, 0.9677, 0.7241,
2024-01-01 02:42:32,072 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 02:45:51,371 INFO [train_stage2.py:138] Validation Metrics (45000): epe 0.8637, 1pix 0.8111, psnr 33.6271
50%|█████████████████████████████████████████████████████████████████████▌ | 50000/100000 [7:40:43<7:05:18, 1.96it/s]2024-01-01 03:28:55,145 INFO [train_recoder.py:42] Training Metrics (50000): [ 50000, 0.0001011] 0.0024, 0.0210, 0.8385, 0.9688, 0.7093,
2024-01-01 03:28:55,408 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 03:32:07,197 INFO [train_stage2.py:138] Validation Metrics (50000): epe 0.8651, 1pix 0.8111, psnr 33.6276
55%|████████████████████████████████████████████████████████████████████████████▍ | 55000/100000 [8:27:01<6:19:35, 1.98it/s]2024-01-01 04:15:13,600 INFO [train_recoder.py:42] Training Metrics (55000): [ 55000, 0.0000910] 0.0024, 0.0207, 0.8421, 0.9698, 0.6951,
2024-01-01 04:15:13,862 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 04:18:12,768 INFO [train_stage2.py:138] Validation Metrics (55000): epe 0.8574, 1pix 0.8137, psnr 33.5728
60%|███████████████████████████████████████████████████████████████████████████████████▍ | 60000/100000 [9:12:12<5:36:34, 1.98it/s]2024-01-01 05:00:24,110 INFO [train_recoder.py:42] Training Metrics (60000): [ 60000, 0.0000809] 0.0024, 0.0209, 0.8451, 0.9708, 0.6843,
2024-01-01 05:00:24,374 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 05:03:23,410 INFO [train_stage2.py:138] Validation Metrics (60000): epe 0.8551, 1pix 0.8136, psnr 33.6163
65%|██████████████████████████████████████████████████████████████████████████████████████████▎ | 65000/100000 [9:57:22<4:56:30, 1.97it/s]2024-01-01 05:45:34,563 INFO [train_recoder.py:42] Training Metrics (65000): [ 65000, 0.0000708] 0.0024, 0.0209, 0.8483, 0.9718, 0.6709,
2024-01-01 05:45:34,829 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 05:48:33,609 INFO [train_stage2.py:138] Validation Metrics (65000): epe 0.858, 1pix 0.8144, psnr 33.2468
70%|████████████████████████████████████████████████████████████████████████████████████████████████▌ | 70000/100000 [10:42:34<4:11:58, 1.98it/s]2024-01-01 06:30:46,820 INFO [train_recoder.py:42] Training Metrics (70000): [ 70000, 0.0000607] 0.0024, 0.0207, 0.8512, 0.9727, 0.6593,
2024-01-01 06:30:47,084 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 06:33:45,986 INFO [train_stage2.py:138] Validation Metrics (70000): epe 0.8425, 1pix 0.8197, psnr 33.5526
75%|███████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 75000/100000 [11:27:47<3:32:25, 1.96it/s]2024-01-01 07:15:58,860 INFO [train_recoder.py:42] Training Metrics (75000): [ 75000, 0.0000507] 0.0024, 0.0206, 0.8535, 0.9735, 0.6507,
2024-01-01 07:15:59,125 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 07:18:57,947 INFO [train_stage2.py:138] Validation Metrics (75000): epe 0.8407, 1pix 0.8199, psnr 33.7347
80%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 80000/100000 [12:12:59<2:48:10, 1.98it/s]2024-01-01 08:01:11,479 INFO [train_recoder.py:42] Training Metrics (80000): [ 80000, 0.0000406] 0.0024, 0.0205, 0.8573, 0.9747, 0.6370,
2024-01-01 08:01:11,742 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 08:04:10,756 INFO [train_stage2.py:138] Validation Metrics (80000): epe 0.8419, 1pix 0.8203, psnr 33.6003
85%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 85000/100000 [12:58:12<2:06:48, 1.97it/s]2024-01-01 08:46:23,988 INFO [train_recoder.py:42] Training Metrics (85000): [ 85000, 0.0000305] 0.0023, 0.0203, 0.8585, 0.9753, 0.6312,
2024-01-01 08:46:24,252 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 08:49:23,038 INFO [train_stage2.py:138] Validation Metrics (85000): epe 0.8347, 1pix 0.8219, psnr 33.7102
90%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 90000/100000 [13:43:24<1:24:25, 1.97it/s]2024-01-01 09:31:35,898 INFO [train_recoder.py:42] Training Metrics (90000): [ 90000, 0.0000204] 0.0023, 0.0204, 0.8610, 0.9762, 0.6218,
2024-01-01 09:31:36,161 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 09:34:34,993 INFO [train_stage2.py:138] Validation Metrics (90000): epe 0.832, 1pix 0.8231, psnr 33.7478
95%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 95000/100000 [14:28:36<42:19, 1.97it/s]2024-01-01 10:16:48,156 INFO [train_recoder.py:42] Training Metrics (95000): [ 95000, 0.0000103] 0.0023, 0.0203, 0.8638, 0.9772, 0.6108,
2024-01-01 10:16:48,422 INFO [train_stage2.py:105] Doing validation ...
2024-01-01 10:19:47,371 INFO [train_stage2.py:138] Validation Metrics (95000): epe 0.8306, 1pix 0.8234, psnr 33.7619
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 100000/100000 [15:13:50<00:00, 1.82it/s]
FINISHED TRAINING
2024-01-01 11:02:02,358 INFO [train_stage2.py:176] Save checkpoint to experiments/GPS-GS_stage2_1231/ckpt/GPS-GS_stage2_final.pth ...
チェックポイントのファイルも生成されています。
$ ls -l experiments/GPS-GS_stage2_1231/ckpt/
total 105652
-rw-r--r-- 1 user user 54091574 Jan 1 11:02 GPS-GS_stage2_final.pth
-rw-r--r-- 1 user user 54092590 Jan 1 10:16 GPS-GS_stage2_latest.pth
$
showというディレクトリを見ると、訓練中の5,000毎のタイミングで画像を生成して検証しています。
$ ls -trl experiments/GPS-GS_stage2_1231/show
total 2952
-rw-r--r-- 1 user user 149904 Dec 31 20:34 5000.jpg
-rw-r--r-- 1 user user 154084 Dec 31 21:23 10000.jpg
-rw-r--r-- 1 user user 127787 Dec 31 22:08 15000.jpg
-rw-r--r-- 1 user user 185552 Dec 31 22:54 20000.jpg
-rw-r--r-- 1 user user 162460 Dec 31 23:39 25000.jpg
-rw-r--r-- 1 user user 153287 Jan 1 00:27 30000.jpg
-rw-r--r-- 1 user user 194510 Jan 1 01:12 35000.jpg
-rw-r--r-- 1 user user 135982 Jan 1 01:59 40000.jpg
-rw-r--r-- 1 user user 172602 Jan 1 02:44 45000.jpg
-rw-r--r-- 1 user user 205880 Jan 1 03:31 50000.jpg
-rw-r--r-- 1 user user 167357 Jan 1 04:17 55000.jpg
-rw-r--r-- 1 user user 157505 Jan 1 05:03 60000.jpg
-rw-r--r-- 1 user user 154265 Jan 1 05:45 65000.jpg
-rw-r--r-- 1 user user 144236 Jan 1 06:31 70000.jpg
-rw-r--r-- 1 user user 141292 Jan 1 07:17 75000.jpg
-rw-r--r-- 1 user user 105799 Jan 1 08:03 80000.jpg
-rw-r--r-- 1 user user 151843 Jan 1 08:47 85000.jpg
-rw-r--r-- 1 user user 180960 Jan 1 09:31 90000.jpg
-rw-r--r-- 1 user user 131762 Jan 1 10:16 95000.jpg
$
これら画像はこちら。
これらを見る限り、正しく生成されているように見えます。
なお、実行中のリソース使用状況はこちら。専用GPUメモリは21.5GB付近をうろうろしていました。
6. テストを試してみる
やっとここまできました。
stage1及びstage2を経て生成されたチェックポイント 'experiments/GPS-GS_stage2_1231/ckpt/GPS-GS_stage2_final.pth' を使用して、生成しましょう。
Freeview rendering(自由視点からのレンダリング)
コマンドラインはこちら。
python test_view_interp.py \
--test_data_root ./data/render_data/val \
--ckpt_path ./experiments/GPS-GS_stage2_1231/ckpt/GPS-GS_stage2_final.pth \
--novel_view_nums 5
カレントディレクトリにinterp_outというディレクトリが作成され、その下に生成画像が格納されます。
test_data_root: レンダリング画像の検証テータが格納されたディレクトリを指定
ckpt_path: チェックポイントのファイルパスを指定
novel_view_nums(仮想視点数)
画像生成時のある視点から次の視点までの間に補完する視点数を指定します。5と指定すると、その視点間に5つの画像が生成されます。10ならば10の画像となります。
無事に生成されています。
$ ls -l interp_out | head
total 1289164
-rw-r--r-- 1 user user 176268 Jan 1 11:18 0000_000_novel00.jpg
-rw-r--r-- 1 user user 176371 Jan 1 11:18 0000_000_novel01.jpg
-rw-r--r-- 1 user user 176187 Jan 1 11:18 0000_000_novel02.jpg
-rw-r--r-- 1 user user 176398 Jan 1 11:18 0000_000_novel03.jpg
-rw-r--r-- 1 user user 177226 Jan 1 11:18 0000_000_novel04.jpg
-rw-r--r-- 1 user user 176281 Jan 1 11:18 0000_001_novel00.jpg
-rw-r--r-- 1 user user 174773 Jan 1 11:18 0000_001_novel01.jpg
-rw-r--r-- 1 user user 172998 Jan 1 11:18 0000_001_novel02.jpg
-rw-r--r-- 1 user user 170616 Jan 1 11:18 0000_001_novel03.jpg
$
ということで、生成されたJPEGファイルを以下のコマンドでパラパラ漫画に変換します。
# 仮想視点数
novel_view_nums=5
# 入力先
indir=./interp_out
# 出力先
outdir=./mp4
mkdir ${outdir}
# 入力ディレクトリ内のjpgファイルの先頭4文字(0000など)単位にffmpegで動画に変換し、出力先に保存する
for r in $(find ${indir} -type f -name '*.jpg' | sed -e 's!^.*/\([0-9]*\)_.*$!\1!' | sort | uniq); do
ffmpeg -framerate 30 -pattern_type glob -i "${indir}/${r}*.jpg" -vcodec libx264 -pix_fmt yuv420p -r 60 ${outdir}/interp_out_${r}_${novel_view_nums}.mp4
done
novel_view_nums(仮想視点数)=5の生成画像
1つの元データから、160枚の画像が生成されました。視点が0 ~ 15、その視点間毎に5枚、ゆえに、16×5 = 80枚。
FYI. 生成された画像の枚数を確認するscript
sum=0
for v in $(seq -w 000 015); do
count=$(ls interp_out_10/0000_${v}_*.jpg | wc -l)
echo "${v}: ${count}"
sum=$(expr ${sum} + ${count})
done
echo ${sum}
実行結果はこちら。80枚。
000: 5
001: 5
002: 5
003: 5
004: 5
005: 5
006: 5
007: 5
008: 5
009: 5
010: 5
011: 5
012: 5
013: 5
014: 5
015: 5
80
novel_view_nums(仮想視点数)=10の生成画像
1つの元データから、160枚の画像が生成されました。視点が0 ~ 15、その視点間毎に10枚、ゆえに、16×10 = 160枚。はい、あってます。
生成された画像の枚数の確認結果はこちら。160枚。
000: 10
001: 10
002: 10
003: 10
004: 10
005: 10
006: 10
007: 10
008: 10
009: 10
010: 10
011: 10
012: 10
013: 10
014: 10
015: 10
160
7. まとめ
GPS-Gaussian、きちんと訓練・テストまで確認できました。素晴らしい!
あと、24GBのVRAMを積んだGPUを用意しましょう。VRAMだいじ。
この記事が気に入ったらサポートをしてみませんか?