DeepMeshによる点群へのメッシュ張りを試してみよう

2025/04/10

こんにちは。 河口研究室助教の浦野(vrano)です。

手元で遊べるようになったので、多少のtipsを付与しながら最新の点群・3Dモデル系技術であるDeepMeshについて紹介しようと思います。

DeepMesh (GitHub)は、点群を入力として、メッシュの3Dモデルを出力できる深層学習モデルとなります。 サンプルはDeepMeshのプロジェクトページに掲載されています。 2025年4月現在は、GitHub上でDeepMeshを動かすためのコードが公開されており、実際に使うモデルの重み(0.5B)がHugging Faceで公開されています。

ということで実際に動かしていきましょう。

環境構築

上記のGitHubページを参照して作っていきます。 使用するホスト環境はUbuntu 22.04.5, CUDA (nvcc) 12.6 with nVIDIA H100 NVLとなります。

GitHubのREADMEのCUDA 12.1の例に従いますが、anacondaではなくpyenvで環境を作ることにします。 ホスト環境によってはfalsh-attentionのビルドで異様に時間がかかるようですので、tmux内で実行して一晩寝かせるなどしてもよいかと思います。

git clone https://github.com/zhaorw02/DeepMesh.git && cd DeepMesh
# 適宜自前の環境に合わせて読み替えてください
pyenv virtualenv 3.12.9 deepmesh # 3.12系ならなんでもよいかと思います
pyenv local deepmesh
pip install wheel # flash-attentionのビルド時にエラーが出ましたので先に入れます
# あとはほぼ同じです
pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu121
pip3 install -U xformers --index-url https://download.pytorch.org/whl/cu121
git clone https://github.com/Dao-AILab/flash-attention
cd flash-attention
pip install packaging
python setup.py install
cd csrc/rotary && pip install .
cd ../layer_norm && pip install .
cd ../xentropy && pip install .
cd ../../.. && rm -r flash-attention # ここはやらなくていいかも
pip install trimesh beartype lightning safetensors open3d omegaconf sageattention triton scikit-image transformers

ここまで浦野の持つ環境では問題は起きませんでした。

続いて、Hugging Faceからモデルをダウンロードします。 クローンしてきたリポジトリ直下(正直どこでもいいと思いますが)で、以下を実行します。

pip install -U "huggingface_hub[cli]"
huggingface-cli login # アクセストークンを求められるので、指示に従って生成しましょう。
huggingface-cli download zzzrw/DeepMesh --local-dir ./

正常に実行できていれば、pytorch_model.binというファイルが作成されるはずです。

サンプルの実行

クローンしたDeepMeshのリポジトリにはサンプルとなるファイルが含まれていますので、まずはそちらを処理させてみます。 READMEにあるUsageにしたがって実行してみます。

CUDA_VISIBLE_DEVICES=0 torchrun --nproc-per-node=1 --master_port=12345 sample.py \
    --model_path "your_model_path" \
    --steps 90000 \
    --input_path examples \
    --output_path mesh_output \
    --repeat_num 4 \
    --temperature 0.5

上記の例では、examples内のモデルを全て読み込み、mesh_outputに出力します。 必ず、model_pathを適切に設定する必要があります。たとえば--model_path "/home/vrano/DeepMesh/pytorch_model.bin"となります。

使うモデルを絞る場合は--uid_list "wand1.obj,wand2.obj,wand3.ply" \を追加します(この場合はinput_path内のwand1.obj,wand2.obj,wand3.plyが読み込まれます)。

H100環境では40-90it/s程度で実行できました(ちなみに、RTX A6000では30-60it/s程度でした)。 対象となるファイルが結構あるので、時間がかかる場合は対象ファイルを絞るとよいでしょう。

実際にc1.objの元ファイルと出力ファイルを比較している動画を撮影してみました。

自前ファイルで実行

さてさて、サンプルは問題無く実行できましたので、今度は自分でファイルを用意して実行してみましょう。 対象にするのはポケモン・ヒトモシのぬいぐるみです。

点群を取得したいので、研究室に転がっていた3Dスキャナ・CR-SCAN OTTERを使いました。

scanner-and-stuffed-toy

で、スキャンしたものがこちら。 CrealityScanアプリ上で確認できる点群です。

scanned

出力した点群には以下のような処理を加えました。

  • 点数を削減(必要ないかもしれません)
  • 中心が0,0,0に来るようにシフト
  • 数値がmmで記録されていたため、m単位になるようにスケール
  • 1x1x1に収まる程度にスケール

変更を加えない場合、DeepMeshは正常に処理を行えず、エラーが出るか、元モデルと似ても似つかない3Dモデルを出力します。 サーバに転送し、実行スクリプトでファイル指定を行って処理させると、以下のようなファイルを生成できました。

なお、GitHubのREADMEでは.npyファイルにしろと書いてありますが、実際には.plyファイルを扱えるので、.plyファイルを使いました。 ただし、点群には法線が必要です(今回使った3Dスキャナは法線付きのモデルを生成してくれました)。

comparison

左が入力点群、右がDeepMeshの出力になります。 点群から読み取れる形状が概ね再現されているのではないでしょうか。

これからもいろいろなファイルやパラメータで試してみようと思います。 今回は3Dスキャナを使ってしまいましたが、本当はLiDARの点群を入力してみたいところです。


今回の投稿内容についてもっと詳しく聞きたい!河口研に興味があります!という方はぜひ見学へいらっしゃって下さい!

学生へのコンタクトは kisho☆ucl.nuee.nagoya-u.ac.jp へどうぞ! (☆を@に変えてください)

河口研はあなたが来るのを楽しみに待っています!