見出し画像

あらためて、WSL2でGPS-Gaussianを試してみる

年をまたいで、GPS-Gaussianです。

以下の記事で試してみたものの、RTX 4090 Laptop GPU(16GB)では、stage1の訓練に270時間かかることが分かり、にんともかんともの状況へ。

この状況を打破すべく、某所での某お方の「まあ●●万円なら安い」というお言葉に後押しされ、、、

AORUS RTX 4090 GAMING BOX

を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ファイルありました。

・GPS-GS_stage2_final.pth : チェックポイント
・real_data.zip : 実データ
・render_data.zip : レンダリング・データ

これらをコマンドラインでダウンロードしようと試行錯誤しましたが、アレコレしないとダウンロードできないため、ブラウザ経由でダウンロードします。

ファイルの格納と展開

まずは、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を読むに「より堅牢なモデルを訓練するには、以下を試してください」とのこと。

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だいじ。

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