instantNeRFの推論結果についてPSNRとSSIM計算する機能の動作を確認しました。
run.py
parseを見ると--test_transformsを与えるとPSNRを計算するとありました。
parser.add_argument("--test_transforms", default="", help="Path to a nerf style transforms json from which we will compute PSNR.")
216行付近が計算処理の内容でした。transform.jsonと同様に画像ファイルの名前とカメラの外部パラメータを指定するようです。
... というEllipsisオブジェクトが使用されていました。
評価用の画像にalphaチャンネルがないと実行時にエラーが出ましたので、差分をとる前にalphaチャンネルを削除して回避しました。
image = np.delete(image, 3, 2) # add 230104 delete alpha
diffimg = np.absolute(image - ref_image)
transform.json
今回は提供されているfoxを使用しました。
ここでは0007, 0014, 0018, 0025, 0049の5枚以外を学習用としましたので、その5枚の表記部分をコメントアウトしました。
evaluation.json
使用するtransform.jsonを複製し、評価用の5枚の表記部分以外をコメントアウトしました。
置き場所をtransform.jsonと同じにすると処理が混ざるので、場所を別のフォルダにしました。
また評価用の画像をevaluation.jsonを置いたフォルダに作ったimagesに置きました。
python run.py
ここではMSAAの影響を考慮するつもりでspp=1としました。
学習済みのsnapshotがない場合
このとき35000回イテレーションかけたときの評価がなされました。
ここで学習用のtransform.jsonは.\data\nerf\fox2に置きました。
またevaluation.jsonは.\data\nerf\evaluation\evaluation.jsonに置きました。
(ngp) PS D:\git\instant-ngpOrtho\instant-ngp> python.exe .\scripts\run.py --mode nerf --scene .\data\nerf\fox2 --test_transforms .\data\nerf\evaluation\evaluation.json --screenshot_spp 1
学習済みのsnapshotがある場合
予めtestbed.exeで学習し保存したbase.msgpackを使用します。
(ngp) PS D:\git\instant-ngpOrtho\instant-ngp> python.exe .\scripts\run.py --mode nerf --load_snapshot .\data\nerf\fox2\base.msgpack --test_transforms .\data\nerf\evaluation\evaluation.json --screenshot_spp 1
結果
各画像のPSNRとを出力するように変更しました。
PSNR=31.60 [min=29.08 max=33.73] SSIM=0.905
image .\data\nerf\evaluation\images/0007, PSNR=33.37 SSIM=0.929
image .\data\nerf\evaluation\images/0014, PSNR=29.08 SSIM=0.911
image .\data\nerf\evaluation\images/0018, PSNR=32.44 SSIM=0.914
image .\data\nerf\evaluation\images/0025, PSNR=33.73 SSIM=0.924
image .\data\nerf\evaluation\images/0049, PSNR=29.36 SSIM=0.845
それぞれの推論画像と差分画像を出力するように変更しました。
数字が比較的悪い0014と0049について確認しました。
0014のreference画像, inference画像, difference画像です。testbedで確認したところ、フローターが挟まっていたようです。
0049のreference画像, inference画像, difference画像です。毛並みの中の細かい陰が再現されていないようです。