本日は昨日に引き続きNeRFを触っていきます。
〇データセットの用意
データは2D画像を使用します。
今回は手元のフィギュア(20cmほどの大きさ)を使用します。
①instant-ngp\dataの階層に新しいフォルダを作成し撮影した画像を配置します。
今回は49枚の画像を使用しました。
以上でデータセットの用意が完了しました。
〇画像データの画角の解析
前回の記事で紹介したようにNeRFで演算するためにはフォトグラメトリ同様画像ごとにどの角度で撮影されたものであるかの情報が必要です。
次のコマンドを実行します。
python scripts/colmap2nerf.py --colmap_matcher exhaustive --run_colmap --aabb_scale 16 --images data/(フォルダ名)
続行してもよいか問われます[Y]キーで進めます。
エラーが発生することがあります。この場合は同じコマンドを繰り返し行います。
成功するとinstant-ngp直下にtransforms.jsonが生成されます。
このファイルが各画像ごとのカメラ位置に関するデータが格納されたものになります。
中をのぞくとこのようになっています。
"file_path": "./data\\Mash\\data\\Mash/12.jpg", "sharpness": 74.02500644718796, "transform_matrix": [ [ 0.6964409236031343, -0.03827112286876128, 0.7165928837442264, 1.4501275944612402 ], [ 0.7173498461507946, 0.010029675047081734, -0.6966409432741141, -1.4139902796370798 ], [ 0.01947403737044757, 0.9992170568602579, 0.034438860255152914, 0.3226570447730123 ], [ 0.0, 0.0, 0.0, 1.0 ] ]
写真が格納されているフォルダ名と同様のフォルダを作成し階層を次のように変更します。
instant-ngp/data/フォルダ名/data/フォルダ名/写真データ
この際に
instant-ngp/data/フォルダ名/data/
の階層にTransform.jsonを配置します。
基本的にdata/フォルダ名/写真データの階層であれば問題ないですが、複数のデータを格納するためにこのような階層構造に変えます。
以上ですべての準備が完了しました。
〇Instant-ngpの実行
次のコマンドを実行します。
(C:\●●など各自の環境)\instant-ngp\build\testbed.exe --scene data\フォルダ名
アプリケーションが実行され3Dモデルの構築が始まります。
UIのLossの値がゼロに近ければ近いほど良い結果を導き出すことができます。
この値はトレーニング中は下がりますが、ある程度の値で停滞をします。
Cropを使用してノイズ部分をトリミングします。
以上で写真から高速に3Dモデルを構築することができました。
手順としてはフォトグラメトリに近いですが、従来のフォトグラメトリよりも少ないデータ数でより高速に構築することができます。
またメッシュ化してBlenderなどで読み込むこともできます。
今回初めて触ってみた技術ですが、2Dから3Dへと変換する性能とその高速さで非常に期待できる技術と感じました。