使用隐马尔可夫模型进行手势识别

信息处理 图像处理 fft
2021-12-23 20:45:20

我目前正在开发一个手势识别系统(用于 Android 应用程序)。我认为我已经完成了图像处理阶段,我可以提取手的轮廓(我现在戴着手套以避免背景减法)。

我还得到了边界椭圆/矩形,质心作为手的“重要”形状特征。

我的问题是,没有很多文献表明通过隐藏马尔可夫模型对图像进行分类之前的下一阶段是什么。我发现这个“特征提取”阶段非常模棱两可。

目前我正在获取轮廓的角度列表(近似以获得有限数量的角度)

问题是我不知道下一步该做什么。当我搜索“使用 HMM 进行形状分类”的文献时,我仍然觉得下一步该做什么很困难。

作为 HMM 的工具,我计划使用 JaHMM。但是我不知道在这个阶段如何使用这个工具,因为我不知道这个分类阶段的输入是什么!

这显示了我可以从我手中获得的信息

我遇到过一些我在一些文献中找到的函数列表,例如快速傅里叶描述符、曲率描述符、B 样条;但是我对如何将这些函数应用于我当前的数据一无所知(即角度列表,例如:-63、154、3、23、54,...)


更新 1:

感谢您的信息。@彼得·K。

关于姿势:我打算找一组用手指拼写的美国手语单词,例如“dog”->“d”“o”“g”(3 个州);但那一刻我还没有决定去做什么。

我目前正在阅读更多论文,看看我应该提取什么类型的信息,例如:

  • 手心
  • 运动角度
  • 从特定点到手部轮廓不同点的距离(等)

现在我遇到了一篇似乎表明我想做什么的论文,我不确定:

http://espace.library.uq.edu.au/eserv.php?pid=UQ:10700&dsID=n0273.pdf

我目前正在阅读第 5 节 - 矢量量化(我之前听说过这个术语但实际上并不知道它涉及什么,并且在图 5 中似乎有一个复杂的算法,如果我理解正确,它会转换我实现的一组值从手(刚才提到)到 1 个数字,我可以用它作为观察序列来训练一个 HMM 的 1 个特定符号。你认为我在正确的轨道上前进吗?(我在 Android 上工作,(NDK) ,我发现 JaHMM 作为 HMM 工具,并使用 OpenCV 进行图像处理。

@Peter K。感谢您的回答。关于数据生成,我计划在生成个人数据集后遵循本文的步骤:(第 4 节和第 5 节) http://www.i.ci.ritsumei.ac.jp/~shimada/papers/vi02 -tanibata.pdf


更新 2:请记住,手势由 {姿势 a,姿势 b,姿势 c} 组成

我现在在想我必须使用某种形式的分类算法。也就是说,我目前有一组特征向量:

姿势A:[椭圆周围的角度,高:宽比]

  • 0.802985 33.909615
  • 0.722824 31.209663
  • 0.734535 30.206722
  • 0.68397 31.838253
  • 0.713706 34.29641
  • 0.688798 30.603661
  • 0.721395 34.880161

姿势 B:[结构与姿势 A 相同]

  • 0.474164 16.077467
    • 0.483104 14.526289
    • 0.478904 14.800572
    • 0.483134 14.523611
    • 0.480608 14.41159
    • 0.481552 15.563665
    • 0.497951 15.563585

等等..

我希望当我输入一个特征向量时,我会得到一个简单的符号,例如“A”、“B”等。

这可能吗?我还在这里迁移了问题:https ://stackoverflow.com/questions/15602963/vector-quantization-algorithms-used-to-provide-observation-sequences-for-hidden

2个回答

我使用 HMM 进行手势识别(不是姿势识别)。我所做的是:跟踪手并识别手在空中绘制的手势,您可以将其成像为轨迹。

您可以使用 HMM 作为序列识别器,因此首先您需要将图像转换为离散的数字序列。

对于您想要识别的每个手势,您需要为此训练一个 HMM。

所以你有一本包含一些已知单词的字典。每个都是经过训练的 HMM。如果你有一个新词(未知的观察),你可以计算字典中每个词可能是未知词的概率。

一些伪代码:

##################### training phase

examples = [112233, 11233, 123, 1122223333]
word1 = train(example)

examples = [222333, 22222223333, 2222333333]
word2 = train(example)

examples = [124555, 1122445, 1111111222224444555]
word3 = train(example)

dictionary = [word1, word2, word3]


##################### recognition phase

#let's say you have a new unkown word: 12245, you want to know what word of the dictionary it is more likly

unkown = 12245
probabilities = []
for w in word:
    probabilities.append( calculate_prob(unkown) )

现在,看看概率的最大值是多少,你就会得到字典中最有可能的单词!

看这里:

http://www.ece.ucsb.edu/Faculty/Rabiner/ece259/Reprints/tutorial%20on%20hmm%20and%20applications.pdf

http://www.codeproject.com/Articles/69647/Hidden-Markov-Models-in-C

http://www.creativedistraction.com/demos/gesture-recognition-kinect-with-hidden-markov-models-hmms/

让我们从姿势识别开始。 本文跟踪手的边界,并计算从该边界检测到的指尖数量。该论文中要注意的一件事是不需要“状态”信息。对于姿势/位置估计,HMM 可能不太适合。

手势信息更适合用于解决问题的 HMM 色域。但是,我需要查看更多您将用于手势的数据。你能解释一下生成你拥有的数据的算法吗?

问题在于,选择正确的隐马尔可夫模型结构对可达到的精度有很大影响……警告:PDF 链接!