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下载,则可以通用网盘方式下载,然后解压至该目录即可。
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
将您所复制的代码直接粘贴至CMD窗口内执行,此时将会自动安装PyTorch和对应版本的CUDA,因为PyTorch比较大,所以等待时间会比较长,请不要中断该操作。
注意:一定要复制你自己得到的,尽量不要直接使用本站所给出的示例命令行!
模型下载
既然是生成式的AI,那么肯定是需要模型的,本站已经为您打包下载好啦。如果你不下载模型也是没关系的,在你第一次使用时,会自动下载模型。
文本生成3D
我们首先需要使用代码编辑器,运行以下代码才能够生成3D模型,本站推荐使用VS Code,执行如下代码,将会自动生成一条鲨鱼🦈模型。
如果你希望生成其它模型,可修改prompt
后的a shark
部分为你想要的内容;如果你想生成更高精度的模型,可以修改size
后的64
为更大参数,例如128
|256
|512
等。
⚠️注意:此脚本一定要保存在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文件后,将其解压至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导入OBJ
Blender
→文件
→导入
→Wavefront(.obj)
,然后选择D:\openai.wiki\shap-e
目录下的example_mesh.obj
模型即可。
图像生成3D
对图像进行采样,然后生成多角度的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))
本站在执行此代码时会显示报错,没有权限,但是未找到解决办法,大家或许可以自行尝试一下。
总结
部分内容没能成功生成,也没有找到解决方法。最近其他的工作量太多了,所以文章输出量有所减少,以后尽量保证每天更新一篇。
如果以后有什么其它需要的教程内容,可以在本站的论坛内求助。
不用每天一篇,太高工作量了,一周2-3篇精品差不多了
@MaHEI 感谢理解😭,强度真的好高,哈哈。
请问shap_e_model_cache这个文件下载后怎么处理呢?是需要解压放在哪个目录下呢?
@Morgen 直接解压出来,放到项目根目录即可。
t.write_obj(f),没有write_obj这个方法,只有write_ply这个方法。
@shap-e 这是报错信息吗?太少了,我看不出来什么,多给出一些。
@PhiltreX 是报错信息。后来发现是openai更新了代码,添加了write_obj这个方法,两周前下载的代码中,并没有这个方法,这是一个不错的方法。