9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

2DGSを用いたガウシアンのメッシュ化

Last updated at Posted at 2024-11-30

はじめに

3Dスキャン Advent Calendar 2024がついにスタートしました!

初日のテーマは、2D Gaussian Splatting(2DGS)を活用したガウシアンからメッシュ化までの手順について解説します。
この記事では、以下の投稿で紹介されている焚き火をメッシュ化した方法を基に、具体的なプロセスを紹介します。

3D Gaussian Splattingをメッシュ化する経緯

私は最近、VRゲームの一つであるVRChatで、現実の物を3DスキャンしてVR内に持ち込むことにハマっています。旅行やイベントの思い出の品、現実では動かせないもの、または解体などして無くなるものを、VRで保存・動かすことで、写真や映像では再現できない「3Dならではの表現」を実現する楽しさを追求しています。

作例はこちら

そんな中でフォトグラメトリを活用してきましたが、水やガラスといった透明なもの、火のように動的なものはフォトグラメトリが不得意であることを痛感しました。そこで、これらに強みを持つガウシアンに興味を持つようになったのです。

現在の解決方法と課題

現状、VRChatでガウシアンを表現する方法としては、VoxelKeiさんが開発した独自のシェーダーが知られています。
現状はVoxelKeiさん自身がこちらを改良されたシェーダー?で実現されています。

このシェーダー?はとても魅力的ですが、GPU負荷が高いため、別の方法を模索していました。そして、「ガウシアンをフォトグラメトリのようにメッシュ化できないか」と調べたところ、2DGS(2D Gaussian Splatting)に行き着いたのです。

警告
2024/12/1現在の構築方法です。
各ソフトのアップデートにより構築方法が変更になる可能性が高いので、この記事はあくまで参考にしていただき、各ソフトのREADMEをお読みください。
READMEから引用したところはこれと同じような警告があります。

前提条件

  • Ubuntuの多少の知識がある
  • RealityCaptureのアライメント処理をしたことがある
  • VRAM 24GB以上のGPU

メッシュ化までの流れ

この章について
記事を書いていたら、かなり長くなってしまったことに気がついたのでとりあえず全体の流れを知っていただこうと思い、この章を書きました。

流れを大まかに理解していただければ、読み飛ばしてもらって大丈夫です。
処理の流れがわからなくなったら、また読み返して貰えればOKです。

1. 環境構築

  • WSL2(Ubuntu 20.04)
  • Anaconda
  • 2d-gaussian-splatting

WSL2を選んだ理由
私の前提条件を満たしているGPUがWindowsメインマシーンのみだったため、WSL2を使ってUbuntu 20.04をインストールしました。
もし、Ubuntuマシーンがある場合はそちらで問題ありません。

2. 素材データ準備

正直このデータを準備するのが一番時間かかりました。

RealityCaptureから出力されたColmap txtデータ構造(画像含む)
<location>
|---cameras.txt
|---images.txt
|---points3D.txt
|---<image 0>
|---<image 1>
|---...
最終的な素材データ構造
<location>
|---images
|   |---<image 0>
|   |---<image 1>
|   |---...
|---sparse
    |---0
        |---cameras.bin
        |---images.bin
        |---points3D.bin
        |---cameras.txt
        |---images.txt
        |---points3D.txt

3. Gaussian Splatting処理とメッシュ化

2DGSのREADMEに書かれている方法で、ガウシアン処理とメッシュ化を実行します。

環境構築

1. WSL2(Ubuntu 20.04)

WSL2を選んだ理由
私の前提条件を満たしているGPUがWindowsメインマシーンのみだったため、WSL2を使ってUbuntu 20.04をインストールしました。
もし、Ubuntuマシーンや仮想環境がある場合はそちらで恐らく問題ありません。

下記の記事を参考にインストールしてください。

注意点は

3.Linux ディストリビューションをインストール

Ubuntu-20.04 を指定するようにしてください。

2. Anaconda

下記の記事の

1.公式サイトからインストーラのダウンロード
2.bashを用いてインストーラを実行

を実行していただければインストール完了です。

WSLで環境を構築している方は、この記事を参考にshファイルを移動させて実行させてください。

3. 2d-gaussian-splatting

bash
# download
git clone https://github.com/hbb1/2d-gaussian-splatting.git --recursive
cd 2d-gaussian-splatting/

# if you have an environment used for 3dgs, use it
# if not, create a new environment
conda env create --file environment.yml

警告
2024/12/1現在の方法です。
引用元
https://github.com/hbb1/2d-gaussian-splatting

素材データ準備

1. RealityCaptureからColmapを出力

RealityCapture 1.5のアップデートでColmapの出力に対応しました。
今回はそれを活用します。

撮影した画像を用意
image.png
RealityCaptureに撮影した画像を入れてアライメント処理を実行
image.png
無事アライメントがうまくいったら
image.png
ワークフローの3.OutputにあるExportを選択
image.png
Camera AlignmentにあるColmap Text Formatを選択
image.png
エクスポート先を選択後にパラメータを選択する画面が出てくるので写真のように変更
画像のエクスポートを忘れずに
image.png
エクスポートされたデータ
image.png

2. Cameraタイプの変更

RealityCaptureから出力されたCamera.txtに書いてあるCameraタイプSIMPLE_RADIALでは2DGSで処理することは非対応
対応しているSIMPLE_PINHOLEPINHOLEに変更する

SIMPLE_RADIALSIMPLE_PINHOLEの違いは歪の値の有無らしい
RealityCaptureから出力されたCamera.txtにはすべて歪0と書かれているので、
カメラタイプの変更と行の最後にある0を消せばいい

参考元

Camera.txt(一部)
# Camera list with one line of data per camera:
#   CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
# Number of cameras: 61
61 SIMPLE_RADIAL 9953 6469 4382.761334473909 4976.5 3234.5 0
46 SIMPLE_RADIAL 9097 6049 8985.572991559862 4548.5 3024.5 0
47 SIMPLE_RADIAL 9180 6082 8987.095179233622 4590 3041 0
58 SIMPLE_RADIAL 9119 6055 8983.253200124884 4559.5 3027.5 0
51 SIMPLE_RADIAL 9177 6073 9018.405000000001 4588.500000000001 3036.5 0
54 SIMPLE_RADIAL 9107 5958 9019.688203418091 4553.5 2979 0
60 SIMPLE_RADIAL 9119 6113 8990.707520891365 4559.5 3056.5 0
53 SIMPLE_RADIAL 9115 6109 8977.094300518134 4557.5 3054.5 0
56 SIMPLE_RADIAL 9141 6106 8985.974605140911 4570.5 3053 0
50 SIMPLE_RADIAL 9115 6135 8986.905055487054 4557.5 3067.5 0
59 SIMPLE_RADIAL 9127 6116 8992.640265394983 4563.5 3058 0
57 SIMPLE_RADIAL 9110 6132 9007.6404494382 4554.999999999999 3066 0
55 SIMPLE_RADIAL 9133 6095 9020.996882145086 4566.5 3047.5 0
48 SIMPLE_RADIAL 9155 6065 9003.711340206186 4577.5 3032.5 0
52 SIMPLE_RADIAL 9101 6048 8967.26864274571 4550.5 3024 0
49 SIMPLE_RADIAL 9120 6096 8991.336099585062 4559.999999999999 3048 0
37 SIMPLE_RADIAL 9115 6046 8990.13698630137 4557.5 3023 0
...
..
.

ChatGPTの力を借りて変更プログラムを作りました。

bash
vim convert_cameras.py
convert_cameras.py
import sys

def convert_camera_file(input_file, output_file):
    with open(input_file, "r") as file:
        lines = file.readlines()

    with open(output_file, "w") as file:
        for line in lines:
            # コメントや空行はそのまま出力
            if line.startswith("#") or line.strip() == "":
                file.write(line)
                continue

            # カメラパラメータを解析
            parts = line.strip().split()
            if parts[1] == "SIMPLE_RADIAL":
                camera_id, model, width, height, fx, cx, cy, k1 = parts
                k1 = float(k1)  # k1 を数値に変換

                # k1 が 0 の場合は SIMPLE_PINHOLE に変換
                if k1 == 0.0:
                    file.write(f"{camera_id} SIMPLE_PINHOLE {width} {height} {fx} {cx} {cy}\n")
                else:
                    # k1 が 0 でない場合はそのまま書き出し
                    file.write(line)
            else:
                # 他のモデルはそのまま書き出し
                file.write(line)

# コマンドライン引数の処理
if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("Usage: python convert_cameras.py <input_file> <output_file>")
        sys.exit(1)

    input_file = sys.argv[1]
    output_file = sys.argv[2]

    convert_camera_file(input_file, output_file)
    print(f"Conversion completed! Output saved to: {output_file}")

Windows・Ubuntuどちらでもいいので下記のコマンドを打ってプログラムを実行

bash
python convert_cameras.py Cameras.txt Cameras.txt

3. txtからbinに変換

colmapコマンドを実行すれば簡単にできます。
aptに登録されているらしいので簡単にインストールできます。

bash
sudo apt update
sudo apt install colmap
bash
colmap model_converter --input_path <path/to/colmap_txt> --output_path <path/to/colmap_bin> --output_type BIN

WSLで環境を構築している方は、この記事を参考に<path/to/colmap_txt><path/to/colmap_bin>を指定してください。

4. Colmapデータを準備

ここに従ってデータを各ディレクトリに配置

何故か、公式のドキュメントにtxtデータの配置位置が書かれていませんでした?

素材データ構造
<location>
|---images
|   |---<image 0>
|   |---<image 1>
|   |---...
|---sparse
    |---0
        |---cameras.bin
        |---images.bin
        |---points3D.bin
        |---cameras.txt
        |---images.txt
        |---points3D.txt

データ配置方法

imagessparseを作成
image.png
imagesに画像データを移動
sparseフォルダの中に0フォルダを作成
0フォルダ内に以下のファイルを配置

0
|---cameras.bin
|---images.bin
|---points3D.bin
|---cameras.txt
|---images.txt
|---points3D.txt

Gaussian Splatting処理とメッシュ化

環境構築のCondaコマンドで作成した仮想環境surfel_splattingをアクティブに

bash
conda activate surfel_splatting

git cloneした2d-gaussian-splattingフォルダーに戻り下記のプログラムを実行

bash
cd 2d-gaussian-splatting/

python train.py -s <path/to/colmap> -m ./output/GS2mesh/ -r 3
python render.py -s <path/to/colmap> -m ./output/GS2mesh/ -r 3

素材の画像が10Kの解像度の場合、-r 4以下にすると3090TiのVRAM24GBではメモリが足りずできませんでした。
もし各プログラムのオプションを知りたい場合は下記のHelpオプションをつければ確認できます。

bash
python train.py -h
python render.py -h

警告
2024/12/1現在の方法です。
引用元
https://github.com/hbb1/2d-gaussian-splatting

実行結果

下記のディレクトリにPlyファイルがあるので、それをBlenderなどで開きます。

output/GS2mesh/point_cloud/iteration_30000/point_cloud.ply

メッシュ化までなので正確にはわかりませんが、炎のようなものがありました!

最後に

ガウシアンからメッシ化する手順を解説しました。
フォトグラメトリと比べていくつもの工程があり、工数がかさみますが、
フォトグラメトリにできなかった表現ができるといいですね!
実際に炎のメッシュ?みたいなのが生成されており、これからの進歩に期待です。

モチベーションやリソースに余裕があれば、テクスチャ生成や他のメッシュ化方法についても取り上げていこうかなと考えています。

モチベーションにつながるのでいいねを押して頂けると助かります。

3Dスキャン Advent Calendar 2024に記事を投稿してくださる方を募集しています。
3Dスキャン関連であれば何でも大丈夫なのでよろしくお願いいたします!

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?