用Shap-E生成3D模型

news2024/11/23 14:55:15

Shap-E 是 OpenAI 开发的突破性模型,它使用文本或图像作为输入生成一系列 3D 对象,以其创新方法改变了 3D 应用领域。 这项非凡的技术可以在 GitHub 上免费获取,允许用户在计算机上无缝运行它,而无需 OpenAI API 密钥或互联网连接。

Shap-E 真正引人注目的是它的多功能性:生成的 3D 对象可以在 Microsoft Paint 3D 等软件中打开,甚至可以转换为 STL 文件以进行 3D 打印。 凭借其独特的功能,Shap-E 正在重新定义我们处理文本到 3D 和图像到 3D 生成的方式,以及由此产生的人工智能应用的创造性可能性。
在这里插入图片描述

推荐:用 NSDT设计器 快速搭建可编程3D场景。

在本教程中,我们将学习如何在 Google Colab 中创建笔记本、设置和使用 OpenAI 的 Shape-E 模型来生成 3D 模型并使用 Blender Studio 对其进行自定义。

在开始之前,请访问 Blender.org 并下载与你的操作系统兼容的 Blender Studio。

1、设置Colab项目

让我们首先在 Google Colab 中创建新的笔记本。

转到 Google Colab 并创建新笔记本。
在这里插入图片描述

2、克隆存储库

现在,我们需要将 Shape 存储库克隆到你的 Google Colab Notebook。

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

进入 shap-e目录并安装依赖包:

%cd shap-e
!pip install -e .

3、实施和烘焙 3D 模型。

添加新的代码单元格 code cell。

在这里我们将导入所有必需的库。

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

单击“run”按钮或 CMD/CTRL + Enter 运行单个代码单元。

Coooooooooooooooooooool!

添加新的代码单元格。

在这里,我们将设备设置为 cuda(如果可用),否则设置为 cpu。

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

单击“run”或 CMD/CTRL + Enter。

添加新的代码单元格。

在这里我们将加载模型和权重。

xm = load_model('transmitter', device=device) 
model = load_model('text300M', device=device) 
diffusion = diffusion_from_config(load_config('diffusion')) 

单击“run”或 CMD/CTRL + Enter。

请耐心等待,加载模型和权重需要一些时间。 对我来说大约需要 5 分钟。 是的,当然这取决于你的互联网连接速度。

添加新的代码单元格。

在这里我们将生成 3D 模型。

batch_size = 1 # this is the size of the models, higher values take longer to generate.
guidance_scale = 15.0 # this is the scale of the guidance, higher values make the model look more like the prompt.
prompt = "a donut" # this is the prompt, you can change this to anything you want.

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

单击“run”或 CMD/CTRL + Enter。

生成 3D 模型需要一些时间,具体取决于你的批大小,较高的批大小将需要更长的时间来生成 3D 模型。 对我来说,生成 batch_size=1 的 3D 模型大约需要 22 秒。

添加新的代码单元格。

在这里,我们将渲染 3D 模型,使用 render_mode = ‘nerf’ 神经辐射场 (NeRF) 来渲染 3D 模型。 你可以将其更改为 render_mode = ‘stf’ 以使用风格传递函数 (STF) 渲染模式渲染 3D 模型。

render_mode = 'nerf' # you can change this to 'stf'
size = 64 # this is the size of the renders, higher values take longer to render.

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

单击“run”或 CMD/CTRL + Enter。

你看到模型在旋转吗? 很酷,对吧?

我们继续吧。

添加新的代码单元格。

在这里,我们将 3D 模型保存为 .ply 和 .obj 文件。

注意: .obj,稍后我们将使用它在 Blender Studio 中进行自定义。

# Example of saving the latents as meshes.
from shap_e.util.notebooks import decode_latent_mesh

for i, latent in enumerate(latents):
    t = decode_latent_mesh(xm, latent).tri_mesh()
    with open(f'example_mesh_{i}.ply', 'wb') as f: # this is three-dimensional geometric data of model.
        t.write_ply(f)
    with open(f'example_mesh_{i}.obj', 'w') as f: # we will use this file to customize in Blender Studio later.
        t.write_obj(f)

单击“run”或 CMD/CTRL + Enter。

将选项卡切换到文件并点击刷新。 你将看到 example_mesh_0.ply 和 example_mesh_0.obj 文件。

在这里插入图片描述

将 .obj 文件下载到本地计算机。

4、在 Blender Studio 中自定义 3D 模型

打开 Blender Studio 并创建新项目。
在这里插入图片描述

删除默认的立方体。
在这里插入图片描述

单击File > Import > Wavefront (.obj)。 选择你从 Google Colab 下载的 .obj 文件。
在这里插入图片描述

应该在中心看到 3D 模型。

在这里插入图片描述

哇!,它本身看起来很酷,不是吗? 顺便说一句,Shap-E 做得很好。

你可以根据需要自定义 3D 模型。

为了演示目的,我简单地将配料涂成粉红色,将甜甜圈涂成棕色。
在这里插入图片描述


原文链接:用Shap-E生成3D模型 — BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AAAI论文阅读

文章目录 Open-Vocabulary Multi-Label Classifcation via Multi-Modal Knowledge Transfer——知识蒸馏的范畴Med-EASi: Finely Annotated Dataset and Models for Controllable Simplifcation of Medical Texts——医学领域数据集构建“Nothing Abnormal”: Disambiguating M…

测试数据不会造?可以用这个工具Faker

在测试过程中,大家应该都遇到过各种各样的数据构造问题。e.g. 构造一批通讯录、构造一批用户三要素(姓名手机号身份证)、构造一批银行卡数据…… 这时候,测试数据大多数可能是这样的: 张三, 130 0000 0001 李四, 130 0000 0002 王五, 130 0000 0003 …

Scons编译lib库

实例目录结构: include文件夹:test.hsrc文件夹:test.cSConscriptSConstruct 如下图所示: SConstruct: #执行当前目录下的SConscript SConscript(SConscript);SConscript: import os from SCons.Script…

模拟实现消息队列项目(系列6) -- 网络通信协议的设计

目录 前言 1. 明确需求 2. 设计应用层协议 2. 定义Request 和 Response 3. 定义参数的父类 4. 定义其他参数类 4.1 创建交换机 4.2 删除交换机 4.3 创建队列 4.4 删除队列 4.5 创建绑定 4.6 删除绑定 4.7 发布消息 4.8 订阅消息 4.9 推送消息 结语 前言 上一章节,我们完成了虚拟…

实现栈和队列

文章目录 1.栈 1.1 栈的概念及结构 1.2 栈的实现 实现栈的标识索引 数组实现栈 栈的结构定义 栈空间数据的初始化和销毁 入栈和出栈 获取栈顶元素、计算栈空间元素个数、判空 2.队列 2.1 队列的概念及结构 2.2 链表的实现 实现链表的标识索引 链表实现队列 定…

JavaScript基础 第一天

本套笔记是通过学习B站Pink老师JavaScript核心进阶 前端必学总结的学习笔记,希望自己之后在使用的过程中能够将所学知识融会贯通 学习目标 1. 理解变量是存储数据的容器 2.理解什么是数据并知道数据的类型 3.知道JavaScript数据类型转换的特征 学习目录 1.Jav…

java 自定义xss校验注解实现

自定义一个注解Xss。名字随意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…

JVM垃圾回收篇-垃圾回收算法与五种引用

JVM垃圾回收篇-垃圾回收算法与五种引用 引用计数法 引用计数(英语:reference counting,RC)是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保…

mac安装open3d时候出现错误

在测试open3d是否正常顺利安装时&#xff0c;出现了如下错误&#xff1a; python -c "import open3d as o3d; print(o3d.__version__)" Traceback (most recent call last):File "<string>", line 1, in <module>File "/Users/huangzhe/…

【产品设计】消息通知系统设计

消息通知可以将内容实时送达用户手机页面&#xff0c;但是泛滥的消息通知会引起用户的反感&#xff0c;也违背了这个设计的初衷。 消息通知可以及时地将状态、内容的更新触达到用户&#xff0c;用户则可以根据收到的消息做后续判断。但是如果没有及时将重要消息触达到用户或者滥…

Java基础入门篇——数据类型(六)

目录 一、基本数据类型 1.1整型类型变量 1.2浮点型 1.3字符型 1.4布尔型 二、引用数据类型 Java是一个强类型语言&#xff0c;Java中的数据必须明确数据类型。数据类型的作用就是约束变量存储数据的形式。例如&#xff0c;定义为int类型存储整数&#xff0c;定义为double…

【分布式流控组件 Sentinel 快速入门】——图文详解操作流程

&#x1f4a7; 分布式流控组件 S e n t i n e l 快速入门 \color{#FF1493}{分布式流控组件 Sentinel 快速入门} 分布式流控组件Sentinel快速入门&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#…

ThreadPoolExecutor线程池详解

ThreadPoolExecutor线程池详解 1. 背景 项目最近的迭代中使用到了ThreadPoolExecutor线程池&#xff0c;之前都只是知道怎么用&#xff0c;没有了解过线程池的底层原理&#xff0c;项目刚上线&#xff0c;有时间整理一下线程池的用法&#xff0c;学习一下线程池的底层实现与工…

Stable Diffusion - Style Editor 和 Easy Prompt Selector 提示词插件配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132122450 Stable Diffusion 的 Prompt 的功能&#xff0c;可以用文字来描述想要生成的图像&#xff0c;根据输入来创造出逼真的图像。Prompt 支持…

Mysql面试题(查询重复数据删除重复数据)

Create table A (id int) 注意&#xff1a;id列非自增&#xff0c;由代码产生并输入&#xff0c;但代码可能产生重复id 1.业务定义中&#xff0c;id列不允许重复&#xff0c;用什么方式保证重复的id不会被输入表中&#xff1f; 2.若已经发生数据重复&#xff0c;请写出SQL语…

【C++进阶之路】继承与多态的概念考察

文章目录 一、问答题二、概念题三、答案与解析问答题概念题 一、问答题 什么是菱形继承&#xff1f;菱形继承的问题是什么&#xff1f;什么是菱形虚拟继承&#xff1f;如何解决数据冗余和二义性的。继承和组合的区别&#xff1f;什么时候用继承&#xff1f;什么时候用组合&…

9:00开始面试,9:08就出来了,这问题问的实在是····

外包工作3年&#xff0c;今年裸辞跳槽&#xff0c;很幸运的是找到了下家&#xff0c;不过 自从加入到这家公司&#xff0c;每天不是在加班就是在加班的路上&#xff0c;薪资倒是给的不少&#xff0c;所以我也就忍了。没想到6月一纸通知&#xff0c;所有人都不许加班&#xff0…

网络防御(9)

.一、SSL工作过程是什么&#xff1f; SSL位于应用层和传输层之间&#xff0c;它能够为基于TCP等可靠连接的应用层协议提供安全性保证。SSL协议本身分为两层&#xff1a; 上层为SSL握手协议&#xff08;SSL handshake protocol&#xff09;、SSLpassword变化协议&#xff08;S…

【locust】使用locust + boomer实现对接口的压测

目录 背景 环境安装 脚本编写 master slave节点&#xff08;golang/boomer&#xff09; 问题 资料获取方法 背景 很早之前&#xff0c;考虑单机执行能力&#xff0c;使用locust做过公司短信网关的压测工作&#xff0c;后来发现了一个golang版本的locust&#xff0c;性能…

HTML

HTML 1. 块级标签 标题&#xff1a; <h1>一级标题</h1> div: <div>这是一个div标签</div> p&#xff1a; <p>这是一个p标签&#xff0c;段落标签</p> <!DOCTYPE html> <html lang"en"> <head><meta charse…