AIモデルとプラットフォーム

テキストから3D生成AIのしくみ:Meta 3D Gen、OpenAI Shap-Eなど

mm
Unite.AI を Google の優先ソースに追加
div]:bg-bg-300 [&_pre]:-mr-4 md:[&_pre]:-mr-9″>
_*]:min-w-0″>

テキストから3Dデジタルアセットを生成する能力は、AIとコンピューターグラフィックスの分野で最も興奮する最近の発展の1つを表しています。3Dデジタルアセット市場は2024年の283億ドルから2029年に518億ドルまで成長することが予測されています。テキストから3D AIモデルは、ゲーム、映画、電子商取引などの業界でのコンテンツ作成を革命的に変える上で重要な役割を果たすことになります。しかし、これらのAIシステムはどのように機能するのでしょうか。この記事では、テキストから3D生成の背後にある技術的詳細に深く掘り下げます。

3D生成の課題

テキストから3Dアセットを生成することは、2Dイメージ生成よりもはるかに複雑なタスクです。2Dイメージは基本的にピクセルのグリッドですが、3Dアセットには、3D空間における幾何学、テクスチャ、材料、そしてしばしばアニメーションを表現する必要があります。この追加の次元性と複雑さにより、生成タスクははるかに困難になります。

テキストから3D生成の重要な課題には、以下のものがあります。

  • 3D幾何学と構造の表現
  • 3D表面全体にわたる一貫したテクスチャと材料の生成
  • 複数の視点からの物理的妥当性と一貫性の確保
  • 同時に細かい詳細と全体的な構造を捉える
  • レンダリングまたは3Dプリンティングが容易なアセットを生成する

これらの課題に対処するために、テキストから3Dモデルは、いくつかの重要な技術と手法を利用しています。

テキストから3Dシステムの重要なコンポーネント

ほとんどの最先端のテキストから3D生成システムには、以下の共通の重要なコンポーネントがあります。

  1. テキストエンコーディング:入力テキストプロンプトを数値表現に変換する
  2. 3D表現:3D幾何学と外観を表現する方法
  3. 生成モデル:3Dアセットを生成するためのコアAIモデル
  4. レンダリング:3D表現を2Dイメージに変換するために使用される手法

これらの各コンポーネントについて詳しく見てみましょう。

テキストエンコーディング

最初のステップは、入力テキストプロンプトをAIモデルが処理できる数値表現に変換することです。これは、通常、大規模な言語モデル(例:BERTまたはGPT)を使用して行われます。

3D表現

3D幾何学をAIモデルで表現する一般的な方法には、以下のものがあります。

  1. ボクセルグリッド:占有または特徴を表す3D配列
  2. 点群:3D点のセット
  3. メッシュ:頂点と面で定義される表面
  4. 暗黙的関数:表面を定義する連続関数(例:符号付き距離関数)
  5. ニューラル放射率場(NeRF):3D空間における密度と色を表すニューラルネットワーク

それぞれが解像度、メモリ使用量、生成の容易さなどのトレードオフを持っています。最近の多くのモデルでは、暗黙的関数またはNeRFを使用して、高品質の結果を合理的な計算要件で実現しています。

例えば、単純な球体を符号付き距離関数として表現できます。

import numpy as np

<p>def sphere_sdf(x, y, z, radius=1.0):
return np.sqrt(x**2 + y**2 + z**2) - radius</p>

<p># 3D点でSDFを評価する
point = [0.5, 0.5, 0.5]
distance = sphere_sdf(*point)
print(f"球面への距離:{distance}")</p>

</div>
</div>
</div>
<h3 class="font-bold">生成モデル</h3>
<p class="whitespace-pre-wrap break-words">テキストから3Dシステムのコアは、3D表現を生成するための生成モデルです。ほとんどの最先端モデルは、2Dイメージ生成で使用されるものと同様の拡散モデルのバリエーションを使用しています。</p>
<p class="whitespace-pre-wrap break-words">拡散モデルは、データに徐々にノイズを追加し、次にこのプロセスを逆にすることを学習することで機能します。3D生成の場合、このプロセスは選択された3D表現の空間で発生します。</p>
<p class="whitespace-pre-wrap break-words">拡散モデルのトレーニングステップの簡略化された疑似コードは、以下のようになります。</p>

<div class="relative flex flex-col rounded-lg">
<div class="pointer-events-none sticky z-20 my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0">
<div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md">

[code language="PYTHON"]
def diffusion_training_step(model, x_0, text_embedding):
# ランダムなタイムステップをサンプリングする
t = torch.randint(0, num_timesteps, (1,))

<p># 入力にノイズを追加する
noise = torch.randn_like(x_0)
x_t = add_noise(x_0, noise, t)</p>

<p># ノイズを予測する
predicted_noise = model(x_t, t, text_embedding)</p>

<p># ロスを計算する
loss = F.mse_loss(noise, predicted_noise)</p>

return loss

<p># トレーニングループ
for batch in dataloader:
x_0, text = batch
text_embedding = encode_text(text)
loss = diffusion_training_step(model, x_0, text_embedding)
loss.backward()
optimizer.step()

生成の際には、純粋なノイズから開始し、テキストエンベッディングに条件づけて反復的に除ノイズします。

レンダリング

結果を視覚化し、トレーニング中にロスを計算するために、3D表現を2Dイメージにレンダリングする必要があります。これは、レンダリングプロセスを介して勾配が流れることを可能にする、微分可能なレンダリング技術を使用して行われます。

メッシュベースの表現の場合、ラスタライズベースのレンダラーを使用することができます。

import torch
import torch.nn.functional as F
import pytorch3d.renderer as pr

<p>def render_mesh(vertices, faces, image_size=256):
# レンダラーを作成する
renderer = pr.MeshRenderer(
rasterizer=pr.MeshRasterizer(),
shader=pr.SoftPhongShader()
)</p>

<p># カメラを設定する
cameras = pr.FoVPerspectiveCameras()</p>

<p># レンダリングする
images = renderer(vertices, faces, cameras=cameras)</p>

return images

<p># 例
vertices = torch.rand(1, 100, 3) # ランダムな頂点
faces = torch.randint(0, 100, (1, 200, 3)) # ランダムな面
rendered_images = render_mesh(vertices, faces)

暗黙的表現(NeRFなど)の場合、レンダリングには通常、レイマーチング技術を使用します。

全体のまとめ:テキストから3Dパイプライン

ここで、重要なコンポーネントを説明したので、典型的なテキストから3D生成パイプラインの全体像を見てみましょう。

  1. テキストエンコーディング:入力プロンプトを密なベクトル表現に変換する
  2. 初期生成:拡散モデルが、テキストエンベッディングに条件づけて、初期の3D表現(NeRFや暗黙的関数など)を生成する
  3. マルチビューの一貫性:生成された3Dアセットの複数のビューをレンダリングし、視点間の一貫性を確保する
  4. 精緻化:追加のネットワークが、幾何学、テクスチャ、詳細を精緻化する
  5. 最終出力:3D表現を、下流アプリケーションで使用するために望ましい形式(テクスチャ付きメッシュなど)に変換する

ここに、簡略化された例を示します。

class TextTo3D(nn.Module):
def __init__(self):
super().__init__()
self.text_encoder = BertModel.from_pretrained('bert-base-uncased')
self.diffusion_model = DiffusionModel()
self.refiner = RefinerNetwork()
self.renderer = DifferentiableRenderer()

<p>def forward(self, text_prompt):
# テキストをエンコードする
text_embedding = self.text_encoder(text_prompt).last_hidden_state.mean(dim=1)</p>

<p># 初期の3D表現を生成する
initial_3d = self.diffusion_model(text_embedding)</p>

<p># 複数のビューをレンダリングする
views = self.renderer(initial_3d, num_views=4)</p>

<p># マルチビューの一貫性に基づいて精緻化する
refined_3d = self.refiner(initial_3d, views)</p>

return refined_3d

<p># 例
model = TextTo3D()
text_prompt = "赤いスポーツカー"
generated_3d = model(text_prompt)

利用可能なトップテキストから3Dアセットモデル

3DGen – Meta

3DGenは、テキストから3Dコンテンツ(キャラクター、プロップ、シーンなど)を生成する問題に対処するように設計されています。

大規模言語とテキストから3Dモデル – 3d-gen

3DGenは、物理ベースのレンダリング(PBR)をサポートしており、これはリアルな3Dアセットの再照明に不可欠です。また、既存の3D形状に対して新しいテクスチャを生成することもできます。パイプラインには、テキストから3Dとテキストからテクスチャの生成を担当する2つの重要なコンポーネント、Meta 3D AssetGenとMeta 3D TextureGenが含まれています。

Meta 3D AssetGen

Meta 3D AssetGen(Siddiqui et al.、2024)は、テキストプロンプトから3Dアセットを初期生成する責任を負います。このコンポーネントは、約30秒でテクスチャとPBRマテリアルマップを備えた3Dメッシュを生成します。

Meta 3D TextureGen

Meta 3D TextureGen(Bensadoun et al.、2024)は、AssetGenによって生成されたテクスチャを精緻化します。また、既存の3Dメッシュに対して新しいテクスチャを生成することもできます。このステージでは、約20秒かかります。

Point-E(OpenAI)

Point-Eは、OpenAIによって開発された別の注目すべきテキストから3D生成モデルです。DreamFusionとは異なり、Point-EはNeRF表現ではなく3D点群を生成します。

Point-Eの重要な機能:

a)2段階のパイプライン:Point-Eは、テキストからイメージの拡散モデルを使用して、合成の2Dビューを生成し、次にこのイメージを条件として、2番目の拡散モデルを使用して3D点群を生成します。

b)効率性:Point-Eは、計算効率が高く、単一のGPUで数秒で3D点群を生成できます。

c)色情報:モデルは、幾何学的情報とともに色情報を保持したカラーポイントクラウドを生成できます。

制限:

  • メッシュベースまたはNeRFベースのアプローチに比べて、精度が低い
  • 多くの下流アプリケーションでは、追加の処理が必要

Shap-E(OpenAI)

Point-Eを基にして、OpenAIは、3Dメッシュを生成するShap-Eを導入しました。これにより、Point-Eのいくつかの制限が解消され、計算効率が維持されます。

Shap-Eの重要な機能:

a)暗黙的表現:Shap-Eは、3Dオブジェクトの暗黙的表現(符号付き距離関数など)を生成することを学習します。

b)メッシュ抽出:モデルは、可微分なマーチングキューブアルゴリズムの実装を使用して、暗黙的表現からポリゴンメッシュを抽出します。

c)テクスチャ生成:Shap-Eは、3Dメッシュのテクスチャも生成できます。これにより、より視覚的に美しい出力が得られます。

利点:

  • 高速な生成時間(数秒から数分)
  • レンダリングや下流アプリケーションに適した直接メッシュ出力
  • 幾何学とテクスチャの両方を生成する能力

GET3D(NVIDIA)

NVIDIAの研究者によって開発されたGET3Dは、高品質のテクスチャ付き3Dメッシュを生成することに重点を置いた、別の強力なテキストから3D生成モデルです。

GET3Dの重要な機能:

a)明示的な表面表現:GET3Dは、DreamFusionやShap-Eとは異なり、暗黙的表現を介さずに、明示的な表面表現(メッシュ)を直接生成します。

b)テクスチャ生成:モデルには、可微分なレンダリング技術が含まれており、高品質のテクスチャを生成および学習することができます。

c)GANベースのアーキテクチャ:GET3Dは、生成対抗ネットワーク(GAN)アプローチを使用しており、モデルがトレーニングされた後は、高速な生成が可能です。

利点:

  • 高品質の幾何学とテクスチャ
  • 高速な推論時間
  • 3Dレンダリングエンジンとの直接統合

制限:

  • 一部のオブジェクトカテゴリでは、3Dトレーニングデータが不足している可能性がある

結論

テキストから3D AI生成は、3Dコンテンツの作成方法に根本的な変化をもたらします。高度なディープラーニング技術を利用することで、これらのモデルは、単純なテキスト説明から複雑な高品質の3Dアセットを生成できます。技術が進化するにつれて、ゲーム、映画、製品デザイン、建築など、さまざまな業界を革命的に変える、さらに高度で能力のあるテキストから3Dシステムの出現が期待されます。

私は過去5年間、機械学習とディープラーニングの魅力的世界に没頭してきました。私の情熱と専門知識は、AI/MLに特に焦点を当てた50以上の多様なソフトウェアエンジニアリングプロジェクトに貢献することになりました。私の継続的な好奇心は、自然言語処理という分野にも私を引き付け、さらに探求したいと思っています。