こんにちは。ISID 金融ソリューション事業部の若本です。
最近、写真から3Dモデルを生成する技術の話題を目にすることが多くなってきました。そこで、写真から3Dを生成できるAIモデルであるInstant NeRFを使って、スマートフォンの撮影画像からどのような結果が出るのか試してみます。複数の撮影条件を用意し、どのように撮影すればうまくレンダリングされるかを検証したいと思います。
Instant NeRF とは?
Instant NeRF1はNeRF2を軽量化したAIモデルです。Instant NeRFを用いることで、10秒足らずで数十枚の画像から3Dシーン(volume)をレンダリングできます。下記は公式が出しているInstant NeRFの動画です。
NeRFモデルではカメラの座標や光線方向(見ている方向)の情報をもとに、各ピクセルの色や透明度を学習します。カメラの座標や方向は画像からだとわからないため、これらの推定は別のアルゴリズムであるCOLMAP3で行いました。NeRFそのものの詳細な構造やその仕組みについては、日本語の解説記事も多く出ているのでここでは触れないこととします。
NeRF でよくある失敗
Instant NeRFをいざ使ってみてよくある(と個人的に思っている)失敗は、「想像していたよりもきれいに出力されなかった」というものです。 このとき、NeRFの主な失敗例は下記の2つです。※下記名称は一般的なものではありません
- floaters
- 雲や霧のようなぼやけたオブジェクトが、被写体周辺に発生します。
- ghost
- 見る角度を変えた際に、被写体が複数現れます。
上記2点は、いずれもデータの整合性が解決できなかったことが原因です。 その他にも、画像系のAIモデルは入力に対して非常に敏感なため、人間の目には判別できないようなわずかな違いでも出力結果が大きく変わってしまうことがあります。 とはいえ、うまく撮影やチューニングできれば高い性能が期待できるNeRFを、早々に諦めてしまうのは勿体ない!ということで、AIモデルにとって重要な入力の観点から、どのように撮影した画像であればNeRFの出力が良くなるのかを実験してみます。
前提
主要な前提は下記の通りです。
- iphone 11の外向きカメラでビデオ撮影
- 解像度:1920 × 1080
- FPS: 30
- 撮影時間:~10秒程度
- instant NeRFの実行環境:NVIDIA Instant NeRF NGP4
- GPU:NVIDIA GeForce RTX 3060
Instant-NGPの環境構築は実施済みであることを想定しています。環境構築には日本語の解説記事も多く出ているので、そちらをご参照ください。
様々な条件で実験
NeRFを綺麗に生成するTipsについてはNVIDIA Instant NeRF NGPの公式にもまとまっています。リンク先では、主に①画像の質、②画像の量について述べられています。 今回はそれらを踏襲しつつ、撮影条件として精度に影響しそうなものをいくつか実験しました。
1. 撮影方法の違い
まずは、撮影方法について見てみます。試したのは、1) 被写体に沿って動かす方法(平行移動と呼称します)と、2) カメラ位置を固定して視線だけ変える方法(視点回転と呼称します)、の2つです。
それぞれの方法で撮影した結果を見てみます。
視点回転で撮影した場合、撮影時に被写体はちゃんと映っていますが、まったく出力できていません。一方、平行移動で撮影した場合には、volumeがきれいに出力されていることがわかります。 これは、COLMAPがカメラの位置を正しく推定できていないことが原因です。
2. 撮影スピードの違い
次は、撮影スピードの違いです。素早く動きながら撮った(=モーションブラーの多い)写真がアウトプットに悪影響を及ぼすことは想像に難くないですが、どのような出力が出るのか試してみます。
予想通り、撮影スピードが早い写真では、出力の質がよくありません。ブレた画像をvolumeレンダリングした結果、椅子の前に大量のfloaterが形成されてしまっています。これは別の角度から見た画像が、ブレた画像と一致するように学習してしまった結果、ブレを表現するためにfloaterが飛び出してしまったようです。
3. 撮影距離の違い
さらに、撮影距離についても検証しました。2.の検証時にはオブジェクトと近い状態で撮影しています、加えていくつかの条件で撮影を実施しました。
ここで、示唆は以下の2つです。
①:目印となるもの(被写体、背景)が遠い場合はカメラの位置推定がずれてしまい、出力の質が低くなる。
②:撮影距離を動的に変更すると、カメラの位置推定ミスや焦点のぼやけなどが発生し、出力の質が低くなる。
遠ければ遠いほど、カメラの位置推定の誤差が大きく影響してしまうようです。近めと遠めの画像が混在していると、そちらも悪影響を及ぼす可能性があります。
4. 撮影角度の違い
撮影する角度の多さによる変化についても見てみましょう。つまり、「見えていない角度の写真も取り込むべきか」を検証します。
実験結果から、一長一短であるといえます。
メリットはオブジェクトが明瞭になることです。1方向の写真からでは、見えていない下側はぼんやりと再現されていましたが、角度を増やすにつれて下側のfloaterが減っています。また、オブジェクトに空いている穴も撮影角度を増やすことで減っていました。
一方、デメリットは上側のfloaterの増加です。横や下から撮った画像を増やすことで、出力上部に雲のようなものが増えました。これは撮影時の「白飛び」によるもので、日光がカメラに入ってしまったことが原因です。
角度を増やすほどオブジェクトの正確さは増しますが、光源が映りこむケースに気を付ける必要がありそうです。今回は撮影した動画をそのままInstant NeRFで読み込む形としましたが、写真の「白飛び」や「黒潰れ」などを抑える前処理は必須かもしれません。
5. 撮影機器の違い
最後に、レンズの違いについて見てみます。
iphone 11以降は超広角カメラが搭載されているため、カメラモードを切り替えて撮影した場合にどのような結果が得られるのか検証します。ちなみに、ここまでの結果はすべて広角レンズで撮影したものです。
同じような入力映像にもかかわらず、驚くほど出力のクオリティが上がりました!広角では平べったく出力されている椅子が、超広角では立体的に出力できています。
レンズがより広角であることは、かなり重要な要素のようです。具体的には、被写界深度が深いとより良い結果となることが考えられます。1. の結果より、広角レンズでも近めで撮影した場合に良い結果が得られているため、被写体から背景まで適切にピントが合った状態で撮影できていることが重要と推察されます。
6. その他気づき
- 画像枚数について
- 20~30枚程度のバラバラに撮った画像ではまったく復元できませんでした。50枚以上あれば見えやすくなることは確認できました。
- 画像枚数が増えても、Instant NeRFの計算時間の変化は体感的にありませんでした。ただし、COLMAPの計算時間は画像量に比例して伸びていきそうです。筆者の環境では、300枚の画像からCOLMAPでカメラ位置を計算するのに1時間ほど要しました。
結論
- 撮影機材が重要です!!
- 目印となるもの(被写体や背景)を視界に入れつつ、カメラがきれいに撮れる範囲でゆっくり動き回りましょう。
- よりクオリティを追求するなら角度を網羅するほうがベターです。
今回検証できなかったこと
本記事では主に動画の撮影方法からNeRFの出力を改善する方法を模索しました。今回検証した項目以外にも、下記のような項目を見直すことで性能の改善が期待できます。
- Instant NGP内のGUIでパラメータチューニング
- カメラ位置推定のチューニング
- floaterやghostの原因となっている画像を見つけて、直接jsonから削除が可能です。
- 結局何枚必要なのか?
- Instant NGPのTipsには50~150枚が適正との表記がありましたが、多すぎた場合のデメリットはあまり感じられませんでした。被写体によって適正枚数が異なる可能性もあります。
まとめ
今回は、NeRFモデルの入力とする画像を変更することによってどのように出力が変わるのかについて検証を行いました。些細に思える違いでもかなり出力結果は変わってしまい、データの収集や処理にコツが求められると感じました。 NeRFモデル自身は非常に強力なので、ユースケースやうまくレンダリングできる条件を見極めて使いこなしたいと思います。
現在ISIDはweb3領域のグループ横断組織を立ち上げ、Web3およびメタバース領域のR&Dを行っております(カテゴリー「3DCG」の記事はこちら)。
もし本領域にご興味のある方や、一緒にチャレンジしていきたい方は、ぜひお気軽にご連絡ください!
私たちと同じチームで働いてくれる仲間を、是非お待ちしております!
ISID採用ページ
執筆:@wakamoto.ryosuke、レビュー:@yamashita.tsuyoshi (Shodoで執筆されました)
- Instant Neural Graphics Primitives with a Multiresolution Hash Encoding(https://arxiv.org/pdf/2201.05989.pdf)↩
- NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis(https://arxiv.org/pdf/2003.08934.pdf)↩
- colmap(https://github.com/colmap/colmap)↩
- NVIDIA Instant NeRF NGP(https://github.com/NVlabs/instant-ngp)↩