Blog
三次元復元関連のツール紹介
AI Lab Graphics & Audioチームの武富です。昨年のECCV2020では、NeRF: Representing Scenes as Neural Radiance Fields for View Synthesisを筆頭にNeural Point-Based Graphics、Free View Synthesis、といった機械学習を使った新視点画像生成の研究発表があり、中でもNeRFは後続研究も数多く存在し新視点画像生成の研究はちょっとしたブームを迎えているように思います。
これらの新視点画像生成の研究では、事前に入力となる画像のカメラパラメータ(焦点距離などの内部パラメータと位置,姿勢の外部パラメータ)は何らかのツールによって取得されていることを想定している場合が多くあります。そこで、この記事では、多視点画像からカメラのパラメータを推定するStructure-from-Motion (SfM)のツールをいくつか紹介しようと思います。ただし、学術用途だと用いたアルゴリズムが明確な方が良いと思いますので、RealityCaptureなどの中身がブラックボックスな商用ソフトウェアは除外しています。また、今回は、比較のため、以下のようなぬいぐるみを撮影した画像71枚を入力として各ツールに与えました。撮影はスマートフォンのカメラでオートフォーカスをオンにした状態で行いました。
VisualSfM
古いツールでメンテナンスももう行われていないのですが、日本語でも比較的多くの情報が得られるツールです。VisualSfMに関しては以下のページで実行ファイルが配布されています。
VisualSfMに関してはSfMによる疎な形状復元のみとなっているため、Multi-View Stereo (MVS)による密な形状復元を行う場合にはCMVS-PMVSを別途ダウンロードする必要があります。VisualSfMでは以下のようにGUIを用いて画像の入力、特徴点抽出・マッチング、三次元復元を行うことができるようになっています。
Structure-from-Motionの一連の処理を実行すると、NVM形式で推定されたカメラパラメータ、復元された三次元点の情報(位置、色、観測されたカメラID)の情報を得ることができます。以下は、実際に出力されたNVMファイルの一部となっています。
3行目の71という数字は視点の数を表しており、この場合は71視点(71枚の画像)があることを表しています。その次の行からは、各カメラのパラメータが以下の形式で記述されています。
画像ファイル名 焦点距離 クォータニオン(qw, qx, qy, qz) カメラ位置(x, y, z) 歪パラメータ 0
これらの各画像に対するカメラパラメータの情報と復元された三次元点の情報を用いることでNeRFなどのアルゴリズムの入力として利用することができます。また、NVM形式のファイルの読み込みには、以下で配布されているコードのutil.hにあるLoadNVM関数が利用できます。
http://grail.cs.washington.edu/projects/mcba/pba_v1.0.5.zip
Meshroom
SfM、MVS、さらにメッシュモデルの生成やテクスチャの生成ができ、写真から三次元モデルを作成するフォトグラメトリツールとしても利用可能なツールとなっています。また、ソースコードが公開されており、実装の確認も可能となっています。
https://github.com/alicevision/meshroom
また、GUIの完成度が高く、以下のようにBlenderなどのモデリングソフトウェアと同様にノードベースで処理の追加やパラメータの変更を行うことが可能になっています。UI部分に関しては、今回紹介するツールの中で一番作りこまれているように思います。
デフォルトの設定で復元パイプラインを実行すると、MeshroomCacheというフォルダが作成され、この中に推定結果などのファイルが作成されるようになります。推定されたカメラパラメータに関しては、StructureFromMotionフォルダ以下に任意の文字列のフォルダが作成されており、この中にcameras.sfmというファイルで保存されています。cameras.sfmについてはjson形式のファイルになっており、以下のように各視点の情報やカメラ内部パラメータ、外部パラメータの情報が記載されています。これらの情報よりNeRFなどのアルゴリズムの入力データを作成することができます。
COLMAP
COLMAPに関してはECCV2020においてコンピュータビジョンコミュニティの進展に大きく寄与したとしてPAMI Mark Everingham Prizeが贈呈されるなど、現状、研究分野ではデファクトスタンダードとなっているSfMツールだと思います。
以下のように、COLMAPの見た目はVisualSfMとかなり似通っており、GUI上でSfMのパイプラインを実行できるようになっています。ただし、VisualSfMと異なり密な復元もこのツールで実行することが可能です。
COLMAPを実行すると指定した作業フォルダ内にsparseという名前のフォルダが作成されます。このフォルダの中にSfMの結果が出力されます。SfMを実行すると以下の3つのバイナリファイルが生成されます。
- cameras.bin
- images.bin
- points3D.bin
これらのファイルについては、以下のようにテキストとして出力することも可能です。
cameras.binにはカメラの内部パラメータ、images.binにはカメラの外部パラメータと特徴点の二次元座標、points3D.binには各点の三次元座標と色などの情報が記載されています。テキストとして出力すると各ファイルの冒頭にフォーマットの情報が記載されています。以下はcameras.txtの例です。
他のツールと同様に、これらの情報からNeRFなどのアルゴリズムの入力データを作成することができます。
各ツールの復元結果の比較
最後に各ツールで復元した結果を以下に示します。デフォルトの設定では、各ツールでSfMにかかる処理時間に差はほとんどありませんが、MVSの時間はCOLMAPが最も長くなっているのが分かります。その代わり、復元された形状を見るとCOLMAPで復元した結果が最もきれいに復元されているように見えます。個人的に、メッシュの生成やテクスチャの生成が必要で無ければ、基本的にはCOLMAPを利用するのが良いと思います。もし、メッシュの生成やテクスチャの生成が必要な場合は、この後の「おまけ」に書いたOpenMVSを用いる方法をおすすめします。
VisualSfM + CMVS-PMVS |
Meshroom |
COLMAP |
|
復元結果 |
|||
SfM処理時間 |
3分 |
7分 |
3分 |
MVS処理時間 |
17分 |
15分 |
73分 |
今回は、各ツールデフォルトのパラメータで復元処理を行いましたが、カメラの内部パラメータが一定(全てのカメラで焦点距離が同一)だと想定される場合、入力の画像が動画の場合、カメラの内部パラメータが既知の場合、などはツール毎にオプションでこれらの条件が設定できるようになっています。もし、これらの条件を利用できる場合は、積極的に利用することで、より安定した三次元形状復元ができるようになります。
おまけ
・COLMAPのMulti-view Stereoの処理をOpenMVSで置き換える
COLMAPはSfMの部分は他のツールに比べて頑健に精度よくカメラパラメータを推定できるのですが、MVSの部分に関してはあまり精度が良く無いように思います。また、MVSの処理で各入力画像に対するデプスマップを推定する処理はかなりの時間がかかります。そこで、MVS部分についてはOpenMVSというMVSに特化したツールを利用することで、ある程度改善をすることが可能です。OpenMVSの実行ファイルに関しては以下のリンクよりダウンロードすることができます。
https://github.com/cdcseacave/openMVS/releases/tag/v1.1.1
※Build instructionsのページにある実行ファイルへのリンクは古いバージョン(0.7.0)へのリンクとなっているおり、このバージョンにはCOLMAPの結果をOpenMVSの形式に変換するためのツールが入っていないので注意が必要
COLMAPとOpenMVSの連携の仕方については、以下の通りです。
- COLMAPの出力からOpenMVS用のプロジェクトファイルを生成する
COLMAPを実行すると作業フォルダ内にdenseとうフォルダが生成されていると思います。復元されたモデル毎にフォルダ分けされていると思うので、OpenMVSを適用したいモデルのフォルダを以下のように指定し、InterfaceCOLMAP.exeを使ってOpenMVS用のプロジェクトファイルを生成します。path_to_OpenMVS_binary/InterfaceCOLMAP.exe -i dense -o scene.mvs - DensifyPointCloud.exeを使って密な復元を行います。
path_to_OpenMVS_binary/DensifyPointCloud.exe scene.mvs
また、メッシュやテクスチャは、さらに以下の手順を実行することで生成することができます。
- メッシュの生成と補正
path_to_OpenMVS_binary/ReconstructMesh.exe scene_dense.mvs
path_to_OpenMVS_binary/RefineMesh.exe scene_dense_mesh.mvs - テクスチャの生成
path_to_OpenMVS_binary/TextureMesh.exe scene_dense_mesh_refine.mvs
OpenMVSで復元された点群とメッシュモデルは以下の通りです。
点群 |
メッシュモデル |
OpenMVSを用いた密な形状復元にかかった処理時間は約18分でした。COLMAPのMVSよりも大幅に時間を短縮できていることが分かります。また、生成された点群の精度も良いように見えます。生成されたメッシュモデルの品質も良好に見えます。ひと手間かかりますが、より高品質な三次元形状が必要な場合は、COLMAPを単独で用いるのではなくOpenMVSと組み合わせて利用するのが良いように思います。
・Cloud Compareを使ったPoint Cloudの比較
SfMに関しては、あくまで相対的なカメラの位置や姿勢を推定する技術のため、各ツール毎に出力されるモデルの原点が異なったり、スケールが異なったりします。このような場合に有用なのがCloud Compareという点群比較ツールです。
このツールを利用することで、点群間の位置合わせを行ったり、差分を可視化したりすることができます。実際に、Meshroomで復元した結果とCOLMAPで復元した結果を単純に重ね合わせると以下のように2つの点群(赤:Meshroom、黄色:COLMAP)の基準となる座標やスケールが異なることが分かります。
Cloud Compareを用いることで、簡単に2つの点群の座標系を統一(Alignment)することができます。座標の統一は簡単で、以下のように位置合わせしたい2つのモデルを選択します。そして、Alignmentのボタンを押します。
その後、以下のように対応する点の選択画面になるので、対応する点を4点以上選択します。選択が完了したら、alignボタンをおし位置合わせを実行します。結果が良好だった場合、チェックマークを押して位置合わせ完了となります。
今回、掲載した実験結果に関しては、全てCloud Compareを用いて位置合わせしています。そのため、同じ視点から結果を見ることができるようになっています。また、Cloud Compareは点群同士を比較し、エラーマップを出すことなどもできるので、三次元ビジョンの問題に取り組む際には有用ツールの一つだと思います。
Author