我想用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))]
我的问题是:
答案 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。
说明: