背景
2023年应该是AIGC走向大众视野,让大众可知可感并且参与其中的一年。但是从基于AIGC的创业的创意和产品来看,显然创业者对AIGC的理解还是过于保守,对于AIGC的发展历史技术的演进、平行的技术路线了解的还是不够深入的。为什么这么说呢,看了23年发布的各种基于AIGC的产品;你应该就会有一个感觉全部是基于单点大模型能力(最新的技术点)来构建应用。固然用最新的技术是没问题的,但是最新技术往往也是有能力上限的。历史上出现的一些技术和解决方案并非有了大模型就完全无用武之地。大家似乎走到了一个怪圈:只有大模型才是AIGC,只能用大模型这个范式解决问题。而忘记我们的目的在于整合大模型的能力创造出以前做不到、需要花费成本很高的项目因为大模型的某些能力突破;引入大模型可以让不能成为可能、让高代价成为够一够就能解决。 以视频生成来举例,其实在大模型火之前有很多的视频生成的探索,比如:
1.数字人方式创作突出人的视频创作
2.基于视频资源的整合blender创作
3.基于游戏仿真的视频创作 ...
视频本身只是一种载体,摄影只是一种创作视频的手段、人为设计然后做图渲染一样也是很重要高质量视频生成方式:游戏创作、动漫创作、虚拟拍摄、电影后处理...之所以广泛采用摄影方式无非是因为摄影的方式是最简单、廉价的创作视频题材的方式。 然而我们在做AIGC视频内容生成时候个人的感觉其实要做的就是要拉低人为设计生成视频的这部分工作。这部分工作特点是技术难度高、创作生成高,如果能做到降低技术门槛、降低创作成本,至少降低到拍摄方式创造视频的成本,那这件事是很有价值也是很有生存空间的。 原因在哪呢?很简单认为设计的内容非自然所有,能够吸引人的原因在于它的创作力、想象力、思想审美...这部分东西是自然景语之上的经过人类情感体悟加工后的重新表述呈现给其它人的内容。这样的内容是很有价值的:
1.已经经过人的体悟、情感加工消耗了人的心力和情绪付出
2.经过了人的抽象、审美表达,抽象和审美表达能力来源于此人生活体验和阅历
个人觉得AIGC在这个阶段应该是可以往这个方向发力,降低人类表达的成本。有所悟然后表达出来中间是有一层门槛的,原因在于哪呢?有所体悟这是一种高纬度的稀疏的数据集表达,你如果要让大众有所共鸣,那就必须把这种高纬稀疏的数据转换成大家都有共识的数据表达。什么样的数据是大众有共识的数据呢,那一定是低纬度、更底层的数据形式。换句话说你如果要表达那就必须是需要降低维度的、把你个性化的体验转成很多更底层的数据维度的组合。这就是表达的难度来由。 绕了半天似乎也没讲明白要怎么做对吧。其实要让大家能够共识至少有两种方式:
1.规范表达标准,比如ipone的触摸屏、手势输入
2.抽取共性表述原子粒度元定义,在更共性层做一致性表达,更上层引申出的语义表达用这统一层的AIGC表达组合出来:比如《说文解字》统一了单子的基本定义、和造字的基本原理
然现在的AIGC产品做的却是一上来就想满足大家个性化需求和意图,给了大家很高的预期,然后对于一些共识标准却忽视。给人感觉就是这东西似乎只是一个高级玩具,不够稳定不能很好表达、没有带来实质性的进度。 唠完这么多,下面介绍些视频生成中人物动作控制的一些研究历史,主要介绍基于数据驱动的驱动方法。
文章序列
1.基于动作匹配的控制
1.1 Motion Graph
1.2 Motion Fields
1.3 Motion match
2.基于学习的动作控制
2.1基于监督模型预测
2.1.1 PFNN: Phase-Functioned Neural Networks
2.2.2 Local Motion Phases for Learning Multi-Contact Character Movements
2.2.3 DeepPhase: Periodic Autoencoders for Learning Motion Phase Manifolds
2.2基于半监督学习:强化学习、示教学习
2.2.1 MDP
2.2.2 POMDP
2.2.3 POSG
2.3基于生成模型:
2.3.1 Character Controllers Using Motion VAEs
2.3.2 MoGlow: Probabilistic and Controllable Motion Synthesis Using Normalising Flows
2.3.3 MotionDiffuse: Text-Driven Human Motion Generation with Diffusion Model
2.3.4 MDM: Human Motion Diffusion Model
正文
Motion Graph
解决什么问题:
自动化串联合成,通过拼接许多短运动片段来生成长运动流。使用自动比较方法定位看起来足够相似以用作过渡点的运动帧,从而实现对过渡图的轻松创作。
解决思路:
两个运动状态相似的动作做串接、过渡动作生成;把相似运动状态动作串联成长动作流。如果能够把所有动捕数据分成片段作为动作状态节点,动作状态之间构建可以跳转的连接边;如果节点之间跳转连接能够形成闭环那么每个动作到另一个动作必然有可行路径到达,可以形成任意长度的动作流。
输入:
运动捕捉数据的语料库
输出:
动作图是一个有向图,其中边包含原始运动数据的片段或自动生成的过渡。然后,节点作为这些小运动片段无缝连接的选择点。由于我们的方法自动检测并创建运动之间的过渡,用户无需捕捉专门设计用于连接的运动。如果需要,用户可以调整动作图的高级结构,以产生不同部分之间所需的连接程度。
算法流程:
动作跳转图构建
节点:运动动作状态,比如5-10帧的慢跑动作 边:从一个运动状态到另一个状态的过渡动作(自动化混合插值生成)
1 候选过渡点
两个运动状态相似度测量指标,如果一个动作状态和动捕数据中任意片段相似度都超过最小距离阀值,这个节点就找不到可以跳转的连接边,这个节点应该去处。 相似度测量指标如何定义: 运动捕捉数据通常表示为指定每帧骨架根位置和关节旋转的参数向量。可以尝试通过计算一些矢量范数来测量每对帧之间姿势差异的简单方法来找到过渡点。然而,这样的简单方法是不明智的,因为它未能解决一些重要问题:
1.简单的矢量范数未能考虑参数的含义。具体来说,在关节角度表示中,某些参数对角色的整体效果产生比其他参数更大的影响(例如,臀部方向与腕部方向)。而且,无法以有意义的方式为这些参数分配固定的权重,因为关节旋转对身体形状的影响取决于身体当前的配置。
2.运动仅在刚性的2D坐标变换下被定义。也就是说,如果我们沿着地板平面平移它或绕垂直轴旋转它,运动基本上不会改变。因此,比较两个运动需要识别兼容的坐标系。
3.平滑的混合需要比可以在单个帧上获得的更多信息。无缝过渡不仅必须考虑身体姿势的差异,还必须考虑关节速度、加速度和可能的高阶导数的差异。 相似性度量融入了每个考虑因素。
为了激励它,骨架只是一个手段。在典型的动画中,多边形网格根据骨架的姿势进行变形。这个网格是唯一可见的,因此在考虑两个动画帧之间有多接近时,这是一个自然的焦点。因此,我们以骨架驱动的点云方面的距离来衡量两个动画帧之间的距离。理想情况下,这个点云是定义角色的网格的降采样。
为了计算两个帧i和j之间的距离D(i, j),我们考虑在用户定义的长度k的两个窗口上形成的点云,一个以i开始,另一个以j结束。也就是说,每个点云是表示窗口中每个帧的姿势的较小点云的组合。使用帧窗口有效地将导数信息纳入度量中,窗口的大小与过渡的长度相同,因此D(i, j)受到形成过渡的每对帧的影响。
可以通过计算两个点云中相应点pi和p′i之间的加权平方距离的平方和来计算i和j之间的距离。为了解决这些点云的坐标系的问题,计算加权平方距离的最小值,假设可以对第二个点云应用任意刚性的2D变换:
绕y轴(垂直轴)旋转点p θ度,然后平移它(x0,z0)。索引是每个点云中点的数量。权重wi可以选择,既可以赋予某些关节(例如,具有约束的关节)更重要的权重,也可以朝着窗口末尾逐渐减小。 线性变换Tθ,x0,z0i将点p绕y轴旋转θ度,然后平移(x0,z0)。这个优化问题有一个封闭形式的解决方案:
计算数据库中每一对帧的距离,形成一个采样的2D误差函数。为了使我们的过渡模型更加紧凑,找到了这个误差函数的所有局部最小值,从而提取了过渡在局部最有利的“甜点”。
2 构建边
如果D(i, j)满足阈值要求,我们通过将帧i到i+k-1与帧j-k+1到j进行混合,创建一个过渡。第一步是对运动应用适当的2D变换。然后,在过渡的第p帧上,我们对根位置进行线性插值,并在关节旋转上执行球面线性插值:
其中,是过渡帧上的根位置,p^{th}。
为了保持连续性,我们选择混合权重 满足条件对于\alpha(p) = 0p \geq k\alpha(p)$
连续性。这需要
使用线性混合意味着可能违反原始运动中的约束。例如,角色的一只脚在应该被固定的地方可能会滑动。这可以通过在原始运动中使用约束注释来纠正。我们将约束视为二进制信号:在给定帧上,特定约束要么存在,要么不存在。将这些信号与方程5和6的类似地混合,相当于在过渡的前半部分使用的约束,并在过渡的后半部分使用的约束。通过这种方式,每个过渡都会自动用约束信息进行注释,这些约束在从图中提取运动时可以在后处理步骤中执行。
3 图减枝
在当前状态下,不能保证图能够无限合成运动,因为可能存在一些节点(称为死胡同),它们不属于任何循环。一旦进入这样一个节点,就会限制能够生成多少额外的运动。其他节点(称为汇点)可能属于一个或多个循环,但仍然只能到达图中总节点数的一小部分。虽然一旦进入汇点仍然可以生成任意长的运动,但这个运动被限制在数据库的一小部分内。最后,一些节点可能具有传入边,使得没有出边包含相同的描述标签集。这是危险的,因为可能会强制在运动中引入逻辑不连续性。例如,目前处于“拳击”动作中的角色可能别无选择,只能过渡到“芭蕾”动作。 为了解决这些问题,我们剪枝图,从而从任意边开始,可以生成任意长的相同类型运动的流,以尽可能多地使用数据库。操作如下。将原始数据的每一帧与一个(可能为空)标签集关联起来。假设有n个唯一的集合。对于每个集合,形成包含所有帧恰好具有该标签集的边的子图。计算这个子图的强连通分量(SCCs),其中SCC是一个最大的节点集,使得对于任何有序对节点(u,v),都存在一个连接的图行走。可以使用Tarjan算法在O(V + E)的时间内计算出这些SCC。我们从这个子图(因此是原始运动图)中消除任何不连接两个最大SCC中的节点的边。完成这个过程后,任何没有边的节点都被丢弃。
如果给定标签集的最大SCC包含低于阈值数量的帧,则向用户发出警告。此外,如果对于任何有序的SCC对,没有从第一个过渡到第二个的方法,则发出警告。在这两种情况下,用户可能希望调整过渡阈值,以提供图更大的连通性。
图检索
到这个阶段,我们已经完成了运动图的构建。在详细描述图遍历如何转换为可播放的运动之后,我们将考虑提取满足用户约束的运动的一般问题。我们的算法涉及解决一个优化问题,因此我们将本节总结为一些建议,关于如何提出这个优化问题。
将图遍历转换为运动
由于运动图上的每条边都是一段运动,图遍历对应于通过将这些片段依次放置而生成的运动。唯一的问题是将每个片段放置在正确的位置和方向上。换句话说,每帧必须通过适当的2D刚体变换进行转换。在图遍历的开始,此变换为恒等变换。每当我们退出过渡边时,当前变换将乘以对齐过渡连接的运动片段的变换。 使用线性混合创建过渡可能会导致众多问题,其中最常见的是在应该固定的情况下,脚会滑动。然而,每个图遍历都会自动用约束信息进行注释(例如,脚必须固定)。这些约束要么直接在原始运动中指定,要么根据帧是原始数据还是过渡生成而生成。
搜索运动
现在可以考虑找到满足用户指定要求的运动的问题。首先值得注意的是,只有非常特殊的图遍历才可能有用。例如,虽然随机图遍历会生成连续的运动流,但这样的算法除了作为一个精心设计的屏幕保护程序之外几乎没有其他用途。更详细的例子是计算图的所有对最短路径表。也就是说,给定一个适当的度量标准,比如经过的时间或行进的距离,可以使用标准的图算法(如Floyd-Warshall算法)找到每对节点u和v的连接图遍历,使度量标准最小化。有了这个表,我们可以例如生成连接一个剪辑到另一个剪辑的运动,使其尽快完成。这比一开始看起来要不太有用。首先,不能保证最短图遍历在绝对意义上是短的。在较大的测试图中(节点数在几千个左右),任意两个节点之间的平均最短路径大约为两秒。这并不是因为图连接得不好。由于过渡大约每三分之一秒一次,这意味着在数千个节点中的任意两个节点之间平均只有五到六次过渡。其次,在图遍历过程中无法控制发生的事情不能指定角色的行进方向或她最终停留的位置。 更一般地,用户可能感兴趣的运动类型可能不涉及最小化简单度量标准,例如总经过时间。然而,对于复杂的度量标准,通常没有简单的方法找到全局最优图遍历。因此,我们转而关注局部搜索方法,试图在合理的时间内找到满意的图遍历。 现在提出了一个框架,用于提取符合用户规格的图遍历。将运动提取构建为一个搜索问题,并使用分支和界限来提高此搜索的效率。用户提供一个标量函数g(w, e),用于评估将边e附加到现有路径w后产生的额外错误,其中w可以是空路径0。路径的总错误f(w)定义如下:
其中w由边e_1, ..., e_n组成。要求g(w, e)为非负,这意味着通过向图遍历添加更多边,永远不能减少总错误。 除了f和g之外,用户还必须提供一个停止条件,指示何时不应向图遍历添加更多边。满足停止条件的图遍历称为完整。图遍历的开始可以由用户指定,也可以随机选择。
目标是找到一个使f最小化的完整图遍历w。为了让用户控制在搜索中考虑哪些运动类型,我们允许对给定的图遍历w附加哪些边施加限制。例如,用户可能决定在特定时间窗口内,图遍历可能只包含“悄悄行动”边。
一个简单的解决方案是使用深度优先搜索来评估所有完整图遍历的f,然后选择最好的一个。然而,可能的图遍历数量随着完整图遍历的平均大小呈指数增长。为了解决这个问题,我们使用分支和界限策略来剪除无法产生最小值的搜索分支。由于根据假设g(w, e)永远不减少,f(w)对于任何v,其中w+v是附加到w的v,都是f(w)的一个下界。因此,我们可以跟踪当前最佳的完整图遍历wopt,并立即停止任何搜索分支,其图遍历的错误超过f(wopt)。此外,用户可以定义一个错误阈值ε,如果f(w) < ε,则认为w足够好,搜索将停止。
当能够在搜索过程的早期获得一个紧密的下界时,分支和界限最为成功。因此,有必要为探索从特定节点出发的边提供一个启发式方法。一个简单的启发式方法是贪心地排序子节点 - 也就是说,给定一组未探索的子节点c_1, ..., c_n,搜索最小化g(w, c_i)的那个。
虽然分支和界限减少了必须对f进行测试的图遍历数量,但它并不改变搜索过程本质上是指数的事实 - 它只是降低了有效的分支因子。因此,逐步生成图遍历。在每个步骤中,我们使用分支和界限来找到n帧的最佳图遍历。我们保留这个图遍历的前m帧,并使用最终保留的节点作为另一次搜索的起点。这个过程一直持续,直到生成完整的图遍历。在我们的实现中,我们使用了n从80到120帧(2到4秒)的值和m从25到30帧(约1秒)的值。
有时在搜索过程中引入一定程度的随机性是有用的,例如在为人群进行动画时。有几种简单的方法可以在不牺牲好结果的情况下在搜索过程中引入随机性。第一种是随机选择搜索的起点。第二种是在每次搜索迭代结束时保留r个最佳图遍历,并在错误在最佳解的某个容差范围内的解中随机选择。
应用:
交互式控制。 我们可以使用路径综合技术使用户对角色进行交互控制。例如,当用户按下左箭头键时,角色可能开始向东移动。为了实现这一点,我们可以使用路径拟合算法找到从图上当前位置开始的一系列边,这些边最好允许角色向东行进。结果图行走的第一个边是将要播放的下一个片段。然后可以重复此过程。为了使这变得实用,我们可以预先计算图中每个节点的图行走序列,以适应直线路径的一些方向(0度、30度,...)。然后将这些路径上的第一个边存储以备后用;它们是在给定方向下角色应该行进时要遵循的最佳边。
高级关键帧。 如果我们希望角色按特定顺序在特定位置执行某些动作,我们可以绘制一个路径,其中的子部分需要适当的动作类型。这使我们能够生成复杂的动画,而无需手动关键帧制作的繁琐过程。因此,我们将这个过程称为“高级”关键帧制作——用户基于应该发生的事情和发生的地方生成动画。
运动导出。 如果使用AI算法确定角色必须沿着某条路径行进或开始执行某些动作,那么可以使用运动图在算法的结果之上“导出”动作。因此,运动图可以作为在视频游戏和交互式环境中为非玩家角色制作动画的后端 —— 可以通过高级流程指定路径和动作类型,运动图将填充细节。
人群。 尽管我们迄今为止的讨论集中在单个角色上,但没有理由不将其应用于多个角色。运动图可以作为人群生成的实用工具。例如,可以使用标准的避碰算法为每个个体生成一条路径,然后运动图可以生成符合该路径的动作。此外,我们可以使用技术为生成的动作添加随机性。
Motion Fields
在现实中人的运动状态是一个连续变量,也就是说我们动作是一个连续性的值,而非只能在指定离散的动作状态跳转;并且在实际游戏中玩家是会对运动状态做控制信号输入的。然而上面介绍的Motion Graph利用状态图方式构建的运动状态其实就是对连续状态做了离散假设,并且一定程度的忽略了玩家信号对初始状态影响。这样就会带来一个问题就是对于动作状态中没有的动作帧只能用和它最相近的动作来替代,用户信号输入后需要在找到一个和库里相似度低于阀值的状态序列才能跳转到下一个动作,会给玩家一种不灵活的感觉。说白了就是不能精准的还原玩家的动作操控,有动作迟滞感。
- 定义状态空间: 首先,将角色的动作状态表示为一个状态空间,其中每个状态由角色的姿势和关节速度组成。
- 构建动作数据库: 将动作捕捉数据作为局部逼近的近似值。这个数据库包含一系列由连续帧构建的动作状态,每个状态由当前帧和下一帧之间的运动计算得到。
- 相似性计算: 对于给定的动作状态,通过计算与数据库中其他动作状态的相似性来构建邻域。相似性是通过一个加权距离度量计算的,其中权重由可调参数( )控制,例如骨骼长度等。
- 动作选择: 在动作场中,每个动作状态都与一组控制动作相关联。这些控制动作表示了角色在下一帧的可能运动。动作选择的目标是在当前状态下选择一个控制动作集,以便在下一帧中合理地过渡到相似的动作状态。
- 动作合成: 通过将选择的控制动作应用于当前状态,计算下一帧的动作状态。在这一步中,可能会考虑一个小的漂移修正,以防止角色的状态漂移到数据库中缺乏数据的区域。
总体来说,motion field 的求解过程涉及到建立动作数据库、计算状态相似性、选择控制动作,以及通过动作合成在状态空间中进行移动。这个方法允许角色灵活地响应用户指令和意外扰动,同时保持生成的动画的自然性。
解决什么问题:
需要角色能够迅速响应用户命令和意外干扰,同时保持生成的动画的可信度。
解决思路:
理想的⽅法是完全模拟⼈类⾃然运动的完整空间,描述⻆⾊从给定状态移动的每⼀种可能的⽅式。 这种模型不会将运动限制在固定的运动剪辑和过渡中,⽽是通过连续的 运动空间实现更⼤的灵活性和敏捷性。 然而对⾃然⻆⾊运动的整个空间进⾏完全建模是不可⾏的,但可以使⽤运动捕捉数据作为局部近似。可以查找并使⽤与⻆⾊在任何点的当前运动相似的运动捕捉数据。通过查询类似的动作来确定哪些未来⾏为是合理的,确保合成的动画保持⾃然:与动作捕捉数据相似,但很少相同。这使得⻆⾊不再需要简单地重放运动数据,从⽽可以在数据的周围⾃由移动。此外,由于总是有多个动作数据可供查阅,因此⻆⾊不断地有多种⽅式来快速改变动作。 利用强化学习方式,学习到如何根据当前状态和用户控制信号输入计算出从当前状态到下一个状态的最优策略(一个动作序列)。类似:[waypoint1:{动作帧1、动作帧2......};waypont2:{动作帧i,动作帧j......}......];
输入:
Motion Field 的求解涉及到一系列的输入,主要包括:
- 动作捕捉数据: 用于构建动作数据库的原始动作捕捉数据,其中包含角色在不同时间步的姿势和关节运动信息。
- 状态表示: 角色的状态表示,通常包括当前帧的姿势和关节速度。这些状态构成了动作场的状态空间。
- 相似性权重( ): 用于计算状态相似性的权重参数,这些参数可以根据需要进行调整,以控制相似性计算的影响。
- 控制动作的集合: 与每个状态相关联的控制动作的集合,这些动作描述了角色在下一帧中可能的运动。这些动作是 motion field 中的可调参数。
- 漂移修正参数: 用于防止角色状态漂移到数据库中缺乏数据的区域的漂移修正参数,通常由一个小的漂移修正项控制。
输出:
Motion Field 求解的输出通常是学到的价值函数或策略函数。这两者都是用来指导动作选择的关键元素。
- 价值函数(Value Function): 价值函数通常表示在每个状态下采取某个动作的预期累积奖励。在 Motion Field 中,价值函数可以表示为 (V(m)),其中 (m) 表示运动状态。价值函数的输出是对于每个状态 (m) 和可能的动作集合的估计值,指示了在该状态下采取不同动作的优劣程度。
- 策略函数(Policy Function): 策略函数定义了在每个状态下应该采取的动作。在 Motion Field 中,策略函数可以表示为 (\pi(m)),其中 (m) 表示运动状态。策略函数的输出是对于每个状态 (m) 的动作选择,指示了在该状态下应该采取哪个动作。
这些输出可以用于在实时控制中决定角色的运动。具体而言,当系统处于某个运动状态时,可以使用学到的价值函数或策略函数来选择最优的动作,以使系统在执行动作后获得最大的预期累积奖励。 最终输出是一个动作的序列,角色根据这个序列在状态空间中移动。
算法流程:
Motion Field 的建模和求解流程可以分为以下步骤:
- 定义动作和状态空间: 首先,确定问题的动作空间和状态空间。动作空间包括角色可以执行的所有动作,而状态空间描述了角色可能处于的各种状态。
- 构建数据库: 收集并准备用于建模的运动数据。这些数据包括不同动作和状态下的角色运动序列。数据的质量和多样性对于 Motion Field 的性能至关重要。
- 相似性权重计算: 对于每个状态,计算与数据库中其他状态的相似性权重。这些权重可以通过各种方法计算,例如基于欧氏距离或其他相似性度量。
- 定义奖励函数: 确定问题的奖励函数,即指导角色行为的目标。奖励函数评估角色在特定状态下执行特定动作的好坏程度。
- 建立强化学习框架: 将问题建模为强化学习问题。定义状态、动作、奖励以及状态转移的函数。
- 选择算法进行强化学习: 选择适当的强化学习算法,例如 Q-learning、深度 Q 网络(DQN)等,用于从数据中学习最优策略。
- 训练模型: 使用收集的运动数据,通过强化学习算法训练 Motion Field 模型,优化模型参数以获得最佳的动作策略。
- 验证和调优: 验证模型在新数据上的性能,根据需要进行调优和优化,以确保模型在各种情况下都能产生合适的动作。
Motion Fields方法其实挺有意思,用到了强化学习来得到一系列从状态a到状态b的行动序列waypoint;然后通过每两个waypoint之间继续找到动作帧序列直到waypoint之间的动作序列都可以通过动作捕捉数据中的帧插值得到为止。这个框架看起来是用到了学习的方法来解决动作连贯性问题,但是它又不是直接通过学习方法来预测下一帧动作是如何,而是学习该如何用现有动作帧组合序列插值出连续、连贯的序列。 State: 不同于Motion graph用character pose作为状态,这里的motion state采用(x, v)作为状态,其中x是pose,v是速度,速度是通过motion data中的相邻pose做差得到的,即v = x' - x,那么当知道(x, v)时,下一状态的pose可以直接通过x'=x+v得到。文章称(x, v)组成的空间叫motion space 光是知道state还不够,要构建一个manifold,还需要知道state之间的相似性。文章将状态之间的距离定义为:
由于要满足manifold的连续性,所以对已有状态进行插值是必不可少的,文章用相似度weight来表示插值的权重
同时,由于有用户需求,且会随时间变化,所以state中还有用户目标。 Action:
action的变化包括两个部分,本质上是pose的变化和速度的变化,这里的y代表的是下一帧的速度,也就是当前状态附近状态的v,然后v的选择是这些附近状态的加权平均,速度的变化也是对应的平均。
比如上图,白心的圈代表当前状态,虚线圈代表下一个状态,而黑色圈代表当前状态的周围状态,圈的大小代表赋予其的权重。A和B代表同一状态,但是对周围点选取不同的权重,可以得到不同的下一状态。
action的选择采用依次选取每一个周围的state为1然后normalize,这样可以避免急停。 根据action生成合成动作序列:
Reward: 就看当前状态是否满足用户要求,框架就是经典的Q-learning框架,每一帧计算和目标的差距。 由于相邻的state的value function普遍比较接近,所以作者提出不要存储所有状态的value function,而是每若干帧存储一次loss,中间的再通过插值得到。
Motion Matching
Motion Fields 根据玩家输入,通过实时的比对当前动画和数据库中的动画片段,寻找动画数据库中于当前动画最匹配的祯或片段来合成 新的动画,从而实现操作反馈及时性的同时保证动作的流畅性. 合成后的动画会与原动画数据有一定的相似性,但因为是由来自于不同片段动画数据的拼接,且由每次玩家输入的细微差别作为变量(比如说移动遥感的速度变化),导致搜索结果的细微差异,从而达到所展现出来的合成动画的不重复性. 相对于Motion Graphs 的预先定义过度动画点, Motion Fields 在保证了动作流畅性的同时,保证了超控反馈及时性,动画的不重复性也让动作更加自然, 也因此受到了游戏业界的关注. 但Motion Fields 的算法太过于沉重复杂,并且其多庞大的数据量及内存需求,因此Motion Fields 并未大批商用化. 但其流畅以及反应及时的混合效果让游戏业界看到了未来游戏动画的希望. Motion Matching 继承了Motion Fields 的“实时搜索动画数据库找到最合适的祯或片段来实时合成新的动画”的思路, 将 Motion Fields 的算法简化并实用化并且成功的用于游戏的角色操作系统中, 此系统大多用于寻路(走,跑,跳 等), 且已经达到了在及时反馈的前提下,不牺牲动画质量的最好的过度混合效果.
解决什么问题:
需要角色能够迅速响应用户命令和意外干扰,同时保持生成的动画的可信度。
解决思路:
实时搜索动画数据库找到最合适的祯或片段来实时合成新的动画
输入:
根据玩家输入,给出角色预期的运动轨迹和速度 当系统接收到玩家的输入后,需要根据输入模拟一个前进轨迹以及轨迹上各点的速度,例如角色转弯可以模拟一个曲线,计算出角色在未来第 0.2s、0.5s、1.0s 处的位移、速度等属性。
输出:
下一帧应该播放的动作,需要满足两个条件
- 从下一帧动作开始,未来运动轨迹和输入的预期轨迹一致。
- 即将播放的姿态可以平滑衔接当前姿态,没有跳变。
由于动捕数据有限,几乎不可能从之前动捕的动作中找到完全满足上述条件的帧,因此需要用查找最近邻的方法,找到最满足条件的帧作为近似结果,然后利用动作融合过渡过去。
算法实现:
- 数据采集: 收集与角色或物体相关的大量动画片段。这可以包括不同方向、速度和动作类型的动画。
- 数据清理: 对采集的动画数据进行清理和标准化,确保它们在整个系统中具有一致的格式。
- 特征提取: 从动画数据中提取关键特征点,这些特征点描述了动作的重要方面,如关节的角度、位置等。
- 数据库建立: 将提取的特征点数据存储在数据库中,以便后续的匹配和检索。
- 运动匹配算法: 使用特定的运动匹配算法,比如机器学习方法或基于物理规律的方法,来匹配实时运动输入与数据库中的动画片段。
- 实时匹配: 在游戏或应用程序中实时执行运动匹配算法,以确定最匹配输入的动画片段。
- 混合动画: 将匹配的动画片段混合在一起,以生成最终的、更自然的动画效果。
- 动画播放: 将混合后的动画应用到角色或物体上,以实现流畅而逼真的运动表现。
匹配例子:
其最关键的部分就是如何找到与当前动画最匹配的动画数据.
通过对比当前动画与动画数据库中的动画数据的 轨迹,Pose, 速度.以每秒30帧为例,假定有由 A,B,C,D,E 个动画片段组成的动画库,以下的所有步骤都是在 1/30 秒内实现的. 轨迹 首先根据玩家当前的操作输入,结合当前角色运动的 速度,加速度,可以预判出一定时间后的角色的位置,以2秒为例。然后分别找出 A, B, C, D, E 片段从第0帧开始, 2秒后的角色位置, 与预判的角色位置做比较,并记录位置间的距离.这里以其中一个片段为例,记录2秒后角色距数值 20 和面向角度数值差 110
Pose 接下来对比当前角色骨骼和片段A的第0帧的角色骨骼,臀部, 左脚骨骼点,右脚骨骼点的位置,并记录距离的数值 0.02, 0.05, 0.07
速度 接下来对比这三个骨骼点的速度,并记录速度的差值 8-4=4, 5-3=2,7-8=1
由此得到一组数据,即当前的角色动画与动画片段A的第0帧相比较:
2秒后角色的的位置举例差: 20
2秒有角色的面向角度差:110
当前角色Pose 与片段A第0帧的臀部距离: 0.02
当前角色Pose 与片段A第0帧的左脚距离: 0.05
当前角色Pose 与片段A第0帧的左脚距离: 0.07
当前角色Pose 与片段A第0帧的臀部速度差: 4
当前角色Pose 与片段A第0帧的左脚速度差: 2
当前角色Pose 与片段A第0帧的右脚速度差: 1
这些数值的和越小,则当前角色动画与动画片段A的第0帧越接近。
但是在实际的情况是并不是每一个因素都是同等重要, 比如在某些情况下角色的轨迹重要程度大于pose, 或者臀部的速度比臀部的pose更重要,于是根据重要程度,让这几个数据乘以百分比。这个百分比是一个开放的数值可以根据需要调整。 于是就有了:
2秒后角色的的位置举例差: 20 1 = 20
2秒有角色的面向角度差:1101.5 = 165
当前角色Pose 与片段A第0帧的臀部距离: 0.020.5 = 0.01
当前角色Pose 与片段A第0帧的左脚距离: 0.050.8 = 0.04
当前角色Pose 与片段A第0帧的左脚距离: 0.070.3 = 0.021
当前角色Pose 与片段A第0帧的臀部速度差: 41= 4
当前角色Pose 与片段A第0帧的左脚速度差: 20.6 =1.2
当前角色Pose 与片段A第0帧的右脚速度差: 10.4 = 0.4
Blender
求和得到一个数值:190.671, 这个数值称为一个cost. 以上是将当前动画与动画片段A的第0帧比较,得到的一个cost. 重复以上的步骤,将当前动画与 A,B, C, D, E 的所有帧做比较,得出的cost最底的那一帧, 就是下一帧会播放的动画.
以上的所有步骤都是在1/30 秒内完成,根据玩家的输入,实时的进行以上步骤,从而实现及时反馈以及最流畅的动画合成. 在玩家不停的改变操作的极端情况下,游戏里的看似流畅的动画的每一帧,都有可能来自于不同的动画片段。
小结:
文章开始回顾了23年AIGC的一些现象性事件,以及个人觉得存在的一些问题;同时引出了自己的一些观点:AIGC应该把已经有的技术能力纳入进来体系化的做出更有实际意义的产品。AIGC个人感觉应该是数据化的更深一层应用,不应该和前几次的数字化进程脱离开来。“先自动再智能”的做法是更务实的,以继承和发展的眼光来看待AIGC或者大模型,而非AIGC上一次无水之源的颠覆的视角对于推进智能化是更有利的。同时在自动化的过程必然会让你更深刻的去剖析和建模你的业务实际的样子,只有业务建模是清晰的智能化过程才能清晰的认识到需要智能体具备什么样的能力,然后再去考虑更上层的模型能力抽象(通用化、泛化)这样是更可控更符合商业逻辑的。 文章接着介绍了Game里面的在演进的一些自动化序列动作探索的技术点:基于检索式、基于学习式。之所以引出序列动作探索技术,原因在于想尝试从Game人视角看到视频生成技术路径。视频生成难点在于序列帧之间的连续性,包括故事连续、物理连续、环境连续。对于环境连续其实最简单做法就是,风景归于自然我们只是摄取即可,人造景outpaint+物理仿真周期性+扰动生成就行。物理连续性最容易想到的就是角色的动作、角色和环境的交互,后者难度很大先考虑前者。所以想到了Game这么多年一直在探索和逐步解决的学科Motion animate。个人觉得如果可以做到角色Animate motion的流畅,然后通过AIGC方式生成角色纹理(这是SD类模型擅长的)给角色批上五彩的个性的皮,在用outpaint+物理仿真方式生成一些背景(或者直接用拍摄风景视频风格化);把这些部分blender应该就可以做出不少高质量的连续视频,这些有角色视频对于普通玩家表达是有所提升的。并且这套框架可以相对明确的指导我们知道每个阶段该做什么,需要什么能力。在真正AGI出现之前它应该都具备指引的意义。
附件:
www.dfki.de/~kuf/MSVC-S… pages.cs.wisc.edu/~heckr/Thes… zhuanlan.zhihu.com/p/50141261