C# 应用程序创建和识别鼠标手势 (.NET)






4.82/5 (36投票s)
本程序可以创建和识别鼠标手势。

引言
是时候更新这篇文章的内容了。
最初的文章写于 2004 年,提供的代码于一年后更新,尽管它无法从该页面下载。话虽如此,该软件能够识别鼠标手势,最初的灵感来自于这篇文章。
尽管我受到了Konstantin Boukreev发布的文章的启发,但这个应用程序还是有很大的不同(至少在编程语言、手势管理和神经网络方面),尽管它使用了相似的图形界面(我觉得很有趣!)以及计算手势特征的相同逻辑。
此次更新包含大量更改(说实话,代码已完全重写),并提供了更轻松的集成以及更灵活和可扩展的神经网络实现,此外,解决方案文件是为 Visual Studio 2008 准备的。
下面将提供更多信息。
注意: 如果您不熟悉人工神经网络 (ANN),请查看此页面,因为详细解释该主题超出了本文的范围。
详细说明
完整的解决方案分为四个项目
NeuralNetworks
:允许创建和操作神经网络的库MouseGestures
:允许定义鼠标手势的库GestureRecognizer
:一个可执行文件,提供了前面库的一种可能实现和集成Test
:一个用于测试目的的控制台应用程序
关于第一个项目,它包含一个前馈神经网络实现(由神经元层组成),一些可以分配给神经元的典型激活函数,反向传播算法的实现以及 PerformanceMonitor
类,该类用于计算有关系统识别性能的统计数据。
网络实现假定输入特征已经过归一化(换句话说,没有专门用于此类任务的输入层)。
第二个库包含 Gesture
类的实现,它主要是二维点的排序集合,以及 GestureSet
类(一组手势,用于存储神经网络使用的训练、测试和验证集),两者都提供加载/保存功能(文件以 XML 格式保存)。
除了上述类之外,还有一些用于操作手势几何形状的辅助函数。
此版本与上一个版本的主要区别在于,在给定相同数量的手势点的情况下,能够提取可变数量的特征;这项任务是通过向手势添加或删除点来完成的,试图最小化手势的变形(请参阅 Gesture.cs 文件中的 ExtractFeatures(int count)
函数)。
可执行项目可能最有趣,因为它能为用户提供即时的视觉反馈。
与上一个版本一样,分类器由一组竞争性神经网络组成,每个神经网络仅用于识别一个手势;主要区别在于能够自定义网络的形态,选择输入、层、每层神经元和激活函数的类型(请参阅菜单项 Neural net -> Neural Network)。
要正确使用该应用程序,请先定义要识别的手势(Settings -> Manage gestures -> Create gesture),然后创建训练集(Settings -> Manage gestures -> Create training set),最后创建测试集(Settings -> Manage gestures -> Create test set)。
在此版本中,手势集的创建可以手动或自动执行,此外,在自动创建过程中可以选择不同的“种子”。
创建手势集后,可以开始训练阶段(Neural net -> Training),并在完成后,通过手动(NeuralNet -> Verify)或使用性能监视器(NeuralNet -> Performances)来尝试系统的识别能力。
另一个新功能是能够为每个神经网络设置置信度阈值,这可以提高系统的识别能力。
手势、手势集和神经网络可以保存和加载为 APP_PATH\Gestures\ 文件夹中的 XML 文件;应用程序使用以下约定(GESTURE 是手势名称的占位符)
- APP_PATH\Gestures\GESTURE.xml:用于存储手势路径、训练集、测试集和神经网络文件的文件
- APP_PATH\Gestures\GESTURE\:包含手势、训练集、测试集和神经网络 XML 文件的文件夹
- APP_PATH\Gestures\GESTURE_G.xml:包含手势点的文件
- APP_PATH\Gestures\GESTURE_S.xml:包含用作训练集的手势的文件
- APP_PATH\Gestures\GESTURE_VS.xml:包含用作测试集的手势的文件
- APP_PATH\Gestures\GESTURE_NN.xml:包含神经网络数据的 XML 文件
关于神经网络
在上一版本的文章中,我写道,与基于多层感知机的分类器相比,测试基于自联想器的分类器的性能可能会很有趣;嗯,好消息是当前版本可以处理这个问题:当神经网络输入数量与输出数量相同时,训练和验证阶段的行为不同,可以识别出哪个分类器性能更好。
结论
本文介绍了用于识别鼠标手势的馈送式人工神经网络方法,旨在用于教育目的。
提供了两个库,可用于实现自定义手势识别系统;解决方案中包含一个应用程序,不仅展示了一种可能的实现,还提供了一个简单的程序,可用于开发和测试自定义识别系统。
历史
- 2004年10月21日:文章发布
- 2008年3月14日:文章更新(代码已完全重写)