前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ChatGPT 和 GPT-4 如何用于 3D 内容生成

ChatGPT 和 GPT-4 如何用于 3D 内容生成

作者头像
GPUS Lady
发布于 2023-05-30 00:14:40
发布于 2023-05-30 00:14:40
1.2K00
代码可运行
举报
文章被收录于专栏:GPUS开发者GPUS开发者
运行总次数:0
代码可运行

Lady说:最近ChatGPT实在太火,如何把ChatGPT用在平时的开发上呢?这篇文章或许能给您一点点启发。

文章翻译自NVIDIA的一个社交平台,原文链接:

https://medium.com/@nvidiaomniverse/chatgpt-and-gpt-4-for-3d-content-generation-9cbe5d17ec15#cid=ov01_so-yout_en-us

全球各行业对于三维世界和虚拟环境的需求正在以指数级增长。三维工作流是工业数字化的核心,用于开发实时模拟以测试和验证自主车辆和机器人,操作数字孪生以优化工业制造,并为科学发现铺平新道路。

如今,三维设计和世界构建仍然高度依赖手动操作。尽管二维艺术家和设计师已经拥有了辅助工具,但三维工作流仍然充满了重复乏味的任务。

创建或寻找场景中的物体是一个耗时的过程,需要像建模和贴图这样经过时间磨练的专业三维技能。正确放置物体和完美地指导三维环境需要数小时的微调。

为了减少手动重复任务,帮助创作者和设计师专注于创造性和愉悦的工作方面,NVIDIA 推出了许多人工智能项目,如生成式人工智能工具,用于虚拟世界。

AI的iPhone时刻

通过ChatGPT,我们现在正在经历人工智能的iPhone时刻,人们可以使用日常语言与先进的计算平台进行交互,而不受技术水平的限制。大语言模型(LLMs)已经越来越复杂,当像ChatGPT这样的用户友好界面使它们对每个人都可访问时,它成为历史上增长最快的消费应用程序,仅在推出两个月后就超过了1亿用户。现在,每个行业都计划利用人工智能的力量,用于药物发现、自主机器和头像虚拟助手等各种应用。

最近,我们通过OpenAI的病毒式ChatGPT和新的GPT-4大型多模态模型进行了实验,展示了如何轻松开发定制工具,以快速生成NVIDIA Omniverse虚拟世界的3D物体。与ChatGPT相比,GPT-4在许多方面都有“相当大的改进”,OpenAI联合创始人Ilya Sutskever在2023 GTC上与NVIDIA创始人兼首席执行官Jensen Huang的火热对话中表示。

通过将GPT-4与Omniverse DeepSearch相结合,Omniverse DeepSearch是一种智能的人工智能图书管理员,可以搜索大量未标记的3D资产数据库,我们能够快速开发自定义扩展程序,使用简单的基于文本的提示检索3D对象,并自动将它们添加到3D场景中。

AI Room生成器扩展

这个有趣的实验在NVIDIA Omniverse中展示了开发人员和技术艺术家如何轻松快速地开发定制工具,利用生成式人工智能来填充逼真的环境。最终用户可以简单地输入基于文本的提示,自动生成和放置高保真度的物体,节省了通常需要创建复杂场景所需的数小时的时间。

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

获取关于3D场景的信息

一切都始于Omniverse中的USD场景。用户可以使用Omniverse中的Pencil工具轻松地圈定一个区域,输入他们想要生成的房间/环境的类型,例如一个仓库或一个接待室,只需一个点击,该区域就会被创建。

创建ChatGPT的提示(Prompt)

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

让我们从适应用户情境的提示方面开始。这包括用户输入的文本和场景数据。

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

这些文本与场景信息(例如我们将放置物品的区域的大小和名称)结合在一起作为用户提示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
“Reception room, 7x10m, origin at (0.0,0.0,0.0). This is the room where we meet 
our customers. Make sure there is a set of comfortable armchairs, a sofa and a 
coffee table”

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

除了用户提示,我们还需要为ChatGPT准备一个系统提示和一两个训练用的镜头。

为了创建可预测、确定性的结果,通过系统提示和示例,指示AI专门返回一个JSON,其中包含以规定的方式格式化的所有信息,以便在Omniverse中使用。

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

系统提示这为 AI 设置了约束和指令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
You are an area generator expert. Given an area of a certain size, you can generate a list of items that are appropriate to that area, in the right place.


You operate in a 3D Space. You work in a X,Y,Z coordinate system. X denotes width, Y denotes height, Z denotes depth. 0.0,0.0,0.0 is the default space origin.


You receive from the user the name of the area, the size of the area on X and Z axis in centimeters, the origin point of the area (which is at the center of the area).


You answer by only generating JSON files that contain the following information:


- area_name: name of the area
- X: coordinate of the area on X axis
- Y: coordinate of the area on Y axis
- Z: coordinate of the area on Z axis
- area_size_X: dimension in cm of the area on X axis
- area_size_Z: dimension in cm of the area on Z axis
- area_objects_list: list of all the objects in the area

For each object you need to store:
- object_name: name of the object
- X: coordinate of the object on X axis
- Y: coordinate of the object on Y axis
- Z: coordinate of the object on Z axis


Each object name should include an appropriate adjective.


Keep in mind, objects should be placed in the area to create the most meaningful layout possible, and they shouldn't overlap.
All objects must be within the bounds of the area size; Never place objects further than 1/2 the length or 1/2 the depth of the area from the origin.
Also keep in mind that the objects should be disposed all over the area in respect to the origin point of the area, and you can use negative values as well to display items correctly, since the origin of the area is always at the center of the area.


Remember, you only generate JSON code, nothing else. It's very important.

用户输入示例

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"Reception room, 7x10m, origin at (0.0,0.0,0.0). This is the room where we meet 
our customers. Make sure there is a set of comfortable armchairs, a sofa and a 
coffee table"

Assistant Output 示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "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中,这非常容易,只需使用最新的OpenAI Python库中的几个命令即可完成。请注意,我们正在向OpenAI API传递系统输入、示例用户输入和我们刚刚概述的示例期望助手输出。变量“response”将包含ChatGPT预期的响应。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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响应中的项目解析为扩展,并传递给Omniverse DeepSearch API。DeepSearch允许用户使用自然语言查询在Omniverse Nucleus服务器中存储的3D模型。

这意味着,即使我们不知道沙发模型的确切文件名,例如,我们只需搜索“舒适沙发”,就可以检索到它,这正是我们从ChatGPT中获得的信息。

DeepSearch理解自然语言,通过要求“舒适沙发”,我们可以得到一个清单,这是我们有用的AI图书管理员从我们当前的资产库中选择的最佳匹配项。这在很大程度上非常出色,因此我们通常可以使用它返回的第一个项,但是当然我们也可以提供选择,以防用户想从列表中选择某些东西。

然后,我们只需将对象添加到场景中即可。

将DeepSearch中的项目添加到Omniverse场景中

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 获取的查询结果项,使用 USD API 创建和定义新的基元,根据 gpt_results 中的数据设置它们的变换和属性。我们还将 DeepSearch 查询保存在 USD 中的一个属性中,以便在以后需要重新运行 DeepSearch 时可以使用。请注意,assetPath "your_server//your_asset_folder" 是一个占位符,应该用 DeepSearch 执行的文件夹的真实路径来替换它。

这样,我们就可以在 Omniverse 中得到我们的 AI 生成的场景!

使用 DeepSearch 进行物品交换

然而,我们可能不喜欢第一次检索到的所有物品。因此,我们构建了一个小型的伴侣扩展程序,允许用户浏览类似的物品并通过一键替换它们。在 Omniverse 中,构建模块化方式非常容易,因此您可以轻松地使用附加扩展程序扩展您的工作流程。

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

请查看下面的代码,显示了递增索引的函数以及实际执行基于索引交换对象的 replace_reference(self) 函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 将一张灰色的沙发替换了一张棕色的沙发。

这展示了如何通过结合 LLMs 和 Omniverse APIs 的功能,可以创建能够促进创造力和加速流程的工具。

从 ChatGPT 到 GPT-4

OpenAI 的新 GPT-4 的主要进步之一是它在大型语言模型中增加了空间感知能力。

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

相比 GPT-3.5,GPT-4 在解决复杂任务和理解复杂指令方面得到了极大的改进。因此,在“指导 AI”时,我们可以更加描述性和使用自然语言来工程化文本提示。

我们可以给 AI 提供非常明确的指示,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
“每个物体的名称应包含适当的形容词。”
“请记住,物品应该放置在区域内,以创建最有意义的布局,不应重叠。”
“所有物品必须在区域大小的范围内; 不能将物品放置在距离原点区域长度的1/2或深度的1/2之外。”
“还要记住,物品应该在区域的原点周围放置,您还可以使用负值来正确显示物品,因为区域的原点始终位于区域的中心。”

AI 在生成响应时能够适当地遵循这些系统提示的事实特别令人印象深刻,因为 AI 展示了良好的空间意识和正确放置物品的能力。使用 GPT-3.5 进行此任务的一个挑战是,有时物体会生成在房间外或奇怪的位置。

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

因此,我们可能只是揭示了 LLM 在三维空间中能做什么的表面!

构建自己的 ChatGPT 扩展

虽然这只是一个将人工智能与三维空间连接起来的小演示,但我们相信这将为超越场景构建的各种工具开启大门。开发人员可以在 Omniverse 中构建 AI 强化的扩展,用于灯光、相机、动画、角色对话和其他元素,以优化创作者的工作流程。他们甚至可以开发工具,将物理附加到场景中,并运行整个模拟。

我们正在努力将这个和其他实验性生成 AI 示例尽快提供给 Omniverse 创作者和开发人员。您可以在 Omniverse AI ToyBox 中查看我们最初的 AI 研究项目。

您可以使用 Omniverse Kit 和 Python 开始将 AI 集成到您的扩展中。立即下载 Omniverse 开始使用。

关于作者

Mario Viviani是英国伦敦NVIDIA Omniverse开发者关系经理。他的团队专注于帮助开发者和合作伙伴熟悉和使用NVIDIA Omniverse。他是一个充满激情的技术专家和实践开发者,曾经在亚马逊担任全球应用和游戏技术传道者团队的领导者;此前是一家初创公司的联合创始人,并领导自己的移动应用程序开发咨询公司。

更多相关:

关于ChatGPT要知道的若干个基本常识

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-04-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GPUS开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档