grt
grt(Gesture Recognition Toolkit)是一款专为实时手势识别打造的跨平台开源 C++ 机器学习库。它主要解决了开发者在构建交互式应用时,难以高效处理摄像头、Kinect、Leap Motion 或加速度计等传感器数据并实现低延迟动作识别的痛点。
无论是需要快速原型的研究人员,还是致力于开发体感游戏、虚拟现实交互或智能控制系统的工程师,grt 都能提供强大的支持。其独特之处在于采用了模块化架构,内置了丰富的预处理、特征提取及分类回归算法。用户只需通过统一的接口调用 train(训练)、predict(预测)等函数,即可轻松完成从数据录入到模型部署的全流程。此外,grt 不仅提供功能全面的图形界面(GUI)方便非代码用户进行数据标注与模型测试,还支持自定义浮点精度以适应不同性能需求,并能灵活导入导出专属的.grt 格式或通用 CSV 数据文件。凭借对实时数据流的优化处理,grt 让复杂的手势识别任务变得简单可控,是连接传感器硬件与智能交互应用的理想桥梁。
使用场景
某康复医疗团队正在开发一套基于惯性传感器(IMU)的上肢康复训练系统,需要实时识别患者是否标准完成了“前举”、“侧平举”等特定复健动作。
没有 grt 时
- 开发者需从零编写信号滤波、特征提取及分类算法,耗时数周且难以保证实时性,导致动作反馈延迟高达数百毫秒。
- 缺乏统一的模型管理格式,每次迭代都需手动处理复杂的二进制数据读写,训练好的模型难以在不同设备间迁移部署。
- 无法有效区分“无动作”状态与具体手势,系统常将患者的静止休息误判为错误动作,严重影响训练数据的准确性。
- 调整算法参数依赖反复修改代码并重新编译,缺乏可视化工具辅助调试,极大拖慢了原型验证进度。
使用 grt 后
- 直接调用 grt 内置的预处理管道和机器学习算法(如 HMM 或 SVM),将开发周期缩短至几天,并实现了毫秒级的低延迟实时识别。
- 利用 grt 专有的
.grt文件格式,一键保存和加载训练好的模型与数据集,轻松实现从开发机到嵌入式设备的无缝部署。 - 借助 grt 预留的“零类标签”机制自动处理空手势检测,精准过滤静止状态,显著提升了动作捕捉的信噪比和判定准确率。
- 配合 grt 提供的图形化界面(GUI),研究人员可直观地录制数据、训练模型并实时观察识别效果,无需编写额外代码即可快速调优。
grt 通过提供标准化的实时机器学习流水线,让开发团队从繁琐的底层算法实现中解放出来,专注于康复逻辑本身的创新与优化。
运行环境要求
- Linux
- macOS
- Windows
未说明
未说明

快速开始
姿势识别工具包(GRT)
姿势识别工具包(GRT)是一个跨平台、开源的C++机器学习库,专为实时姿势识别而设计。
构建状态:
- 主分支:
- 开发分支:
当前版本:0.2.5
关于GRT需要了解的关键点:
- 该工具包由两部分组成:全面的C++ API和前端图形用户界面(GUI)。您可以在本仓库中获取C++ API和GUI的源代码;GUI的预编译版本可在此处下载:[http://www.nickgillian.com/wiki/pmwiki.php/GRT/Download]
- C++ API和GUI均设计用于处理实时传感器数据,但也可用于更传统的离线机器学习任务。
- GRT的输入可以是任意N维浮点向量——这意味着您可以将GRT与摄像头、Kinect、Leap Motion、加速度计或其他任何您可能自行搭建的自定义传感器配合使用。
- 工具包定义了一个通用的Float类型,默认为双精度浮点数,但可通过GRT主Typedefs头文件轻松更改为单精度。
- GRT的VectorFloat和MatrixFloat类的精度会根据主Float精度自动更新。
- 工具包将类别标签0保留为特殊的空手势类别标签,用于自动手势检测。因此,如果您希望使用手势检测功能,请避免将任何手势标记为类别标签0。
- 训练数据和模型以自定义的**.grt*文件格式保存。这些文件由一个简单的头部和主数据集组成。除了.grt文件外,您还可以通过在保存或加载文件时使用.csv*扩展名来导入/导出CSV格式的数据。
- 几乎所有GRT类都支持以下函数:
- predict( ... ):使用输入数据(...)和预先训练好的模型进行预测,例如分类或回归。
- train( ... ):使用输入数据(...)训练一个新的模型,随后可用于实时预测。
- save( ... ):将模型或数据集保存到文件中。文件格式可以是自定义的GRT文件(.grt)或CSV文件(.csv)。
- load( ... ):从文件中加载预先训练好的模型或数据集。文件格式可以是自定义的GRT文件(.grt)或CSV文件(.csv)。
- reset():重置模块,例如重置滤波器模块会清除其历史缓冲区中的值并将其设置为零。
- clear():清除模块,移除所有预先训练好的模型、权重等。例如,清除滤波器模块会删除滤波器系数、历史缓冲区等。
- 带下划线的函数,如train_( ... ),会将输入参数作为引用传递,因此在处理非常大的数据集时效率更高。
核心资源
- GRT官网:http://www.nickgillian.com/grt
- GRT维基:https://github.com/nickgillian/grt/wiki
- GRT论坛:http://www.nickgillian.com/forum
- GRT API参考:http://nickgillian.com/grt/api/0.2.5/
- GRT源代码:https://github.com/nickgillian/grt
- GRT GUI下载:http://www.nickgillian.com/wiki/pmwiki.php/GRT/Download
- GRT《机器学习研究期刊》论文:grt.pdf
核心算法
GRT支持广泛的监督与非监督机器学习算法,适用于分类、回归和聚类任务,包括:
分类: Adaboost、决策树、动态时间规整、高斯混合模型、隐马尔可夫模型、k近邻、朴素贝叶斯、随机森林、支持向量机、Softmax,以及更多…(https://github.com/nickgillian/grt/wiki/reference#classifiers)
回归: 线性回归、逻辑回归、神经网络(多层感知机)
除了上述机器学习算法外,工具包还包含大量用于预处理、特征提取和后处理的算法。
更多详细信息请参阅维基。
GRT 扩展
目前已有多个扩展和第三方应用将 GRT 用作后端机器学习系统,其中包括:
- ofGrt:GRT 的一个扩展,专为 openFrameworks 设计。
- ml-lib,由 Ali Momeni 和 Jamie Bullock 开发:ml-lib 是一套用于 Max 和 Pure Data 的机器学习外部库,旨在跨多种平台运行,包括 OS X、Windows 和 Linux,以及 Intel 和 ARM 架构。
- ESP,由 David A. Mellis 和 Ben Zhang 开发:这是一款交互式应用,旨在通过应用机器学习技术,帮助初学者在交互项目中更熟练地使用传感器。该系统基于 openFrameworks 构建,并提供了多个有趣的示例,分别针对 Arduino 传感器模块 以及更通用的输入数据流(例如网络数据)。
- Android 移植版:您可以在 这里 找到 GRT 的 Android 特定移植版本。
GRT 架构
为了在保持一致性的同时提供灵活性,GRT 采用了面向对象的模块化架构。该架构围绕一组核心 模块 和一个中央 手势识别流水线 构建。
模块和流水线的输入均为 N 维浮点向量,这使得工具包能够灵活适应不同类型的输入信号。
每个模块中的算法既可以作为独立类单独使用,也可以通过流水线将多个模块串联起来,构建更为复杂的手势识别系统。GRT 包含用于预处理、特征提取、聚类、分类、回归和后处理的模块。
该工具包的源代码结构如下:
- ClassificationModules:包含所有 GRT 分类算法,如 AdaBoost、朴素贝叶斯、K 近邻、支持向量机等。
- ClusteringModules:包含所有 GRT 聚类算法,包括 K 均值、高斯混合模型和自组织映射。
- ContextModules:包含所有 GRT 上下文模块,这些模块可以连接到手势识别流水线,为实时分类系统提供额外的上下文信息。
- CoreAlgorithms:包含一些在整个 GRT 中广泛使用的算法,如粒子滤波器、主成分分析和受限玻尔兹曼机。
- CoreModules:包含所有 GRT 基础类,如 MLBase、Classifier、FeatureExtraction 等。
- DataStructures:包含所有用于记录、保存和加载数据集的 GRT 类。
- FeatureExtractionModules:包含所有 GRT 特征提取模块,如快速傅里叶变换、量化器和时域特征。
- PostProcessingModules:包含所有 GRT 后处理模块,如类别标签过滤器和类别标签超时过滤器。
- PreProcessingModules:包含所有 GRT 预处理模块,包括低通滤波器、高通滤波器、死区处理等。
- RegressionModules:包含所有 GRT 回归模块,如多层感知器神经网络、线性回归和逻辑回归。
- Util:包含大量辅助类,如日志记录、工具类、时间戳、随机数生成和矩阵操作等。
入门示例
本示例演示了 GRT 的几个关键组件,例如:
- 如何从文件(例如 CSV 文件)加载数据集
- 如何将数据集拆分为训练集和测试集
- 如何设置一个新的手势识别流水线,并向流水线中添加分类算法
- 如何使用训练数据集训练新的分类模型
- 如何将训练好的流水线保存到文件或从文件加载
- 如何使用自动测试数据集测试分类模型的准确率
- 如何使用手动测试数据集测试分类模型的准确率
- 如何打印详细的测试结果,例如精确率、召回率和混淆矩阵
您可以在 GRT 的 examples 文件夹中找到此源代码以及大量其他示例和教程。
您应该使用一个参数运行此示例,该参数指向您想要加载的文件,例如:
./example my_data.csv
您可以在 GRT 的主数据目录中找到几个示例 CSV 文件和其他数据集。
//包含 GRT 主头文件
#include <GRT/GRT.h>
using namespace GRT;
using namespace std;
int main (int argc, const char * argv[]) {
//从命令行解析训练数据文件名
if (argc != 2) {
cout << "错误:未能从命令行解析数据文件名。";
cout << "您应该使用一个指向数据文件的参数来运行此示例\n";
return EXIT_FAILURE;
}
const string filename = argv[1];
//从文件加载一些训练数据
ClassificationData trainingData;
cout << "正在加载数据集..." << endl;
if (!trainingData.load(filename)) {
cout << "错误:未能从文件加载训练数据\n";
return EXIT_FAILURE;
}
cout << "数据加载完成" << endl;
//打印一些关于训练数据的统计信息
trainingData.printStats();
//将训练数据划分为训练集和测试集。80 表示 80% 的数据将用于训练,20% 将作为测试集返回
cout << "正在将数据拆分为训练/测试集..." << endl;
ClassificationData testData = trainingData.split(80);
//创建一个新的手势识别流水线
GestureRecognitionPipeline pipeline;
//向流水线中添加 KNN 分类器,K 值为 10
pipeline << KNN(10);
//使用训练数据训练流水线
cout << "正在训练模型..." << endl;
if (!pipeline.train(trainingData)) {
cout << "错误:未能训练流水线!\n";
return EXIT_FAILURE;
}
//将流水线保存到文件
if (!pipeline.save("HelloWorldPipeline.grt")) {
cout << "错误:未能保存流水线!\n";
return EXIT_FAILURE;
}
//从文件加载流水线
if (!pipeline.load("HelloWorldPipeline.grt")) {
cout << "错误:未能加载流水线!\n";
return EXIT_FAILURE;
}
//使用测试数据测试流水线
cout << "正在测试模型..." << endl;
if (!pipeline.test(testData)) {
cout << "错误:未能测试流水线!\n";
return EXIT_FAILURE;
}
//打印一些关于测试的统计信息
cout << "流水线测试准确率:" << pipeline.getTestAccuracy() << endl;
//手动将测试数据集输入流水线进行预测
Float testAccuracy = 0.0;
for (UINT i=0; i<testData.getNumSamples(); i++) {
pipeline.predict(testData[i].getSample());
if (testData[i].getClassLabel() == pipeline.getPredictedClassLabel()) {
testAccuracy++;
}
}
cout << "手动测试准确率:" << testAccuracy / testData.getNumSamples() * 100.0 << endl;
//获取流水线中的类别标签向量
Vector< UINT > classLabels = pipeline.getClassLabels();
//打印精确率
cout << "精确率:";
for (UINT k=0; k<pipeline.getNumClassesInModel(); k++) {
cout << "\t" << pipeline.getTestPrecision(classLabels[k]);
}cout << endl;
//打印召回率
cout << "召回率:";
for (UINT k=0; k<pipeline.getNumClassesInModel(); k++) {
cout << "\t" << pipeline.getTestRecall(classLabels[k]);
}cout << endl;
//打印 F1 分数
cout << "F1 分数:";
for (UINT k=0; k<pipeline.getNumClassesInModel(); k++) {
cout << "\t" << pipeline.getTestFMeasure(classLabels[k]);
}cout << endl;
//打印混淆矩阵
MatrixFloat confusionMatrix = pipeline.getTestConfusionMatrix();
cout << "混淆矩阵:\n";
for (UINT i=0; i<confusionMatrix.getNumRows(); i++) {
for (UINT j=0; j<confusionMatrix.getNumCols(); j++) {
cout << confusionMatrix[i][j] << "\t";
}cout << endl;
}
return EXIT_SUCCESS;
}
教程和示例
您可以在 examples 文件夹中找到大量的教程和示例。此外,您还可以在 GRT 的官方维基上找到丰富的示例和参考资料:
http://www.nickgillian.com/wiki/pmwiki.php?n=GRT.GestureRecognitionToolkit
如果您使用 CMake 构建 GRT,在成功构建主 GRT 库之后,构建目录中会自动生成一个 examples 文件夹。然后您可以直接从该示例目录运行示例应用程序。要运行任何示例,请在 grt/build/examples 目录下打开终端并运行:
./ExampleName
其中 ExampleName 是您想要运行的示例应用程序的名称。
论坛
请注意,目前论坛服务器出现故障,我们正在努力修复。在此期间,请使用 GitHub 的问题和拉取请求。
旧论坛的链接如下:http://www.nickgillian.com/forum/
Bug 报告
请将 Bug 提交到 GitHub Bug 跟踪器。
贡献
欢迎所有贡献,用户可以通过以下几种方式为工具包做出贡献:
- 改进由 Doxygen 生成的 API(通过提高现有代码文档的覆盖率和质量)
- 改进可在 维基 中找到的高级文档
- 添加新的示例或教程,或改进现有示例和教程
- 添加新的 单元测试,以帮助确保当前函数的质量并及早发现潜在的 Bug
请为任何贡献提交 拉取请求。
GRT 浮点精度
GRT 默认使用双精度浮点值。工具包的精度由以下 Float 类型定义指定:
typedef double Float; ///< 此类型定义用于在整个 GRT 中设置浮点精度
如果需要,可以通过修改 GRT/Util/GRTTypedefs.h 头文件中定义的主 GRT Float 类型定义值,轻松将其更改为单精度精度。
VectorFloat 和 MatrixFloat 数据结构
GRT 在整个工具包中使用两种主要的数据结构:Vector 和 Matrix。它们都是模板类,因此可以泛化为任何 C++ 类型。关于这些数据类型,需要了解的主要内容如下:
- Vector: 继承自 STL vector 类。
// 创建一个包含 3 个元素的整数向量
Vector< int > vec1(3);
// 创建一个包含 2 个元素的字符串向量
Vector< string > vec2(2);
// 创建一个包含 5 个 Foo 对象的向量
Vector< Foo > vec3(5);
- Matrix: 提供用于存储二维数组的基类。
// 创建一个 3x2 大小的整数矩阵
Matrix< int > mat1(3,2);
// 创建一个 2x2 大小的字符串矩阵
Matrix< string > mat2(2,2);
// 创建一个 5x3 大小的 Foo 矩阵
Matrix< Foo > mat3(5,3);
- VectorFloat: 提供用于存储浮点向量数据的主要数据结构。VectorFloat 的精度将自动与 GRT Float 的精度保持一致。
// 创建一个包含 10 个元素的新向量
VectorFloat vector( 10 );
for(UINT i=0; i<vector.getSize(); i++){
vector[i] = i*1.0;
}
- MatrixFloat: 提供用于存储浮点矩阵数据的主要数据结构。MatrixFloat 的精度将自动与 GRT Float 的精度保持一致。
// 创建一个 5x2 的浮点矩阵
MatrixFloat matrix(5,2);
// 遍历矩阵中的数据,并将其设置为一个简单的递增值
UINT counter = 0;
for(UINT i=0; i<matrix.getNumRows(); i++){
for(UINT j=0; j<matrix.getNumCols(); j++){
matrix[i][j] = counter++;
}
}
构建 GRT
您可以在 build 文件夹中找到一个 CMakeLists 文件,可用于为您的机器自动生成 Makefile。
请阅读 build 文件夹中的 README 文件,以了解如何将 GRT 构建成适用于 Linux、OS X 或 Windows 的静态库。
在您的 C++ 项目中安装和使用 GRT
有关如何在您的 C++ 项目中构建、安装和使用 GRT 的详细信息,请参阅 build 目录。
许可证
手势识别工具包采用 MIT 许可证授权。
特此授予任何人免费获取本软件及其相关文档文件(以下简称“软件”)副本的权利,允许其在不受限制的情况下处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售该软件副本的权利;并允许向任何获得该软件的人提供该软件,但须遵守以下条件:
上述版权声明和本许可声明应包含在该软件的所有副本或实质性部分中。 本软件按“原样”提供,不提供任何形式的明示或暗示保证,包括但不限于适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论该等责任是基于合同、侵权行为或其他原因而产生,亦无论该等责任是否与本软件或其使用有关,或因其他方式而产生。
版本历史
v0.2.42016/12/05v0.2.02016/08/08v0.1.02016/02/21常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备