見出し画像

Scaniverseの3D Gaussian splattingて結局のところどうなのさ

これまで3D Gaussian splatting(以下、3DGS)を使うには、独自に実装するかLumaAIなどのアプリが選択肢として存在しました。

前者は技術オタクくらいしかしないと思うので、多くの人はアプリを使って3DGSを使っていると思います。

3DGSが使えるアプリは限られており、LumaAIがデファクトスタンダードとなっていました、

先日、Scaniverseというアプリでも3DGSが使えるようになり大きな注目を集めました。
しかもLumaAIがクラウド処理なのに対してScaniverseはエッジ処理(スマホ側で処理)という点も注目されました。

ただエッジでする処理としては非常に重たいと思っているため、きっと何かしら制限をかけているのではないかと考えています。

そこで今回はLumaAIとScaniverseの結果をそれぞれ見比べて、どのような違いがあるかを見ていきたいと思います。

検証環境

前提

インプットとなる動画は同じものを使用したかったのですが、Scaniverseが動画をインプットとして処理する機能をもっていなかったため、LumaAIは動画をインプットとし、Scaniverseは同じような構図、時間で撮影しました。

端末

iPhone12 Pro 512GB

点群による比較

3DGSはアルゴリズムとして点群をベースとしています。
基本的な出力結果はガウスであるため点群ではないのですが、各アプリがSplatに対応したPLY形式に変換して出力する機能を提供しているため、今回はそれを利用したいと思います。

Scaniverse

Scaniverseで生成した点群の点の数は114,293でした。
思ったより少ないですね。

以下にScaniverseの3DGSで生成した点群を示します。
ちなみに色の変換はめんどくさいし関係ないのでしてません。

Scaniverseで生成した点群

LumaAI

以下にLumaAIの3DGSで生成した点群を示します。
点の数は565,302です。
Scaniverseの約5倍!

ちなみにPointCloudとして出力するとこんな感じ
点の数は1,570,755

LumaAIで生成した点群

Metashape

ちょっと系統は違いますがSfM/MVSもやってみました
SfMで疎な点群を生成し、MVSで密な点群を生成するので、比較にはいいのかなと思い入れてみました。

以下に疎な点群を示します。
点の数は265,324

Metashapeで生成した点群(疎)


以下に密な点群を示します。
点の数は2,687,218

Metashapeで生成した点群(密)

処理部分を考察

3DGSは点群をベースにしていると前述したように、点の数がSplatに影響すると考えました。

そのため各アプリでデータを出力して点群として見ましたが、Scaniverseが圧倒的に点が少ない結果となりました。

これは最初の点群生成の時点でARKitなのかARDKなのかわかりませんが、VIOとかvSLAMとか知らんけどやっていて、それに対して3DGSの処理を進めているのかなと思いました。

また3DGSの処理においても、誤差逆伝播のイテレーションを抑えている印象も受けました。

他にもあるのかもしれませんが、これらによってエッジでの処理を実現しているのかなと考えます(中の人が見たら鼻で笑われる考察かもしれませんが)。

LumaAIの点群密度が高かったのは、クラウド処理によるタイポイントの多さと誤差逆伝播のイテレーションの豊富さかなと思いました。

いずれにせよ、PLY形式への変換アルゴリズムによって何を基にしているのかが変わると考えられます。

例えば、出力されるPLYは全て3DGSの基となった点群かもしれませんし、ガウシアンの分布をフィルタリングした上で点に置き換えてるかもしれませんし、色々な方法が考えられるのでそこはまあいいや。

LumaAIは変換にOpen3Dを使ってるみたいなのでバックエンドで点群処理してるかも。

そこら辺はデータの中身を見たらある程度推測できます。が。バイナリ形式なのでバイナリエディタで見てあげましょう。

まあ以下はScaniverseのデータですが。

データ項目としては、LumaAIのPointCloudのPLYはPointCloudの形式(x,y,z,r,g,b)、LumaAIとScaniverseのSplatは58~62次元のパラメータで構成されてます。
Splatは3DGSの論文にもあるように、ガウシアンのパラメータをPLYに当て込むとこうなるのでほぼ変わらない(一部不要なのは消してる?)イメージ

ちなみにLumaAIは法線ベクトルを持ってました。

3DGSは点群ベースで処理するはずなので、PointCloud形式で出力した点数よりも少なくなるのはなんで?って感じですが、それは私の勉強不足の可能性があります。(つーかLumaAIの点群密度ってクラウドでMVSやってね?)

以上

この記事が気に入ったらサポートをしてみませんか?