python - 使用python : hmm learning使用kinect进行手势识别

标签 python machine-learning hidden-markov-models

我想用kinect在python中做手势识别。

在阅读了一些理论之后,我认为最好的方法之一是使用隐马尔可夫模型 (HMM)(baum welch 或某些 EM 方法)和一些已知的手势数据进行无监督学习,以获得一组经过训练的 HMM(一个对于我想要识别的每个手势)。

然后我会进行识别,将观察数据的最大对数似然(使用维特比?)与训练集中的 HMM 相匹配。

例如,我有一些数据(右手的坐标x,y,z)用kinect设备记录了一些手势(打招呼,打拳,用手做一个圆圈)并且我做了一些训练:

# training
known_datas = [
tuple( load_data('punch.mat'),                'PUNCH' ),
tuple( load_data('say_hello.mat'),            'HELLO' ), 
tuple( load_data('do_circle_with_hands.mat'), 'CIRCLE' )
]

gestures = set()
for x, name in known_datas:
    m = HMM()
    m.baumWelch(x)
    gestures.add(m)

然后我对观察到的新数据执行最大 loglik 的识别,并为每个训练有素的 HMM 选择之前保存的具有最大 loglik 的手势:

# recognition
observed = load_data('new_data.mat')
logliks = [m.viterbi(observed) for m in gestures]

print 'observed data is ', gestures[logliks.index(max(logliks))]

我的问题是:

  • 这是完全愚蠢的事情吗?
  • 一个真实案例有多少训练集?
  • 每个 HMM 有多少个状态?
  • 是否可以实时进行?

最佳答案

首先:这是一个非常特殊的问题,这里需要一位机器学习专家。不幸的是,在堆栈交换站点中还没有 ML 等价物……也许有一天会有一个。 :)

我猜你的方法是有效的,只是一些评论:

  • 您刚刚在此处使用 HMM() 实例化的 HMM 类需要精心设计,以便 HMM 的结构可以表示类似于手势的某物。 HMM 在它们之间具有状态转换,那么您将如何为手势定义 HMM?我很肯定这是可能的(甚至认为这是一个好方法),但它需要一些思考。也许这些状态只是 3D 立方体的角,对于您识别的手势的每个观察点,您选择这个立方体最近的角。然后 BW 算法可以通过您的训练数据来近似转换可能性。但您可能需要选择更细粒度的状态模型,可能是 n * n * n 体素网格。

  • Viterbi 算法 给您的不是模型的可能性,而是给定序列观察的最可能状态序列。 IIRC 你会选择前向算法来获得给定模型的给定观察序列的概率。

我假设,给定一个训练有素且不太复杂的 HMM,您应该能够实时识别手势,但这只是一个有根据的猜测。 :)

关于python - 使用python : hmm learning使用kinect进行手势识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8490462/

相关文章:

python - pygraphviz,导入错误 : undefined symbol: Agundirected

python - csv的pandas DataFrame输出端

python - 我的 while 循环不工作

java - Weka预测分类节点

machine-learning - 何时停止训练 - LOOV MLP

python - KNN 查询数据维度必须与训练数据维度匹配

r - R中的隐马尔可夫模型包

python - 如何使用 beautifulSoup 从网站中提取和下载所有图像?

hidden-markov-models - 我必须如何使用 Baum-Welch 和多次观察来训练 HMM?

algorithm - 用于实时应用的维特比算法