MLエンジニアへの道 #67 - V-SLAM & SAM

Last Edited: 7/18/2025

このブログ記事では、コンピュータビジョンにおけるV-SLAM/SAMのための深層学習アルゴリズムについて紹介します。

ML

前回の記事では、Structure from Motion (SfM)に関連するコンピュータビジョンタスクとして、 オプティカルフローと特徴点追跡(ベイズフィルタ)について説明しました。 しかし、Visual Simultaneous Localization and Mapping (V-SLAM) や Structure and Motion (SaM) と呼ばれるSfMにより密接に関連するコンピュータビジョンタスクがあります。 その名前が示すように、これらのタスクは、動画フレームや異なる角度からの複数の画像によって撮影されたシーンのマッピングとカメラの位置推定を同時に行うことを要します。 この記事では、そんなV-SLAM/SaMのための高度な深層学習アルゴリズムとその前提知識について紹介します。

ガウス・ニュートン法

SfMに関する記事では、バンドル調整に非線形手法を使用することについて触れました。この際に実際にバンドル調整に使用される主要な手法は、 ニュートン法またはニュートン・ラフソン法の拡張であるガウス・ニュートン法です。ニュートン・ラフソン法は、 非線形関数 f(x)f(x) の二次テイラー展開を使用し、二次近似の最小値を見つけることによって徐々に最小値に近づく手法で、その導出は以下の通りです。

f(xt+1)=f(xt+α)f(xt)+f(xt)α+12f(xt)α20=ddα(f(xt)+f(xt)α+12f(xt)α2)=f(xt)+f(xt)αα=f(xt)f(xt)xt+1=xtf(xt)f(xt) f(x_{t+1}) = f(x_t + \alpha) \approx f(x_t) + f'(x_t)\alpha + \frac{1}{2}f''(x_t)\alpha^2 \\ 0 = \frac{d}{d\alpha} (f(x_t) + f'(x_t)\alpha + \frac{1}{2}f''(x_t)\alpha^2 ) = f'(x_t) + f''(x_t)\alpha \\ \alpha = -\frac{f'(x_t)}{f''(x_t)} \\ x_{t+1} = x_t - \frac{f'(x_t)}{f''(x_t)}

ここで、二次近似の二次導関数(ヘッセ行列)が正であり、二次近似が凸であると仮定することで、 導関数を取ってゼロに設定することで最小値を見つけることができます。 これにより、ヤコビ行列とヘッセ行列を使用して適切な更新値 α\alpha が得られ、最小値に近づくことができます。 勾配降下法とは異なり、この手法はヘッセ行列(または凹性)を考慮するため、一部の関数に対してより高速に収束する可能性があります。 しかし、正のヘッセ行列という仮定が満たされない場合、この方法では最小値の導出が不安定になる可能性があります。 さらに、ヘッセ行列の計算は計算コストが高いことが多く、ニュートン法はあまり実用的ではありません。 ガウス・ニュートン法は、ヘッセ行列を近似することでこの問題に対処し、残差の二乗を最小化するためにニュートン法を利用します。

ri=yif(xi;β), β=minβL=minβiri(β)2βjL=i2ririβj=2irifiβj=2JTrβjβk2L=2iriβkfiβj+ri2fiβjβk=2ifiβkfiβj+ri2fiβjβk2ifiβkfiβj=2JTJβ(t+1)=β(t)(β2L)1βLβ(t)(2JTJ)1(2JTr) r_i = y_i - f(x_i; \beta), ~ \beta^{*} = \min_\beta L = \min_\beta \sum_i r_i(\beta)^2 \\ \nabla_{\beta_j} L = \sum_i 2r_i \frac{\partial r_i}{\partial \beta_j} = -2 \sum_i r_i \frac{\partial f_i}{\partial \beta_j} = -2 J^T r \\ \nabla^2_{\beta_j \beta_k} L = -2 \sum_i \frac{\partial r_i}{\partial \beta_k}\frac{\partial f_i}{\partial \beta_j} + r_i\frac{\partial^2 f_i}{\partial \beta_j \beta_k} \\ = -2 \sum_i -\frac{\partial f_i}{\partial \beta_k}\frac{\partial f_i}{\partial \beta_j} + r_i\frac{\partial^2 f_i}{\partial \beta_j \beta_k} \approx 2 \sum_i \frac{\partial f_i}{\partial \beta_k}\frac{\partial f_i}{\partial \beta_j} = 2 J^T J \\ \beta^{(t+1)} = \beta^{(t)} - (\nabla^2_{\beta} L)^{-1} \nabla_{\beta} L \approx \beta^{(t)} - (2 J^T J)^{-1}(-2 J^T r)

上は、LLを最小化するβ\beta^* を見つけるために β\beta に関する LL の一次および二次導関数を計算してニュートン法を適用しています。 LL の二次導関数を近似するために、まず積の法則を使用して βjL\nabla_{\beta_j} L の導関数を取り、 次に積の第二部分を破棄してヘッセ行列を 2JTJ2 J^T J として近似します。これにより、簡単に得られるヤコビ行列と残差列ベクトル rr のみを使用してパラメータ更新を表現できます。 通常、因数分解と三角測量から点 XX と運動 MM の初期推定値を得た後、非線形バンドル調整にこのガウス・ニュートン法を使用し、 これはSLAMにおいても前提知識として必要です。

マハラノビス距離

SLAMのもう一つの必要な前提知識は、観測値と分布の間の距離を測定するマハラノビス距離です。 これは、xxμ\mu から何標準偏差離れているかを測定するZスコア z=xμσz=\frac{x-\mu}{\sigma} を、 多変量平均と共分散を持つ分布に一般化したものです。平均 μ=(μ1,μ2,...,μn)T\vec{\mu}=(\mu_1, \mu_2, ..., \mu_n)^T と共分散行列 Σ\Sigma を持つ確率分布が与えられた場合、 x=(x1,x2,...,xn)T\vec{x}=(x_1, x_2, ..., x_n)^T の分布からのマハラノビス距離は (xμ)TΣ1(xμ)\sqrt{(\vec{x}-\vec{\mu})^T \Sigma^{-1} (\vec{x}-\vec{\mu})} として計算されます。 Σ\Sigma は正半定値であるため、距離は常に定義されます。

また、共分散行列 Σ\Sigma を持つ分布に関して、x\vec{x} と別の点 y\vec{y} の間のマハラノビス距離を (xy)TΣ1(xy)\sqrt{(\vec{x}-\vec{y})^T \Sigma^{-1} (\vec{x}-\vec{y})} として計算することもできます。 分布が単位分散を持つ場合、マハラノビス距離はユークリッド距離と等価であることがわかります。 SLAMの文脈では、以前の対応予測のセットと更新された対応予測のセットの間の不一致を計算するために、 ユークリッド距離の代わりにマハラノビス距離を使用します。これは、対応予測のセット内の点が相関していると仮定するためです (マハラノビス距離は計算複雑性の増加という代償を払う代わりに、相関/共分散を考慮でき、 スケール不変で外れ値に対してより敏感でないという利点があります)。

RAFT

SLAMの最後の前提条件は、RAFT(Recurrent All-Pairs Field Transformsの略)で、 これは4D相関ボリュームと相関ボリュームによって情報を得たConvGRUによる反復的改良を利用した、 オプティカルフロー推定のための深層学習アルゴリズムです。RAFTは、 まず特徴エンコーダーを使用して各フレームから元の画像の1/8の解像度(H8×W8×D\frac{H}{8} \times \frac{W}{8} \times D)の特徴マップを取得し、 すべての特徴ベクトルのペアの内積を計算し(H8×W8×H8×W8\frac{H}{8} \times \frac{W}{8} \times \frac{H}{8} \times \frac{W}{8})、 その結果を異なるストライド(1、2、4、8)でプーリングすることで、高解像度を保持しながら小さな変位から大きな変位まで捉える4D相関ボリュームの相関ピラミッドを構築します。

RAFT

次に、ConvGRUを用いた更新部分では、初期フローベクトルf0f_0を取り、ft+1=ft+Δff_{t+1} = f_t + \Delta fΔf\Delta fを計算することでオプティカルフロー推定を反復的に調整します。 具体的には、前回のフロー推定ft1f_{t-1}、コンテキストエンコーダーからのコンテキスト特徴、 そしてフロー推定x=x+ft1x' = x + f_{t-1}に基づいて以前に推定された対応ピクセルxx'の周りの半径rrの近傍ピクセルN(x)N(x')に対応する相関ピラミッドから(バイリニアサンプリングで)サンプリングされた相関を連結します。 この連結された入力は、隠れ状態とともに処理されて更新された隠れ状態に到達し、 これを2つの畳み込み層に通すことでΔf\Delta fが得られます。 結果として得られるフロー推定fTf_T(通常T=10T=10)は元の画像の1/8の解像度を持ち、 これをアップサンプリングすることで最終的な予測に到達できます。(実装と実験結果の詳細については、記事の最後に引用されている原論文を確認することをお勧めします。)

RAFTは、オプティカルフロー推定の様々なデータセットにおいて最先端の精度と効率を達成し、 最も重要なことに、強力な汎化能力を実証しました。原論文では、 この成功を相関ピラミッドとバイリニアサンプリングによる相関ルックアップの意図的な設計に帰因させています。 これは、オートエンコーダーアーキテクチャとは異なり、比較的高解像度を維持しながら関連する相関特徴を効率的に計算、抽出し、 シーンに対してフロー推定を柔軟に調整できる軽量な反復更新を可能にします。 また、RAFTがフロー推定(x=x+fx' = x + f)を通じて対応問題を暗黙的に解決していることも重要な点です。 これは、複数のビューとフレームを含む様々な3Dコンピュータビジョンタスクにとって不可欠です。 したがって、RAFTの能力を構造と動きの推論に使用することを検討することができます。

DROID-SLAM

RAFTの同じ著者ら(Teed, Z. & Deng, J.)は、RAFTからの観察を活用してDROID-SLAMを開発しました。 これは当時のV-SLAMにおける最先端の深層学習アルゴリズムとなり、強力な汎化能力を示しました。 RAFTを(同じ点を捉える可能性のある2枚以上の画像を処理することが必要である)SLAMタスクに適応させるため、 DROID-SLAMはまず12個のキーフレーム(DROID-SLAMによって推定されたオプティカルフローが16px以上のフレーム)をサンプリングし、 3ステップ以内のキーフレームを接続することでフレームグラフを構築します。推論中に新しいキーフレームが追跡されると、 最も古いキーフレームまたは平均オプティカルフローが最も小さいキーフレームのいずれかを破棄します。 そして、DROID-SLAMはエッジで接続されたすべてのフレームペアiijjを処理します。

X=(X,Y,Z,W)T, Gij=GjGi1Πc(X)=(fxXZ+cxfyYZ+cy), Πc1(p,d)=(pxcxfxpycyfy1d)p=Πc(GijΠc1(p,d)) \text{X} = (X, Y, Z, W)^T, ~ G_{ij}=G_j \circ G_i^{-1} \\ \Pi_c(\text{X}) = \begin{pmatrix} f_x \frac{X}{Z} + c_x \\ f_y \frac{Y}{Z} + c_y \end{pmatrix}, ~ \Pi_c^{-1}(p, d) = \begin{pmatrix} \frac{p_x - c_x}{f_x} \\ \frac{p_y - c_y}{f_y} \\ 1 \\ d \end{pmatrix} \\ p' = \Pi_c(G_{ij}\Pi_c^{-1}(p, d))

上は、DROID-SLAMが使用する同次座標でのV-SLAMの形式化で、カメラ内部パラメータc=(fx,fy,cx,cy)c=(f_x, f_y, c_x, c_y)が与えられた場合に、 pppp'の対応問題をカメラポーズGG(カメラ外部パラメータ)と深度ddに関連付けるものです。 DROID-SLAMは、密バンドル調整層(DBA)を使用してSfMの線形手法からのカメラポーズと深度推定を反復的に調整します。 DBAは、推定されたpp'がRAFTの様なモデル(アーキテクチャはRAFTとほぼ同一で、対応を調整するフローまたは残差uuとDBA用の重みWWを予測する) によって反復的に更新される対応予測pijp_{ij}^{*}と一致するように、調整因子Δξ\Delta \xiGij=eΔξGijG_{ij}' = e^{\Delta \xi}G_{ij})とΔd\Delta ddi=Δd+did_i'=\Delta d + d_i) をすべてのペアに対して計算します。

E(G,d)=(i,j)EpijΠc(GijΠc1(pi,di))Σij2, Σij=diagwijE(x)=r(x)TWr(x), r(x)=pΠc(GΠc1(p,d))E(x)(r(x)+JΔxΔx)TW(r(x)+JΔxΔx),r(x)r(x)+(Δxr(x))Δx=r(x)+JΔxΔxminE(x)=min(r(x)+JΔxΔx)TW(r(x)+JΔxΔx) E(G', d')=\sum_{(i,j) \in \mathscr{E}}||p_{ij}^{*}-\Pi_c(G_{ij}'\Pi_c^{-1}(p_i, d_i'))||_{\Sigma_{ij}}^2, ~ \Sigma_{ij}=\text{diag}w_{ij} \\ E(x')=\sqrt{r(x')^TWr(x')}, ~ r(x') = p^{*}-\Pi_c(G'\Pi_c^{-1}(p, d')) \\ E(x') \approx \sqrt{(r(x) + J_{\Delta x} \Delta x)^TW(r(x) + J_{\Delta x} \Delta x)}, \\ r(x') \approx r(x) + (\nabla_{\Delta x}r(x)) \Delta x = r(x) + J_{\Delta x} \Delta x \\ \min E(x') = \min (r(x) + J_{\Delta x} \Delta x)^TW(r(x) + J_{\Delta x} \Delta x)

DBAは具体的には、上のようなpijp_{ij}^{*}pp'間の(ConvGRUユニットによって計算された重みを使用した)重み付きマハラノビス距離EEを使用して、 距離を最小化するΔξ\Delta \xiΔd\Delta dを計算します。 マハラノビス距離は残差r(x)r(x')(ここでx=[G,d]x'=[G', d'])で表現でき、残差r(x)r(x')は1次テイラー近似を使用してアクセス可能なr(x)r(x)と決定したいΔx\Delta xで表現できます。 重み付きマハラノビス距離を最小化するためには、平方根関数は単調増加関数であるため、重み付き二乗残差を最小化すれば良いです。 ここで、ガウス・ニュートン法(安定性と収束のための減衰因子λ\lambda付き)を使用して線形方程式系を設定し、以下のように解くことができます。

x=x(x2E)1xExx=Δx=(x2E)1xEx2EΔx=xE(x2E+λI)Δx=xExE=2JxTWr, x2E=2JxTWJx(JxTWJx+λI)Δx=JxTWr[JGTWJG+λIJGTWJd+λIJdTWJG+λIJdTWJd+λI][ΔξΔd]=[JGTWrJdTWr][BEETC][ΔξΔd]=[vw]Δξ=[BEC1ET]1(vEC1w), Δd=C1(wETΔξ) x' = x - (\nabla^2_x E)^{-1} \nabla_x E \\ x' - x = \Delta x = - (\nabla^2_x E)^{-1} \nabla_x E \\ \nabla^2_x E \Delta x = - \nabla_x E \\ (\nabla^2_x E + \lambda I) \Delta x = - \nabla_x E \\ \nabla_x E = -2J_x^TWr, ~ \nabla^2_x E = 2J_x^TWJ_x \\ (J_x^TWJ_x + \lambda I) \Delta x = J_x^TWr \\ \begin{bmatrix} J_G^TWJ_G + \lambda I & J_G^TWJ_d + \lambda I \\ J_d^TWJ_G + \lambda I & J_d^TWJ_d + \lambda I \end{bmatrix} \begin{bmatrix} \Delta \xi \\ \Delta d \end{bmatrix} = \begin{bmatrix} J_G^TWr \\ J_d^TWr \end{bmatrix} \\ \begin{bmatrix} \text{B} & \text{E} \\ \text{E}^T & \text{C} \end{bmatrix} \begin{bmatrix} \Delta \xi \\ \Delta d \end{bmatrix} = \begin{bmatrix} \text{v} \\ \text{w} \end{bmatrix} \\ \Delta \xi = [B - EC^{-1}E^T]^{-1}(v-EC^{-1}w), ~ \Delta d = C^{-1}(w - E^T \Delta \xi)

これにより、BBCCEEが行列である上の線形方程式系が導かれ、シュア補元(上のように)を利用してこれを効率的に解くことができます (シュア補元についてはこの記事の下部に引用されているリソースを確認できます。シュア補元はつまり一つの変数を最初に解き、 その結果を使って別の変数を解くことで、より低次元で解を得ることのできる方法です)。BBCCEEvvwwの値を得るには、 JGJ_GJdJ_dを計算する必要がありますが、これはチェインルールを使用して行うことができます(導出の詳細は、記事の下部に引用されている原論文のAppendixから確認できます)。 DROID-SLAMは合成TarTanAirデータセットで、DBAからConvGRUへ逆伝播されるuuに対するフロー損失(pij=u+p(t1)p_{ij}^{*}=u+p'^{(t-1)})と、 重みWWに対する真値と予測ポーズを比較するポーズ損失を用いて訓練され、様々なシーンやステレオおよびRGB-Dカメラに対する強力な汎化能力を持つ最先端のSLAMアルゴリズムとなりました。

MegaSAM

DROID-SLAMの性能とアーキテクチャ設計により強力な汎化性能が実現されたにも関わらず、 ハンドヘルドデバイスで撮影されたもののように、カメラと物体が動的に移動する動的な動画では依然として苦戦しており、 実世界のシナリオへの適用が妨げられていました。CVPR 2025でbest paper honorable mentionを受賞したMegaSAMは、 DROID-SLAMを基盤として様々な調整を加えることでこの制限に対処しています。 まずMegaSAMは、速度と収束のバランスを取るために曲率に基づいて減衰因子を調整する、 より堅牢なLevenberg-Marquardtアルゴリズム((JTWJλdiag(JTWJ))Δx=JTWr(J^TWJ - \lambda \text{diag}(J^TWJ))\Delta x=J^TWr) を用いて焦点距離ffGGと共に学習します。 また、静的な動画のみでの訓練後に従来のモデルFFを凍結し、 追加のネットワークFmF_mを用いて動的な動画に対する物体移動確率マップmRH8×W8m \in \mathbb{R}^{\frac{H}{8} \times \frac{W}{8}}を学習し、 確信度重み(w~ij=wˉij+mi\tilde{w}_{ij}=\bar{w}_{ij}+m_i)に確率マップを反映させます。

Dialign=α^Direl+β^,α^=Diabsmedian(Diabs)Direlmedian(Direl), β^=median(DiabsDirel)E=(i,j)EpijpijΣij2+wdidiDialign2 D_i^{\text{align}} = \hat{\alpha} D_i^{\text{rel}} + \hat{\beta}, \\ \hat{\alpha} = \frac{D_i^{\text{abs}} - \text{median}(D_i^{\text{abs}})}{D_i^{\text{rel}} - \text{median}(D_i^{\text{rel}})}, ~ \hat{\beta}=\text{median}(D_i^{\text{abs}}-D_i^{\text{rel}}) \\ E=\sum_{(i,j) \in \mathscr{E}}||p_{ij}^{*}-p_{ij}'||_{\Sigma_{ij}}^2+w_d\sum_i||d_i'-D_i^{\text{align}}||^2

さらにMegaSAMは、訓練中にDepthAnythingを用いた単眼深度事前情報を組み込み、カメラ焦点距離の真値を25%ランダムに摂動させることで初期化します。 さらに、DepthAnythingからの単眼深度事前情報DrelD^{\text{rel}}と、UniDepthからの焦点距離推定f^\hat{f}とメトリック単眼深度DabsD^{\text{abs}}を用いて、 推論時に深度DalignD^{\text{align}}と焦点距離f^\hat{f}の初期化を実行し、DalignD^{\text{align}}による正則化も採用しています。 正則化の重みwdw_dwd=γdexp(βdmedian(diag(Hd)))w_d = \gamma_d \exp(-\beta_d \text{median}(\text{diag}(H_d)))として計算されます。 これは、ヘッセ行列が変数の摂動に対する再投影(対応点推定の)誤差の感度を明らかにし、したがって不確実性を示すためです。 高いヘッセ値は高い感度と低い不確実性を意味し、単眼深度事前情報による正則化をより少なくすることが好ましいことを示唆します。 また、Hf<τfH_f < \tau_fの場合、低いヘッセ値は焦点距離が入力から観測不可能である可能性を示唆するため、 DBA内での焦点距離最適化も無効化されます。

MegaSAMにおけるDROID-SLAMへのこれらの修正により、ネット上の動画を含む様々なシーンで大幅な性能向上が実現されました。 しかし、移動物体がフレームを支配する動画や強い歪みや変動する焦点距離を持つ動画に関しては依然として制限があり、 SAMにはまだ改善の余地があることを示唆しています。(実装と評価に関するより詳細な説明については、 記事の最後に引用されている原論文を確認することをお勧めします。Side Note:FoundationStereoとMegaSAMの両方が、 いくつかのタスク関連の違いはあるものの、良い単眼事前情報に基づいて、ConvGRUを用いて初期予測を反復的に改良するために、 豊富な4D表現を取得し参照するという似たアーキテクチャを持つことは興味深いです。)

結論

この記事では、高度なSLAMまたはSAMアルゴリズムであるDROID-SLAMとMegaSAM、およびそれらの前提知識(Gauss-Newton法、マハラノビス距離、RAFT)を紹介しました。 詳細に踏み込めなかった実装や関連する概念(Schur補元、Levenberg-Marquardtアルゴリズム、UniDepth、CasualSAM、システムアーキテクチャなど)があるため、 以下に引用されているリソースや他の関連するリソースを確認することを強くお勧めします。

リソース