電通総研 テックブログ

電通総研が運営する技術ブログ

写真から3Dモデルを生成するAI!nvdiffrecを試してみた

こんにちは、ISID 金融ソリューション事業部の若本です。
本記事は電通国際情報サービス Advent Calendar 2022の12日目の記事となります!前日の記事は徳山さんの「フロントエンド開発にちょっと慣れてきた方におすすめしたいPatterns.dev」でした。
この記事では、今年発表されたAIモデルである「nvdiffrec」を使って、iPhoneで撮影した動画から3Dモデルを作成する手順をご紹介します。

今回作成したのは、上記画像の「青い遊具」になります!

はじめに

近年、NeRFをはじめとしてリアルの物体や景色を3Dに落とし込む技術が盛り上がりを見せています。
先日の記事でもNeRFから3Dのシーンを生成しました。3Dの視点がサクッと生成できるのはすごいですよね。

上記のようなNeRFの結果は、そのまま3Dアプリケーションで使えるものでしょうか?現在、答えは「No」です。
NeRFの出力は「輝度場」と呼ばれるものであり、カメラから見える光の反射を推定して出力しています。一方、Blenderをはじめとする3DCG制作エンジンでは、メッシュなどを取り込むのが一般的です。メッシュは形状として落とし込まれたデータになっており、NeRFのように曖昧な箇所をぼかした表現はできません。
そのため、既存の3DCG制作エンジンにNeRFの結果を取り込むには、一工夫が必要になります。
たとえば、先日ご紹介したInstant NGP1では、Instant NeRFの出力から古典的な手法を用いてメッシュ化する試験的な機能が備わっています。この機能を使うと、下記のような結果が得られます。

大枠はNeRFの結果と変わりませんが、印象がかなり異なるかと思います。出力されたメッシュの凹凸が激しく、メッシュについている色がfloater(周りに浮いている雲のようなもの)の色になっていたり、元の画像と全く異なる結果となっています。NeRFではうまくぼかせていたものを無理やりメッシュにしたために見た目の印象がかなり変わってしまいます
そこで今回は、3Dメッシュを直接生成するAIモデルを検証することにしました。

nvdiffrecとは?

nvdiffrec2は、3Dメッシュを直接生成するAIモデルです。
NeRF同様、nvidiaが開発したAIモデルであり、画像処理のトップカンファレンスであるCVPR2022にも採択されています。
nvdiffrecでは上記の課題に対し、3DCG制作エンジンに直接取り込めるアウトプットを直接学習します。このとき、形状・素材・照明環境をそれぞれ最適化することによって、画像の見え方から「対象の素材や画像内の照明環境」を推定できます。下記はnvdiffrecの公式の紹介動画になります。

結果として、上記動画内のように元の形状や色に近い3Dメッシュが出力されます。

自分で撮影した動画でnvdiffrecを動かす方法

本記事では、nvdiffrecのリポジトリを用いて、自分で撮影した動画から3Dメッシュを作成する手順をご紹介します。
なお、本記事で使用するコードはこちらに配置しています。
基本的にはポチポチ「Shift+Enter」を押すだけで動くようになっておりますのでご活用ください。

0. 事前準備

※撮影機材はiPhone11、縦動画撮影での動作を確認済みです。

1. 動画を撮影

(可能であれば)360度から対象物を撮影しましょう。カメラの位置情報を推定するため、対象物は動かさないほうがよいです。この際、筆者は物体が見切れないように撮影を行いました
撮影の基本的なコツは以前の記事を参考にしていただけると幸いです。

ここでは、対象物を2周する形で計20秒間の動画撮影を行っています。筆者はiPhone11で撮影したため、解像度は1920×1080です。リソースの都合上、後段の処理で512pixelまで解像度を落とすため、512pixel以上の解像度であれば問題はありません。
また、必須ではありませんが、撮影後に一度NeRFで出力してみることをおすすめします。NeRFがうまく出力できていない場合、以降のプロセスでの結果が期待できなくなります。

2. Google Drive上で画像に変換

撮影した動画をGoogle Driveにアップし、こちらのコードで画像に変換します。
Google Colaboratory(以下Colabと呼称)上でコードを開くと下記のような画面が現れますので、ファイル名を設定して実行します。

下記のように「<フォルダ名>/images/<切り出した画像名>」のフォルダ階層になっていれば方法は特に問いません。

3. カメラ情報の推定&物体のマスク推定(ローカル環境)

nvdiffrecを動作させる前に、以下の情報が必要になります。

  • imagesと同じ階層に「masks」フォルダを配置し、その中に「images」内の画像に対応したマスク画像
  • imagesと同じ階層にカメラ位置の推定情報(pose_bounds.npy)

今回のコードにはその処理を含めていないため、別の環境で用意することにします。
筆者は、nvdiffrec内のissueを参考に、有志の方が作成されているcolmap2poses.pyを使用しました(2022年11月時点で公式からカスタムデータセットへの適用手順は示されていません)。Instant NeRFが動作する環境であれば、rembgを追加でインストールするだけで動作します。

pip install rembg

「images」が入ったフォルダとこのスクリプトをInstant NeRFが動作する環境に配置し、下記のコマンドで動かしました。

python colmap2poses.py --mask "imagesを含むフォルダへのpath" --colmap_path "colmapのpath"

上記のスクリプトでは、カメラ位置の推定をcolmapを用いて行うとともに、AIモデル「U2Net3」を用いた物体の切り抜きを行っています。

実行後、下記のようなフォルダ構成になっていればOKです。

ただし、「masks」に格納されているマスク画像はrembgで自動推定されたものですので、影が予測結果に入ってしまったり、予測結果が欠けていたりしています。

そこで、筆者はより精度を高めるために、アノテーションツール「EISeg4」を用いて直接マスク画像の作成を行いました。

600枚弱の画像があったため、4時間ほどかけてアノテーションを行いました。手間がかかるため、少しでも良い結果を得たい場合のみおすすめします。

4. nvdiffrecの実行

3.の結果をGoogle Driveにアップし、こちらのコードに沿ってColab上でnvdiffrecを学習させます。学習の手順は下記の通りです。
①:関連ライブラリをインストールする
②:前処理を行う
③:nvdiffrecのパラメータを設定して実行する
それぞれについて、簡単に見てみましょう。

4-①:関連ライブラリをインストールする

Google driveを同期した後、関連ライブラリをインストールします。
初回のみ、nvdiffrecをGoogle drive上にcloneする必要があります。下記はColab上でコードを開いた画面です。cloneしていない場合のみ、「nvdiffrec_install」のチェックが必要になります。

4-②:前処理を行う

こちらはコードの下記3つのセルを順番に実行すると完了します。

上図内のコードでは、基本的にcroppingとscalingの2つの処理を行いました。
croppingでは、学習しやすいように正方形の画像をもとの画像から切り出しています。本来であれば、画像をそのままモデルに入れることが望ましいですが、今回は時間の都合上断念しました。さらに、見切れている画像を学習に使わない処理も事前に実施しています。
scalingでは、学習に用いる画像のリサイズを行いました。筆者は512pixelで動作確認しましたが、こちらを大きくするほど高い品質が見込めるため、リソースに余裕のある方は大きくすることを推奨します。なお、scalingのコードはnvdiffrec/data/derd/scale_images.pyとほぼ同様です。

4-③:nvdiffrecのパラメータを設定して実行する

最後に、パラメータを設定して実行してみましょう。colab上ではいくつかGUIで設定できるようにしてありますが、それ以外の設定項目もありますので、適宜nvdiffrecのリポジトリをご確認ください。

!python train.py --config $config_path

上記のコードを実行すると、nvdiffrecの学習が開始されます。学習が完了すると、nvdiffrec/out下に.obj形式、.mtl形式のメッシュとテクスチャファイルが生成されます。

今回使用したデータでは、下記のような結果が得られました。

光の反射が特殊だった上部については推定がうまくいきませんでしたが、それらしきメッシュは作成することができました
形状と色が改善できており、そのままNeRFでメッシュを出力するよりも良い結果が得られているといえそうです。メッシュの出力は、マシンスペックやデータ量の増加、チューニングの工夫によってさらに改善することが見込めます。

最終的に、作成したメッシュは、もちろんBlenderなどで取り込むことができます
せっかくのアドベントカレンダーなので、クリスマス仕様にしてみました!

おわりに

この記事ではnvdiffrecを用いて、iPhoneで撮影した動画から3Dメッシュを作成する手順についてご紹介しました。

3DCG技術に関するAIの発展は目覚ましく、実用的な3DモデルをAIで手軽に生成する未来は着実に近づいていると感じています。ワクワクするような技術が次々と現れる今日ですが、引き続き楽しんでキャッチアップしていきたいと思います。

最後までお読みいただき、ありがとうございました。 現在ISIDはweb3領域のグループ横断組織を立ち上げ、Web3およびメタバース領域のR&Dを行っております(カテゴリー「3DCG」の記事はこちら)。 もし本領域にご興味のある方や、一緒にチャレンジしていきたい方は、ぜひお気軽にご連絡ください!
私たちと同じチームで働いてくれる仲間を、是非お待ちしております!
ISID採用ページ

執筆:@wakamoto.ryosuke、レビュー:@yamada.yShodoで執筆されました