任程的博客

计算机图形、动画、虚拟现实 / 3D Computer Graphics, Computer Animation, Virtual Reality / uStep禹步信息科技
  首页  :: 联系 :: 订阅 订阅  :: 管理

运动捕捉数据的行为分割

Posted on 2011-08-16 12:01  任程  阅读(3150)  评论(0编辑  收藏  举报

定义  

        我们有时会获得一些时间很长的运动捕捉数据文件,每个文件中包含多个行为动作(如图所示),比如走路、拳击、跑步、跳跃等等,而在进行运动编辑与运动合成时,常常希望一个片段只包含一种行为,例如你做运动片段插值的时候,可能只想要多个走路的运动片段,你不会想要把走路和一个特技动作进行直接的插值。

image

       当运动数据文件很多时,自动地对这些文件进行行为的分割就是很有用的了,分割后每个片段只包含一种类型的行为,也就是说给定一个运动数据文件m1,我们需要将m分割为m1,m2,…mS,分割的段数S与各个分割点是待求解的。

方法

       文章”Segmenting Motion Capture Data into Distinct Behaviors, J. Barbic and A. Safonova and  J.Y. Pan and  C. Faloutsos and J. K. Hodgins and N. S. Pollard”(以下简称该文章为”Segment一文”)旨在处理此问题,你可以在这里:http://graphics.cs.cmu.edu/projects/segmentation/看到与该文章的视频信息,并下载到该文中使用的运动数据文件。我这里要提供的是对其文中想法的一个简述,并提供源代码。

       Segment一文中介绍了三种分割的方法,分别是PCA方法(Principle Component Analysis)、PPCA(Probabilistic Principle Component Analysis)方法、GMM(Gaussian Mixture Model)方法。

       其中前两种方法都基于PCA主元分析,其基本思想是这样的:人体各关节的运动由很大的相关性(如步行动作中左臂向前摆动时右臂会向后摆动),因此利用PCA可以对人体动作进行降维从而提取出主要成分来;而两个不同的行为会具有不同的主元成分,那么利用此特点就可以将行为区分开来。首先对一个区间段内的运动数据进行PCA提取,然后不断的加长此区间的长度,如果在加长到某个数据帧时发现提取出的PCA成分与前面区间段的PCA成分差异较大,那么就断定运动在此处发生了行为切换。

       第三种方法基于混合高斯模型,其想法与以上也有相通之处,用高斯混合模型对整个运动序列进行建模,不同的行为会有不同的高斯分布,每个行为会聚集在自己的高斯簇周围,如果一个数据帧之前的运动片段聚集于一个簇,而其之后的运动片段聚集于另一个簇,那么就在此数据帧处对运动进行分割。

代码

       Segment一文的实验结果表明,PPCA方法得到的结果最优(具体实验请看原文),因此实现了PPCA方法,这里是代码下载:https://files.cnblogs.com/ArenAK/BehaviorSegmentation.zip,当然你可以基于此代码做一些调整,就能得到PCA方法,因为PCA方法较PPCA方法更简单。

       代码不当与需改进之处,欢迎指正。

代码使用方法:

直接运行main.m就可以了!

默认输入

运动数据文件Patient1.Mix 01.amc.txt

默认输出

程序运行完后,在matlab的命令行窗口显示类似这样的内容:
allcuts =
          1        1020        1819        2588        3157
4066        4666        6035        7234       8883        9192
9609       10208       10617
这就是分割点,每个数字代表在哪一帧进行分割。
另外程序会输出一些文件在result文件夹下,分为两类:
1. 原txt文件被转化为amc文件并输出,如Patient1.Mix 01.amc.txt被转换为如Patient1.Mix01.amc.txt.amc,你可以用能打开amc程序的三维软件查看动作。
2. 各个被分段后的amc文件,文件名以seg_开头,如seg_1.amc,seg_2.amc等,同样你可以查看分段得到的动作。

说明

代码包中包括了一个运动数据文件Patient1.Mix01.amc.txt作为输入,如果你想测试其它文件,请在网页http://graphics.cs.cmu.edu/projects/segmentation/ 中提供的链接下载,代码的输入可以是与此文件格式相同的txt文件,也可以是CMU数据库的标准amc文件(你可以在http://mocap.cs.cmu.edu/tools.php下载到查看amc文件的三维软件)。

输入的文件可以是一个或多个,将其放在ExperimentCMUData文件夹下即可。
另外,程序中有个参数threshold,默认值设为了500000,根据不同的文件,有可能你想要调节一下这个数:threshold越大,分段数越少;threshold越小,分段数越多。