[Text2Mesh] AIでテキストから3Dメッシュを生成する

2021年12月20日月曜日

Artificial Intelligence

本記事ではText2meshと呼ばれる機械学習手法を用いて、テキストから3Dオブジェクトを生成する方法を紹介します。

アイキャッチ

Text2Meshとは

以下の記事では、テキストから2Dの画像を生成する方法を紹介させていただきました。本記事はこちらの3Dバージョンです

Text2Meshは、入力されたテキストに準拠した色や幾何学的詳細を予測し、3Dメッシュを構築する機械学習手法です。

FuseDream同様にCLIPを利用して、生成した3Dメッシュと入力テキストの類似度スコアが最大化されるように3Dメッシュを構築します。

特徴は、事前にトレーニングされた生成モデルも特殊な3Dメッシュデータセットも必要としないことです。様々な3Dメッシュ上で無数のスタイルを合成することが可能となっています。

Text2Mesh出力サンプル

Text2Meshの導入手順

セットアップ1: conda環境構築

それでは早速、開発環境にText2Meshをセットアップしていきます。
動作確認は下記の環境で行っています。

OS: Ubuntu 18.04.3 LTS
GPU: GeForce GTX 1080

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

それでは、Text2Meshをインストールしていきます。他の機械学習環境に影響を与えないためにMinicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。

それではセットアップを始めていきます。
githubからコードを取得後、ymlファイルを使ってconda環境構築を構築していきます。

# gitからcodeをclone
$ git clone https://github.com/threedle/text2mesh.git

# Proxy配下の場合は事前に下記を設定
$ export http_proxy="http://"username":"password"@proxy:port"
$ export https_proxy="http://"username":"password"@proxy:port"

# ymlファイルからconda環境構築
$ conda env create --file ./text2mesh/text2mesh.yml

# 作成した環境をアクティベート
$ conda activate text2mesh

# torchの動作確認
$ python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.device_count());"
1.9.0
True
2

以上で環境構築は完了です。
ymlファイルが提供されているとセットアップが簡単で良いですね。

もしtorchの動作確認でGPUがあるにも関わらず認識されないなどの不具合がある場合は、一度torchをアンインストールして、 ご自身のcudaバージョンに合わせてPytorch 1.9.0をインストールされ直すことをおすすめします。

Text2Meshの実行

それでは早速Text2Meshを試してみます。
なお実行時のコマンドのサンプルは./demo/run_all.shに記載されています。

始めに"Santa Claus in a long coat"を入力してみます。

# text2mesh実行
$ python main.py \
--run branch --obj_path data/source_meshes/person.obj \
--output_dir results/demo/people/santa \
--prompt "Santa Claus in a long coat" \
--sigma 12.0  --clamp tanh \
--n_normaugs 4 --n_augs 1 --normmincrop 0.1 --normmaxcrop 0.4 \
--geoloss --colordepth 2 --normdepth 2 --frontview --frontview_std 4 --clipavg view \
--lr_decay 0.9 --clamp tanh --normclamp tanh  --maxcrop 1.0 \
--save_render --seed 29 --n_iter 1500  \
--learning_rate 0.0005 --normal_learning_rate 0.0005 --standardize \
--no_pe --symmetry --background 1 1 1

"Santa Claus in a long coat"の出力結果は以下の通りです。イテレーションが進むごとにオブジェクトが徐々に完成されていますね。

ロングコートを来たサンタの出力結果

--seedを変更すると、初期値として設定する乱数が変更されるため生成される3Dメッシュも異なります。
先ほどの"Santa Claus in a long coat"のseedを29から123に変更してみます。

# seed変更により同じテキストでも出力結果は変更される
$ python main.py \
--run branch --obj_path data/source_meshes/person.obj \
--output_dir results/demo/people/santa \
--prompt "Santa Claus in a long coat" \
--sigma 12.0  --clamp tanh \
--n_normaugs 4 --n_augs 1 --normmincrop 0.1 --normmaxcrop 0.4 \
--geoloss --colordepth 2 --normdepth 2 --frontview --frontview_std 4 --clipavg view \
--lr_decay 0.9 --clamp tanh --normclamp tanh  --maxcrop 1.0 \
--save_render --seed 123 --n_iter 1500  \
--learning_rate 0.0005 --normal_learning_rate 0.0005 --standardize \
--no_pe --symmetry --background 1 1 1
ロングコートを来たサンタの乱数変更後の出力結果

さきほどとは明らかに異なる出力結果が出力されました。先ほどよりビビッドな出力結果となりましたね。

objファイルさえ用意すれば人以外の生成も可能です。
以下は、"A horse in a green coat holding a carrot"の出力結果です。

# person以外の確認
$ python main.py \
--run branch --obj_path data/source_meshes/horse.obj \
--output_dir results/demo/horse/green --prompt "A horse in a green coat holding a carrot" \
--sigma 5.0 --geoloss --clamp tanh \
--n_normaugs 4 --n_augs 1 --normmincrop 0.1 \
--normmaxcrop 0.1 --colordepth 2 --normdepth 2 --frontview --frontview_std 4 --clipavg view \
--lr_decay 0.9 --clamp tanh --normclamp tanh --maxcrop 1.0 \
--save_render --seed 48240889 --save_render --n_iter 1500 \
--frontview_center 5.4 0.4
人参を咥えた緑のコートを着た馬の出力結果

人参の色が口以外の箇所にもマッピングされていますが、緑のコートの布のようなテクスチャが見事に再現されています。

まとめ

本記事では、Text2Meshで3Dメッシュの生成方法を紹介しました。
生成されたobjファイルはMtlLibを用いてオブジェクトとして読み込むことが可能です。
精度がさらに向上すれば3Dオブジェクトの作成が自動化される未来も訪れそうです。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1. 論文 - Text2Mesh: Text-Driven Neural Stylization for Meshes

2. GitHub - threedle/text2mesh

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology