步骤
VMD是通过迭代搜寻变分模型优解, 来确定我们所知的模态uk(t)及其对应的中心频率ωk和带宽。
每个模态都是具有中心频率的有限带宽(就是在频域中有在一定的宽度)。所有模态之和为源信号。
而对求最优解采用二次惩罚和拉格朗日乘数将上诉约束问题转换为非约束问题,并用交替方向乘子法求解这个非约束问题, 通过迭代更新最终得到信号分解的所有模态。分解的所有模态中有包含主要信号的模态和包含噪声的模态。将包含主要信号的模态进行重构,从而达到去噪的效果。
代码步骤思路(uk和ωk更新算法)
1、初始化uk、ωk、λ和n=0,k=0
2、n=n+1(迭代次数)
3、k=k+1,根据VMD算法公式更新uk、ωk
4、又根据相关的算法更新拉格朗日乘数λ
5、知直到满足一定条件,停止迭代,不然转到2步骤
以上只是求每一个模态的单步骤
总步骤:
1、初始化uk、ωk、亏握物λ和n=0,
2、n=n+1(迭代次数)
3、根据VMD算法公式更新uk、ωk
4、又根据相关的算法更新拉格朗日乘数λ
5、知直到满足一定条件根据(相似系数来判断),停止迭代,不然转到2步骤
6、k=k+1,将源信号减去分解出来的模态,并作为下次一循环的源信号,转到步骤1123456789101112131415
如何判断相关模皮掘态
判断
用信号与模态的相似程度来判断信号与噪声 。推荐一篇论文,他对VMD进行了一些优化。例如:在VMD中一般采用局部重构,即将与原信号相似的模态就认为是信号,与原信号相差大的模态认为噪声,然而噪声模态中其实还含有一些信号,用一定方法提取信号,可增加信噪比和可信度。同理(我自己的看法),采用定的滤波器处理信号模态来去除其中的噪声会不会提高信噪比。这是一个方向。
推荐论文:基于VMD的激光雷达回波信号去噪方法销液研究
应用
缺点及解决方法
1、最大的局限性是边界效应和突发的信号。这与基于L2平滑阶段的使用密切相关,该阶段过度惩罚了域边界和内部的跳跃。
2、长期模态的光谱带会随着时间的推移而急剧变化,并且会在全局范围内重叠。在这里,直接的解决方案是将信号分解成较短的块,在这些块上信号足够稳定。
3、要求预先定义模态数K。这是我们与许多成功的聚类和分段算法(例如k-means)共享的缺点。
MikuMikuDance(简称MMD)是一款动画软件,早期视为Vocaload角色制作动画的软件,现在还经常能在B站等视频网站,或一些动画网站(某I站)看到MMD作品。
我在高中也简单学过 *** 作这款软件以及PE、水杉等软件,学会了简单k帧、套动作、调渲染、加后期、压缩等技术,这与我学习计算机专业有很大的关系(虽然学校学的和这个八竿子打不着,或许我应该学美术去),现在已经分不清很多东西了,封面静画就是杂七杂八过气MME一锅扔的成果,得益于G渲的强大,还能看出一点效果。
现在我想学一些3D的开发,包括用程序读取模型、动作等,很快我就想到之前用过的MMD。
一些3D姿势估计(3D pose estimate)或许能得到骨骼位置以及PAF(骨骼间关系),但我需要知道3D动画是如何储存动作数据的,才能想到怎样将姿势估计得到的数据转化为动作数据。
因此我找了一些资料解析MMD的动作数据VMD(Vocaload Mation Data)文件,并写下这篇记录。
本文会用python解析vmd文件,并纠正上述文章的一点错误。
根据MMD的规矩,上借物表:
封面静画:
首先,vmd文件本身是一个二进制文件,里面装着类型不同的数据:uint8、uint32_t、float,甚至还有不同编码的字符串,因此我们需要二进制流读入这个文件。
vmd格式很像计算机网络的协议格式,某某位是什么含义,区别是,vmd文件的长度 理论 上是无限的,让我们来看看。
vmd的大致格式如下:
最开始的就是 头部(header) ,看到这就有十分强烈的既视感:
其中, 版本信息(VersionInformation) 长度为30,是ascii编码的字符串枣没枯,翻译过来有两种,一为“Vocaloid Motion Data file”,二为“Vocaloid Motion Data 0002”,长度不足30后用\0(或者说b'\x00')填充。这是由于vmd版本有两种,大凳洞概是为了解决模型名称长度不足,因此后续只影响模型名称的占用长度。
模型名称(ModelName) ,是动作数据保存时用的模型的模型名,通过这个我们可以获取到那个名称,我们知道,一个动作数据想要运作起来,只要套用模型的骨骼名称是标准的模板就可以,因此我想象不出这个名称有何用处,或许某些模型带有特殊骨骼,例如翅膀之类的,这样能方便回溯?模型名称的长度根据版本而决定,version1为10,version长度为20。编码原文写的是shift-JIS,是日语编码,这样想没错,然而我试验后发现并非如此,例如经常改模型的大神 神帝宇 的模型,他的模型名称用shift-JIS为乱码,用gb2312竟然能正察老常读出来;还有 机动牛肉 大神的模型,他的模型名称用gb2312无法解码,用shift-JIS解码竟然是正常的简体中文???怎么做到的?
骨骼关键帧,分为两部分:骨骼关键帧数、骨骼关键帧记录:
我们可以查一下,每个骨骼关键帧的数量为111字节。
一开始还没发现,旋转坐标竟然有四个,分别为x, y, z, w,急的我去MMD里查看一下,发现和我印象中没有什么差别
为何补间曲线的类型不确定呢?上面csdn博客的教程说 “uint8_t那里有冗余,每四个只读第一个就行” 。说的没有问题,首先我们要清楚这个补间曲线坐标的含义。
我们打开MMD,读入模型,随意改变一个骨骼点,记录帧,就会发现左下角会出现补间曲线。
后面的格式与这个格式大同小异。
表情关键帧分为:表情关键帧数、表情关键帧记录:
镜头关键帧分为:镜头关键帧数、镜头关键帧记录:
距离是我们镜头与中心红点的距离,在MMD中,我们可以通过滑轮改变
Orthographic似乎是一种特殊的相机,没有近大远小的透视关系(不确定),不过在我的实验中,它一直取值为0。和上面的已透视没有关系,当取消已透视时,透视值会强制为1。
下面的骨骼追踪似乎没有记录,可能是强制转换成骨骼所在的坐标了。
后面的格式与这个格式大同小异。
表情关键帧分为:光线关键帧数、光线关键帧记录:
rgb颜色空间之[0, 1]之间的数,类似html的RGB(50%, 20%, 30%)这种表示方法,转换方式就是把RGB值分别除以256。
光线投射方向是[-1, 1]之间的小数。正所对的投射方向是坐标轴的负方向,例如将Y拉到1, 光线会从上向下投影。
我依旧会使用面向对象的方式构建VMD类,不过构造方法无力,属性太多,我选择用静态方法添加属性的方式构建对象
随意掰弯一些关节并注册、使用:
output:
因为前面提到的编码模式,我选择用gb2312解码,在很多(也许是大部分)动作数据都会报错,可以去掉编码方式:
我们没有移动方块骨骼,因此位置信息都是0。
不喜欢看欧拉角的话,可以写一个转换方法:
这样只要调用:
即可得到转换成欧拉角的结果,同样的方式还可以编写转换RGB、弧度、角度等
python内置的json包可以很方便得将字典转换成json格式文档储存。
我们也可以试着写一些将VMD转换成vmd文件的方法。
通过学习VMD的文件结构,大致了解了储存动作数据的格式和一些方法,或许可以类比到一些主流的商业3D软件上。
读取程序并不难,我写程序的很多时间都是查二进制 *** 作消耗的,通过这个程序,还巩固了二进制 *** 作的知识。
我在google上找到了一个包 saba ,专门用于 *** 控MMD的文件,包括模型、动作数据等
现在学一下图形学,等学有所得再做出更多东西。
含义1:乱者VMD 是一个分子可视化程序,该程序采用3D图形以及内置握陪冲脚本来对大型生物分子系统进行显示、制成动画以及分析等 *** 作。
含义2:VMD(Visual Merchandising),即 “视觉段歼营销”或者“商品计划视觉化”。
VMD不仅仅涉及到陈列、装饰、展示、销售的卖场问题,还涉及到企业理念以及经营体系等重要“战略”,需要跨部门的专业知识和技能,并不是通常意义上我们狭义理解的“展示、陈列”,而实际它应该是广义上“包含环境以及商品的店铺整体表现”。
目前在发达国家视觉营销包含,空间:通过空间立体视觉效果营造品牌氛围。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)