Shap-E|文本生成3D模型

由OpenAI发布的Point-E升级模型Shap-E,相比基于点云的显式生成模型text-to-3D,Shap-E直接生成隐函数的参数来渲染纹理网格和神经辐射场,在高维多表示输出空间实现更好的质量!

Shap-E|文本生成3D模型

OpenAI发布全新隐式text-to-3D模型Shap-E,速度依然炸裂,不过生成性能略有不足。去年12月,OpenAI曾发布Point-E模型,只需几秒钟即可根据文本生成3D资产,相比竞品模型DreamFusion提速大约600倍。最近OpenAI再次发布了一款升级模型Shap-E,相比基于点云的显式生成模型Point-E,Shap-E直接生成隐函数的参数来渲染纹理网格和神经辐射场,收敛速度更快,在更高维的多表示输出空间中实现了更好的样本质量!

论文链接:https://arxiv.org/pdf/2305.02463.pdf

项目教程

如果您是初学者,对于命令行不太理解,那么请按下键盘上的Win键+R键后,在弹出的新窗口内输入CMD并按下回车,打开CMD窗口,按顺序执行如下的每一条命令。

首先我们需要确认一个工作目录,用来存放shap-e的相关环境依赖文件。本站所选择的目录为D盘的根目录下openai.wiki文件夹,完整路径为:D:\openai.wiki\shap-e

检测D盘是否存在openai.wiki目录,没有则创建该文件夹。

if not exist D:\openai.wiki mkdir D:\openai.wiki

强制切换工作路径为D盘openai.wiki文件夹。

cd /d D:\openai.wiki

执行如下命令,自动获取Shap-E的GitHub文件至D:\openai.wiki目录内。

git clone https://github.com/openai/shap-e.git

备注:如果你无法通过Git下载,则可以通用网盘方式下载,然后解压至该目录即可。

Shap-E

提取密码 文件说明 文件大小 11.73MB 文件格式 ZIP 资源价格 免费 下载次数 3

GitHub

项目开源地址:https://github.com/openai/shap-e

环境部署

为不影响电脑中的现有环境,请一定要安装Conda,如果您不知道什么是Conda,或者未安装过Conda,请【点击此处】参阅该文章,安装部署Conda之后再继续以下步骤。

在CMD中执行下面的命令行,创建Conda虚拟环境至该项目的目录中,方便日后重装系统也能够正常使用,无需重新部署环境。

conda create -p D:\openai.wiki\shap-e\ENV python=3.9

执行完成上面的命令之后,将会在CMD窗口中看到Proceed ([y]/n)?提示,我们直接按下回车即可。

初始化Conda环境,避免后续可能报错。

conda init cmd.exe

激活已创建的Conda环境,这样我们可以将我们后续所需要的所有环境依赖都安装至此环境下。

conda activate D:\openai.wiki\shap-e\ENV

为避免出现问题,我们再次强制切换至shap-e的项目路径,确保一切可以正常安装。

cd /d D:\openai.wiki\shap-e

执行如下命令,将会自动根据项目脚本的配置下载所需依赖。

pip install -e .

但是我们目前仍然无法正常使用,因为官方文件中还缺少几个库,我们手动安装一下。

pip install pyyaml ipywidgets

上面我们已经安装了所有运行该项目的必要内容,目前我们通过文本来生成模型的,但目前是依赖于CPU方式来生成,速度极慢。

GPU

如果你的电脑CPU不够强劲,或者拥有英伟达显卡,那么本站非常建议您下载并安装PyTorch,不然生成3D模型的速度非常非常非常慢!

PyTorch

在安装PyTorch之前,您需要先前往官网(PyTorch)查看自己应该安装哪个版本。

请您像下图一样按顺序选择即可,依次选择Stable->Windows->Conda->Python->CUDA 11.8。

其中的Stable其实就是稳定版的PyTorch,Preview(Nightly)是每天更新的预览测试版,可能存在未知Bug,所以最好选择Stable版本。

如果您看到的不是CUDA 11.8,而是CUDA 11.9或更高的版本也没关系,只要前缀是CUDA即可。

在您按顺序选择好之后,复制下面的<Run this Command>的内容即可,例如本站所得到的为:

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

Shap-E|文本生成3D模型

将您所复制的代码直接粘贴至CMD窗口内执行,此时将会自动安装PyTorch和对应版本的CUDA,因为PyTorch比较大,所以等待时间会比较长,请不要中断该操作。

注意:一定要复制你自己得到的,尽量不要直接使用本站所给出的示例命令行!

模型下载

既然是生成式的AI,那么肯定是需要模型的,本站已经为您打包下载好啦。如果你不下载模型也是没关系的,在你第一次使用时,会自动下载模型。

shap_e_model_cache

提取密码 文件说明 文件大小 4.54GB 文件格式 RAR 资源价格 免费 下载次数 1

文本生成3D

我们首先需要使用代码编辑器,运行以下代码才能够生成3D模型,本站推荐使用VS Code,执行如下代码,将会自动生成一条鲨鱼🦈模型。

如果你希望生成其它模型,可修改prompt后的a shark部分为你想要的内容;如果你想生成更高精度的模型,可以修改size后的64为更大参数,例如128256512等。

⚠️注意:此脚本一定要保存在D:\openai.wiki\shap-e目录下,不然无法自动找到模型和相关依赖。

import torch
from IPython.display import display
from shap_e.util.notebooks import decode_latent_mesh

# 导入所需的模块和函数
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

#############################################################################

# 设置提示文本
prompt = "a shark"

# 设置批大小和引导比例
batch_size = 4
guidance_scale = 15.0

size = 64 # 这是渲染的尺寸,更高的值需要更长的时间来渲染。

#############################################################################

# 检查是否有可用的 CUDA 设备,并相应地设置设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 加载传输器模型和 text300M 模型
xm = load_model('transmitter', device=device)
model = load_model('text300M', device=device)

# 加载扩散配置
diffusion = diffusion_from_config(load_config('diffusion'))

# 使用指定的参数对潜在变量进行采样
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,
)

# 设置渲染模式(nerf 或 stf)
render_mode = 'nerf' # 你可以把它改成 'stf'

# 创建用于渲染的摄像机配置
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))

# 将潜在变量保存为网格的示例

for i, latent in enumerate(latents):
    t = decode_latent_mesh(xm, latent).tri_mesh()
    with open(f'example_mesh_{i}.obj', 'w') as f:
        t.write_obj(f)

我们执行完成后,将会在脚本的所在D:\openai.wiki\shap-e目录下生成4个名为example_mesh的obj格式模型,因为我们填写的batch_size参数为4

现在虽然可以正常生成模型,但是会得到以下报错。

D:\openai.wiki\shap-e\shap_e\models\stf\renderer.py:286: UserWarning: exception rendering with PyTorch3D: No module named 'pytorch3d'
  warnings.warn(f"exception rendering with PyTorch3D: {exc}")
D:\openai.wiki\shap-e\shap_e\models\stf\renderer.py:287: UserWarning: falling back on native PyTorch renderer, which does not support full gradients
  warnings.warn(

这代表我们未安装pytorch3d模块,所以无法正常渲染,我们后面来解决该问题。

PyTorch3D

为了能够正常渲染贴图,我们还需要添加PyTorch3D依赖库,该库的安装方式比较麻烦。而且需要对应的CUDA版本。

本站已经安装过其它版本的CUDA,如果本站更改了CDUA的版本,那么之前本站所部署的所有开源项目全部都可能无法正常使用,所以下面这部分内容本站并未实际操作。如果大家在安装时遇到困难,可前往【论坛】发帖救助。

先安装必要的依赖库,执行如下命令行。

conda install pytorch=1.13.0 torchvision pytorch-cuda=11.6 -c pytorch -c nvidia

CUB

此时还需要从 https://github.com/NVIDIA/cub/releases 下载CUB库并将其解压缩到您选择的文件夹中。 在生成之前定义环境变量CUB_HOME,并将其指向包含CUB的目录。

如果您不方便下载,本站也提供了国内网盘的下载地址。

cub-1.10.0

提取密码 文件说明 文件大小 626.89KB 文件格式 ZIP 资源价格 免费 下载次数 1

下载CUB文件后,将其解压至D:\openai.wiki目录下,完整目录为D:\openai.wiki\CUB

执行以下CMD命令行快速添加至系统环境变量内。需要注意的是,必须以管理员身份运行CMD

setx CUB_HOME "D:\openai.wiki\CUB" /M

此时分别执行如下两行内容,安装PyTorch3D即可。

conda install -c fvcore -c iopath -c conda-forge fvcore iopath
conda install -c conda-forge pytorch3d

模型载入

关于OBJ格式,这是三维行业的通用格式,类似于FBX。几乎所有三维DDC软件都是支持OBJ格式的,我们可以通过Maya、Blender、3D Max等软件载入OBJ模型。

Blender

关于Blender最简单安装方法,其实就是下载一个Steam,然后在商店内搜索安装,非常方便,而且相比于其它DDC软件,Blender体积更小,支持中文,无需购买,是完全开源的三维编辑器。

至于其它DDC软件专业性太强啦,如果非专业人员,不建议安装使用,最关键的问题是价格高昂。还是Blender更加便捷,也非常容易学习。

Blender下载

如果你不想安装Steam,那么也可以通过本站所提供的网盘下载Blender软件,安装步骤简单,点击下一步即可。

blender-3.5.1-windows-x64

提取密码 文件说明 文件大小 276.90MB 文件格式 MSI 资源价格 免费 下载次数 2

Blender导入OBJ

Blender文件导入Wavefront(.obj),然后选择D:\openai.wiki\shap-e目录下的example_mesh.obj模型即可。

图像生成3D

对图像进行采样,然后生成多角度的3D模型视图。

Shap-E|文本生成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

# 检查是否有可用的 CUDA 设备,并相应地设置设备
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'))

# 批次大小和引导尺度
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,
)

# 渲染模式(nerf 或 stf)
render_mode = 'nerf'  # 您可以将其更改为 'stf' 以进行网格渲染
size = 64  # 渲染的大小;更高的值需要更长的时间来渲染。

# 创建用于渲染的摄像机配置
cameras = create_pan_cameras(size, device)

# 对每个潜在变量进行解码和渲染
for i, latent in enumerate(latents):
    images = decode_latent_images(xm, latent, cameras, rendering_mode=render_mode)
    for j, image in enumerate(images):
        image_path = f"generated_image_{i}_{j}.png"
        image.save(image_path)
        print(f"保存图像:{image_path}")

    print(f"生成图像完成")

点云多视图渲染

加载 3D 模型或三网格,创建一批多视图渲染和点云,将它们编码为潜在,然后渲染回来。如果需要此功能,则必须安装Blender。

Blender

为此,请安装 Blender 版本 3.3.1 或更高版本,并将环境变量设置为 Blender 可执行文件的路径。

如果你是通过Steam安装的Blender,可以通过执行以下CMD命令行快速添加至系统环境变量内。需要注意的是,必须以管理员身份运行CMD。

setx BLENDER_PATH "C:\Program Files (x86)\Steam\steamapps\common\Blender" /M

如果是手动安装的Blnder,默认的安装路径为C:\Program Files\Blender Foundation\Blender 3.5。如果你的路径与本站的不一致,请手动修改,然后执行如下命令。

setx BLENDER_PATH "C:\Program Files\Blender Foundation\Blender 3.5" /M

代码示例

import torch
from IPython.display import display

# 导入所需的模块和函数
from shap_e.models.download import load_model
from shap_e.util.data_util import load_or_create_multimodal_batch
from shap_e.util.notebooks import create_pan_cameras, decode_latent_images, gif_widget

# 检查是否有可用的 CUDA 设备,并相应地设置设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 加载传输器模型
xm = load_model('transmitter', device=device)

# 模型路径
model_path = "/shap_e/examples/example_data/cactus/object.obj"

# 这可能需要几分钟,因为它需要在两种不同的模式下渲染模型两次。
batch = load_or_create_multimodal_batch(
    device,
    model_path=model_path,
    mv_light_mode="basic",
    mv_image_size=256,
    cache_dir="example_data/cactus/cached",
    verbose=True,  # 这将显示渲染过程中的 Blender 输出
)

# 禁用梯度计算
with torch.no_grad():
    # 将批次数据编码为潜在变量
    latent = xm.encoder.encode_to_bottleneck(batch)

    # 设置渲染模式(stf 或 nerf)
    render_mode = 'stf'  # 您可以将其更改为 'nerf'
    size = 128  # 当使用 nerf 时建议降低分辨率

    # 创建用于渲染的摄像机配置
    cameras = create_pan_cameras(size, device)

    # 解码潜在变量并生成图像
    images = decode_latent_images(xm, latent, cameras, rendering_mode=render_mode)

    # 显示图像
    display(gif_widget(images))

本站在执行此代码时会显示报错,没有权限,但是未找到解决办法,大家或许可以自行尝试一下。

总结

部分内容没能成功生成,也没有找到解决方法。最近其他的工作量太多了,所以文章输出量有所减少,以后尽量保证每天更新一篇。

如果以后有什么其它需要的教程内容,可以在本站的论坛内求助。

此文章由OpenAI开源维基百科原创发布,如若转载请注明出处:https://openai.wiki/shap-e.html

(0)
上一篇 2023-05-09 20:30
下一篇 2023-05-15 15:18

回复 shap-e

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(7条)

  • MaHEI
    MaHEI 2023-05-15 09:48

    不用每天一篇,太高工作量了,一周2-3篇精品差不多了

  • Morgen
    Morgen 2023-05-19 16:52

    请问shap_e_model_cache这个文件下载后怎么处理呢?是需要解压放在哪个目录下呢?

  • shap-e
    shap-e 2023-05-19 22:15

    t.write_obj(f),没有write_obj这个方法,只有write_ply这个方法。

    • PhiltreX
      PhiltreX 2023-05-19 23:11

      @shap-e这是报错信息吗?太少了,我看不出来什么,多给出一些。

    • shap-e
      shap-e 2023-05-21 09:57

      @PhiltreX是报错信息。后来发现是openai更新了代码,添加了write_obj这个方法,两周前下载的代码中,并没有这个方法,这是一个不错的方法。

微信