我想用 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)
然后我对执行最大 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 有多少个状态?
- 是否可以实时进行?