Relative vs Metric Depth
Depth Anything のような monocular depth foundation model を実用に使うときには、relative depth と metric depth の違いを理解しておくことが非常に重要です。誤解すると、せっかくの depth map を間違った scale で 3D Reconstruction に使ってしまいます。
何が違うのか
| 種類 | 単位 | 解釈 |
|---|---|---|
| Relative depth | 任意 | 近い / 遠いの順序関係に意味がある |
| Metric depth | meter など物理単位 | 値そのものが距離 |
なぜ monocular では metric が難しいのか
単一 image だけでは、scene の絶対的な大きさは原理的に決まりません。同じ image は、「小さい model を近くから撮ったもの」と「大きい実物を遠くから撮ったもの」のどちらにも対応しえます。
これは数式的には、
のように、depth と焦点距離を同じ係数 でスケールしても同じ image が得られる、という ambiguity に対応します。
Relative depth の使いどころ
Relative depth は scale が不定ですが、それでも多くの用途で十分価値があります。
- 画像編集での前景 / 背景分離
- Diffusion model の depth condition (ControlNet など)
- Sparse SfM への depth prior
- Visual effect (depth-of-field、parallax 効果)
- View synthesis での coarse geometry
これらの用途では、「どちらが手前か」がわかれば十分なケースが多いです。
Metric depth の使いどころ
Metric depth が必要なのは、絶対距離が意味を持つ場面です。
- Robotics の障害物回避
- 自動運転の距離推定
- 計測 / 測量
- AR での object placement (実寸大配置)
- Scale-aware NeRF / 3DGS
これらでは、relative depth をそのまま使うと、対象が現実より小さい / 大きい配置になります。
Relative から metric への変換
Relative depth から metric depth を得るには、scale と shift を解く必要があります。
実用上は、
- Known calibration object のサイズ
- Sparse SfM の metric point cloud
- Depth sensor (LiDAR / Stereo) のサンプル
- IMU / GPS 経由の motion scale
などを使って を fit します。Depth Anything V2 のような model には、metric depth 用に fine-tune された variant が用意されていることもあります。
実務的なチェックリスト
- 入力 image の domain は training data と近いか
- 必要なのは relative か metric か
- Metric が必要なら、scale を決める source があるか
- 反射 / 透明 / 鏡が含まれていないか
- Crop / resize のときに depth scale が崩れていないか
数式で見る relative depth と metric depth の対応付け
Monocular depth model が出す予測 が relative depth であるとき、external な reference を使って metric scale を当てる必要があります。Reference depth を とすると、affine alignment は次の最小二乗問題です。
Alignment 後の metric depth は次のようになります。
Reference は SfM の sparse depth、stereo depth、LiDAR の sample 点、または既知サイズの object などです。この式の気持ちは、「single image だけでは決まらない絶対 scale を、外部の量から補う」ということです。
Inverse depth で学習されている model では、 として扱う場合があり、その場合は inverse 空間で affine alignment するか、 に戻してから合わせるかで挙動が変わります。Pipeline で depth を扱うときには、model がどちらの空間で値を出しているかを必ず確認する必要があります。
関連ページ
主なソース
- Depth Anything paper: https://arxiv.org/abs/2401.10891
- Depth Anything V2 paper: https://arxiv.org/abs/2406.09414