4

我想用 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 有多少个状态?
  • 是否可以实时进行?
4

2 回答 2

2

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

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

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

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

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

于 2011-12-13T14:43:59.797 回答
1

它已经在许多变体中成功应用:http ://scholar.google.co.il/scholar?hl=en&q=HMM+Gesture+Recognition 。

评论:

于 2011-12-13T23:16:50.157 回答