代码1
数据介绍
该动作识别的数据主要来源于8个不同的人动作,每个人做了5种动作,每种动作做了2个,所以算起来一共是8*5*10=400动作,其中每个动作有80组数据。
利用HMM训练的过程:
首先就是对每种动作进行训练,我们假设先对第一种动作进行训练。我们拿出80组都是动作1的数据。同时80%的数据(64)用来进行训练,剩下的数据用来做测试。
其次我们对每个相同动作的64组数据放在一起进行聚类,形成在单个动作下的8簇数据点,然后每组数据中的点打上簇的标签号,这样我们就知道了每个簇的中心点。对于测试数据而言就是利用点的位置和簇的中心位置进行计算,离得哪个簇近就把点打标签为哪个簇。
对于打好标签的数据,我们开始训练。假设我们打好了8个簇,那么我们需要选择隐状态(一般不大于观测的类型数,我们这里选择3个隐状态,同时我们这里面是8个簇,所以发射矩阵B为8*3的矩阵),然后我们利用初始化的初始状态概率矩阵,加上状态概率转移矩阵就可以进行模型的训练了。
注意点
对于离散的量测来说,即量测可以穷举,此时的发射概率为矩阵,但是对于连续的量测来说,一般为GMM模型,此时发射概率一般为高斯模型参数的值。本例子中,将位置空间的连续性转化为具有簇类特征的可穷举性。对于新的数据而言,我们就需要进行数据的簇类化,可以理解为是特征提取。
这个就相当于对每frame很多点进行目标的跟踪,然后形成一个点,这样就可以利用类似于这种方法实现模型的训练了。
当然其实也可以利用这些数据基于GMM-HMM进行动作的识别。可以这样理解:每frame数据只有一个点,把这个点当做观测的特征,但是由于这些点是某个函数的分布,我们一般用多个高斯的分布来表征,这里假设是两个。那个这样子的量测数就不是可以穷举的,我们会假设该动作下的数据是高斯的分布,于是我们参数就是就是两个高斯的参数(均值和方差)以及每个高斯的权重,那么我们就可以进行参数的学习了。这个就是一般是量测是概率连续的情况下用高斯来逼近。这种当然会加大计算量。同时如果你用了一个高斯分布,那个此时显然是不对的。因为你的特征显然不是高斯分布下的数据。所以,有时候需要在多个高斯和连续,离散等因素之间做选择。
这个进行每一帧数据进行簇类特征的提取,也算是时间序列下特征的提取。
代码2
这个代码主要是针对利用人体3D点云的数据进行GMM-HMM学习人体动作,可以进行如下理解:
首先就是获得相同动作的数据,并且根据特征进行了不同组但是相同特征的数据在时间序列下的简单重新排序。这里面是对每个动作序列进行了9划分,每个阶段动作都会有60625大小的数据。所以要对特征的参数进行学习。这里与与上面离散不同的是,不需要进行特征的提前提取,此时这些特征是给定好的。所以我们会针对在不同时间下相同特征数据的参数进行学习。如果数据比较大我们可以进行下采样,也就是类似于代码中对数据进行等分的划分。也可理解为相同的特征在不同组数据,以及不同时间段下的一个数据的分布,我们如果假设为高斯,那么我需要对每个特征的分布进行学习,这样才能学习到联合的概率分布。我们上面可以理解为在时间序列下点来自那个簇类的概率最大,这里我们一样理解就是时间序列下点来自哪个参数分布的概率最大。上面的是时间序列下点来自哪个簇类的序列概率是学习来得,在这里时间序列下点来自哪个分布参数下的概率也是学习得到的。如果我们有新的一组数据进行测试,可以这样理解,我们把时间序列下的数据计算出来自哪个分布的概率最大。在已知的序列下,来自哪个模型的概率最大,说明就是哪个模型的数据。时间序列下特征的分布学习,而且是对相同的特征在动作下的分布,主要是通过时间序列来获得特征的分布,因此有了特征变化的时间序列。
补充:如果有小伙伴需要了解学习的代码,可以分享,我可以做免费的讲解。