単眼深度推定の技術と応用 - 1 枚の画像から奥行きを推定する手法
単眼深度推定とは - 2D 画像から 3D 情報を復元する技術
単眼深度推定 (Monocular Depth Estimation) は、1 枚の RGB 画像からシーン内の各ピクセルの奥行き (深度) を推定する技術です。人間は単眼でも経験的な手がかり (遠近法、テクスチャ勾配、遮蔽関係) から奥行きを知覚できますが、これをコンピュータで実現するのは ill-posed problem (不良設定問題) として知られる困難な課題です。
深度推定の手がかり:
単眼深度推定モデルは、以下のような視覚的手がかりを学習します。遠近法による収束 (平行線が遠方で交わる)、テクスチャ勾配 (遠方ほどテクスチャが細かくなる)、大気遠近法 (遠方ほど霞む)、既知物体のサイズ (人や車の大きさから距離を推定)、遮蔽関係 (手前の物体が奥の物体を隠す) などです。
ステレオ視との比較:
ステレオカメラは 2 台のカメラの視差から三角測量で正確な深度を計算できますが、専用ハードウェアが必要です。LiDAR はレーザーで直接距離を測定しますが高価です。単眼深度推定は通常のカメラ 1 台で動作するため、スマートフォンやドローンなど既存デバイスへの適用が容易です。ただし絶対的な距離精度ではステレオや LiDAR に劣ります。
出力形式:
深度推定モデルの出力は深度マップ (Depth Map) と呼ばれ、各ピクセルに距離値が格納されたグレースケール画像です。近い物体は明るく (または暗く)、遠い物体は暗く (または明るく) 表現されます。相対深度 (順序関係のみ) と絶対深度 (メートル単位の距離) の 2 種類があり、用途に応じて使い分けます。
教師あり学習による深度推定モデル
教師あり深度推定は、RGB 画像と対応する深度マップのペアで学習します。深度の正解データは LiDAR、構造化光センサー (Kinect)、ステレオカメラなどで取得されます。代表的なデータセットとして NYU Depth v2 (室内、654 枚テスト) と KITTI (屋外、697 枚テスト) が広く使用されています。
Eigen らの先駆的研究 (2014):
深層学習による単眼深度推定の先駆けとなった研究で、マルチスケール CNN を使用しました。粗い深度を推定するグローバルネットワークと、細部を精緻化するローカルネットワークの 2 段階構成です。NYU Depth v2 で当時の最高精度を達成し、以降の研究の基盤となりました。
エンコーダ・デコーダ構造:
現代の深度推定モデルは、セマンティックセグメンテーションと同様のエンコーダ・デコーダ構造を採用しています。エンコーダ (ResNet、EfficientNet など) で特徴を抽出し、デコーダでピクセル単位の深度値を予測します。スキップ接続により高解像度の空間情報を保持し、鮮明な深度境界を実現します。
損失関数の設計:
深度推定の損失関数には工夫が必要です。単純な L1/L2 損失では遠方の小さな誤差が過小評価されるため、対数空間での損失 (Scale-Invariant Loss) が広く使用されます。Eigen の SI-Loss は L = (1/n) Σ(log d_i - log d*_i)² - (λ/n²)(Σ(log d_i - log d*_i))² で定義され、スケール不変な学習を可能にします。勾配損失を追加してエッジの鮮明さを向上させる手法も効果的です。
自己教師あり深度推定 - ステレオ画像や動画からの学習
教師あり学習には高価な深度センサーによる正解データが必要ですが、自己教師あり (Self-Supervised) 手法はステレオ画像ペアや単眼動画のみで学習できます。正解深度なしで学習できるため、大規模データでの学習が容易になります。
Monodepth (Godard ら, 2017):
ステレオ画像ペアを用いた自己教師あり学習の代表的手法です。左画像から深度を推定し、その深度で右画像を再構成 (ワープ) します。再構成画像と実際の右画像の差 (photometric loss) を最小化することで、深度推定を学習します。左右の一貫性制約 (left-right consistency) により、オクルージョン領域での精度も向上させています。
Monodepth2 (Godard ら, 2019):
単眼動画のみで学習可能な改良版です。連続フレーム間の相対ポーズ (カメラの動き) を同時に推定する PoseNet を導入し、前後フレームからの再構成損失で深度を学習します。静止物体問題 (カメラと同速度で動く物体) への対処として、auto-masking 技術を導入しています。KITTI で教師あり手法に迫る精度を達成しました。
学習の仕組み:
自己教師あり深度推定の学習信号は「視点変換の整合性」です。推定した深度とカメラポーズを使って、ある視点の画像を別の視点に変換 (ワープ) し、実際の画像と比較します。この再構成誤差を最小化する過程で、ネットワークは正確な深度を推定する能力を獲得します。損失関数には SSIM (Structural Similarity) と L1 損失の組み合わせが標準的に使用されます。
制限事項:
- 動く物体 (他の車両、歩行者) の深度推定が不正確になりやすい
- テクスチャのない領域 (白い壁、空) では学習信号が弱い
- 絶対スケールが不定 (相対深度のみ学習される)
- 低照度や逆光条件での性能低下
MiDaS と DPT - 汎用深度推定モデルの進化
MiDaS (Mixing Datasets for Monocular Depth Estimation) と DPT (Dense Prediction Transformer) は、Intel ISL が開発した汎用深度推定モデルです。複数のデータセットを混合学習することで、特定のドメインに依存しない汎化性能を実現しています。
MiDaS の革新 (2020):
従来の深度推定モデルは特定のデータセット (室内 or 屋外) に特化していましたが、MiDaS は 10 以上のデータセットを混合して学習します。各データセットの深度スケールが異なる問題を、スケール不変・シフト不変な損失関数で解決しました。結果として、室内・屋外・自然風景など多様なシーンで安定した深度推定が可能になっています。
DPT - Vision Transformer の導入 (2021):
DPT は CNN ベースのエンコーダを Vision Transformer (ViT) に置き換えました。ViT のグローバルな自己注意機構により、画像全体の文脈を考慮した深度推定が可能になります。CNN が局所的な受容野に制限されるのに対し、Transformer は画像の任意の位置間の関係を直接モデル化できます。DPT-Large は KITTI で AbsRel 0.062 を達成し、CNN ベースの手法を大幅に上回りました。
MiDaS v3.1 の実用性:
MiDaS v3.1 は複数のバックボーン (DPT-BEiT-Large, DPT-SwinV2-Large, DPT-Large) を提供し、精度と速度のトレードオフに応じて選択できます。PyTorch Hub から torch.hub.load('intel-isl/MiDaS', 'DPT_Large') で簡単に利用可能です。入力画像を 384 × 384にリサイズし、正規化後にモデルに入力するだけで高品質な深度マップが得られます。
Depth Anything (2024):
最新の汎用深度推定モデルとして Depth Anything が注目されています。6200 万枚の未ラベル画像を活用した大規模な自己教師あり事前学習と、150 万枚のラベル付きデータでのファインチューニングにより、MiDaS を上回る汎化性能を達成しています。ViT-L バックボーンで KITTI AbsRel 0.046 を記録しています。
深度推定の応用 - AR、自動運転、3D 再構成
単眼深度推定は、追加のハードウェアなしで 3D 情報を取得できるため、様々な分野で実用化が進んでいます。スマートフォンのカメラだけで動作する点が、LiDAR やステレオカメラと比較した最大の利点です。
AR (拡張現実) でのオクルージョン処理:
AR アプリケーションでは、仮想オブジェクトを現実世界に自然に配置するためにオクルージョン (遮蔽) 処理が重要です。深度マップを使用することで、手前の実物体が仮想オブジェクトを隠す表現が可能になります。Apple の ARKit や Google の ARCore は深度推定を活用してリアルなオクルージョンを実現しています。
自動運転での障害物検知:
単眼カメラからの深度推定は、LiDAR の補完として自動運転に活用されています。Tesla は LiDAR を使用せず、カメラのみで深度を推定する方針を採用しています。ただし、単眼深度推定の絶対精度は LiDAR (誤差 2cm 以下) に比べて劣るため (誤差 5-15%)、安全性が最重要な場面では補助的な役割にとどまります。
ポートレートモードのボケ効果:
スマートフォンのポートレートモードは、深度推定を使用して被写体と背景を分離し、背景にぼかし (ボケ) を適用します。Google Pixel は単眼深度推定とデュアルピクセル AF の情報を組み合わせ、一眼レフカメラのような浅い被写界深度効果を実現しています。深度マップの精度が高いほど、被写体の輪郭に沿った自然なボケが得られます。
3D 写真と視点変換:
Facebook (Meta) の 3D Photos 機能は、深度推定を使用して 2D 写真から 3D 効果を生成します。推定した深度マップに基づいてレイヤーを分離し、視差効果を適用することで、デバイスの傾きに応じた立体的な表示を実現しています。同様の技術は、映画の 2D-3D 変換にも応用されています。
実装と評価 - Python での深度推定パイプライン
単眼深度推定モデルの実装から評価まで、実践的なパイプラインを構築します。MiDaS を使用した推論、カスタムデータでのファインチューニング、評価指標の計算方法を解説します。
MiDaS による推論:
MiDaS の推論は数行のコードで実行できます。model = torch.hub.load('intel-isl/MiDaS', 'DPT_Large') でモデルをロードし、midas_transforms で入力を前処理します。出力は逆深度 (inverse depth) マップで、値が大きいほど近い物体を示します。可視化には matplotlib のカラーマップ (plasma, inferno) が適しています。
評価指標:
- AbsRel (Absolute Relative Error): |d - d*| / d* の平均。値が小さいほど良い
- SqRel (Squared Relative Error): (d - d*)² / d* の平均
- RMSE: 二乗平均平方根誤差。絶対的な距離精度を評価
- δ < 1.25: max(d/d*, d*/d) < 1.25 を満たすピクセルの割合。値が大きいほど良い
ファインチューニング:
特定ドメイン (医療画像、水中画像など) での精度向上には、ドメイン固有のデータでファインチューニングが有効です。MiDaS の事前学習済み重みを初期値とし、学習率 1e-5 程度で 10-20 エポック学習します。少量のデータ (100-500 枚) でも顕著な精度向上が見られます。
深度マップの後処理:
推定された深度マップには、エッジ付近のアーティファクトやノイズが含まれることがあります。バイラテラルフィルタで深度マップを平滑化しつつエッジを保持する処理が有効です。また、深度の不連続点 (物体境界) を検出し、セグメンテーションマスクと組み合わせることで、より正確な深度境界を得られます。点群 (Point Cloud) への変換にはカメラの内部パラメータ (焦点距離、主点) が必要で、Open3D ライブラリで効率的に処理できます。