今回の記事ではテキストから3Dオブジェクトを作成ができるShap-Eの実装を紹介します。
Google Colabを使用して簡単に実装できますので、ぜひ最後までご覧ください。
今回の内容
・Shap-Eとは
・Shap-Eの実装(テキストから3Dオブジェクト)
・Shap-Eの実装(画像から3Dオブジェクト)
Shap-Eとは
「Shap-E」は「条件付き生成モデル」と呼ばれ、特定の条件や指示に基づいて3Dオブジェクトを作成します。
Shap-Eのユニークな点は、他の同様のモデルと比較して単一の3Dオブジェクトを作成するだけでないことです。代わりに、それは「暗黙の関数」と呼ぶもののパラメータ、つまり数学的な説明を作成します。これらの関数は、テクスチャと光の効果を備えた詳細な3Dオブジェクトに変換できる3D形状のレシピのようなものです。これが著者が「テクスチャ付きメッシュとニューラル輝度フィールドとしてレンダリング」と表現する意味です。
Shap-Eの訓練は2つのステップで行われます。まず、研究者は「エンコーダ」を使用して3Dオブジェクトを暗黙の関数のパラメータに変換します。これは、完成したケーキからレシピを見つけ出すようなものと考えてください。次に、彼らはエンコーダからの結果に「条件付き拡散モデル」を訓練します。これは、訓練されたデータに似た新しいデータを生成する方法を学ぶコンピュータプログラムの一種を指します。ケーキの例えを使うと、私たちがレシピを見つけ出したケーキに似た新しい種類のケーキを焼く方法を学ぶようなものです。
詳細は以下のリンクからご確認ください。
Shap-Eの導入
ここからはGoogle colabを使用して、Shap-Eを実装していきましょう。
まずはGPUを使用できるように設定をします。
「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更
Googleドライブをマウントします。
from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive
!git clone https://github.com/openai/shap-e.git
%cd shap-e
必要なライブラリをインストールします。
!pip install -e .
テキストから3Dオブジェクト生成
まずはテキストを与えて、3Dオブジェクトを生成します。
import torch
from shap_e.diffusion.sample import sample_latents
from shap_e.diffusion.gaussian_diffusion import diffusion_from_config
from shap_e.models.download import load_model, load_config
from shap_e.util.notebooks import create_pan_cameras, decode_latent_images, gif_widget
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
xm = load_model('transmitter', device=device)
model = load_model('text300M', device=device)
diffusion = diffusion_from_config(load_config('diffusion'))
出力したいオブジェクトのプロンプトを指定します。以下の例では「prompt = “a shark”」としています。
batch_size = 4
guidance_scale = 15.0
prompt = "a shark"
latents = sample_latents(
batch_size=batch_size,
model=model,
diffusion=diffusion,
guidance_scale=guidance_scale,
model_kwargs=dict(texts=[prompt] * batch_size),
progress=True,
clip_denoised=True,
use_fp16=True,
use_karras=True,
karras_steps=64,
sigma_min=1e-3,
sigma_max=160,
s_churn=0,
)
render_mode = 'nerf'
size = 256 # this is the size of the renders; higher values take longer to render.
cameras = create_pan_cameras(size, device)
for i, latent in enumerate(latents):
images = decode_latent_images(xm, latent, cameras, rendering_mode=render_mode)
display(gif_widget(images))
3Dオブジェクトを生成することができました。
結果を保存することができます。
from shap_e.util.notebooks import decode_latent_mesh
for i, latent in enumerate(latents):
t = decode_latent_mesh(xm, latent).tri_mesh()
with open(f'example_mesh_{i}.ply', 'wb') as f:
t.write_ply(f)
with open(f'example_mesh_{i}.obj', 'w') as f:
t.write_obj(f)
画像から3Dオブジェクト生成
次に画像を与えて、3Dオブジェクトを生成します。
import torch
from shap_e.diffusion.sample import sample_latents
from shap_e.diffusion.gaussian_diffusion import diffusion_from_config
from shap_e.models.download import load_model, load_config
from shap_e.util.notebooks import create_pan_cameras, decode_latent_images, gif_widget
from shap_e.util.image_util import load_image
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
xm = load_model('transmitter', device=device)
model = load_model('image300M', device=device)
diffusion = diffusion_from_config(load_config('diffusion'))
入力する画像を「image = load_image(“./shap_e/examples/example_data/corgi.png”)」とします。
batch_size = 4
guidance_scale = 3.0
image = load_image("./shap_e/examples/example_data/corgi.png")
latents = sample_latents(
batch_size=batch_size,
model=model,
diffusion=diffusion,
guidance_scale=guidance_scale,
model_kwargs=dict(images=[image] * batch_size),
progress=True,
clip_denoised=True,
use_fp16=True,
use_karras=True,
karras_steps=64,
sigma_min=1e-3,
sigma_max=160,
s_churn=0,
)
render_mode = 'nerf'
size = 256
cameras = create_pan_cameras(size, device)
for i, latent in enumerate(latents):
images = decode_latent_images(xm, latent, cameras, rendering_mode=render_mode)
display(gif_widget(images))
同様に3Dオブジェクトが生成されました。
まとめ
最後までご覧いただきありがとうございました。
今回の記事ではテキストから3Dオブジェクトを作成ができるShap-Eの実装を紹介しました。