ENGINEER BLOG

ENGINEER BLOG

話題の『Point-E』で3Dモデルをサクッと作ってみた!

こんにちは。
イノベーション本部の田中です。


さて、新年1発目は昨年末にオープンソース化された話題の『Point-E』を試してみたいと思います。


1. Point-E とは?

簡潔にまとめると、テキストから3Dモデルを生成するAIです。

テキストから直接3Dモデルを生成するのではなく、「テキストから平面画像を生成するモデル」と 「画像から3次元の点群を生成するモデル」を組み合わせて生成しています。 他の手法と比べて短時間で3Dモデルを生成できることが特徴です。

テキストから画像を生成する「DALL-E2」やチャットボットAI「ChatGPT」などで有名なOpenAIが開発し、GitHubにソースを公開しています。

公開されているサンプルは、テキストから点群を生成するモデル(text2pointcloud)の他に、 画像から点群を生成するモデル(image2pointcloud)、 点群からメッシュを生成するモデル(pointcloud2mesh)があります。

PointEの処理プロセス概要図(引用元:Point-E発表論文)

2. 試してみる

GitHubに公開されているサンプルをGoogle ColaboratoryのGPU環境で動かしていきます。


■環境準備

まずは、Google Colaboratoryのノートブックの設定をGPUに変更します。

続いて、公開されているリポジトリをクローンして、パッケージをインストールします。

!git clone https://github.com/openai/point-e.git
%cd point-e
!pip install .

これで環境準備はできました。
次はサンプルコードを実行していきます。


2-1. 画像から点群を生成、及びメッシュ生成

サンプルコード(image2pointcloud.ipynb)を使って、 画像から3Dモデルの生成を行ってみます。


入力する画像は以下を使いました。


■必要なライブラリのインポート

from PIL import Image
import torch
from tqdm.auto import tqdm

from point_e.diffusion.configs import DIFFUSION_CONFIGS, diffusion_from_config
from point_e.diffusion.sampler import PointCloudSampler
from point_e.models.download import load_checkpoint
from point_e.models.configs import MODEL_CONFIGS, model_from_config
from point_e.util.plotting import plot_point_cloud

■モデルの準備

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

print('creating base model...')
base_name = 'base40M' # use base300M or base1B for better results
base_model = model_from_config(MODEL_CONFIGS[base_name], device)
base_model.eval()
base_diffusion = diffusion_from_config(DIFFUSION_CONFIGS[base_name])

print('creating upsample model...')
upsampler_model = model_from_config(MODEL_CONFIGS['upsample'], device)
upsampler_model.eval()
upsampler_diffusion = diffusion_from_config(DIFFUSION_CONFIGS['upsample'])

print('downloading base checkpoint...')
base_model.load_state_dict(load_checkpoint(base_name, device))

print('downloading upsampler checkpoint...')
upsampler_model.load_state_dict(load_checkpoint('upsample', device))

■サンプラーの準備

sampler = PointCloudSampler(
    device=device,
    models=[base_model, upsampler_model],
    diffusions=[base_diffusion, upsampler_diffusion],
    num_points=[1024, 4096 - 1024],
    aux_channels=['R', 'G', 'B'],
    guidance_scale=[3.0, 3.0],
)

■画像を入力して推論を実行

# Load an image to condition on.
img = Image.open('point_e/examples/example_data/corgi.jpg') #colab上のパスを指定

# Produce a sample from the model.
samples = None
for x in tqdm(sampler.sample_batch_progressive(batch_size=1, model_kwargs=dict(images=[img]))):
    samples = x

■生成した点群の表示

pc = sampler.output_to_point_clouds(samples)[0]
fig = plot_point_cloud(pc, grid_size=3, fixed_bounds=((-0.75, -0.75, -0.75),(0.75, 0.75, 0.75)))

図:生成された点群

点群が生成されたので、次はサンプル「pointcloud2mesh.ipynb」を参考に、メッシュを生成していきます。


■足りないライブラリをインポート

from point_e.util.pc_to_mesh import marching_cubes_mesh
import skimage.measure

■モデルの準備

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

print('creating SDF model...')
name = 'sdf'
model = model_from_config(MODEL_CONFIGS[name], device)
model.eval()

print('loading SDF model...')
model.load_state_dict(load_checkpoint(name, device))

■メッシュの生成 ※解像度は128に設定

# Produce a mesh (with vertex colors)
mesh = marching_cubes_mesh(
    pc=pc,
    model=model,
    batch_size=4096,
    grid_size=128,
    # grid_size=32, # increase to 128 for resolution used in evals
    progress=True,
)

生成された画像はこちら👇



同じリポジトリ内に公開されているスクリプト(blender_script.py)を使って、Blenderでレンダリングすることも可能です。



結構きれいに生成されていますね。


2-2.テキストから点群を生成、及びメッシュ生成

今度はテキストから3Dモデルを作成してみます。 コードは上記と同様にサンプルコード(text2pointcloud.ipynb)が公開されていますので、割愛させていただきます。

・入力するテキスト:’a red motorcycle’の場合


・入力するテキスト:’a black car’の場合


・入力するテキスト:’a white rabbit’の場合


乗り物は形状も色も指定した通りに生成することができましたが、 最後のウサギは、入力テキストから”white”を外してもうまく生成できませんでした。


上記の他にもいくつかの入力を試してみましたが、 なかなか思うような結果は得られず、テキストからの生成は難しい印象を受けました。


3.まとめ

今回は話題の『Point-E』を試してみました。

画像やテキストから短時間で3Dモデルを生成することができました。
まだ生成が不得意な物もありそうですが、数分でサクッと3Dモデルを生成できてしまうのは驚きでした。


今後はスマホのカメラで撮影した画像から3Dモデルを生成するなど、色々と試してみたいと思います。