NVIDIA Omniverse与GPT-4结合生成3D内容

news2024/11/16 3:30:16

全球各行业对 3D 世界和虚拟环境的需求呈指数级增长。3D 工作流程是工业数字化的核心,开发实时模拟来测试和验证自动驾驶车辆和机器人,操作数字孪生来优化工业制造,并为科学发现铺平新的道路。

如今,3D 设计和世界构建仍然是高度手动的。虽然 2D 艺术家和设计师已经拥有了辅助工具,但 3D 工作流程仍然充满了重复、乏味的任务。

为场景创建或查找对象是一个耗时的过程,需要长期磨练的专业 3D 技能,例如建模和纹理化。正确放置对象以及将 3D 环境艺术引导至完美需要数小时的微调。

为了减少手动、重复性任务并帮助创作者和设计师专注于工作中富有创意和乐趣的方面,NVIDIA 推出了众多 AI 项目,例如用于生成式AI/

人工智能的 变革

借助 ChatGPT,我们现在正在体验变革,各种技术水平的个人都可以使用日常语言与高级计算平台进行交互。大模型(LLM) 变得越来越复杂,当像 ChatGPT 这样的用户友好界面让每个人都可以使用它们时,它成为历史上增长最快的应用,推出后仅两个月就超过了 1 亿用户。现在,每个行业都计划利用人工智能的力量进行广泛的应用,例如药物发现、自主机器和虚拟助手。

最近,我们尝试了 OpenAI 的病毒式 ChatGPT 和新的 GPT-4 大型多模态模型,以展示开发可为NVIDIA Omniverse中的虚拟世界快速生成 3D 对象的自定义工具是多么容易。OpenAI 联合创始人 Ilya Sutskever 在GTC 2023上与 NVIDIA 创始人兼首席执行官黄仁勋的炉边聊天中表示,与 ChatGPT 相比,GPT-4 标志着“在许多方面都有相当大的改进” 。

通过将 GPT-4 与Omniverse DeepSearch(一种智能 AI应用,能够搜索未标记 3D 资产的海量数据库)相结合,我们能够快速开发一个自定义扩展,通过简单的基于文本的提示检索 3D 对象,并将它们自动添加到3D 场景。

AI生成3D内容

NVIDIA Omniverse(3D 应用程序开发平台)中的这一有趣实验向开发人员和技术美术人员展示了快速开发利用生成式 AI 来填充现实环境的自定义工具是多么容易。最终用户只需输入基于文本的提示即可自动生成和放置高保真对象,从而节省创建复杂场景通常所需的数小时时间。

从扩展生成的对象基于通用场景描述(USD) SimReady 资产。SimReady 资产是物理上精确的 3D 对象,可以在任何模拟中使用,并且其行为就像在现实世界中一样。

获取有关 3D 场景的信息

一切都从 Omniverse 中的场景开始。用户可以使用 Omniverse 中的铅笔工具轻松圈出一个区域,输入他们想要生成的房间/环境类型(例如仓库或接待室),然后单击一下即可创建该区域

创建 ChatGPT 提示

  ChatGPT提示由四部分组成:系统输入、用户输入示例、助手输出示例和用户提示。

让我们从适合用户场景的提示的各个方面开始。这包括用户输入的文本以及场景中的数据。

例如,如果用户想要创建一个接待室,他们会指定类似“这是我们会见客户的房间。确保有一套舒适的扶手椅、沙发和咖啡桌。” 或者,如果他们想要添加一定数量的项目,他们可以添加“确保至少包含 10 个项目”。

该文本与场景信息相结合,例如我们将在其中放置项目作为用户提示的区域的大小和名称

“接待室,7 x10 米,原点为( 0.0 , 0.0 , 0.0 )。这是我们会见客户
的房间。确保有一套舒适的扶手椅、沙发和咖啡桌”

将用户的文本与场景细节相结合的想法非常强大。在场景中选择一个对象并以编程方式访问其详细信息比要求用户编写提示来描述所有这些详细信息要简单得多。我怀疑我们会看到很多利用这种文本+场景到场景模式的 Omniverse 扩展。

除了用户提示之外,我们还需要使用系统提示和一两次训练来启动 ChatGPT。

为了创建可预测的、确定性的结果,人工智能根据系统提示和示例专门返回一个 JSON,其中所有信息都以明确定义的方式格式化,以便可以在 Omniverse 中使用。

以下是我们将发送的四部分提示。

系统提示

这为人工智能设置了约束和指令

您是一个区域生成专家。在给定一定大小的区域后,您可以生成适合该区域的物品列表,并将它们放置在正确的位置。

您在一个三维空间中操作,使用 X、Y、Z 坐标系。其中,X 代表宽度,Y 代表高度,Z 代表深度。坐标 (0.0, 0.0, 0.0) 表示默认的空间原点。

您从用户那里接收到区域的名称、X 和 Z 轴上的尺寸(以厘米为单位)、区域的原点(即区域中心点)。

您的回答只需生成包含以下信息的 JSON 文件:

  • area_name:区域名称
  • X:区域在 X 轴上的坐标
  • Y:区域在 Y 轴上的坐标
  • Z:区域在 Z 轴上的坐标
  • area_size_X:区域在 X 轴上的尺寸(厘米)
  • area_size_Z:区域在 Z 轴上的尺寸(厘米)
  • area_objects_list:区域中所有物品的列表

对于每个物品,您需要存储以下信息:

  • object_name:物品名称
  • X:物品在 X 轴上的坐标
  • Y:物品在 Y 轴上的坐标
  • Z:物品在 Z 轴上的坐标

每个物品的名称应包含适当的形容词。

请记住,物品应该放置在区域内,以创建最有意义的布局,并且它们不应重叠。所有物品必须位于区域尺寸的边界内;永远不要将物品放置在距离原点超过区域长度或深度的一半的位置。还要注意,物品应根据区域的原点分布在整个区域内,您也可以使用负值来正确显示物品,因为区域的原点始终位于区域的中心。

请记住,您只需生成 JSON 代码,不需要其他内容。这非常重要。

 用户输入示例

  这是用户可能提交的内容的示例。请注意,它是场景数据和文本提示的组合。

“接待室,7 x10m,原点为 ( 0.0 , 0.0 , 0.0 )。这是我们会见客户的房间
。确保有一套舒适的扶手椅、沙发和咖啡 桌”

辅助输出示例

这提供了人工智能必须使用的模板。请注意我们如何描述我们期望的JSON。

{
    "area_name": "Reception",
    "X": 0.0,
    "Y": 0.0,
    "Z": 0.0,
    "area_size_X": 700,
    "area_size_Z": 1000,
    "area_objects_list": [
        {
            "object_name": "White_Round_Coffee_Table",
            "X": -120,
            "Y": 0.0,
            "Z": 130
        },
        {
            "object_name": "Leather_Sofa",
            "X": 250,
            "Y": 0.0,
            "Z": -90
        },
        {
            "object_name": "Comfortable_Armchair_1",
            "X": -150,
            "Y": 0.0,
            "Z": 50
        },
        {
            "object_name": "Comfortable_Armchair_2",
            "X": -150,
            "Y": 0.0,
            "Z": -50
        }  ]
}

连接到 OpenAI

该提示通过 Python 代码从扩展发送到 AI。这在 Omniverse Kit 中非常简单,只需使用最新的O penAI Python 库的几个命令即可完成。请注意,我们正在将系统输入、示例用户输入和我们刚刚概述的示例预期助理输出传递给 OpenAI API。变量“response”将包含来自 ChatGPT 的预期响应。

# Create a completion using the chatGPT model   
 response = openai.ChatCompletion.create(
         model="gpt-3.5-turbo",
         # if you have access, you can swap to model="gpt-4",
                    messages=[
                            {"role": "system", "content": system_input},
                            {"role": "user", "content": user_input},
                            {"role": "assistant", "content": assistant_input},
                            {"role": "user", "content": my_prompt},
                             ]
                    )
    # parse response and extract text
    text = response["choices"][0]["message"]['content']

将 ChatGPT 的结果传递到 Omniverse DeepSearch API 并生成场景

然后,扩展程序会解析 ChatGPT JSON 响应中的项目,并将其传递到 Omnivere DeepSearch API。DeepSearch 允许用户使用自然语言查询搜索存储在 Omniverse Nucleus 服务器中的 3D 模型。

这意味着,例如,即使我们不知道沙发模型的确切文件名,我们也可以通过搜索“Comfortable Sofa”来检索它,这正是我们从 ChatGPT 中获得的。

DeepSearch 能够理解自然语言,通过向其询问“舒适的沙发”,我们会得到一份项目列表,我们乐于助人的人工智能图书馆员从我们当前资产库中选择的资产中确定了最适合的项目。它在这方面出奇地好,所以我们经常可以使用它返回的第一个项目,但当然,我们建立了选择,以防用户想要从列表中选择某些内容。

从那里,我们只需将对象添加到舞台即可。

将 DeepSearch 中的项目添加到 Omniverse 阶段

现在 DeepSearch 已返回结果,我们只需要将对象放入 Omniverse 中即可。在我们的扩展中,我们创建了一个名为 place_deepsearch_results() 的函数,它处理所有项目并将它们放置在场景中。

def place_deepsearch_results(gpt_results, query_result, root_prim_path):
        index = 0
        for item in query_result:
            # Define Prim          
            stage = omni.usd.get_context().get_stage()
            
            prim_parent_path = root_prim_path + item[‘object_name’].replace(" ", "_")
            parent_xForm = UsdGeom.Xform.Define(stage, prim_parent_path)
            
            prim_path = prim_parent_path + "/" + item[‘object_name’].replace(" ", "_")
            next_prim = stage.DefinePrim(prim_path, 'Xform')


            # Add reference to USD Asset
            references: Usd.references = next_prim.GetReferences()
            
            references.AddReference(
                assetPath="your_server://your_asset_folder" + item[‘asset_path’])


            # Add reference for future search refinement 
            config = next_prim.CreateAttribute("DeepSearch:Query", Sdf.ValueTypeNames.String)
            config.Set(item[‘object_name’])
            
           # translate prim
            next_object = gpt_results[index]
            index = index + 1
            x = next_object['X']
            y = next_object['Y']
            z = next_object['Z']

此方法用于放置项目,迭代我们从 GPT 获得的 query_result 项目,使用 USD API 创建和定义新原语,根据 gpt_results 中的数据设置其转换和属性。我们还将 DeepSearch 查询保存在美元的属性中,以便以后我们想再次运行 DeepSearch 时可以使用它。请注意,assetPath“your_server//your_asset_folder”是一个占位符,应替换为执行 DeepSearch 的文件夹的真实路径。

使用 DeepSearch 交换项目

然而,我们可能不喜欢第一次检索到的所有项目。因此,我们构建了一个小型配套扩展程序,允许用户浏览类似的对象并只需单击即可交换它们。借助 Omniverse,可以非常轻松地以模块化方式构建,因此您可以通过其他扩展轻松扩展您的工作流程。

这个配套扩展非常简单。它采用通过 DeepSearch 生成的对象作为参数,并提供两个按钮来从相关 DeepSearch 查询中获取下一个或上一个对象。例如,如果 USD 文件包含属性“DeepSearch:Query = Modern Sofa”,它将通过 DeepSearch 再次运行此搜索并获得下一个最佳结果。当然,您可以将其扩展为包含所有搜索结果图片的可视化 UI,类似于我们用于一般 DeepSearch 查询的窗口。为了使这个示例简单,我们只选择了两个简单的按钮。

请参阅下面的代码,其中显示了增加索引的函数,以及实际根据索引操作对象交换的函数replace_reference(self) 。

def increment_prim_index():
            if self._query_results is None:
                return 


            self._index = self._index + 1


            if self._index >= len(self._query_results.paths):
                self._index = 0


            self.replace_reference()


def replace_reference(self):
        references: Usd.references = self._selected_prim.GetReferences()
        references.ClearReferences()
        references.AddReference(
                assetPath="your_server://your_asset_folder" + self._query_results.paths[self._index].uri)

请注意,如上所述,路径“your_server://your_asset_folder”只是一个占位符,您应该将其替换为执行 DeepSearch 查询的 Nucleus 文件夹。

使用 DeepSearch 将灰色沙发替换为棕色沙发

这展示了如何通过结合 LLM 和 Omniverse API 的力量,可以创建增强创造力和加快流程的工具。

从 ChatGPT 到 GPT-4

OpenAI 的新 GPT-4 的主要进步之一是其在大型语言模型中增强的空间意识。

我们最初使用ChatGPT API,它基于GPT-3.5-turbo。虽然 GPT-4 提供了良好的空间感知,但它提供了更好的结果。您在上面视频中看到的版本使用的是 GPT-4。

GPT-4 相对于 GPT-3.5 在解决复杂任务和理解复杂指令方面有了很大的改进。因此,在设计文本提示“指导人工智能”时,我们可以更具描述性并使用自然语言

我们可以给人工智能非常明确的指令,例如:

  • “每个对象名称都应该包含一个适当的形容词。”
  • “请记住,对象应该放置在该区域中以创建尽可能最有意义的布局,并且它们不应该重叠。”
  • “所有物体都必须在区域大小的范围内;切勿将物体放置在距原点超过该区域长度 1/2 或深度 1/2 的位置。”
  • “还要记住,对象应该放置在相对于区域原点的整个区域上,并且您也可以使用负值来正确显示项目,因为区域的原点始终位于区域的中心。该地区。”

人工智能在生成响应时正确遵循这些系统提示的事实尤其令人印象深刻,因为人工智能表明对空间意识以及如何正确放置物品有很好的理解。使用 GPT-3.5 执行此任务的挑战之一是有时对象会在房间外或奇怪的位置生成。

GPT-4 不仅将物体放置在房间的正确边界内,而且还逻辑地放置物体:床头柜实际上会出现在床的一侧,咖啡桌将放置在两个沙发之间,等等。

构建您自己的 ChatGPT 支持的扩展

虽然这只是人工智能连接到 3D 空间后可以做什么的一个小演示,但我们相信它将为场景构建之外的各种工具打开大门。开发人员可以在 Omniverse 中构建人工智能驱动的扩展,用于照明、相机、动画、角色对话和其他优化创作者工作流程的元素。他们甚至可以开发工具将物理附加到场景并运行整个模拟。

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

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

相关文章

使用 wxPython和ECharts生成和保存HTML图表

使用wxPython和ECharts库来生成和保存HTML图表。wxPython是一个基于wxWidgets的Python GUI库,而ECharts是一个用于数据可视化的JavaScript库。 C:\pythoncode\blog\echartshow.py 参考网址:https://echarts.apache.org/v4/examples/zh/index.html 安装…

九宫格方式显示9个echarts效果

功能: 创建了一个简单的Web浏览器应用程序,使用wxPython库创建了一个主窗口,并在窗口中嵌入了九个Web浏览器面板。用户可以选择一个文件夹,并通过点击按钮打开多个网页,每个网页将在一个单独的Web浏览器面板中显示。这…

解决 adb install 错误INSTALL_FAILED_UPDATE_INCOMPATIBLE

最近给游戏出包,平台要求 v1 签名吧,AS 打包后,adb 执行安装到手机,我用的设备是google pixel6 , android 系统 13, 提示如下: adb install -r v5_android_202308161046.apk Performing Streamed Install a…

sql server 存储过程 set ansi_nulls set quoted_identifier,out 、output

SQL-92 标准要求在对空值(NULL) 进行等于 () 或不等于 (<>) 比较时取值为 FALSE。 当 SET ANSI_NULLS 为 ON 时&#xff0c;即使 column_name 中包含空值&#xff0c;使用 WHERE column_name NULL 的 SELECT 语句仍返回零行。即使 column_name 中包含非空值&#xff0c…

AI 绘画Stable Diffusion 研究(九)sd图生图功能详解-老照片高清修复放大

大家好&#xff0c;我是风雨无阻。 通过前面几篇文章的介绍&#xff0c;相信各位小伙伴&#xff0c;对 Stable Diffusion 这款强大的AI 绘图系统有了全新的认知。我们见识到了借助 Stable Diffusion的文生图功能&#xff0c;利用简单的几个单词&#xff0c;就可以生成完美的图片…

Java多线程实战

Java多线程实战 java多线程&#xff08;超详细&#xff09; java自定义线程池总结 Java创建线程方式 方法1&#xff0c;继承Thread类 方法2&#xff0c;实现Runable接口 方法2-2&#xff0c;匿名内部类形式lambda表达式 方法3&#xff0c;实现Callable接口&#xff0c;允许…

【Django】Task2 了解models和使用admin后台

文章目录 【Django】Task2 了解models和使用admin后台1.什么是models1.1常用字段类型说明1.2常用配置参数1.3models示例 2.使用Django的admin管理模块2.1admin管理模块介绍2.2创建管理员用户2.3定义models实体对象2.4注册对象2.5合并数据库2.6启动项目并进入管理后台 3.springb…

计算机视觉:从图像识别到目标检测的技术进展

随着人工智能领域的快速发展&#xff0c;计算机视觉技术在过去几年中取得了令人瞩目的进步。从最初的图像识别到如今的目标检测&#xff0c;技术的不断创新和突破让计算机在理解和解释图像中变得越来越强大。本文将带您走进这一令人兴奋的领域&#xff0c;探索计算机视觉从图像…

ssh远程连接服务器

一、远程连接服务器简介 二、连接加密技术简介 三、ssh服务配置 四、用户登录ssh服务 Enforcing会强制限制&#xff0c;如端口为22&#xff0c;可以访问&#xff0c;如果是2000端口&#xff0c;不能使用 Permissive是宽容的模式&#xff0c;不限制使用端口 Enforcing会重启失败…

C++ 用st协程库解决 一个客户端同时连接多个服务端的问题 State Thread st协程库 在程序中的运用

继之前的一篇文章 业务需求是这样 程序中配置了很多个网络设备 这些设备作为server端 每隔1分钟要通过socket去和设备通信 以此来实现 设备是否在线 默认最传统的方法 一个线程中 遍历这些设备 假设有30个设备 每个设备超时时间5秒 那么 遍历一遍需要30*5 150秒 如…

uniapp 小兔鲜儿 - 首页模块(2)

目录 热门推荐 首页 – 热门推荐组件 首页 – 获取热门推荐数据 首页 – 热门推荐数据类型并渲染 猜你喜欢 首页 – 猜你喜欢组件 首页 – 获取猜你喜欢数据 首页 – 猜你喜欢数据类型和渲染 首页 – 猜你喜欢分页准备 首页 – 猜你喜欢分页加载 首页 – 猜你喜欢分…

RabbitMQ启动服务报错1067解决方案

首先&#xff1a; 你的 Erlang正确下载安装&#xff0c;且配置完成环境变量&#xff0c;可在命令行键入erl&#xff0c;若显示erlang版本则说明环境变量配置成功。如下&#xff1a; 原因分析&#xff1a; 1. 电脑名称为中文 2. erlang和rabbitmq版本不匹配 3. 安装目录有空格…

211、仿真-基于51单片机土壤湿度智能盆栽灌溉报警Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&am…

诚迈科技荣膺小米“最佳供应商奖”

近日&#xff0c;诚迈科技受邀参加小米战略合作伙伴HBR总结会。诚迈科技以尽职尽责的合作态度、精益求精的交付质量荣膺小米公司颁发的最佳供应商奖&#xff0c;其性能测试团队荣获优秀团队奖。 诚迈科技与小米在手机终端方向一直保持着密切的合作关系&#xff0c;涉及系统框架…

机械臂-五次多项式与三次多项式对比

##1、三次多项式算法 代码如下&#xff1a; L(1) Link( d, 0.081, a ,-0.01 , alpha, pi/2 ,offset,0); L(2) Link( d, 0 , a , 0.099 , alpha, 0 ,offset,pi/2); L(3) Link( d, 0 , a , -0.01 , alpha,pi/2,offset,pi/2); L(4) Link( d, 0.1170.123,…

JVM中分代回收机制

为什么要分为新生代和老年代&#xff1f; 分为新生代&#xff08;Young Generation&#xff09;和老年代&#xff08;Old Generation&#xff09;是为了更有效地管理和优化内存的使用。 新生代主要存放生命周期较短的对象&#xff0c;例如方法的局部变量、临时变量等。由于这…

奥威BI财务数据分析方案:借BI之利,成就智能财务分析

随着智能技术的发展&#xff0c;各行各业都走上借助智能技术高效运作道路&#xff0c;财务数据分析也不例外。借助BI商业智能技术能够让财务数据分析更高效、便捷、直观立体&#xff0c;也更有助于发挥财务数据分析作为企业经营管理健康晴雨表的作用。随着BI财务数据分析经验的…

数据结构介绍

1、什么是数据结构呢&#xff1f; 计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。数据结构是为了更方便的管理和使用数据&#xff0c;需要结合具体的业务来进行选择。一般情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。…

STM32单片机并口通信编程实例:代码详解与应用案例

引言&#xff1a; 单片机并口通信是一种传统而常用的通信方式&#xff0c;通过并行方式进行数据传输。尽管串口通信在现代应用中更加普遍&#xff0c;但并口通信在一些特定领域的应用仍然具有重要意义。本文将介绍单片机并口通信的原理、配置和实践方法&#xff0c;并给出STM32…

中电金信通过KCSP认证 云原生能力获权威认可

中电金信通过KCSP&#xff08;Kubernetes Certified Service Provider&#xff09;认证&#xff0c;正式成为CNCF&#xff08;云原生计算基金会&#xff09;官方认证的 Kubernetes 服务提供商。 Kubernetes是容器管理编排引擎&#xff0c;底层实现为容器技术&#xff0c;是云原…