CVPR2025 Best Paper: VGGTを調べつつmibotの3次元モデルを作ってみた
はじめに
こんにちは!KGモーターズ株式会社でエンジニアをしている中村です。
今年もCVPR2025がアメリカ・テネシー州で6月に開催されました。
Best Paper に選ばれた論文について調べたので、Tech Blog にまとめます。
今回はVGGT(Visual Geometry Grounded Transformer)という3次元抽出モデルについてです。
KGモーターズではmibotという小型EVを開発しています。詳細は以下をご覧ください。
また現在は量産開発と並行して、工場内の自動走行やデジタルツインを作るために3次元データ生成を行っています。
VGGTとは
VGGTは、任意枚数の画像を入力に3次元表現を得ることができるモデルで、オックスフォード大学と Meta の AI チームが発表したものです。
3次元表現と書きましたが、VGGTがすごいのは1回の推論で
- カメラパラメータ
- ポイントマップ
- 深度マップ
- ポイントトラック
を予測することができます。
最大数百枚の画像を入力として受け取り、すべての画像に対してカメラパラメータ、ポイントマップ、深度マップ、ポイントトラックをまとめて 1 秒未満で予測し、追加の最適化を要する従来手法より高精度を示すことが多い
従来は各Taskごとに特化したモデルが多かったですし、推論時に画像間のズレを最小化する最適化が行われることがありますが、VGGTは複数Taskを一度に予測でき、最適化を行わないため処理速度が速いという強みがあります。
1回の推論で複数Taskを解ける上に、各Taskの精度もstate-of-the-artだそうです。
つまりVGGTの強さをまとめると
- 1回で複数Taskの問題が解ける
- そして各Taskの精度も高い
- 後処理の最適化がないため処理速度が速い
詳細は後段で確認します。
mibotで試してみた
このモデルは GitHub にコードが公開されているため、README を見れば動かすことができます。
実際にスマホでmibotを数枚撮影し推論してみました。
やや光のあたり具合などが影響してそうですので、ヒストグラムの調整をして輝度調整をすればもう少しクオリティは高くなりそうな気がしています。
サンプルデータでも回してみましたが、こちらの方が比較的綺麗に生成できていて、撮影する画角などの工夫も必要だと思いました。
どこかでみたことあると思ったら、NeRFでよく見るやつです。
出力データ詳細
このモデルは以下の数式で記述することができます。
ここで
入力は任意枚数の画像になるため、ここでは
つまり、入力画像を、このネットワーク
-
:カメラパラメータg_i -
:深度マップD_i -
:ポイントマップP_i -
:ポイントトラックT_i
が予測できるというわけです。
カメラマップ
これらは 3 次元表現から 2 次元に変換する際の計算や、マルチビューで異なる視点から同じ物体を対応付けるのに使われます。
- 回転
- 4次元のベクトル
- クォータニオンで、3次元の方向ベクトルと1次元の回転角度を持っている
- 並進
- 3次元のベクトル
- 画像の中心座標が3Dのグローバル座標からどの程度(x, y, z)だけオフセットしているか
- 画角
- 2次元ベクトル
- 水平方向と垂直方向がグローバルから見てどの程度拡大縮小しているか
深度マップ
深度マップは画像の各ピクセルがカメラからどの程度の距離にあるかをヒートマップで表現したデータです。
Depth Estimationというタスクで研究が行われるものになります。
少々古いですが、イメージは以下の画像のようなものです。
ポイントマップ
これは画像の各ピクセルごとに対して、3 次元のグローバル座標に対応する (X, Y, Z) 座標の情報を持つデータです。
点群データとして扱うことも可能です。
ポイントトラック
「この物体は、別の画像のどこに写っているのか」に答えるためのデータです。
これは3次元の再構成や動画解析、新規視点合成などで使用されることが多いです。
アーキテクチャー
モデルの入出力と新規性や強みはわかった、というところでアーキテクチャーを見ていきます。
特徴的な部分としては主に以下になるかと思います。
- BackboneにDINO[1]を用いてパッチトークンに分割
- 各フレームにカメラトークン・レジスタトークンを付与
- Alternating-Attentionを使っている
- カメラ/深度/ポイントマップ/トラックを同時に予測
いくつか抜粋して説明します。
BackboneにDINOを使用
DINOもMetaのAIチームによって提案されたモデルで、画像における自己教師あり学習を用いたモデルです。
ImageNet[2]の画像をDINOで特徴空間に埋め込むと、教師あり学習に匹敵する物体認識ができるようになり、またVision Transformer[3]を用いると物体を識別し、Segmentationチックなことができるようになります。
VGGTでは、各入力画像を 14 x 14のパッチに分割し、DINOを使うことで画像の特徴ベクトルを抽出し、情報量の高いトークンとして出力しています。
カメラトークンを付与
各画像から得られた特徴ベクトルにAdd camera token
という箇所があります。
3次元の再構成やマルチビュー解析では、カメラがどの位置でどの向きから撮ったのか?を扱うことが重要になります。
ここで付与されるカメラトークンは、カメラの位置、向き、画角などを表現するためのトークンになります。
またカメラトークンと画像トークンをTransformerに渡し学習することで、カメラトークンが画像の内容とカメラの位置・向き・画角等を反映したベクトルになっているということです。
Alternating-Attention
複数画像を扱う上での難しさは、
- 1つの画像内での関係性
- 画像間での関係性
のどちらも理解するということです。
1. 1つの画像内での関係性
は、ある1枚の画像の中で、「照明の下に机がある」というようなイメージです。
2. 画像間での関係性
は複数の画像に机が写っていた場合、この机は画像内で写っている位置は異なっても、空間上では同じ位置にあるということを理解する必要があります。
(絵が下手なのですが、イメージ図です。赤の画像と青の画像で机が写っている位置は違いますが、部屋の中では机は同じ位置に設置してあるということです)
これを解決しようと思うと
- 全ての画像を一気に処理
- 画像間の関係性は理解しやすいが計算が重い
- 画像をバラバラに処理
- 情報が分散しやすい
という難しさがありますが、VGGTでは Alternating-Attention という仕組みを使っています。
Alternating-Attentionは、1つの画像内でAttentionを計算するFrame-wise Self-Attention
と、複数の画像間で Attention を計算するGlobal Self-Attention
という2つのSelf-Attentionレイヤーから成っていて、これらを交互に組み合わせることで局所性とグローバル性を保っています。
ETH3D[4]を用いて、
- Cross Attention
- Global Attentionのみ
- Alternating-Attention
の3ケースでパラメーター数を揃えて実験したところ、Alternating-Attentionが最も精度が高くなったことがわかります。
評価
このモデルは1回で複数Taskをこなすため、各Taskで性能評価があります。
さすがに全ては多いので、ここではポイントマップに限定して記載します。
使用データセット
高精度な3DスキャンがGround Truthとして存在しているETH3D[4:1]を用いて評価をしています。
高密度なスキャンデータのため、予測結果としても高い精度が要求されます。
KaggleにもETH3D Datasetがあります
評価データの選定
以下の方法で推論をします。
- 各シーンからランダムに10フレーム抽出
- これらをVGGTで推論
厳密には、予測した結果と評価データで座標系がずれており、そのまま比較はできないため、Umeyamaアルゴリズム[5]という整列処理をしてから予測結果と評価データのGround Truthで比較を行います。
評価結果
Accuracy, Completeness, Overallで評価をしています。
どれも予測とGround Truthの平均距離を表す指標のため、値が小さいほど良い結果になります。
例によって精度は他モデルより良いのですが、個人的に面白いところはそこではなく、
- VGGTで予測されたポイントマップを使うより、深度マップとカメラパラメータの予測結果から3次元座標を計算した方が精度が良い
ということです。
Meanwhile, compared to directly using our estimated point maps, we found that the predictions from our depth and camera heads (i.e., unprojecting the predicted depth maps to 3D using the predicted camera parameters) yield
higher accuracy. We attribute this to the benefits of decomposing a complex task (point map estimation) into simpler subproblems (depth map and camera prediction), even though camera, depth maps, and point maps are jointly supervised during training.
ということはポイントマップ予測という複雑なタスクよりも深度マップとカメラパラメータ予測のタスクに分解した方が精度が上がるということなんですね。
最後に
今回は直近の mibot 開発とはやや異なる内容でしたが、
KGモーターズでは量産に向けたソフトウェア開発とともに、将来を見据えた研究開発も行っております。
現在、一緒に事業を作る仲間を募集していますので、
mibotのソフトウェア開発に興味のある方はぜひお気軽にご連絡ください!
補足: 推論した環境について
- OS: Ubuntu
- GPU: NVIDIA T4 16GB
- 実行時はDockerコンテナを使用
この程度のマシンスペックだと入力画像は20枚程度が限界です。
Discussion