>首页> IT >

Autodesk分享:让3D美术师更强大,如何在Maya中使用AI插件

时间:2023-08-13 08:17:18       来源:腾讯网

在游戏研发领域, Maya是制作游戏美术资源、动画、场景的主流软件,也美术以及TA工作者们使用最多的工具之一。

随着AIGC技术的发展,Autodesk也在使用机器学习让该公司旗下的工具可以帮助美术从业者提高效率,并降低这些专业工具的使用门槛。

今年的GDC活动中,来自Autodesk公司的基础产品经理Chip Weatherman和高级工程师Bruno Roy就分享了Maya最新的AI插件,让同行们可以通过大型语言模型在Maya里进行直观互动,哪怕是没有代码基础的小白,也能通过文字指令实现专家级别的操作。


(资料图片仅供参考)

以下是Gamelook听译的完整内容:

Chip Weatherman:

我是Chip Weatherman,我是Autodesk基础产品经理,基础团队负责3ds Max和Maya所有的API和SDK。另外,我还和其他内部团队一起合作,例如我与Bruno领导的与微软合作的团队。

围绕机器学习和AI,一直都有些争议,比如它有可能抢走美术师们的工作。但我们希望采取另一种方式,实际上只是让美术师变得更强大,用更少的操作步骤给他们加速,让他们更快速完成工作。

我入行超过20年了,但这种互动模型从来没有变过,无论是应用还是行业。现在,我们有机会在未来极大改变这种状况,使其变得更好。接下来不再赘述,让Bruno介绍一些技术细节。

Bruno Roy:

基本上,就像Chip所说,这个项目是与微软团队合作的,他们称之为AI加速工作室团队,也就是通过Azure模型为我们提供OpenAI的访问,后者对于测试你如何利用这些类型的模型上的服务的层是非常好用的。

我会非常简短地介绍这个项目的真正灵感的一些背景,以及我们在生成式AI领域所处的位置。我还会介绍我们部署这种方法的一个简短概览,当然,我们还会提到数据以及我们实现它所做的试验,我们会展示一个简短demo,是直接在Maya里操作的录屏,最后我们会宣布测试,以及未来将会着手提升的未来范围。

背景与动机

非常简短的背景介绍,或许很多的概念对很多人来说都并不是新的。不过,我们的目标是充分利用“自然语言处理(Natural Language Processing,即NLP)”以更好地理解我们如何表达事情来创作内容,在这个案例中特指的是在Maya当中。

当然,像GPT-3/3.5(现在已经有了GPT-4)这些模型并不是新事物,这些模型在利用文本创造或生成代码或者文字。还有衍生模型,他们称之为多模态化,也就是整合不同的数据结构以更好地理解、连接,比如连接图片与文字,或者文字与视频,或者顺序、草图,现在通过这些模型都是可实现的。

当然,与我们项目更接近的事Codex,与GPT相反,训练和目的是生成代码,所以,我们希望的就是为Maya整合自然语言和代码生成。

我们对Maya Assist的立场,实际上我们内部把这个项目称之为Maya Codex,它作为一个插件随着测试发布,介于DALL-E和Codex之间。因此,我们的目标是利用NLP代码生成用于Maya当中的内容创作和互动。

所以,这背后的动机,就是让这些工具更加直观,你不用成为专家也能使用它们。当然,我们还希望通过始终这种功能引入一个学习过程。因此,使用我们的插件,你可以始终看到这些模型产出而生成的代码,这样,你通过Maya里的API也可以用这种模型学习脚本。

方法概览

当然,自动化是很明显的一个目标,因为你希望实用脚本自动化繁重的工作,以及重复性的工作。所以这是非常高层级的概览,我们在Maya里有一个插件,这个插件调用我们称之为的“Maya辅助服务层”。这一层,如果我们要深入了解的话,它是连接OpenAI模型,也是我们寻求多样化反馈并从中生成代码的地方。

这是来自微软的AI加速工作室团队提供的,实际上这就是我们使用、评估并更新使用模型的整个管线,从这个插件输入代码。

基本上,我们有用户指令,这些指令作为样本被我们的入口和反馈服务解析,这会被用来创作一个数据集,我们会使用该数据集的不同变体来做大量实验,并且看哪里取得进展、哪里能够评估一些指标,以确保我们的模型方向正确。

一旦对不同实验的结果感到满意,就可以通过Azure用我们的管线提升、实际上是对当前的模型进行升级。因此,这对于用户是透明的,他们知道自己使用的事更新过的模型。

通过这个服务,返回的其实是由Azure OpenAI生成的代码,所以这个代码是使用Maya API的Python代码,用来控制UI,包括创作内容。

这是一个非常简单的用例,我们的用户输入“为场景增加立方体”,从那个插件返回的命令就是生成这个几何体,因此这里是polyCube命令。然后,后续操作可能是“在X轴将立方体旋转45度”,接下来通过一系列的指令输入,你会得到带有物体恰当值参照的命令。

在这个插件里,实际上当前的范围聚焦四个类别以验证概念,我们现在只覆盖摄像头、光照、材质以及整物体操作,后者是我们自己的称呼,也就是不包括物体内的元素,而是在场景中只操作整个物体。

对每个类别,我们都使用了简单的操作,例如刚体变换(rigid transformation),不过也有一些更复杂的,比如你可以用插件将一个物体与其他物体关联,它会理解3D场景并将其实现。实际上,在插件界面的红框内,有一些建议告诉你该如何称呼它,或者可以使用哪些命令。

数据

不令人意外的是,带有这种能力的数据是至关重要的。我们当然需要强大的数据集,以确保我们能够精准衡量进度。因此评估(数据)集的想法是我们的真实数据,我们会与之对比来看我们做的有多好。

基本而言,这个数据包含了成对的自然指令与命令,当然,这些命令包括我之前提到的四个类别的案例。这些由各领域的专家审核,所以,我们确保这些指令能够制作出用户指令描述的东西。

我们还使用这些样本来优化实验模型的参数和配置,因此,我们也在用这个数据集来优化我们的模型,在最近的版本做出更好的提升。

有关这一点可能比较有趣的是,我稍后会说,该评估集80%的分布都是由一对一样本组成,这些对应用户生成的一个指令,它就生成一个命令,我们还有其他的案例,它会生成更多行命令。但实际上,如果你由一对一样本,它的学习会更好。所以,基本上,你代码里的一个命令使用一行代码。

出于验证和微调目的,我们还需要增长这个数据集,我们需要更多数据来训练和微调。所以,这里我们使用来自评估集力的成对的样本,我们使用一个Synthetic Data Generator在这些自然指令里提取一些元素。基本就是行为动词、数值、物体参照,我们生成更抽象通用的表达,以后可以用来生成更多的变体。

当然,我们在使用这些样本对应的代码,并将其输入我们的训练模型以便在更多延伸案例中带来更好的提升。这些模型样本的使用方法有些是有帮助的,比如我们的“(零)小样本学习(zero/few-shot learning)”。

我们这里对小样本学习做了一系列的试验,随着我们收到更多的请求,我们提供更多与玩家请求相似的样本,只是提供了更多的上下文环境。

这里要强调一些事情,不管我们使用哪个模型,都有历史背景,它指的是此前被用户使用的命令,或者在这些精准指标当中比小样本学习部分更有影响力。基本来说,小样本学习就是选取一些类似的样本提供给用户的请求,而历史背景则是用户此前使用过的命令。

更有趣的是,当你将两者结合起来,可以得到底部那样表现更好的模型,因此我们使用的是小样本学习的五个样本,加上像这样带有历史背景的样本。

在所有支持的类别中,我们的精确度超过80%,这是非常好的。实际上,如果看右边,这些指标的纯命令分解的得分会低一些,我们在这些地方得分较低的唯一原因,就是一些指令太过于简单,所以我们实际上能够学习的样本更少。

为了评估我们处理这些样本的效果,我们在这里使用了我们所谓的“Exact Match Error Analysis”,基本上就是对比预期以及生成的代码,所以我们是在看它们有多相似。你们可以在这个样本里看到,两个非常不同的生成代码,将生成完全相同的结果。

唯一的区别是,单一代码,或者flag的长短版本。这有些误导性,因为你会得到非常低的分数,它是假阳性(false positive)的,因为你在最终会得到同样的预期结果。

由于我们使用的是小样本学习,我们需要辨别我们的库里哪些是最接近的样本,为我们的模型提供一个指导。所以,我们尝试了不同的技巧,我们称之为“Sentiment Classifier”的是了解用户意图,以及这个请求在更大的样本库里放在哪里适合。我们做了尝试,高等级类别对于这里的分类器(classifier)而言有些太宽泛、有些混淆,因此我们还决定关注普通级别的分类,后者也有些偏颇,因为如之前所提到的,有些指令的样本更少,因此我们的数据集非常不平衡。

所以,我们决定采用一个常用的技巧,被称为“Density-Based Spatial Clustering”方法,在数据内提取自然分组,以便让我们试图关注的数据更有代表性。

如之前所述,我们了解的是一对一样本,因为这里的学习更稳定,使用这些比率。

我们处理和训练这部分数据,使用了“High-Level APIs”,它们是我们调用压缩更复杂任务的函数。如右侧案例,你可以要求“改变pCube1颜色为红色”,它会使用Maya API通过三个Python命令反应出来。我们的目标是将它压缩和封装到一个高级别API,也就是单行,所以我们要求在它之上训练,就像将这些简单的数值插入到更复杂的命令中。

因此,我们试图聚焦于非常具体的用例,用更多通用函数调用,而不是直接使用API。这个函数其实知道Maya API。

我们为了降低微调要求而做的其他一些事,就是提供更大范围的上下文环境。我们的目标是提供背后的用户意图,我们实现的方式是让一个分类器预测用户指令反映的可能被使用的命令,我们提供预期命令的函数签名、描述、flag,以及一些描述。有时候,我们还提供用例,如它展现在Dockstring结构形式里的那样。这是可选的,因为我们已经在使用小样本学习,后者已经提供了很多样本,它们更符合用户使用的命令顺序。

基本上,这就是我们设计指令的一个总结,随它提供一个非常高级别的背景,通常只是说我们在使用Maya Python API并展示出来。在基于这些大型语言模型训练的核心模型中,你还需要加入大量不同版本,所以我们做的是聚焦于我们想要的版本,确保这些版本之间不会有矛盾。

此外,我们还提供了延展背景,这个背景实际被分为三个部分,第一个我们称之为任务特定的信息,提供通过dockstring结构形式来反应的用户意图;第二部分提供小样本学习的样本,也就是这个任务的不同描述版本,确保它被封装在模型的请求中;另外,我们也使用来自这部分和历史背景的其他类型的背景。

Demo

我们这里有一个demo,我会讲解每一步执行了什么动作。

这是我们从KITBASH3D得到的一个场景,来展示一些真实资产,让你们知道如何用在插件内与之互动。

首先我会开启灯光,这样我要增加光源的时候你们可以看到变化。

接下来我会要求增加一个太阳,重命名为Sun,你不需要成为专家就可以知道一个太阳带来的将是来自很远地方的平行光,有了这种插件是很酷的。

我要求替代、并将其旋转90度,说“你能够将它调低15度?”这其实是在X轴,减掉15度,

你可以用自己的话说,将强度降低到50%,你还可以说“我想再降低一些,让他更像环境”。

再回到光源,我会增加一个摄像头并重命名,你也可以一句话里加入多个请求,我会将它移动到路灯前面,“将摄像头移动到路灯前”,它实际上知道应该放在什么位置。

让它指向正面建筑结构,我们来通过摄像头来看真实视角。我会要求它隐藏路灯,因为看起来它似乎错位了。

接下来我希望了解不同的光源来强调这些,可以看到墙上的灯,我会增加光源,来强调建筑的细节,增加壁灯,然后问“能否指出它在哪里?”只需要用你自己的语言,然后我复制这个灯,放在右边同样的位置。

然后对右边的灯重命名,因为它是在左侧被创造的,然后要求它将灯放在右边的位置,它就会移动到这里。

我们再做些更酷的事情,回到我们创造的摄像头,现在我要求改变这些光源的颜色,“将左侧聚光灯颜色变红”,然后右侧也同样操作。

将它调得更亮一些,“10倍亮度”,可以看属性编辑器,这里灯的数值1被改成了10,所以,你不必知道如何进入这些菜单和工具条进行调整。

我们也可以对材质做一些很酷的事情,比如对前面的花瓶使用与柱子同样的材质。

对于这些玻璃,我可以让刚刚移除的街灯放在门口左侧,然后旋转,“将其向右旋转90度”,接着增加另一个路灯形成对称效果。

技术总监也可以用它来在非常复杂的场景中做出非常小的改变。或者,你也可以是一个学习这些技巧的新手,能够看到我们插件生成的代码,在操作的过程中可以学习脚本,而不是专门的操作或者只是学习如何使用Python API。

未来展望

对于未来的工作,我们在关注这些模型的问题,尤其是文本模型,GPT-4提供了另一个选择,它们不一定理解3D世界。我们的目标是使用这种多模带来更好的结构,比如通过USD呈现的比ERT更好。

另外,我们还会引入“Multiple Completions”,也就是提供更多类似样本,比如你会用不同于的说法,或者是适合其他用户的方法,在你输入指令的时候给出提示建议。

可以看到,我们最开始用的是Codex,现在用了ChatGPT 3/3.5,在你输入的时候,会出现提示,以便帮你得到更好的结果。

目前,我们加入了摄像头照明,物体操控与材质,不过,未来我们希望拓展到渲染,并且已经有了一些行之有效的案例。当然,UI和布局通常做起来都很难,因为你需要使用很多的菜单与工具条,所以,我们也可以用同样的技术控制。

当然,希望可以运用到动画和建模,加入一些基础功能,例如帮助定位、动画骨骼,或者更高级别的建模。

关键词: