人工知能は現代の主要な分野の一つであり、自動運転車から医療、さらには失明予防まで、あらゆる分野で応用されています。最近、新しい3D再構成方法が提案されました。
現在利用可能な多くの最先端の3D再構成手法は、シーンの処理やレンダリングに大量のCPU/GPUリソースを必要とします。一部の手法は両方を必要とするものさえあります。
過去数年間、NeRF(ニューラルレイディアンスフィールド)手法など、多くの3D再構成に関する記事が発表されました。この手法は、仮想ツアーや没入型ゲーム、建築可視化など、多くの分野で非常に優れた3D再構成を実現し、高い精度のシーンとモデルを提供します。しかし、これは代償を伴います。NeRFは時間がかかり、大量のメモリとストレージスペースを必要とし、静的シーンに限定されます。ガウススプラッティング(Gaussian Splatting)はこれらの問題の一部を解決し、現在最高の3D再構成手法となっています。
本記事では、この手法を室内再構成の特定分野に適用します。主な目標は以下の通りです:
- 3D再構成とガウススプラッティングの仕組みを理解する
- 小規模なデモを実行し、自宅のシーンを再構成する方法を学ぶ
それでは、自宅の3D再構成方法について詳しく見ていきましょう。
1、3D再構成の基本
再構成は、シーンの異なる視点からカメラで撮影した複数の写真から始まります。これらの画像が再構成の入力データとなります。再構成の主な目的は、シーンの空間構造を復元し、任意の角度から表示できるようにすることです。
3D再構成における最も重要な概念の一つは特徴マッチングです。これは、複数のビューで2D画像内のユニークな点または特徴を識別し、マッチングすることを指します。2つの画像間の対応関係を使用してカメラの相対位置を推定し、これらの特徴の3D位置を三角測量で計算します。ガウススプラッティングは、別の手法である構造的運動(SfM)から得られた点群を使用します。この手法は、カメラの時間経過に伴う動きを分析することで、カメラの姿勢と3D構造を推定します。
3D再構成は、考古学、建築学、医療画像、エンターテイメント産業、自律ロボット技術など、様々な分野で広く応用されています。技術の進歩に伴い、3D再構成は、仮想現実や拡張現実、製造業など、私たちが物理的およびデジタル世界と対話する方法を革新し、新たな可能性を切り開くでしょう。
2、ガウススプラッティングの概要
SNGULARでは、この革新的な新技術について少し紹介します。
ガウススプラッティングは、処理時間などの問題を解決しようとする新しい3D再構成手法です。この手法では、シーンをボリュームやメッシュとして表現するのではなく、世界を3Dキャンバスとして使用し、小さなストロークを描画して、入力画像のように見えるまで調整します。この手法の主な利点の一つは、静止画像だけでなく、移動するシーンも再構成できることです:
この手法は点群から始まり、各点に対して小さなストロークを作成し、徐々に各ストロークのサイズ、位置、回転、色を変更します。各反復で、ランダム勾配降下法を使用してこれらのパラメータを最適化し、ストロークと入力画像間の誤差を減少させます。しかし、これだけでは不十分です。一部の領域はより多くのストロークを必要とする場合や、不要な領域ではストロークを削除する必要がある場合があるため、100回の反復ごとに密度化プロセスが適用されます。詳細が必要な領域ではストロークを分割し、不要になった領域では削除します。
最適化が公式リポジトリで取得したコードの7000回と30000回の反復に達すると、デフォルトでシーンを表現するために必要なすべてのストロークが含まれるplyファイルが作成されます。このファイルを互換性のある可視化ツールにロードするだけで完了です!
3、ガウススプラッティングの利点
ガウススプラッティングの仕組みを理解したところで、この手法の利点をまとめましょう。
- 学習時間の短縮:1時間程度の計算時間でシーンの学習が完了します。
- 高いレンダリングfps:ガウススプラッティングは、最大100fpsの速度でシーンをリアルタイムにレンダリングできます。
- 動的シーン対応:他の手法のように静的シーンだけでなく、移動するシーンも再構成できます。
4、ガウススプラッティングで自宅を再構成する
このチュートリアルでは、Ubuntu 20.04を使用します。CUDA対応のグラフィックカードが必要で、私たちはGTX 1080を使用しました。
最初のステップは画像の取得です。最も簡単な方法は、再構成したい領域のビデオを作成することです。
試してみてください:
- 長すぎたり短すぎたりしないビデオを取得し、約1分程度を目安にしてください。
- 滑らかな動きで様々な角度から撮影してください。
- 1920x1080程度の解像度を使用してください。
- 物体に焦点を合わせて回転させ、背景も写るようにしてください。
- 良好な照明条件下で行ってください。そうしないと、ソフトウェアでのマッチングが困難になります。
ビデオができたら、ffmpegを使用してフレームを抽出できます。これには、ターミナルで以下を実行します:
ffmpeg -i <ビデオファイルへのパス> -r X 例/input/image%03d.jpg
-rのXを、ビデオの長さに応じて数字に置き換える必要があります。このパラメータを使用して、100〜300枚の画像が得られるまで調整してください。画像が多いほど点群の品質は向上しますが、より多くのVRAMを持つグラフィックカードが必要になります。私たちのビデオではXを2に設定したため、最終的なコマンドは以下のようになります:
ffmpeg -i video.mp4 -r 2 例/input/image%03d.jpg
数秒後、画像を処理できるようになります。
前述の通り、Gaussian Splattingは、SfMによって計算された点群と画像を入力として使用します。ColmapやNeRFを使用することを推奨しています。Colmapを使用するのは非常に簡単な方法です。Ubuntuでは、aptを使用してColmapをダウンロードするだけです。
sudo apt-get install colmap
サーバーで実行している場合(スクリーンがない場合)、Colmapを手動でビルドする必要があるかもしれません。その方法は、こちらで確認できます。
Colmapをインストールしたら、点群を生成し続けます。Gaussian Splattingリポジトリは、これを簡単に実行できるスクリプトを提供しています。まず、gitを使用してリポジトリをダウンロードします。
システムにgitがインストールされていない場合は、以下のコマンドでインストールできます:
sudo apt-get install git
その後、以下を実行します:
git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive
ダウンロードが完了したら、環境の準備を始めます。condaを使用します。インストールしていない場合は、こちらで見つけることができます。
Gaussian Splattingの要件をインストールします:
cd gaussian-splatting
conda env create -f environment.yml
完了したら、環境をアクティブ化します:
conda activate gaussian_splatting
次に、点群の処理を開始します:
python convert.py -s <PATH>/<フォルダ名>/
完了すると、以下のようなディレクトリツリーが作成されます:
<場所>
| — -input
| | — -<画像0>
| | — -<画像1>
| | — -…
| — -distorted
| — -database.db
| — -sparse
| — -0
| — -…
そして、以下のコマンドで学習を開始できます!
python train.py -s <COLMAPまたはNeRF Syntheticデータセットへのパス>
老子云3D可視化とモデル最適化プラットフォームhttps://www.laozicloud.com/