将HMM应用于手势识别的一组方法是应用类似于通常用于语音识别的架构。
HMM不会放在空间上,而是放在时间上,每个视频帧(或从帧中提取的特征集)将是来自HMM状态的发射。
不幸的是,基于HMM的语音识别是一个相当庞大的领域。已经编写了许多关于描述不同体系结构的书籍和论文。我建议从Jelinek的“语音识别的统计方法”开始(http://books.google.ca/books?id=1C9dzcJTWowC&pg=PR5#v=onepage&q&f=false),然后从那里跟随参考资料。另一个资源是CMU sphinx网页(http://cmusphinx.sourceforge.net)。
还要记住的另一件事是,基于HMM的系统可能比条件随机场或最大间隔识别器(例如SVM-struct)等判别方法不太准确。
对于基于HMM的识别器,总体的训练过程通常如下:
1)对原始数据执行某种信号处理
2)对处理后的数据应用矢量量化(VQ)(也可以使用其他降维技术)
3)手动构建HMM,其状态转换捕获手势中不同姿势的序列。
这些HMM状态的发射分布将以来自第2步的VQ向量为中心。
在语音识别中,这些HMM是从给出每个单词音素序列的音素词典中构建的。
4) 构造一个包含每个单独手势HMM之间转移的单一HMM(或在语音识别的情况下,每个音素HMM之间转移)。然后,使用手势视频对组合HMM进行训练。
对于识别过程,应用信号处理步骤,为每个帧找到最近的VQ条目,然后在给定量化向量的情况下,通过HMM找到高得分的路径(即Viterbi路径或来自A*搜索的一组路径)。该路径给出了视频中预测的手势。
我为Coursera PGM课程实现了2D版本,其中kinect手势是最后一个单元。
https://www.coursera.org/course/pgm
基本上,这个想法是你不能很好地使用HMM来确定姿势。在我们的单元中,我使用了一些变体的K-means将姿势分成概率类别。HMM用于实际决定哪些姿势序列实际上是可行的手势。但是,在一组姿势上运行任何聚类算法都是一个很好的候选方案——即使你不知道它们是什么类型的姿势或类似的内容。