3DスキャンとGaussian splatting

近年、Gaussian SplattingやNeRF(Neural Radiance Fields)関連の技術は、
「少ない画像から高品質な新規視点レンダリングを行う」
「ある程度の幾何情報(3D形状)を推定する」
 という点で非常に注目されています。3Dスキャナーとしての利用を検討します。

目次

NeRFやGaussian Splattingはそもそも何をする技術?

NeRF(Neural Radiance Fields)

複数方向から撮影した画像を元に、「ボリューム表現(放射輝度場)」を学習して、新規視点の画像をフォトリアリスティックに生成できるもの。従来のフォトグラメトリと比べ、テクスチャや複雑なライティングの扱いが上手で、結果映像が高品質。
ただし、従来のNeRFは学習に時間がかかる(数分~数時間単位)ことが多く、またジオメトリ(3Dメッシュ)を取り出すには追加処理が必要。

Gaussian Splatting

SIGGRAPH 2023で発表された比較的新しい手法で、NeRFのようなボリューム表現を「ガウス分布の集合」に置き換えたもの。学習とレンダリングが非常に高速という特徴があり、リアルタイムあるいはほぼリアルタイムに近い速度を目指せる研究が進んでいます

「3D Gaussian Splatting」は、フランスの国立情報学自動制御研究所(Inria)、コートダジュール大学、そしてマックスプランク情報学研究所(MPI Informatik)の研究者たちによって共同開発されました。

公式コードは非商用という形で発表されていたのですが、各社が自力で実装する試みが行われており、3Dスキャンアプリ「Scaniverse」にもGS技術が導入されています。Microsoft Babylon.jsでは .splat ファイルを読み込み表示できるようになっています。

とはいえ現時点では、まだ研究途上であり、3Dプリンタに用いることができる三次元メッシュを出力するワークフローが確立されているわけではないようです(ただし派生手法で部分的には可能)。

GSのPythonライブラリー

企業の独自実装のように、Githubで公開されているOSSがいくつかあります。生成AIによるとオススメは以下の3つ。

  • 手軽に試したい → Taichi 3D Gaussian Splatting
  • カスタマイズしたい → Taichi Splatting (※ニュージーランド・カンタベリー大学による実装)
  • 高品質なGaussian Splattingを求める → WangFeng18版 (※TikTokのBytedance所属?)

Taichi(Taichi Lang) とは?

Taichiは、物理シミュレーションやコンピュータグラフィックス向けに設計されたPythonベースの並列計算フレームワーク 兼 プログラミング言語 です。Pythonのような書き方でも、実行時に最適化されるため、高速に動作します。

  • Pythonに統合されたドメイン固有言語(DSL)
    Pythonで書けるが、内部的に高性能なコンパイルが行われる。
  • 高速な並列計算が可能
    CPU(マルチスレッド)、CUDA(GPU)、Metal(Apple)、Vulkan などに対応。
    つまり速度を気にしなければCUDAが不要で、CPUだけでも処理できます。

Pythonライクな記述で、低レベルのハードウェア最適化ができるようになっています。ただしその分、品質はGraphDecoの公式実装やPyTorch版より低いことが想定されるので、手軽に試すならTaichi、しっかりやるならPyTorch版を選ぶとよい。とのこと。

Taichi版 GS

https://github.com/wanmeihuali/taichi_3d_gaussian_splatting

Apache-2.0 ライセンスです。

Google Colabでデモを動かします。

Google Colabの環境が新し過ぎたので、古いPythonに戻します。
「コマンドパレット→代替ランタイムバージョン」を選択します。

# Githubからクローン
!git clone https://github.com/wanmeihuali/taichi_3d_gaussian_splatting

%cd /content/taichi_3d_gaussian_splatting
!pip install -r requirements.txt
!pip install -e .
!pip install taichi==1.6.0

# デモ用のトレーニングファイル、画像をダウンロード
!pip install gdown
!gdown --folder --id 1d14l9ewnyI7zCA6BxuQUWseQbIKyo3Jh

# 解凍する
!unzip -o /content/boots_dataset/boots_image.zip -d /content/taichi_3d_gaussian_splatting/
!unzip -o /content/boots_dataset/boots_super_sparse.zip -d /content/taichi_3d_gaussian_splatting/data/

# Colab用の設定になっていない?ので、メモリを確保
!sed -i 's/device_memory_GB=0.1/device_memory_GB=2/' /content/taichi_3d_gaussian_splatting/taichi_3d_gaussian_splatting/GaussianPointTrainer.py

# 実行 ※お試しでやるならconfig内に記載のイテレーション減らしていいはず
%cd /content/taichi_3d_gaussian_splatting
!python gaussian_point_train.py --train_config config/boots_super_sparse_config.yaml

レンダリングします。

!python gaussian_point_render.py \
    --parquet_path /content/taichi_3d_gaussian_splatting/logs/boots_super_sparse_experiment_1/best_scene.parquet \
    --poses /content/taichi_3d_gaussian_splatting/data/boots_super_sparse/boots_train.json \
    --output_prefix /content/taichi_3d_gaussian_splatting/output/render

画像だとイマイチよくわかりません。


Parquetファイルをそのまま描画してみました。

import pandas as pd
import plotly.express as px

# .parquet ファイルのパス
parquet_path = "/content/best_scene.parquet"

# Parquet データの読み込み
df = pd.read_parquet(parquet_path)

# 3D 散布図を描画
fig = px.scatter_3d(df, x='x', y='y', z='z', color='r_sh0',color_continuous_scale='Viridis', opacity=0.3)
fig.show()

結果

3D的に確認可能な点群が出来ていることがわかりました。

3Dスキャンに使えそうではある

IMU搭載のカメラを複数使って撮影、クラウドにデータを送ってGSで高品質な3Dデータを生成するサービスはアリかも知れません。
今回はお試しだったので、元々モデルデータ等があるTaichi版のデモを使用しつつ計算量をガッツリ減らして試しました。CUDA最適化されていると噂のWangFeng18さんバージョンも、そのうち試したいと思います。

ハードウェア製造・大量生産だけでは中国系の企業に一瞬で模倣されてしまいそうですが、GSを組み入れたシステム・サービスおよびコンテンツを提供する形であれば、乗り換え防止も出来るかも知れませんね。

メモ:Google ColabではCUDA有効COLMAPを利用できなかったので、別の方法を考えた方が良いかも知れません。

 
 
  

当サイトの記事の一部はAIにより執筆されています。内容について最新の情報とは異なる場合も御座いますのでご留意くださいませ。最新の情報をご確認くださいますようお願い申し上げます。

よかったらシェアしてね!
目次