人工智能

文本到3D AI生成的工作原理:Meta 3D Gen、OpenAI Shap-E等

mm
Large Language and Text-to-3D Models
div]:bg-bg-300 [&_pre]:-mr-4 md:[&_pre]:-mr-9″>
_*]:min-w-0″>

从文本提示生成3D数字资产代表了人工智能和计算机图形学中最令人兴奋的最近发展之一。随着3D数字资产市场预计从2024年的283亿美元增长到2029年的518亿美元,文本到3D AI模型有望在游戏、电影、电子商务等行业的内容创作中发挥重要作用。但是,这些AI系统到底是如何工作的?在这篇文章中,我们将深入探讨文本到3D生成的技术细节。

3D生成的挑战

从文本生成3D资产比生成2D图像要复杂得多。2D图像基本上是像素的网格,而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. 神经辐射场(NeRFs):表示3D空间中的密度和颜色的神经网络

每种方法都有其在分辨率、内存使用和生成易用性方面的权衡。许多最近的模型使用隐式函数或NeRFs,因为它们可以在合理的计算要求下实现高质量的结果。

例如,我们可以将一个简单的球体表示为一个有符号距离函数:

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># Evaluate SDF at a 3D point
point = [0.5, 0.5, 0.5]
distance = sphere_sdf(*point)
print(f&quot;Distance to sphere surface: {distance}&quot;)

生成模型

文本到3D系统的核心是生成3D表示的生成模型。最先进的模型使用了一种扩散模型的变体,类似于用于2D图像生成的模型。

扩散模型通过逐渐向数据添加噪声,然后学习逆转此过程来工作。对于3D生成,这个过程发生在所选3D表示的空间中。

一个简化的扩散模型训练步骤的伪代码可能如下:

def diffusion_training_step(model, x_0, text_embedding):
# Sample a random timestep
t = torch.randint(0, num_timesteps, (1,))

<p># Add noise to the input
noise = torch.randn_like(x_0)
x_t = add_noise(x_0, noise, t)</p>

<p># Predict the noise
predicted_noise = model(x_t, t, text_embedding)</p>

<p># Compute loss
loss = F.mse_loss(noise, predicted_noise)</p>

return loss

<p># Training loop
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):
# Create a renderer
renderer = pr.MeshRenderer(
rasterizer=pr.MeshRasterizer(),
shader=pr.SoftPhongShader()
)</p>

<p># Set up camera
cameras = pr.FoVPerspectiveCameras()</p>

<p># Render
images = renderer(vertices, faces, cameras=cameras)</p>

return images

<p># Example usage
vertices = torch.rand(1, 100, 3) # Random vertices
faces = torch.randint(0, 100, (1, 200, 3)) # Random faces
rendered_images = render_mesh(vertices, faces)

对于隐式表示,如NeRFs,我们通常使用光线行进技术来渲染视图。

将所有组件整合起来:文本到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(&#039;bert-base-uncased&#039;)
self.diffusion_model = DiffusionModel()
self.refiner = RefinerNetwork()
self.renderer = DifferentiableRenderer()

<p>def forward(self, text_prompt):
# Encode text
text_embedding = self.text_encoder(text_prompt).last_hidden_state.mean(dim=1)</p>

<p># Generate initial 3D representation
initial_3d = self.diffusion_model(text_embedding)</p>

<p># Render multiple views
views = self.renderer(initial_3d, num_views=4)</p>

<p># Refine based on multi-view consistency
refined_3d = self.refiner(initial_3d, views)</p>

return refined_3d

<p># Usage
model = TextTo3D()
text_prompt = &quot;A red sports car&quot;
generated_3d = model(text_prompt)

可用的顶级文本到3D资产模型

3DGen – Meta

3DGen旨在解决从文本描述生成3D内容(如角色、道具和场景)的问题。

Large Language and Text-to-3D Models - 3d-gen

Large Language and Text-to-3D Models – 3d-gen

3DGen支持基于物理的渲染(PBR),这对于在现实世界应用中对3D资产进行重新照明是必不可少的。它还可以使用新的文本输入对以前生成或艺术家创建的3D形状进行生成性重新纹理。该管道集成了两个核心组件:Meta 3D AssetGen和Meta 3D TextureGen,它们分别处理文本到3D和文本到纹理的生成。

Meta 3D AssetGen

Meta 3D AssetGen(Siddiqui et al.,2024)负责从文本提示生成3D资产的初始生成。该组件生成一个带有纹理和PBR材质映射的3D网格,耗时约30秒。

Meta 3D TextureGen

Meta 3D TextureGen(Bensadoun et al.,2024)细化了AssetGen生成的纹理。它还可以根据额外的文本描述为现有的3D网格生成新的纹理。该阶段耗时约20秒。

Point-E(OpenAI)

Point-E,由OpenAI开发,是另一个值得注意的文本到3D生成模型。与DreamFusion不同,DreamFusion生成NeRF表示,而Point-E生成3D点云。

Point-E的关键特征:

a)两阶段管道:Point-E首先使用文本到图像扩散模型生成合成的2D视图,然后使用此图像来条件第二个扩散模型,生成3D点云。

b)效率:Point-E旨在计算效率高,能够在单个GPU上几秒钟内生成3D点云。

c)颜色信息:该模型可以生成彩色的点云,保留了几何和外观信息。

限制:

  • 与基于网格或NeRF的方法相比,保真度较低
  • 点云需要额外的处理才能用于许多下游应用程序

Shap-E(OpenAI):

在Point-E的基础上,OpenAI推出了Shap-E,它生成3D网格而不是点云。这解决了Point-E的一些局限性,同时保持了计算效率。

Shap-E的关键特征:

a)隐式表示:Shap-E学习生成3D对象的隐式表示(有符号距离函数)。

b)网格提取:该模型使用可微分的行进立方体算法将隐式表示转换为多边形网格。

c)纹理生成:Shap-E还可以为3D网格生成纹理,生成更具视觉吸引力的输出。

优势:

  • 快速生成时间(几秒到几分钟)
  • 直接网格输出,适合渲染和下游应用程序
  • 既可以生成几何形状,也可以生成纹理

GET3D(NVIDIA):

GET3D,由NVIDIA研究人员开发,是另一个强大的文本到3D生成模型,专注于生成高质量的有纹理的3D网格。

GET3D的关键特征:

a)显式表面表示:与DreamFusion或Shap-E不同,GET3D直接生成显式表面表示(网格),而无需中间的隐式表示。

b)纹理生成:该模型包括一个可微分的渲染技术,用于学习和生成3D网格的高质量纹理。

c)GAN-based架构:GET3D使用生成对抗网络(GAN)方法,这使得生成速度快,一旦模型训练完成。

优势:

  • 高质量的几何和纹理
  • 快速的推理时间
  • 直接集成到3D渲染引擎中

限制:

  • 需要3D训练数据,对于某些对象类别来说,这些数据可能很稀缺

结论

文本到3D AI生成代表了我们创建和交互3D内容的方式发生了根本性的转变。通过利用先进的深度学习技术,这些模型可以从简单的文本描述中生成复杂的高质量3D资产。随着技术的不断发展,我们可以期待看到越来越复杂和强大的文本到3D系统,它们将从游戏和电影到产品设计和建筑等行业带来革命性的变化。

我已经沉浸在了令人着迷的机器学习和深度学习世界中五年了。我的热情和专业知识让我为超过50个不同的软件工程项目做出了贡献,特别关注AI/ML。我的持续的好奇心也让我对自然语言处理产生了兴趣,这是一个我渴望进一步探索的领域。