关注我们.

人工智能

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

mm
更新 on
大型语言和文本到 3D 模型

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

3D 生成的挑战

从文本生成 3D 资产比生成 2D 图像要复杂得多。虽然 2D 图像本质上是像素网格,但 3D 资产需要在三维空间中表示几何图形、纹理、材质,通常还有动画。这种增加的维度和复杂性使生成任务更具挑战性。

文本到 3D 生成的一些关键挑战包括:

  • 表示 3D 几何和结构
  • 在 3D 表面上生成一致的纹理和材质
  • 从多个角度确保物理合理性和一致性
  • 同时捕捉精细细节和整体结构
  • 生成可轻松渲染或 3D 打印的资产

为了应对这些挑战,文本到 3D 模型利用了几种关键技术和技巧。

文本转 3D 系统的关键组件

大多数最先进的文本到 3D 生成系统都有一些共同的核心组件:

  1. 文字编码:将输入的文本提示转换成数值表示
  2. 3D 表示:一种表示三维几何和外观的方法
  3. 生成模型:生成 3D 资产的核心 AI 模型
  4. 渲染:将 3D 表示转换为 2D 图像以实现可视化

让我们更详细地探讨每一个问题。

文本编码

第一步是将输入的文本提示转换为 AI 模型可以使用的数字表示。这通常使用大型语言模型来完成,例如 BERT 或 GPT.

3D 表示

在 AI 模型中,有几种常见的表示 3D 几何的方法:

  1. 体素网格:表示占用或特征的三维数组
  2. 点云:3D 点集
  3. 网格:定义表面的顶点和面
  4. 隐式函数:定义表面的连续函数(例如有符号距离函数)
  5. 神经辐射场 (神经再生):表示 3D 空间中的密度和颜色的神经网络

每种方法在分辨率、内存使用量和生成难易程度方面都有所取舍。许多近期模型都使用隐式函数或 NeRF,因为它们可以在合理的计算要求下获得高质量的结果。

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

import numpy as np

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

# Evaluate SDF at a 3D point
point = [0.5, 0.5, 0.5]
distance = sphere_sdf(*point)
print(f"Distance to sphere surface: {distance}")

生成模型

文本到 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,))

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

# Predict the noise
predicted_noise = model(x_t, t, text_embedding)

# Compute loss
loss = F.mse_loss(noise, predicted_noise)

return loss

# 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

def render_mesh(vertices, faces, image_size=256):
    # Create a renderer
    renderer = pr.MeshRenderer(
        rasterizer=pr.MeshRasterizer(),
        shader=pr.SoftPhongShader()
    )
    
    # Set up camera
    cameras = pr.FoVPerspectiveCameras()
    
    # Render
    images = renderer(vertices, faces, cameras=cameras)
    
    return images

# 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)

对于像 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()
    
    def forward(self, text_prompt):
        # Encode text
        text_embedding = self.text_encoder(text_prompt).last_hidden_state.mean(dim=1)
        
        # Generate initial 3D representation
        initial_3d = self.diffusion_model(text_embedding)
        
        # Render multiple views
        views = self.renderer(initial_3d, num_views=4)
        
        # Refine based on multi-view consistency
        refined_3d = self.refiner(initial_3d, views)
        
        return refined_3d

# Usage
model = TextTo3D()
text_prompt = "A red sports car"
generated_3d = model(text_prompt)

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

3DGen – 元

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

大型语言和文本到 3D 模型 - 3d-gen

大型语言和文本到 3D 模型 – 3d-代

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

Meta 3D 资产生成器

Meta 3D AssetGen(Siddiqui 等人,2024 年)负责根据文本提示初始生成 3D 资源。此组件可在约 3 秒内生成带有纹理和 PBR 材质贴图的 30D 网格。

Meta 3D 纹理生成器

Meta 3D TextureGen(Bensadoun 等人,2024)细化 AssetGen 生成的纹理。它还可用于根据附加的文本描述为现有 3D 网格生成新纹理。此阶段大约需要 20 秒。

Point-E(OpenAI)

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

Point-E 的主要特点:

a) 两级流水线:Point-E 首先使用文本到图像的扩散模型生成合成的 2D 视图,然后使用该图像来调节产生 3D 点云的第二个扩散模型。

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

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

限制:

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

Shap-E(OpenAI):

在 Point-E 的基础上,OpenAI 推出了 p-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 的架构:GET3D 使用生成对抗网络(GAN)方法,模型训练完成后可以快速生成。

优点:

  • 高品质的几何形状和纹理
  • 推理时间快
  • 与 3D 渲染引擎直接集成

限制:

  • 需要 3D 训练数据,而对于某些对象类别而言,此类数据可能比较稀缺

结语

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

在过去的五年里,我一直沉浸在机器学习和深度学习的迷人世界中。 我的热情和专业知识使我为 50 多个不同的软件工程项目做出了贡献,特别关注人工智能/机器学习。 我持续的好奇心也吸引了我对自然语言处理的兴趣,这是我渴望进一步探索的领域。