はじめに
最近発表されたLingBot-Mapを、COLMAPの代わりにスマホ2D動画からのカメラ姿勢推定に使ってみました。
画像から3D再構成する手法の比較ツイートをたまたま見かけましたが、LingBot-MapはこのVGGTという手法の系譜にあたるそうです。COLMAPだけでなく色々な手法があるんですね。
LingBot-Mapの特徴
※AIに聞いているので間違っているかもしれません。
ストリーミング処理
COLMAPなどの従来のSfMでやっていたカメラ姿勢推定と深度推定を、ストリーミング動画から処理できます。
ここでいうストリーミングとは、未来フレームを使わず現在と過去だけで、フレーム到着順に処理できるということです。COLMAPでは後から全体を見直すBundle Adjustment(BA)を実行していましたが、それが不要になります。リアルタイムのスピードというわけではありませんが、逐次処理できるのが特徴です。
SLAMなどの他手法との比較は以下のようになっています。
破綻の少なさと姿勢推定の精度
長い動画でも破綻しづらく、姿勢推定の精度も高いとされています。
ストリーミング処理は今の私の用途的には重要ではありませんが、長い入力で破綻しづらく姿勢推定の精度が高い点は気になります。以下のようなケースでCOLMAPより破綻しづらいようです。
環境構築
GitHubで公開されているので、ローカルで環境構築できます。
私の環境は以下です。
- OS:Windows
- GPU:NVIDIA GeForce RTX 3080(VRAM 10GB)
実行方法
連番画像から生成する場合はこのように実行します。
python demo.py --use_sdpa --model_path checkpoints\lingbot-map-long.pt --image_folder input\images --mask_sky
GUIで生成結果を表示できるモードもありました(COLMAPのように生成中の様子が表示されるわけではなく、結果のみ表示されます)。
自分の動画で試してみた
以前COLMAPで生成したときは3つのモデルに分かれてしまったデータでも、ちゃんと1つにつながって生成できました!
こちらのうまくいった別の電車のデータも、
COLMAPだとこのように2つに位置が分裂して、なおかつ電車内部に入った段階で途切れてしまっていました。
3DGS始めたての頃に撮影したので、対象物に近づきすぎていてCOLMAPで失敗するのは仕方ないと思っていましたが、こうして時を超えて正しく位置推定してくれると感動しますね。
ちなみにGLBで書き出すこともできました。
動画ファイルからの直接入力
動画ファイルを入力として、自動で切り出しから処理してくれます。
python demo.py --use_sdpa ^
--video_path input\movie.mp4 ^
--fps 1 ^
--model_path checkpoints\lingbot-map-long.pt ^
--mask_sky
ただし、fpsの指定がうまく機能せずかなり多くの画像が生成されてしまったので、自分でffmpegで切り出した方が良いかもしれません。
FlashInferを使っていない私の環境では、375枚の処理に43分かかりました。
GPUもかなり使うので、裏でLichtFeldStudioの起動などは私のPCではできません。
オフラインレンダリングパイプライン(失敗)
最近、長い動画向けにオフラインレンダリングパイプラインが追加されていました。
25000フレームというのはかなり多いですね。COLMAPだと13分の動画でも0.5秒ごとに切り出すので、そこまで枚数を使いませんが、LingBot-Mapでは多めにフレームを使うようです。
オフラインレンダリングパイプラインはWindows環境でうまく構築できませんでした。そういえばLingBot-Mapは特に前提環境の明記がないですね。
COLMAP形式で書き出して3DGS生成(失敗)
書き出しは現状npz形式での出力しかなさそうだったので、3DGSを作るためにCOLMAP形式で書き出せるようdemo.pyを改変しました。
書き出したデータをLichtFeldStudioで読み込むとこのようになりました。
3DGSの生成結果
生成してみましたが、あまりきれいではありませんでした。
そもそも点群データがよく見たらきれいではないですね。
最後に
COLMAPソフトではうまくアライメントできなかったデータでもLineBot-Mapではアライメントが成功しました。




















