今回の記事ではテキストから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を実装していきましょう。

Open In Colab

まずは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”)」とします。

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の実装を紹介しました。

コメントを残す