用kinect和python进行手势识别:嗯学习

时间:2011-12-13 14:02:29

标签: python machine-learning hidden-markov-models

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

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

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

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

# 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)

然后我执行对执行max 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有多少个州?
  • 是否可以实时进行?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

它已成功应用于多种变体:http://scholar.google.co.il/scholar?hl=en&q=HMM+Gesture+Recognition

说明: