5.4近邻模型

科技   科技   2024-07-22 09:02   上海  


1.简介
近邻模型是机器学习(ML)变形模型的一种变体。它擅长处理更复杂的形状和图案,如角色服装,因此在某些情况下比神经变形模型更好用。
与使用网络直接改变顶点位置的神经变形模型不同,近邻模型会生成一组系数,然后用于在用户选择的数据集中查找近邻。最近的邻居会将其复杂的形状特征传输到最终输出中。
更具体地说,近邻模型中顶点deltas的计算方法是:

vertex_delta = mean_delta + (coeff* basis) + nearest_neighbor_delta

1.1.与神经形态模型的比较
在近邻模型中,用户可以自由改变近邻数据集中的形状,这将直接影响最终输出结果。与神经形态模型相比,近邻模型允许更复杂的形状特征,为用户提供了更多的可控性。但另一方面,与神经形态模型相比,近邻模型往往速度更慢,内存消耗更大。
2.视口
要打开近邻模型的训练视口,请确保
1.已选择最近邻模型
2.选择Training

3.训练数据

3.1.训练设置

训练设置
训练设置与神经形态模型相同。请参考神经形态模型文档。以下是简要说明:
  1. 骨骼网格:这是要变形的骨骼资产。
  2. 训练输入动画:用作训练数据的动画列表
  3. 动画序列:这些是真实姿势。它们可以是随机创建的姿势序列。
  4. 几何缓存:其中包括在每个真实姿态上模拟的真实网格。您可以从 Alembic 文件中导入。
  5. 网络输入:这定义了网络的输入。一般是骨骼旋转。

3.2.最佳实践
  • 一般情况下,您需要运行离线模拟,在几何缓存中生成地面实况数据。对于服装,您可以使用 Houdini Vellum 或 Chaos Cloth。
  • 在模拟过程中,您需要对网格进行多帧模拟,直到网格停止移动。
  • 通常在模拟过程中最好关闭重力(目前网络只将关节旋转作为输入,不考虑重力)。
  • 使用随机创建的姿势,例如由 MLDeformer Maya 插件创建的姿势。请勿仅使用常规动画中的姿势,因为我们已经发现网络可能会过度拟合。
  • 确保对每个关节的所有三个旋转维度进行采样。角度范围可以很小,但不能为 0。如果某些维度没有采样,网络就会变得过度拟合。
  • 使用足够数量的姿势。我们建议使用 5000 个姿势,但越多越好。
  • 检查顶点三角是否合理偏小。您可以通过查看 "训练基础 "网格上的绿线来检查顶点离差。顶点离差过大会导致训练效果不佳。

3.3.Alembic 导入设置

将 Alembic 文件导入引擎时,请确保以下设置正确无误:
Alembic 输入设置
3.4.重新导入资产
目前,最近邻接模型不会自动检测资产(动画序列或几何图形缓存)是否被重新导入。如果重新导入资产,请按照以下步骤操作,以确保能识别更改:
1.将当前条目设置为 "无"。
2.重置为您的资产。
4.训练设置
  • InputDim 和 OutputDim:表示网络中输入和输出的数量。引擎会自动更新这些值。
    • InputDim = num_joints * 3
    • OutputDim = sum(num_basis)
  • 隐藏层数:该数组用于设置 "隐藏层 "的数量以及每层中 "神经元 "的数量。
    • 这些数字应从 InputDim 逐步移动到 OutputDim。例如,如果输入是 63,输出是 256,那么隐藏层的维数就是 [64, 128]。
    • 通常情况下,2-4 个隐藏层就足够了。
    • 训练前,隐藏层不能为空。如果留空,编辑器会自动填充其值。
    • 一般情况下,只要遵守上述规则,隐藏层的大小对最终结果的影响很小。否则(例如,如果隐藏层尺寸小于输入尺寸和输出尺寸),就会导致结果不佳。
  • Num Epochs:训练时循环整个训练集的次数。默认值 10000 是安全的,但对于大多数资产来说通常过高。对于有 5k 个姿势的数据集,建议使用 2500 次。


5.Section
区段是为近邻搜索而确定的独特区域。在运行期间,每个部分都会在其特定数据集中搜索近邻,并应用相应的细节。在给出的示例中,我们定义了两个部分:一个是上衣部分,另一个是下裤部分。
注意:我们只为每个 MLDeformer 资产定义了一个部分。有关详情,请参阅 "定义剖面的最佳实践"。
  • Num Basis(基数):这是对该部分建模时使用的基准数。基数越多,模型就越精确,但也需要更多的内存,因为模型需要存储更多的基数。
    • 选中 "Use PCA(使用 PCA)"时可编辑该参数,否则不可编辑,该参数等于 "Num Basis Per Section(每区段基数)"。
  • 权重贴图创建方法和顶点索引:它们用于使用顶点贴图定义剖面。有三种定义剖面的方法:
  • 从文本:通过编写文本字符串使用顶点索引定义剖面。
    • 骨骼网格组件中有使用网格信息预定义的字符串。
来自文本的权重图
    • 您也可以使用自定义字符串定义一个部分,如本部分的第一张图片。例如 "0-5, 9, 12, 37-50"。如果您在顶点 Houdini 中定义了一个组,并希望将顶点指数复制到虚幻中,这将非常有用(请记住添加逗号)。
  • 选定骨骼:通过选择骨骼来定义截面。受所选骨骼影响的所有顶点都会包含在内(注意:辅助关节也需要选中)。顶点三角将乘以皮肤权重,以创建与非选定区域的平滑混合。
根据骨骼绘制体重图
选择骨骼:打开小工具以选择骨骼。
创建属性:使用所选骨骼的皮肤权重创建顶点属性。这对 "顶点属性 "方法非常有用。
顶点属性:使用顶点属性定义截面。您可以在骨骼网格绘制工具中手动绘制顶点属性。所有权重不为零的顶点都会包含在截面中。顶点三角值乘以权重,可以平滑地混合到非选定区域。
  • 属性名称:用于定义截面的属性名称
  • 要创建顶点属性,您可以使用 "已选骨骼 "子菜单中的 "创建属性 "按钮,也可以使用骨骼网格上任何现有的浮动顶点属性。
  • 要绘制顶点属性,需要使用骨骼网格编辑工具插件。进入 "编辑工具"→"编辑皮肤权重"→"绘制地图",然后选择要修改的属性。

外部 Txt:有时,在 Houdini 等外部软件中绘制遮罩更为理想。您可以绘制遮罩并导出一个 .txt 文件,其中每一行的浮点数代表一个顶点的权重。
权重地图 Txt
权重图 Txt
  • 您需要确保顶点顺序相同,因为虚幻有时会对骨骼网格数据中的网格重新排序。
  • Houdini 中导出顶点权重的 python 代码段示例如下

node = hou.pwd()
geo = node.geometry()
import numpy as np
import os
mask_values = [point.attribValue('mask') for point in geo.points()]
output_path = os.path.expandvars('$HIP/mask/upper.txt')
print('write to', output_path)
np.savetxt(output_path, np.array(mask_values), fmt='%f')
  •  为了确保顶点顺序一致,有时您可能需要在 Houdini 中对顶点重新排序。您可以在虚幻中根据顶点顺序为顶点分配新的索引,并使用排序节点对顶点进行排序。下面的 python 代码段展示了一个创建名为 "assigned_index "的新属性用于排序的示例。
  • 邻居姿势:近邻数据集中的模型。该数据集是指用于改进模型复杂几何细节的数据集。在网络训练完成后,可以对其进行编辑。如果保持为 "无",则不会应用近邻 delta。
  • 近邻网格:近邻数据集中的网格。网络训练完成后可对其进行编辑。如果留为 "无",则不会应用近邻三角网格。
    • 近邻姿态和近邻网格可以通过关键姿态提取工具自动生成,也可以通过外部工具手工选择或两者结合生成。


5.1.截面可视化
您可以使用可视化 → 训练网格下的设置将定义的截面可视化。
1.选中绘制顶点
2.选择要可视化的截面
可视化截面中的所有顶点。灰色的权重为 0,橙色的权重为 1。
可视化section
5.2.定义区段的最佳实践
您可以为希望单独应用近邻搜索的重叠区域定义区域。例如,您可以为躯干定义一个区域,为双臂定义两个区域。
如果有不重叠的区域,最好使用单独的 MLDeformer 资产,而不是在同一资产中使用单独的部分。在实践中,您希望将上半身和下半身的服装分别置于不同的 MLDeformer 资产中。这样,上半身的动作就不会影响下半身的细节,反之亦然。以上示例仅供演示之用。

5.3.最近邻数据集的最佳实践

始终检查顶点delta的合理大小。使用下拉菜单可视化近邻数据集的顶点delta。

检查数据集

6.状态

近邻模型的状态。

模型状态

  • 网络状态:网络上次训练的时间

  • 推理状态:资产的当前状态。您可以使用该字段来确定修改属性后是否需要重新训练或更新。

    • 重新导入骨骼网格或训练数据时例外。推理状态不会更新,但需要重新训练资产。同样,如果近邻数据被重新导入,也需要重新更新。

  • 变形目标状态:上次更新变形目标的时间。

  • 网络结构:上次训练的网络结构。其格式为 InputDim [HiddenLayerDims] OutputDim。这是当前加载的网络结构,可能与训练设置中的 HiddenLayerDims 属性不同,后者是将要训练的网络结构。

  • 更新:更新模型的变形目标。

  • 清除引用:清除对其他资产(动画序列或几何缓存)的引用/依赖。如果您不想在您的版本库中检查这些大型资产,这对资产验证很有用。


7.最近邻设置

最近邻设置
  • 使用 PCA:是否使用 PCA 计算基数。PCA 是一种根据数据集预先计算基础的程序性方法。如果未选中,则将使用网络训练基数。

    • 使用 PCA 时,模型更容易模糊,但高频噪声较少。

    • 不使用 PCA 时,模型的细节可能会更好,但更容易出现伪影。

  • 使用双四元数△:该选项使用双四元数蒙皮来计算和反转顶点三角。有时我们会看到更好的结果,有时我们会看到更差的结果。

    • 只有顶点三角是使用双四元数计算的。基本蒙皮不使用。打开此选项并不会将线性混合蒙皮转换为双四元数蒙皮。它只会影响三角的计算方式。

      我们需要在变形图的引擎内容中使用 DG_DQDeform_RecomputeNormals。这是默认选项。

  • 衰减系数:这决定了前一帧的细节在当前帧中逐渐消失的速度。计算当前帧细节的公式如下:current_frame_wrinkle = decay_factor * last_frame_wrinkle + (1 - decay_factor) * predicted_wrinkle。更改此选项无需重新训练或更新模型。

  • 使用 RBF:使用径向基函数计算近邻三角。默认情况下(关闭),模型只查找一个最近邻,并将其细节应用到最终结果中。打开后,模型将查找多个近邻,并根据径向基函数对它们进行混合,然后应用到最终结果中。这可能会使结果更加平滑。更改此选项无需重新训练或更新模型。

  • RBFSigma:径向基函数中使用的西格玛参数。该值越大,混合的邻域越多,结果也就越平滑。更改此选项无需重新训练或更新模型。

8.训练网络

定义好部分后,我们就可以训练网络了。

在初始历时中,模型中的误差应该会明显减少。如果没有出现这种情况,可能是数据出了问题。

9.应用近邻迭代

网络训练完成后,我们可以在 "部分 "下设置 "近邻姿态 "和 "近邻网格"。然后,我们需要点击 "更新 "来更新变形目标,然后才能在视口中看到结果。

变形目标压缩设置与神经变形模型相同,但我们需要针对近邻模型进行调整。我们建议首先将 Delta Zero Threshold(零阈值)设置为 0,压缩级别设置为 1,如果内存有问题,再进行调整。Include Normals应保持关闭。

变形目标
近邻模型尚未支持包含法线和遮蔽。
最后确定变形目标(Finalize Morph Targets)会删除变形资产中存储的原始数据。这有助于减少磁盘大小和变形器资产的加载时间。但这也会导致无法编辑压缩设置,除非重新训练模型。
10.测试
测试设置与神经形态模型基本相同。首先,我们需要在顶部菜单栏的下拉菜单中将 "训练 "切换为 "测试"。然后,我们需要在左侧的可视化面板中设置测试动画序列。
10.1.变形器图形
当开启 "Use Dual Quaternion Deltas"时,应使用 DG_DQ_RecomputeNormals。否则,应使用 DG_LinearBlendSkin_Morph_Cloth_RecomputeNormals。您可以在 /Engine/PluginsDG_DQ_RecomputeNormals 中找到这些变形器图形。
11.关键姿势提取工具

工具下拉菜单

在训练和更新模型后,您可以使用 "关键姿势提取工具 "自动创建近邻数据集。在给定输入姿势列表后,该工具会将相似的姿势归类为簇,并选取簇中心创建近邻数据集。该工具使用 KMeans 算法进行聚类。

关键姿势提取工具

  • 近邻模型资产:用于计算聚类的资产

  • 剖面索引:用于计算聚类的剖面索引

  • Num Clusters:要提取的聚类个数

  • 提取几何图形缓存:是否同时提取几何图形缓存。如果未选中,工具将只创建动画序列。如果选中,工具将同时创建几何图形缓存。

  • 输入:要提取姿势的数据

    • 姿势:要聚类的姿势

    • (可选)缓存:每个姿势的几何缓存。只有选中 "提取几何图形缓存 "时才需要。

      • 缓存中的帧数应等于 "姿势 "中的键数

    • 必须包含的帧:最终输出中必须包含的帧

  • 提取的姿势:将输出姿势写入的文件。您可以使用 "新建姿势 "按钮覆盖现有文件或创建新文件

  • 提取的缓存:将输出几何图形缓存写入的文件。您可以使用 "新建几何体缓存 "按钮覆盖现有文件或创建新文件

  • 新姿势:创建一个新的空动画序列

  • 新几何图形缓存:创建一个新的空几何图形缓存

  • 提取:运行提取关键姿势工具。这将在 "提取姿势 "和 "提取缓存 "中输出结果。它还会在输出日志中输出结果。

    • 这些结果会组成一对数字。第一个数字是动画索引。第二个数字是帧。您可以使用这些信息在外部软件中组装数据集。

提取结果

12.近邻统计工具
在生产过程中,我们有时需要对近邻数据集进行修剪,以便使模型符合内存预算。邻居统计工具会运行一个测试动画,并输出有关哪些姿势使用最少、哪些姿势使用最多的统计信息,这有助于指导修剪过程。
近邻统计工具
  • 近邻模型资产:用于计算统计的资产
  • 测试动画:要测试的动画
  • 区段索引:用于计算统计的区段索引
  • Get Stats(获取统计信息):计算统计信息并在 Output Log(输出日志)中输出结果。


统计输出

输出说明

  • 索引:最近邻数据集中基于 0 的索引

  • 相似姿势:数据集中与此姿势最相似的姿势

  • 出现次数:在测试动画中作为近邻出现的次数

  • 帧数:该姿势在测试动画中作为近邻出现的帧数



近期焦点
Unreal Fest Shanghai 2024 | 虚幻引擎技术开放日,开票啦!
通过游戏动画示例项目获取500多种免费动画
UOD Awards 2024 作品征集,启动!
虚幻引擎5.4现已发布
GDC 2024:来自State of Unreal的重大新闻
欢迎来到全新的虚幻引擎网站
我们将在四月下旬更新虚幻引擎、Twinmotion和RealityCapture的定价

扫描下方二维码,关注后点击菜单栏按钮“更多内容”并选择“联系我们”获得更多虚幻引擎的授权合作方式和技术支持
长按屏幕选择“识别二维码”关注虚幻引擎
“虚幻引擎”微信公众账号是Epic Games旗下Unreal Engine的中文官方微信频道,在这里我们与大家一起分享关于虚幻引擎的开发经验与最新活动。


虚幻引擎
Epic Games 旗下 Unreal Engine 虚幻引擎官方订阅号
 最新文章