我想用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/