Blog

5 posts

基于tuple的SoA容器实现

SoA和AoS In computing, array of structures (AoS), structure of arrays (SoA) and array of structures of arrays (AoSoA) refer to contrasting ways to arrange a sequence of records in memory, with regard to interleaving, and are of interest in SIMD and SIMT programming. 根据Wikipedia的介绍,SoA是一种并行友好的layout,这种数据结构是我在学习如何用OpenGL向GPU加载顶点数据时时了解到的。比如在编辑顶点数据时,我们常常会分别对顶点的不同属性单独处理,因此当使用SoA时,能保证缓存友好。打个比方,当我们想要批量修改顶点的法向量时,使用SoA这种layout,能够保证不会载入其它属性(位置、颜色)的数据到Cache中。 当然,除了顶点,还有许多地方也会用到,比如在ECS架构,大多数`System`只处理一种类型的`Component`,这类似于对顶点的属性进行处理。而`Entity`则类似于顶点的概念。 实现 这里我们想要实现SoA的容器,类似于google/filament中的SoA模板容器filament/StructureOfArrays.h at main · google/filament (github.com),模板参数为属性。这里大部分接口都是类似的,具体实现因为数据存储方式不同而有所区别。

BlogC++

⚓{0x08}DeepPhase. 关于Phase的编码器

在昨天深夜的时候,Starke推了一条他们最新出炉的一篇siggraph。视频中的人物动画反倒是不怎么吸引我,重点是下方这个Phase Manifold。我第一眼看到的时候就觉得这肯定是近两年内角色动画中最漂亮的一篇工作。 文章和视频在这个GitHub repo中 看完这篇文章后,也非常冲动地先写下这篇blog,作者在文章中有很多想法在曾经出现在我的脑海中,这也是为什么编号是0x08。至于中间的这几篇文章为什么还没有填,还是课程比较繁重,所以打算暑假再填,(当然不是因为懒。大致的目录以及对应的文章如下 0x03 NSM, LMP对应的是19年和20年Strake的文章。没错,这人的文章属于那种能给人inspiration的文章(类似的还有Motion Field)。 Neural state machine for character-scene interactions. Local motion phases for learning multi-contact character movements. 0x04 MVAE,对应的是20年的 Character controllers using motion VAEs 0x05 Motion Graph 和 Motion Field,这两篇也是非常经典的文章,不管是业界还是学界都有应用和延申 0x06 Motion Matching,在业界中属于比较前沿的技术,属于简化版的Motion Field,由于它的简单好用,近些年频繁地出现在学界的研究中。(如果有时间的话,这里会写一个非常非常简单的demo,逃 0x07 这里会重新提起Phase这个概念在动画领域其他分支上的工作 DeepMimic, 在基于DRL的、物理的角色动画中使用Motion数据来给予奖励,属于让agent去track动画数据,一般称为motion tracking Robust motion in-betweening,由Transformer启发的深度补帧工作,在航海日志中属于一个小插曲,篇幅可能不多,但其中的一个position encoding可以联想到NSM中的Phase的计算。(这个联系我在前两个月中发现,在现在要讲的这篇DeepPhase中作者也有提及,第一次感觉和大牛离得辣么近

⚓{0x02} MANN导读

书接上回,PFNN是一种动态调整网络参数的一种motion生成模型,它在运行时根据当前的角色状态的Phase,来调整网络参数。调整方法是将Phase映射到一个周期样条函数,其输出为网络的参数。同时作者也提出,调整方法也可以是网络。那么这篇导读就是一个初步的尝试。 背景 MANN,全称“Mode-Adaptive Neural Networks for Quadruped Motion Control”。从标题上看,这是一种模式适应的生成网络,用于生成四足运动。 这篇文章和PFNN的主要不同是,动态更新网络参数的方法变为使用一个网络来调整,称为gating network。 其次研究对象变为了四足运动,相比于双足运动,其复杂度和多变性更大。由此引出了一些问题: 如何定义四足运动的Phase? gating network是何物? 首先是第一个问题,在PFNN中,Phase的定义是比较简单的,将左右脚着地的信号映射到 上,这么做的原因是PFNN的研究对象是human locomotion,更具体的说是很简单的人类移动。如果套用PFNN的方法,我们是很难定义四足动物的运动的Phase。比如MANN的具体对象是狼,它的locomotion的pattern相比于human locomotion更为复杂。如下图所示,同一类别的运动,四肢着地的方式就有四种不同(可能不止),同时某些肢体的着地时间还有交叠,这使得我们更难去定义Phase。 这里作者给出的方法是,用部分的肢体信息去隐式地表示Phase,让网络去学到这其中的”奥妙“。 对于第二个问题,其实比较好解释,如果还记得 中的Phase Function,那么这个gating network就是Phase Function。一样是在运行时调整生成网络的参数。如果小伙伴读过其它论文的话,有一个东西很像gating network,就是hyper network。 Overview 整个Pipeline如上图所示。其生成网络的输入与PFNN大同小异。同时使用了CCD full-body反向动力学来调整四肢与地面的接触,减少artifact。下面主要讲一下gating network Gating Network MANN 区别于 PFNN 的最主要不同点就是,计算 Blending 因子的方式。在这篇论文中,作者使用 gating network 来预测 blending 因子。相比于人为定义一个确定的函数计算,用网络的方式能生成更好地生成合适地 blending 因子。gating network 的输入 是生成网络输入的一个子集,包括

⚓{0x00} 工欲善其事,必先利其器

在一系列的努力操作下,我终于能读到心心念的计算机图形学了。但不得不说,我找导师的时间确实太晚了,应该在通知拟录取的时候就开始找老师了(其实最好就是在你准备考研的时候,去联系心仪的导师)。不过怎么说,现在算是稳定下来了。 刚到实验室,研究所给了台还算一般的工作站,双路E5-2670(垃圾佬u),Quadro M5000,64GG DDR4。普通的STAT固态硬盘,这就有点拉了,以后遇到IO瓶颈再升级。总的来说炼点小丹不在话下。 就我的一向习惯,在拿到一台机子的时候,首先就是全盘格式化重装一边Windows 11,然后才开始配置环境。主要是避免一些前任留下的奇怪问题。下面主要分三个部分讲,系统环境、编程环境、科研工具。这篇文章也算是一个记录,用于统一以后不同电脑的环境,打造家的味道。 系统环境 首先就是登录巨硬的账号,主要是可以自动同步一些Windows 11的设置。接下来就是进入正题了。 墙🔨 总得看看更广阔的世界,是吧(逃 这里使用Clash-Windows作为自己搭好的梯子的前端,选用它有两点原因:界面好看、支持多种不同协议的代理。至于如何搭建梯子,在这就不赘诉了。 WSL2 这里因为安装的是 Windows 11 所以可以直接根据下面的流程安装 WSL2 控制面板—>程序—>查看方式:大图标(在界面的右上角)—>程序与功能—>启用或关闭 Windows 功能—> 勾选Hyper-V和适用于 Linux 的 Windows 子系统—>确定,然后重启电脑 这里使用yuk7/ArchWSL作为我们的 wsl 系统。首先在仓库的 Release 中下载 Arch.zip,然后解压到一个具有权限的文件夹中,这里最好是解压到速度最快的硬盘(毕竟是系统、吃4K随机存储的速度),这里假设路径是path/to/arch 然后在path/to/arch中运行Arch.exe,这里建议安装好后添加一个新用户,然后运行在此目录下打开 cmd 运行命令Arch.exe config --default-user username,把username换成刚刚创建的用户名。最后在给他root的权限,以方便安装 package 最后运行wsl --update和wsl --set-default-version 2和wsl --set-version Arch 2来将 Arch Linux 升级成 wsl2

⚓{0x01} 关于PFNN一些看法

背景 在角色动画领域中,骨骼的动画是最重要的一种动画,一般称之为motion。受动物运动的启发,人们将角色动画简化为两步,骨骼的姿势变化(骨骼动画),以及皮肤受到骨骼的变化而变化(蒙皮)。 本文所介绍的这篇文章则是研究如何利用深度学习来生成和控制骨骼动画。生成的骨骼动画的好坏可以由下面几点来评判: 动画是否连续 动画是否自然 第一个点是最基础的,它限定骨骼的姿势变化不能太大,比如角色正在跑步,下一帧的骨骼姿势不应该突然变成非跑步姿势(比如站立)。那么这一点就可以基本上决定了这类生成模型大体都是自回归模型,那么就需要考虑误差累积的问题,减少误差累积有很多方法,有些方法还是场景特点的,在这就不一一介绍。 第二个点就比较主观,好在我们在使用深度学习研究时,一般是有数据集的,而数据集大都采自真实世界,我们可以设计一些距离函数来评判生成的动画是否和ground truth足够接近,从而来评判生成的动画是否自然。 此外为了加入控制,我们会在自回归的途中对输入进行一定的修改,以达到控制生成的动画。因此大致的流程可以由下图表示 在我们所讲的这篇文章中,有两个主要的工作: 为动作捕捉数据生成虚拟的地形,这是由于动作捕捉设备只捕捉人体mark点的空间运动,并不会扫描动捕场景的地形,因此需要为虚拟场景生成与动捕数据对应的地形。 提出所谓的Phase-Functioned Neural Network,即PFNN来生成自然的locomotion。 前者工作属于数据增强的方法,其大致思路是:根据现有的虚拟场景高度图,切割出大量地块,然后将这些地块去fit每个locomotion,选出最匹配的地块,之后再微调这些地块的高度,让其更匹配locomotion。这个方法比较暴力,论文中介绍了三种误差来表示地块和locomotion的匹配程度,这里不再赘述。 PFNN 上图就是PFNN的模型示意图,分成两个部分: 生成网络,即左侧的MLP, 用于动态调整MLP参数的一个模块——Phase Function。 现在我们先来看左半边的网络,即 motion 的生成网络。它的结构比较简单,由三层全连接层组 成,隐藏层的输出由 ELU 激活。 在讨论网络的输入输出之前,我们先整理一下需求是什么: 生成下一帧的 Pose,即关节点的位置, 能够有一定的控制,即控制角色的运动方向、运动速度、以及运动的形态(gait), 能够适应具有地形的场景,而不是一个平地场景。 现在我们可以开始说明输入输出的具体设计 网络输入 对于第 帧的motion生成,输入如下 在平面上的路径信息,我们一般通过这几个量来控制角色的运动。这些量也是定义于根节点空间 , 路径位置 , 路径方向 , 步态(gait), 包括走路、慢跑、奔跑、蹲伏走、跳跃。one hot 编码。

Blog
Page 1 of 1