Multi-View Stereo
Multi-View Stereo(MVS)は、複数 image と既知の camera pose から dense な geometry を復元する method です。通常、Structure from Motion によって camera pose と sparse point cloud を得た後に実行されます。SfM が「特徴点だけで camera と sparse structure を決める」処理だとすれば、MVS は「camera が分かっている状態で、できるだけ多くの pixel に depth や surface を割り当てる」処理です。
目的
MVS の目的は、各 view の dense depth map、または scene 全体の dense point cloud / mesh を復元することです。
典型的な入力は次の通りです。
- Multi-view images
- Camera intrinsics
- Camera extrinsics
- 必要に応じて、SfM で得た sparse point cloud や view graph
典型的な出力は次の通りです。
- Reference view ごとの depth map
- Depth map を fuse した dense point cloud
- Point cloud から再構成した mesh
- Surface normal や confidence map
Photometric consistency
MVS の基本 idea は、正しい 3D surface point は複数 view に投影したときに同じ見た目になる、という photometric consistency です。
Reference view を 、source view の集合を とします。Reference image 上の pixel を homogeneous coordinate で とします。Depth candidate を とすると、この pixel が表す world coordinate 上の 3D point は次のように back-projection できます。
ここでは、camera extrinsics が という world-to-camera 変換であると仮定しています。この式の気持ちは、「reference camera から pixel の方向に depth だけ進んだ点を、world coordinate に戻す」ということです。
この 3D point を source view に投影すると、source image 上の対応位置は次のようになります。
正しい depth であれば、reference image の patch と、source image の 周辺の patch は似た見た目になるはずです。そのため、photometric cost は次のように書けます。
各項の意味は次の通りです。
- は、reference pixel の depth を と仮定したときの matching cost です。
- は、reference image の pixel value または feature value です。
- は、source view に投影した位置の pixel value または feature value です。
- は view selection や occlusion を考慮した重みです。見え方が極端に悪い view の影響を小さくするために使います。
- は、すべての重みが 0 に近い場合に分母が 0 になることを避けるための小さな正数です。
- は absolute difference、squared difference、Huber loss、または learned feature distance などです。
この式の気持ちは、「depth をいろいろ仮定して source view へ写し、もっとも見た目が一致する depth を選ぶ」ということです。実際には照明変化や exposure 差があるため、raw RGB の差だけではなく、normalized cross-correlation(NCC)や learned feature が使われます。
Patch similarity として NCC を使う場合、window 上で次のように書けます。
NCC は値が大きいほど patch が似ていることを表します。Cost として使う場合は、 のように小さいほど良い形に変換します。平均値を引いて正規化しているため、単純な明るさの差に少し強くなります。
Depth map based MVS
多くの MVS pipeline では、各 reference image に対して depth map を推定し、その depth map 群を fuse して dense point cloud や mesh を作ります。
COLMAP の dense reconstruction も、この流れに近い構成です。
Depth map 推定は、pixel ごとに独立に depth を選ぶだけでは不安定です。Textureless region では photometric cost が平坦になり、repetitive pattern では誤った depth にも低い cost が出るからです。そのため、古典的な MVS では、data term と smoothness term を組み合わせた energy minimization として考えることがあります。
各項の意味は次の通りです。
- 第一項は data term です。各 pixel の depth が multi-view photometric consistency と合っているかを測ります。
- 第二項は smoothness term です。近傍 pixel の depth が急に変わりすぎないようにします。
- は隣接 pixel pair の集合です。
- は data term と smoothness term の重みの釣り合いを決めます。
- は depth 差への penalty です。Total variation のように edge を保ちやすい penalty が使われることがあります。
この式の気持ちは、「画像間で見た目が合う depth を選びたいが、近くの pixel は同じ surface に乗っていることが多いので、depth map としても滑らかにしたい」というものです。ただし、object boundary では本当に depth が不連続になります。そのため、画像の edge では smoothness を弱める edge-aware regularization がよく使われます。
Plane sweep と homography warping
Depth candidate を有限個の plane として並べ、各 plane 上へ source view を warping する考え方は plane sweep stereo と呼ばれます。ここでは、reference camera 座標で plane が を満たし、reference 座標から source 座標への変換が であるとします。このとき、plane-induced homography は次のように書けます。
ここで、 は reference camera 座標で見た plane normal、 は reference camera center から plane までの符号付き距離です。Plane equation を と定義する文献では符号が反対になりますが、重要な点は、depth plane を一つ決めると、reference image と source image の間の対応が homography として計算できることです。この式の気持ちは、「ある depth の平面上に scene があると仮定すれば、二つの image の見え方は一枚の射影変換で対応付けられる」ということです。
Learning-based MVS でも、この homography warping は重要です。MVSNet は、複数 view の feature map を depth hypothesis ごとに reference frustum 上へ warping し、cost volume を作ります。
Learning-based MVS と cost volume
MVSNet 以降、deep learning を使った MVS では、multi-view feature から cost volume を作り、3D convolution や recurrent refinement によって depth を推定します。
Reference view と source view から抽出した feature を、depth hypothesis ごとに reference view へ揃えます。View の warped feature を とすると、MVSNet 型の variance-based cost は次のように書けます。
は、depth を仮定して view を揃えたとき、multi-view feature がどれくらいばらつくかを表します。二乗は feature channel ごとに計算されます。正しい depth では、各 view の feature が同じ surface point を見ているため、ばらつきが小さくなることを期待します。
Network は、この cost volume を regularize して depth probability を出します。Depth candidate が であり、regularized cost が であるとき、softmax による depth probability と期待値 depth は次のように書けます。
ここで、 は softmax の鋭さを調整する temperature です。この式の気持ちは、「cost が低い depth ほど確率を高くし、その確率で depth candidate を平均する」というものです。Cost volume の解像度を粗密に分ける cascade 型の method や、depth 方向を recurrent に処理する method は、メモリ使用量と精度のバランスを改善するために使われます。
Learning-based MVS は、textureless region や noisy matching に対して強くなる可能性がありますが、training data の domain に依存することがあります。Camera pose がずれている場合には、learned feature が強くても warping 自体がずれるため、最終的な geometry が崩れます。
Geometric consistency と depth map filtering
Depth map based MVS では、各 reference view で depth を推定した後に、複数 view の depth が互いに矛盾していないかを確認します。Reference view の pixel と depth から 3D point を作り、それを source view に投影して を得ます。
Source depth map が正しければ、 で back-project した点 は、元の と近いはずです。
そこで、次のような条件で inconsistent な depth を除きます。
ここで、 は reprojection error の threshold、 は depth consistency の threshold、 は source camera coordinate で見た の depth です。この式の気持ちは、「reference view で作った点を source view へ持って行き、さらに戻しても、ほぼ同じ pixel と depth に戻ってきてほしい」ということです。
Depth fusion
Filtering 後の depth map は、view ごとに partial な surface を表しています。これらを一つの dense point cloud にまとめる処理が depth fusion です。
各 depth observation から得た 3D point を 、confidence を とすると、近い観測をまとめた fused point は次のように重み付き平均で表せます。
この式の気持ちは、「同じ surface point を複数 view から少しずつ異なる位置として観測しているので、信頼度の高い観測を強く反映しながら一つにまとめる」ということです。実際の system では、normal consistency、viewing angle、photometric confidence、visibility、occlusion なども使って、fuse する観測を慎重に選びます。
Mesh が必要な場合は、fused point cloud から Poisson surface reconstruction、Delaunay-based meshing、TSDF fusion などを使って surface connectivity を作ります。
MVS の分類
古典的な MVS は、何を主要な表現として最適化するかによって大まかに分類できます。
| 分類 | 何を推定するか | 直感 |
|---|---|---|
| Voxel / volumetric method | 空間中の voxel occupancy や signed distance | 空間を格子に分け、どこに surface があるかを探します。 |
| Depth map based method | 各 view の depth map | 画像ごとに dense depth を作り、あとで統合します。 |
| Surface evolution method | Mesh や surface | Surface を動かしながら photo-consistency が高い形へ近づけます。 |
| Patch-based method | 小さな oriented patch | 信頼できる局所 patch を増やし、filtering しながら dense 化します。 |
| Learning-based method | Cost volume や depth distribution | Multi-view matching と regularization を neural network で学習します。 |
Depth map based method は、大規模 scene で扱いやすく、COLMAP や多くの deep MVS method でも中心的な考え方になっています。
MVS の難所
- Textureless surface
- Reflective / transparent object
- Specular highlight
- Thin structure
- Occlusion
- Large viewpoint change
- Inaccurate camera pose
これらの難しさは、photometric consistency の仮定が弱くなることとして理解できます。Textureless surface では、どの depth でも似た見た目になり、cost curve が平坦になります。Specular surface では、同じ 3D point でも view によって色が変わります。Occlusion では、reference view で見える点が source view では別の物体に隠れているため、正しい対応が存在しません。Camera pose error があると、正しい depth を仮定しても warping 位置がずれるため、全体の cost が信頼できなくなります。
SfM との関係
SfM と MVS は、同じ multi-view geometry を使いますが、役割が異なります。
| 観点 | SfM | MVS |
|---|---|---|
| 主な入力 | Multi-view images | Multi-view images + camera pose |
| 主な出力 | Camera pose と sparse point cloud | Dense depth map、dense point cloud、mesh |
| 主な対応 | Sparse feature track | Pixel または patch 単位の dense correspondence |
| 主な objective | Reprojection error | Photometric consistency と geometric consistency |
| 失敗しやすい要因 | Feature 不足、誤対応、overlap 不足 | Textureless surface、反射、occlusion、pose error |
実務では、SfM の pose が少しでもずれていると MVS の photometric matching が壊れます。そのため、MVS の品質を上げるためには、撮影時の overlap、calibration、SfM の bundle adjustment、外れ値除去が非常に重要です。
関連ページ
- Depth Estimation
- Structure from Motion
- Stereo Matching
- Point Clouds, Meshes, and TSDF
- Surface Normals and Normal Maps
主なソース
- COLMAP dense reconstruction documentation: https://colmap.readthedocs.io/en/stable/tutorial.html#dense-reconstruction
- Furukawa and Hernández, “Multi-View Stereo: A Tutorial”, 2015: https://www.carlos-hernandez.org/papers/fnt_mvs_2015.pdf
- Seitz et al., “A Comparison and Evaluation of Multi-View Stereo Reconstruction Algorithms”, CVPR 2006: https://vision.middlebury.edu/mview/seitz_mview_cvpr06.pdf
- MVSNet paper: https://arxiv.org/abs/1804.02505
- Yao et al., “Recurrent MVSNet”, CVPR 2019: https://arxiv.org/abs/1902.10556