当前位置: 首页 > news >正文

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

全球各行业对 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 texttext = 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 = 0for 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 Assetreferences: 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 primnext_object = gpt_results[index]index = index + 1x = 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 + 1if self._index >= len(self._query_results.paths):self._index = 0self.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 中构建人工智能驱动的扩展,用于照明、相机、动画、角色对话和其他优化创作者工作流程的元素。他们甚至可以开发工具将物理附加到场景并运行整个模拟。

相关文章:

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

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

Windows Server --- RDP远程桌面服务器激活和RD授权

RDP远程桌面服务器激活和RD授权 一、激活服务器二、设置RD授权 系统:Window server 2008 R2 服务:远程桌面服务 注:该方法适合该远程桌面服务器没网络状态下(离线),激活服务器。 一、激活服务器 1.打开远…...

关于游戏盾

游戏盾(Game Shield)是一种针对游戏行业特点的网络安全解决方案,主要针对游戏平台面临的各种网络攻击和安全威胁。以下是一些原因,说明为什么游戏平台需要加游戏盾: 1. DDoS攻击:游戏平台通常容易受到分布式…...

回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SSA-KELM-Adaboost麻雀算法优化核极限学习机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本…...

《cpolar内网穿透》外网SSH远程连接linux(CentOS)服务器

本次教程我们来实现如何在外公网环境下,SSH远程连接家里/公司的Linux CentOS服务器,无需公网IP,也不需要设置路由器。 视频教程 [video(video-jrpesBrv-1680147672481)(type-csdn)(url-CSDN直播https://live-file.csdnimg.cn/release/live/…...

IDEA启动报错【java.sql.SQLSyntaxErrorException: ORA-00904: “P“.“PRJ_NO“: 标识符无效】

IDEA报错如下: 2023-08-17 11:26:15.535 ERROR [egrant-biz,b48324d82fe23753,b48324d82fe23753,true] 24108 --- [ XNIO-1 task-1] c.i.c.l.c.RestExceptionController : 服务器异常org.springframework.jdbc.BadSqlGrammarException: ### Error queryin…...

Nginx详解

1、高并发时代 单台tomcat在理想情况下可支持的最大并发数量在200~500之间,如果大于这个数量可能会造成响应缓慢甚至宕机。 解决方案是通过多台服务器分摊并发压力,这不仅需要有多台tomcat服务器,还需要一台服务器专门用来分配请求。这既是…...

摸清一下mysql授权语句的实际执行关系

样例 ---------------------------------------------------------------------- grant all PRIVILEGES on db1.* to test% identified by test1; grant all PRIVILEGES on db2.* to test% identified by test2; grant all PRIVILEGES on db3.* to test127.0.0.1 identified …...

sCrypt于8月12日在上海亮相BSV数字未来论坛

2023年8月12日,由上海可一澈科技有限公司(以下简称“可一科技”)、 临港国际科创研究院发起,携手美国sCrypt公司、福州博泉网络科技有限公司、复旦大学区块链协会,举办的BSV数字未来论坛在中国上海成功落下帷幕。 本次…...

Hbase的列式存储到底是什么意思?一篇文章让你彻底明白

一、 HBase 定义 Apache HBase™ 是以 hdfs 为数据存储的,一种分布式、可扩展的 NoSQL 数据库。 二、 HBase 数据模型 HBase 的设计理念依据 Google 的 BigTable 论文,论文中对于数据模型的首句介绍。 Bigtable 是一个稀疏的、分布式的、持久的多维排…...

机器学习|Softmax 回归的数学理解及代码解析

机器学习|Softmax 回归的数学理解及代码解析 Softmax 回归是一种常用的多类别分类算法,适用于将输入向量映射到多个类别的概率分布。在本文中,我们将深入探讨 Softmax 回归的数学原理,并提供 Python 示例代码帮助读者更好地理解和…...

EmbedPress Pro 在WordPress网站中嵌入任何内容

EmbedPress Pro可让您通过高级自定义、自定义品牌、延迟加载和更多惊人功能嵌入源。为古腾堡块和Elementor编辑器提供支持的一体化 WordPress 嵌入解决方案。使用 EmbedPress 在古腾堡创建交互式内容。使用 EmbedPress 的古腾堡块立即将任何内容嵌入到您的网站。 网址: EmbedP…...

【C++学习手札】一文带你初识C++继承

食用指南:本文在有C基础的情况下食用更佳 🍀本文前置知识: C类 ♈️今日夜电波:napori—Vaundy 1:21 ━━━━━━️💟──────── 3:23 …...

【ubuntu18.04】01-network-manager-all.yaml和interfaces和resolv.conf各有什么区别和联系

文章目录 01-network-manager-all.yaml、interfaces 和 resolv.conf 是与网络配置相关的文件,它们在网络设置中有着不同的作用和使用方式。 01-network-manager-all.yaml: 这是一个配置文件,通常在 Ubuntu 系统上使用 NetworkManager 进行网络管理时使用…...

24近3年内蒙古大学自动化考研院校分析

今天给大家带来的是内蒙古大学控制考研分析 满满干货~还不快快点赞收藏 一、内蒙古大学 学校简介 内蒙古大学位于内蒙古自治区首府、历史文化名城呼和浩特市,距北京400余公里,是中华人民共和国成立后党和国家在民族地区创办的第一所综合大…...

大语言模型(LLM)与 Jupyter 连接起来了

现在,大语言模型(LLM)与 Jupyter 连接起来了! 这主要归功于一个名叫 Jupyter AI 的项目,它是官方支持的 Project Jupyter 子项目。目前该项目已经完全开源,其连接的模型主要来自 AI21、Anthropic、AWS、Co…...

ChatGLM2-6B在Windows下的微调

ChatGLM2-6B在Windows下的微调 零、重要参考资料 1、ChatGLM2-6B! 我跑通啦!本地部署微调(windows系统):这是最关键的一篇文章,提供了Windows下的脚本 2、LangChain ChatGLM2-6B 搭建个人专属知识库:提供…...

聊聊火车的发展

目录 1.火车的概念 2.火车的发展历史 3.火车对战争的影响 4.火车对人们出行造成的影响 1.火车的概念 火车是一种由机械动力驱动的陆上交通工具,通常用来运输人员和货物。它由一列或多列的连接在一起的车厢组成,有轨道作为其行驶的基础,并通…...

IDEA使用@Autowired为什么会警告?

在使用IDEA编写Spring相关的项目时,当在字段上使用Autowired注解时,总会出现一个波浪线提示:”Field injection is not recommended.” 这让我不禁疑惑:我每天都在使用这种方式,为何不被推荐呢?今天&#x…...

npm如何设置淘宝的镜像源模式

1. 查看当前npm的下载源 npm config get registry2. 全局配置npm使用淘宝镜像作为默认下载源 npm config set registry https://registry.npm.taobao.org --global3. 安装依赖包 npm install <package-name> 添加到devDependencies字段中&#xff1a; npm install &l…...

浅谈Redis的maxmemory设置以及淘汰策略

推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 「java、python面试题」来自UC网盘app分享&#xff0c;打开手机app&#xff0c;额外获得1T空间 https://dr…...

考虑分布式电源的配电网无功优化问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Cpp异常概述

异常概述 1. 异常处理的重要性和作用&#xff1a; 异常处理是编程中的一个核心组成部分&#xff0c;因为它提供了一种方法来处理程序运行时可能遇到的意外情况&#xff0c;例如文件未找到、网络连接丢失或无效的用户输入等。当这些情况发生时&#xff0c;程序可以优雅地处理它…...

山东布谷科技直播软件源码Nginx服务器横向扩展:搭建更稳定的平台服务

在直播软件源码平台中&#xff0c;服务器扮演着重要的角色&#xff0c;关系着视频传输、数据处理、用户管理等工作的顺利完成。随着互联网的迅猛发展&#xff0c;直播行业也随之崛起&#xff0c;全世界的人们都加入到了直播软件源码平台中&#xff0c;用户流量的增加让服务器的…...

SystemVerilog之接口详解

1.入门实例 测试平台连接到 arbiter的例子&#xff1a;包括测试平台, arbiter仲裁器, 时钟发生器 和连接的信号。 ㅤㅤㅤ ㅤ ㅤㅤㅤㅤㅤ Arbiter里面可以自定义发送的权重&#xff0c; 是轮询还是自定义 grant表示仲裁出来的是哪一个&#xff0c;也即只有0&#xff0c;1&am…...

RabbitMq-1基础概念

RabbitMq-----分布式中的一种通信手段 1. MQ的基本概念&#xff08;message queue,消息队列&#xff09; mq:消息队列&#xff0c;存储消息的中间件 分布式系统通信的两种方式&#xff1a;直接远程调用&#xff0c;借助第三方完成间接通信 消息的发送方是生产者&#xff0c…...

深度学习1:通过模型评价指标优化训练

P(Positive)表示预测为正样本&#xff0c;N(negative)表示预测为负样本&#xff0c;T(True)表示预测正确,F(False)表示预测错误。 TP&#xff1a;正样本预测正确的数量&#xff08;正确检测&#xff09; FP&#xff1a;负样本预测正确数量&#xff08;误检测&#xff09; TN…...

excel隔行取数求和/均值

问题描述 如图有好多组数据&#xff0c;需要求每组数据对应位置的平均值 解决方法 SUM(IF(MOD(ROW(C$2:C$81), 8) MOD(ROW(C2), 8), C$2:C$81, 0))/10然后下拉右拉扩充即可&#xff0c;其中需要根据自身需要修改一些数据 SUM(IF(MOD(ROW(起始列$起始行:结束列$结束行), 每…...

批量记录收支明细,轻松通过收支占比图表轻松分析支出项目占比!

您是否希望更加直观地了解个人或企业的支出项目占比情况&#xff1f;是否想通过图表分析&#xff0c;快速定位支出的主要项目&#xff0c;并做出相应的调整&#xff1f;现在&#xff0c;我们的智能收支分析大师为您提供了一种智能化的解决方案&#xff01;只需几步操作&#xf…...

pdf怎么压缩?一分钟学会文件压缩方法

PDF文件过大一般主要原因就是内嵌大文件、重复的资源或者图片比较多&#xff0c;随之而来的问题就是占用存储空间、被平台限制发送等等&#xff0c;这时候我们可以通过压缩的方法缩小PDF文件大小&#xff0c;下面就一起来看看具体的操作方法吧。 方法一&#xff1a;嗨格式压缩大…...