[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-nickgillian--grt":3,"tool-nickgillian--grt":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",142651,2,"2026-04-06T23:34:12",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107888,"2026-04-06T11:32:50",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":10,"last_commit_at":59,"category_tags":60,"status":17},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[35,15,13,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":66,"readme_en":67,"readme_zh":68,"quickstart_zh":69,"use_case_zh":70,"hero_image_url":71,"owner_login":72,"owner_name":73,"owner_avatar_url":74,"owner_bio":75,"owner_company":76,"owner_location":77,"owner_email":76,"owner_twitter":76,"owner_website":78,"owner_url":79,"languages":80,"stars":114,"forks":115,"last_commit_at":116,"license":76,"difficulty_score":117,"env_os":118,"env_gpu":119,"env_ram":119,"env_deps":120,"category_tags":128,"github_topics":129,"view_count":32,"oss_zip_url":76,"oss_zip_packed_at":76,"status":17,"created_at":139,"updated_at":140,"faqs":141,"releases":171},4706,"nickgillian\u002Fgrt","grt","gesture recognition toolkit","grt（Gesture Recognition Toolkit）是一款专为实时手势识别打造的跨平台开源 C++ 机器学习库。它主要解决了开发者在构建交互式应用时，难以高效处理摄像头、Kinect、Leap Motion 或加速度计等传感器数据并实现低延迟动作识别的痛点。\n\n无论是需要快速原型的研究人员，还是致力于开发体感游戏、虚拟现实交互或智能控制系统的工程师，grt 都能提供强大的支持。其独特之处在于采用了模块化架构，内置了丰富的预处理、特征提取及分类回归算法。用户只需通过统一的接口调用 train（训练）、predict（预测）等函数，即可轻松完成从数据录入到模型部署的全流程。此外，grt 不仅提供功能全面的图形界面（GUI）方便非代码用户进行数据标注与模型测试，还支持自定义浮点精度以适应不同性能需求，并能灵活导入导出专属的.grt 格式或通用 CSV 数据文件。凭借对实时数据流的优化处理，grt 让复杂的手势识别任务变得简单可控，是连接传感器硬件与智能交互应用的理想桥梁。","# Gesture Recognition Toolkit (GRT)\n\nThe Gesture Recognition Toolkit (GRT) is a cross-platform, open-source, C++ machine learning library designed for real-time gesture recognition.\n\nBuild Status:\n* Master branch: \n  * ![Master Build Status](https:\u002F\u002Ftravis-ci.org\u002Fnickgillian\u002Fgrt.svg?branch=master)\n* Dev branch: \n  * ![Dev Build Status](https:\u002F\u002Ftravis-ci.org\u002Fnickgillian\u002Fgrt.svg?branch=dev)\n\nCurrent version: [0.2.5](http:\u002F\u002Fnickgillian.com\u002Fgrt\u002Fapi\u002F0.2.5\u002F)\n\nKey things to know about the GRT:\n* The toolkit consists of two parts: a comprehensive [C++ API](http:\u002F\u002Fnickgillian.com\u002Fgrt\u002Fapi\u002F0.2.5) and a front-end [graphical user interface (GUI)](http:\u002F\u002Fwww.nickgillian.com\u002Fwiki\u002Fpmwiki.php\u002FGRT\u002FGUI). You can access the source code for both the C++ API and GUI in this repository, a precompiled version of the GUI can be downloaded [here](http:\u002F\u002Fwww.nickgillian.com\u002Fwiki\u002Fpmwiki.php\u002FGRT\u002FDownload)\n* Both the C++ API and GUI are designed to work with real-time sensor data, but they can also be used for more conventional offline machine-learning tasks \n* The input to the GRT can be any *N*-dimensional floating-point vector - this means you can use the GRT with Cameras, Kinect, Leap Motion, accelerometers, or any other custom sensor you might have built\n* The toolkit defines a generic [Float](#grt-floating-point-precision) type, this defaults to double precision float, but can easily be changed to single precision via the main GRT Typedefs header\n* The precision of the GRT [VectorFloat](#vectorfloat-and-matrixfloat-data-structures) and [MatrixFloat](#vectorfloat-and-matrixfloat-data-structures) classes is automatically updated based on the main Float precision\n* The toolkit reserves the class label value of zero as a special **null gesture** class label for automatic gesture spotting, so if you want to use gesture spotting avoid labeling any of your gestures with the class label of zero\n* Training data and models are saved as custom **.grt** files.  These consist of a simple header followed by the main dataset.  In addition to the grt files, you can also import\u002Fexport data via CSV files by using the *.csv* file extension when saving\u002Floading files\n* Almost all the GRT classes support the following functions: \n  * **predict( ... )**: uses the input data (...) and a pre-trained model to perform a prediction, such as classification or regression\n  * **train( ... )**: uses the input data (...) to train a new model that can then be used for real-time prediction\n  * **save( ... )**: saves a model or dataset to a file.  The file format can be a custom GRT file (.grt) or a CSV file (.csv)\n  * **load( ... )**: loads a pre-trained model or dataset from a file. The file format can be a custom GRT file (.grt) or a CSV file (.csv)\n  * **reset()**: resets a module, for example resetting a filter module would clear the values in its history buffer and sets them to zero\n  * **clear()**: clears a module, removing all pre-trained models, weights, etc.. For example, clearing a filter module would delete the filter coefficients, history buffer, etc.\n* Functions with an underscore, such as **train_( ... )**, pass the input arguments as references and are therefore more efficient to use with very large datasets\n\n## Core Resources\n* GRT Website: [http:\u002F\u002Fwww.nickgillian.com\u002Fgrt](http:\u002F\u002Fwww.nickgillian.com\u002Fgrt)\n* GRT Wiki: [https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki)\n* GRT Forum: [http:\u002F\u002Fwww.nickgillian.com\u002Fforum](http:\u002F\u002Fwww.nickgillian.com\u002Fforum)\n* GRT API Reference: [http:\u002F\u002Fnickgillian.com\u002Fgrt\u002Fapi\u002F0.2.5\u002F](http:\u002F\u002Fnickgillian.com\u002Fgrt\u002Fapi\u002F0.2.5)\n* GRT Source Code: [https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt)\n* GRT GUI Download: [http:\u002F\u002Fwww.nickgillian.com\u002Fwiki\u002Fpmwiki.php\u002FGRT\u002FDownload](http:\u002F\u002Fwww.nickgillian.com\u002Fwiki\u002Fpmwiki.php\u002FGRT\u002FDownload)\n* GRT Journal of Machine Learning Research paper: [grt.pdf](http:\u002F\u002Fjmlr.csail.mit.edu\u002Fpapers\u002Fvolume15\u002Fgillian14a\u002Fgillian14a.pdf)\n\n## Core Algorithms\nThe GRT supports a wide number of supervised and unsupervised machine learning algorithms for classification, regression, and clustering, including:\n* **Classification:** [Adaboost](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fadaboost), [Decision Tree](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fdecision_tree), [Dynamic Time Warping](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fdtw), [Gaussian Mixture Models](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fgmm), [Hidden Markov Models](http:\u002F\u002Fwww.nickgillian.com\u002Fwiki\u002Fpmwiki.php\u002FGRT\u002FHMM), [k-nearest neighbor](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fknn), [Naive Bayes](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fanbc), [Random Forests](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Frandom_forests), [Support Vector Machine](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fsvm), [Softmax](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fsoftmax), and [more...](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Freference#classifiers)\n\n* **Regression:** [Linear Regression](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Flinear_regression), [Logistic Regression](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Flogistic_regression), [Neural Networks (Multilayer Perceptron)](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fmlp)\n\n* **Clustering:** [k-means](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fblob\u002Fmaster\u002Fexamples\u002FClusteringModulesExamples\u002FKMeansExample\u002FKMeansExample.cpp), [cluster tree](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fblob\u002Fmaster\u002Fexamples\u002FClusteringModulesExamples\u002FClusterTreeExample\u002FClusterTreeExample.cpp), [Gaussian Mixture Models](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fblob\u002Fmaster\u002Fexamples\u002FClusteringModulesExamples\u002FGaussianMixtureModelsExample\u002FGaussianMixtureModelsExample.cpp)\n\nIn addition to the machine learning algorithms above, the toolkit also includes a large number of algorithms for [preprocessing](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Freference#pre-processing), [feature extraction](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Freference#feature-extraction), and [post processing](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Freference#post-processing).\n\nSee the [wiki](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki) for more details.\n\n## GRT Extensions\nThere are now several extensions and third-party applications that use the GRT as the backend machine learning system, these include:\n\n* [ofGrt](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002FofxGrt): an extension of the GRT for [openFrameworks](http:\u002F\u002Fopenframeworks.cc)\n* [ml-lib](https:\u002F\u002Fgithub.com\u002Fcmuartfab\u002Fml-lib), by [Ali Momeni](http:\u002F\u002Falimomeni.net\u002F) and [Jamie Bullock](http:\u002F\u002Fjamiebullock.com): ml-lib is a library of machine learning externals for Max and Pure Data, designed to work on a variety of platforms including OS X, Windows, Linux, on Intel and ARM architectures.\n* [ESP](https:\u002F\u002Fgithub.com\u002Fdamellis\u002FESP), by [David A. Mellis](https:\u002F\u002Fgithub.com\u002Fdamellis) and [Ben Zhang](https:\u002F\u002Fwww.benzhang.name): An interactive application that aims to help novices make sophisticated use of sensors in interactive projects through the application of machine learning.  The system is built using [openFrameworks](http:\u002F\u002Fopenframeworks.cc) and has several interesting examples built for [Arduino sensor modules](https:\u002F\u002Fcreate.arduino.cc\u002Fprojecthub\u002Fmellis\u002Fgesture-recognition-using-accelerometer-and-esp-71faa1) and more generic input data streams (e.g., network data).\n* [Android Port](http:\u002F\u002Fhollyhook.de\u002Fwp\u002Fgrt-for-android): you can find a specific Android port of the GRT [here](http:\u002F\u002Fhollyhook.de\u002Fwp\u002Fgrt-for-android).\n\n## GRT Architecture\nTo support flexibility while maintaining consistency, the GRT uses an object-oriented modular architecture. This architecture is built around a set of core **modules** and a central **gesture recognition pipeline**.\n\nThe input to both the modules and pipeline consists of a **N-dimensional floating-point vector**, making the toolkit flexible to the type of input signal. \nThe algorithms in each module can be used as standalone classes; alternatively, a pipeline can be used to chain modules together to create a more sophisticated gesture-recognition system. The GRT includes modules for preprocessing, feature extraction, clustering, classification, regression and post processing.\n\nThe toolkit's source code is structured as follows:\n* **ClassificationModules:** Contains all the GRT classification algorithms, such as AdaBoost, Naive Bayes, K-Nearest Neighbor, Support Vector Machines, and more.\n* **ClusteringModules:** Contains all the GRT clustering algorithms, including K-Means, Gaussian Mixture Models, and Self-Organizing Maps.\n* **ContextModules:** Contains all the GRT context modules, these are modules that can be connected to a gesture recognition pipeline to input additional context to a real-time classification system.\n* **CoreAlgorithms:** Contains a number of algorithms that are used across the GRT, such as Particle Filters, Principal Component Analysis, and Restricted Boltzmann Machines.\n* **CoreModules:** Contains all the GRT base classes, such as MLBase, Classifier, FeatureExtraction, etc..\n* **DataStructures:** Contains all the GRT classes for recording, saving and loading datasets.\n* **FeatureExtractionModules:** Contains all the GRT feature extraction modules.  These include FFT, Quantizers, and TimeDomainFeatures.\n* **PostProcessingModules:** Contains all the GRT post-processing modules, including ClassLabelFilter and ClassLabelTimeoutFilter.\n* **PreProcessingModules:** Contains all the GRT pre-processing modules, including LowPassFilter, HighPassFilter, DeadZone, and much more.\n* **RegressionModules:** Contains all the GRT regression modules, such as MLP Neural Networks, Linear Regression, and Logistic Regression.\n* **Util:** Contains a wide range of supporting classes, such as Logging, Util, TimeStamp, Random, and Matrix.\n\n## Getting Started Example\nThis example demonstrates a few key components of the GRT, such as:\n* how to load a dataset from a file (e.g., a CSV file)\n* how to split a dataset into a training and test dataset\n* how to set up a new Gesture Recognition Pipeline and add a classification algorithm to the pipeline\n* how to use a training dataset to train a new classification model\n* how to save\u002Fload a trained pipeline to\u002Ffrom a file\n* how to use an automatically test dataset to test the accuracy of a classification model\n* how to use a manually test dataset to test the accuracy of a classification model\n* how to print detailed test results, such as precision, recall, and the confusion matrix\n\nYou can find this source code and a large number of other examples and tutorials in the GRT examples folder.\n\nYou should run this example with one argument, pointing to the file you want to load, for example:\n\n```\n .\u002Fexample my_data.csv\n```\n\nYou can find several examples CSV files and other datasets in the main GRT data directory.\n\n```C++\n\u002F\u002FInclude the main GRT header\n#include \u003CGRT\u002FGRT.h>\nusing namespace GRT;\nusing namespace std;\n\nint main (int argc, const char * argv[]) {\n  \u002F\u002FParse the training data filename from the command line\n  if (argc != 2) {\n    cout \u003C\u003C \"Error: failed to parse data filename from command line. \";\n    cout \u003C\u003C \"You should run this example with one argument pointing to a data file\\n\";\n    return EXIT_FAILURE;\n  }\n  const string filename = argv[1];\n\n  \u002F\u002FLoad some training data from a file\n  ClassificationData trainingData;\n\n  cout \u003C\u003C \"Loading dataset...\" \u003C\u003C endl;\n  if (!trainingData.load(filename)) {\n    cout \u003C\u003C \"ERROR: Failed to load training data from file\\n\";\n    return EXIT_FAILURE;\n  }\n\n  cout \u003C\u003C \"Data Loaded\" \u003C\u003C endl;\n\n  \u002F\u002FPrint out some stats about the training data\n  trainingData.printStats();\n\n  \u002F\u002FPartition the training data into a training dataset and a test dataset. 80 means that 80%\n  \u002F\u002Fof the data will be used for the training data and 20% will be returned as the test dataset\n  cout \u003C\u003C \"Splitting data into training\u002Ftest split...\" \u003C\u003C endl;\n  ClassificationData testData = trainingData.split(80);\n\n  \u002F\u002FCreate a new Gesture Recognition Pipeline\n  GestureRecognitionPipeline pipeline;\n\n  \u002F\u002FAdd a KNN classifier to the pipeline with a K value of 10\n  pipeline \u003C\u003C KNN(10);\n\n  \u002F\u002FTrain the pipeline using the training data\n  cout \u003C\u003C \"Training model...\" \u003C\u003C endl;\n  if (!pipeline.train(trainingData)) {\n    cout \u003C\u003C \"ERROR: Failed to train the pipeline!\\n\";\n    return EXIT_FAILURE;\n  }\n\n  \u002F\u002FSave the pipeline to a file\n  if (!pipeline.save(\"HelloWorldPipeline.grt\")) {\n    cout \u003C\u003C \"ERROR: Failed to save the pipeline!\\n\";\n    return EXIT_FAILURE;\n  }\n\n  \u002F\u002FLoad the pipeline from a file\n  if (!pipeline.load(\"HelloWorldPipeline.grt\")) {\n    cout \u003C\u003C \"ERROR: Failed to load the pipeline!\\n\";\n    return EXIT_FAILURE;\n  }\n\n  \u002F\u002FTest the pipeline using the test data\n  cout \u003C\u003C \"Testing model...\" \u003C\u003C endl;\n  if (!pipeline.test(testData)) {\n    cout \u003C\u003C \"ERROR: Failed to test the pipeline!\\n\";\n    return EXIT_FAILURE;\n  }\n\n  \u002F\u002FPrint some stats about the testing\n  cout \u003C\u003C \"Pipeline Test Accuracy: \" \u003C\u003C pipeline.getTestAccuracy() \u003C\u003C endl;\n\n  \u002F\u002FManually project the test dataset through the pipeline\n  Float testAccuracy = 0.0;\n  for (UINT i=0; i\u003CtestData.getNumSamples(); i++) {\n    pipeline.predict(testData[i].getSample());\n\n    if (testData[i].getClassLabel() == pipeline.getPredictedClassLabel()) {\n      testAccuracy++;\n    }\n  }\n  cout \u003C\u003C \"Manual test accuracy: \" \u003C\u003C testAccuracy \u002F testData.getNumSamples() * 100.0 \u003C\u003C endl;\n   \n  \u002F\u002FGet the vector of class labels from the pipeline\n  Vector\u003C UINT > classLabels = pipeline.getClassLabels();\n\n  \u002F\u002FPrint out the precision\n  cout \u003C\u003C \"Precision: \";\n  for (UINT k=0; k\u003Cpipeline.getNumClassesInModel(); k++) {\n    cout \u003C\u003C \"\\t\" \u003C\u003C pipeline.getTestPrecision(classLabels[k]);\n  }cout \u003C\u003C endl;\n\n  \u002F\u002FPrint out the recall\n  cout \u003C\u003C \"Recall: \";\n  for (UINT k=0; k\u003Cpipeline.getNumClassesInModel(); k++) {\n    cout \u003C\u003C \"\\t\" \u003C\u003C pipeline.getTestRecall(classLabels[k]);\n  }cout \u003C\u003C endl;\n\n  \u002F\u002FPrint out the f-measure\n  cout \u003C\u003C \"FMeasure: \";\n  for (UINT k=0; k\u003Cpipeline.getNumClassesInModel(); k++) {\n    cout \u003C\u003C \"\\t\" \u003C\u003C pipeline.getTestFMeasure(classLabels[k]);\n  }cout \u003C\u003C endl;\n\n  \u002F\u002FPrint out the confusion matrix\n  MatrixFloat confusionMatrix = pipeline.getTestConfusionMatrix();\n  cout \u003C\u003C \"ConfusionMatrix: \\n\";\n  for (UINT i=0; i\u003CconfusionMatrix.getNumRows(); i++) {\n    for (UINT j=0; j\u003CconfusionMatrix.getNumCols(); j++) {\n      cout \u003C\u003C confusionMatrix[i][j] \u003C\u003C \"\\t\";\n    }cout \u003C\u003C endl;\n  }\n\n  return EXIT_SUCCESS;\n}\n```\n## Tutorials and Examples\n\nYou can find a large number of tutorials and examples in the examples folder.  You can also find a\nwide range of examples and references on the main GRT wiki:\n\nhttp:\u002F\u002Fwww.nickgillian.com\u002Fwiki\u002Fpmwiki.php?n=GRT.GestureRecognitionToolkit\n\nIf you build the GRT using CMake, an examples folder will automatically be generated in the build directory after you successfully build the main GRT library. Example applications can\nthen be directly run from this example directory.  To run any of the examples, open terminal in the grt\u002Fbuild\u002Fexamples directory and run:\n\n    .\u002FExampleName\n\nwhere *ExampleName* is the name of the example application you want to run.\n\n## Forum\n\nNote, at the moment the forum server is currently broken, we are working to resolve this.  In the meantime, use GitHub issues and pull requests.\n\nYou can find the link for the old forum at: [http:\u002F\u002Fwww.nickgillian.com\u002Fforum\u002F](http:\u002F\u002Fwww.nickgillian.com\u002Fforum\u002F)\n\n## Bugs\n\nPlease submit bugs to the [github bug tracker](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fissues).\n\n## Contributions\n\nAll contributions are welcome, there are several ways in which users can contribute to the toolkit:\n\n* improving the doxygen generated [API](http:\u002F\u002Fnickgillian.com\u002Fgrt\u002Fapi\u002F0.2.5) (by improving coverage and quality of the current documents in the existing code) \n* improving the higher-level documentation that can be found in the [wiki](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki)\n* adding new examples or tutorials, or improving the existing ones\n* adding new [unit tests](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Ftree\u002Fmaster\u002Ftests), to help ensure the quality of the current functions and catch potential bugs in the future\n\nPlease submit [pull requests](https:\u002F\u002Fhelp.github.com\u002Farticles\u002Fabout-pull-requests\u002F) for any contribution.\n\n## GRT Floating Point Precision\nThe GRT defaults to double precision floating point values.  The precision of the toolkit is defined by the following **Float** typedef:\n\n```C++\ntypedef double Float; \u002F\u002F\u002F\u003CThis typedef is used to set floating-point precision throughout the GRT\n```\n\nThis can easily be changed to single precision accuracy if needed by modifying the main GRT **Float** typedef value, defined in GRT\u002FUtil\u002FGRTTypedefs.h header.\n\n## VectorFloat and MatrixFloat Data Structures\nThe GRT uses two main data structures throughout the toolkit: *Vector* and *Matrix*.  These are templates and can, therefore, generalize to any C++ class.  The main things to know about these data types are:\n\n- **Vector:** this inherits from the [STL vector class](http:\u002F\u002Fwww.cplusplus.com\u002Freference\u002Fvector\u002Fvector\u002F)\n```C++\n\u002F\u002FCreate an integer vector with a size of 3 elements\nVector\u003C int > vec1(3);\n\n\u002F\u002FCreate a string vector with a size of 2 elements\nVector\u003C string > vec2(2);\n\n\u002F\u002FCreate a Foo vector with a size of 5 elements\nVector\u003C Foo > vec3(5);\n```\n- **Matrix:** this provides the base class for storing two dimensional arrays:\n```C++\n\u002F\u002FCreate an integer matrix with a size of 3x2\nMatrix\u003C int > mat1(3,2);\n\n\u002F\u002FCreate a string matrix with a size of 2x2\nMatrix\u003C string > mat2(2,2);\n\n\u002F\u002FCreate a Foo matrix with a size of 5x3\nMatrix\u003C Foo > mat3(5,3);\n```\n- **VectorFloat:** this provides the main data structure for storing floating point vector data. The precision of VectorFloat will automatically match that of GRT Float.\n```C++\n\u002F\u002FCreate a new vector with 10 elements\nVectorFloat vector( 10 );\nfor(UINT i=0; i\u003Cvector.getSize(); i++){ \n    vector[i] = i*1.0; \n}\n```\n- **MatrixFloat:** this provides the main data structure for storing floating point matrix data. The precision of MatrixFloat will automatically match that of GRT Float.\n```C++\n\u002F\u002FCreate a [5x2] floating point matrix\nMatrixFloat matrix(5,2);\n\n\u002F\u002FLoop over the data and set the values to a basic incrementing value\nUINT counter = 0;\nfor(UINT i=0; i\u003Cmatrix.getNumRows(); i++){\n    for(UINT j=0; j\u003Cmatrix.getNumCols(); j++){\n        matrix[i][j] = counter++;\n    }\n}\n```\n\n## Building the GRT\n\nYou can find a CMakeLists file in the build folder that you can use to auto generate a makefile for your machine.\n\nRead the readme file in the build folder to see how to build the GRT as a static library for Linux, OS X, or Windows.\n\n## Installing and using the GRT in your C++ projects\n\nSee the build directory for details on how to build, install, and use the GRT in your C++ projects.\n\n## License\n\nThe Gesture Recognition Toolkit is available under an MIT license.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and\u002For sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n","# 姿势识别工具包（GRT）\n\n姿势识别工具包（GRT）是一个跨平台、开源的C++机器学习库，专为实时姿势识别而设计。\n\n构建状态：\n* 主分支： \n  * ![主分支构建状态](https:\u002F\u002Ftravis-ci.org\u002Fnickgillian\u002Fgrt.svg?branch=master)\n* 开发分支： \n  * ![开发分支构建状态](https:\u002F\u002Ftravis-ci.org\u002Fnickgillian\u002Fgrt.svg?branch=dev)\n\n当前版本：[0.2.5](http:\u002F\u002Fnickgillian.com\u002Fgrt\u002Fapi\u002F0.2.5\u002F)\n\n关于GRT需要了解的关键点：\n* 该工具包由两部分组成：全面的[C++ API](http:\u002F\u002Fnickgillian.com\u002Fgrt\u002Fapi\u002F0.2.5)和前端[图形用户界面（GUI）](http:\u002F\u002Fwww.nickgillian.com\u002Fwiki\u002Fpmwiki.php\u002FGRT\u002FGUI)。您可以在本仓库中获取C++ API和GUI的源代码；GUI的预编译版本可在此处下载：[http:\u002F\u002Fwww.nickgillian.com\u002Fwiki\u002Fpmwiki.php\u002FGRT\u002FDownload]\n* C++ API和GUI均设计用于处理实时传感器数据，但也可用于更传统的离线机器学习任务。\n* GRT的输入可以是任意*N*维浮点向量——这意味着您可以将GRT与摄像头、Kinect、Leap Motion、加速度计或其他任何您可能自行搭建的自定义传感器配合使用。\n* 工具包定义了一个通用的[Float](#grt-floating-point-precision)类型，默认为双精度浮点数，但可通过GRT主Typedefs头文件轻松更改为单精度。\n* GRT的[VectorFloat](#vectorfloat-and-matrixfloat-data-structures)和[MatrixFloat](#vectorfloat-and-matrixfloat-data-structures)类的精度会根据主Float精度自动更新。\n* 工具包将类别标签0保留为特殊的**空手势**类别标签，用于自动手势检测。因此，如果您希望使用手势检测功能，请避免将任何手势标记为类别标签0。\n* 训练数据和模型以自定义的**.grt**文件格式保存。这些文件由一个简单的头部和主数据集组成。除了.grt文件外，您还可以通过在保存或加载文件时使用*.csv*扩展名来导入\u002F导出CSV格式的数据。\n* 几乎所有GRT类都支持以下函数：\n  * **predict( ... )**：使用输入数据(...)和预先训练好的模型进行预测，例如分类或回归。\n  * **train( ... )**：使用输入数据(...)训练一个新的模型，随后可用于实时预测。\n  * **save( ... )**：将模型或数据集保存到文件中。文件格式可以是自定义的GRT文件（.grt）或CSV文件（.csv）。\n  * **load( ... )**：从文件中加载预先训练好的模型或数据集。文件格式可以是自定义的GRT文件（.grt）或CSV文件（.csv）。\n  * **reset()**：重置模块，例如重置滤波器模块会清除其历史缓冲区中的值并将其设置为零。\n  * **clear()**：清除模块，移除所有预先训练好的模型、权重等。例如，清除滤波器模块会删除滤波器系数、历史缓冲区等。\n* 带下划线的函数，如**train_( ... )**，会将输入参数作为引用传递，因此在处理非常大的数据集时效率更高。\n\n## 核心资源\n* GRT官网：[http:\u002F\u002Fwww.nickgillian.com\u002Fgrt](http:\u002F\u002Fwww.nickgillian.com\u002Fgrt)\n* GRT维基：[https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki)\n* GRT论坛：[http:\u002F\u002Fwww.nickgillian.com\u002Fforum](http:\u002F\u002Fwww.nickgillian.com\u002Fforum)\n* GRT API参考：[http:\u002F\u002Fnickgillian.com\u002Fgrt\u002Fapi\u002F0.2.5\u002F](http:\u002F\u002Fnickgillian.com\u002Fgrt\u002Fapi\u002F0.2.5)\n* GRT源代码：[https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt)\n* GRT GUI下载：[http:\u002F\u002Fwww.nickgillian.com\u002Fwiki\u002Fpmwiki.php\u002FGRT\u002FDownload](http:\u002F\u002Fwww.nickgillian.com\u002Fwiki\u002Fpmwiki.php\u002FGRT\u002FDownload)\n* GRT《机器学习研究期刊》论文：[grt.pdf](http:\u002F\u002Fjmlr.csail.mit.edu\u002Fpapers\u002Fvolume15\u002Fgillian14a\u002Fgillian14a.pdf)\n\n## 核心算法\nGRT支持广泛的监督与非监督机器学习算法，适用于分类、回归和聚类任务，包括：\n* **分类：** [Adaboost](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fadaboost)、[决策树](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fdecision_tree)、[动态时间规整](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fdtw)、[高斯混合模型](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fgmm)、[隐马尔可夫模型](http:\u002F\u002Fwww.nickgillian.com\u002Fwiki\u002Fpmwiki.php\u002FGRT\u002FHMM)、[k近邻](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fknn)、[朴素贝叶斯](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fanbc)、[随机森林](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Frandom_forests)、[支持向量机](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fsvm)、[Softmax](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fsoftmax)，以及更多…([https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Freference#classifiers](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Freference#classifiers))\n\n* **回归：** [线性回归](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Flinear_regression)、[逻辑回归](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Flogistic_regression)、[神经网络（多层感知机）](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Fmlp)\n\n* **聚类：** [k均值](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fblob\u002Fmaster\u002Fexamples\u002FClusteringModulesExamples\u002FKMeansExample\u002FKMeansExample.cpp)、[聚类树](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fblob\u002Fmaster\u002Fexamples\u002FClusteringModulesExamples\u002FClusterTreeExample\u002FClusterTreeExample.cpp)、[高斯混合模型](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fblob\u002Fmaster\u002Fexamples\u002FClusteringModulesExamples\u002FGaussianMixtureModelsExample\u002FGaussianMixtureModelsExample.cpp)。\n\n除了上述机器学习算法外，工具包还包含大量用于[预处理](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Freference#pre-processing)、[特征提取](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Freference#feature-extraction)和[后处理](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki\u002Freference#post-processing)的算法。\n\n更多详细信息请参阅[维基](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki)。\n\n## GRT 扩展\n目前已有多个扩展和第三方应用将 GRT 用作后端机器学习系统，其中包括：\n\n* [ofGrt](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002FofxGrt)：GRT 的一个扩展，专为 [openFrameworks](http:\u002F\u002Fopenframeworks.cc) 设计。\n* [ml-lib](https:\u002F\u002Fgithub.com\u002Fcmuartfab\u002Fml-lib)，由 [Ali Momeni](http:\u002F\u002Falimomeni.net\u002F) 和 [Jamie Bullock](http:\u002F\u002Fjamiebullock.com) 开发：ml-lib 是一套用于 Max 和 Pure Data 的机器学习外部库，旨在跨多种平台运行，包括 OS X、Windows 和 Linux，以及 Intel 和 ARM 架构。\n* [ESP](https:\u002F\u002Fgithub.com\u002Fdamellis\u002FESP)，由 [David A. Mellis](https:\u002F\u002Fgithub.com\u002Fdamellis) 和 [Ben Zhang](https:\u002F\u002Fwww.benzhang.name) 开发：这是一款交互式应用，旨在通过应用机器学习技术，帮助初学者在交互项目中更熟练地使用传感器。该系统基于 [openFrameworks](http:\u002F\u002Fopenframeworks.cc) 构建，并提供了多个有趣的示例，分别针对 [Arduino 传感器模块](https:\u002F\u002Fcreate.arduino.cc\u002Fprojecthub\u002Fmellis\u002Fgesture-recognition-using-accelerometer-and-esp-71faa1) 以及更通用的输入数据流（例如网络数据）。\n* [Android 移植版](http:\u002F\u002Fhollyhook.de\u002Fwp\u002Fgrt-for-android)：您可以在 [这里](http:\u002F\u002Fhollyhook.de\u002Fwp\u002Fgrt-for-android) 找到 GRT 的 Android 特定移植版本。\n\n## GRT 架构\n为了在保持一致性的同时提供灵活性，GRT 采用了面向对象的模块化架构。该架构围绕一组核心 **模块** 和一个中央 **手势识别流水线** 构建。\n\n模块和流水线的输入均为 **N 维浮点向量**，这使得工具包能够灵活适应不同类型的输入信号。  \n每个模块中的算法既可以作为独立类单独使用，也可以通过流水线将多个模块串联起来，构建更为复杂的手势识别系统。GRT 包含用于预处理、特征提取、聚类、分类、回归和后处理的模块。\n\n该工具包的源代码结构如下：\n* **ClassificationModules**：包含所有 GRT 分类算法，如 AdaBoost、朴素贝叶斯、K 近邻、支持向量机等。\n* **ClusteringModules**：包含所有 GRT 聚类算法，包括 K 均值、高斯混合模型和自组织映射。\n* **ContextModules**：包含所有 GRT 上下文模块，这些模块可以连接到手势识别流水线，为实时分类系统提供额外的上下文信息。\n* **CoreAlgorithms**：包含一些在整个 GRT 中广泛使用的算法，如粒子滤波器、主成分分析和受限玻尔兹曼机。\n* **CoreModules**：包含所有 GRT 基础类，如 MLBase、Classifier、FeatureExtraction 等。\n* **DataStructures**：包含所有用于记录、保存和加载数据集的 GRT 类。\n* **FeatureExtractionModules**：包含所有 GRT 特征提取模块，如快速傅里叶变换、量化器和时域特征。\n* **PostProcessingModules**：包含所有 GRT 后处理模块，如类别标签过滤器和类别标签超时过滤器。\n* **PreProcessingModules**：包含所有 GRT 预处理模块，包括低通滤波器、高通滤波器、死区处理等。\n* **RegressionModules**：包含所有 GRT 回归模块，如多层感知器神经网络、线性回归和逻辑回归。\n* **Util**：包含大量辅助类，如日志记录、工具类、时间戳、随机数生成和矩阵操作等。\n\n## 入门示例\n本示例演示了 GRT 的几个关键组件，例如：\n* 如何从文件（例如 CSV 文件）加载数据集\n* 如何将数据集拆分为训练集和测试集\n* 如何设置一个新的手势识别流水线，并向流水线中添加分类算法\n* 如何使用训练数据集训练新的分类模型\n* 如何将训练好的流水线保存到文件或从文件加载\n* 如何使用自动测试数据集测试分类模型的准确率\n* 如何使用手动测试数据集测试分类模型的准确率\n* 如何打印详细的测试结果，例如精确率、召回率和混淆矩阵\n\n您可以在 GRT 的 examples 文件夹中找到此源代码以及大量其他示例和教程。\n\n您应该使用一个参数运行此示例，该参数指向您想要加载的文件，例如：\n\n```\n .\u002Fexample my_data.csv\n```\n\n您可以在 GRT 的主数据目录中找到几个示例 CSV 文件和其他数据集。\n\n```C++\n\u002F\u002F包含 GRT 主头文件\n#include \u003CGRT\u002FGRT.h>\nusing namespace GRT;\nusing namespace std;\n\nint main (int argc, const char * argv[]) {\n  \u002F\u002F从命令行解析训练数据文件名\n  if (argc != 2) {\n    cout \u003C\u003C \"错误：未能从命令行解析数据文件名。\";\n    cout \u003C\u003C \"您应该使用一个指向数据文件的参数来运行此示例\\n\";\n    return EXIT_FAILURE;\n  }\n  const string filename = argv[1];\n\n  \u002F\u002F从文件加载一些训练数据\n  ClassificationData trainingData;\n\n  cout \u003C\u003C \"正在加载数据集...\" \u003C\u003C endl;\n  if (!trainingData.load(filename)) {\n    cout \u003C\u003C \"错误：未能从文件加载训练数据\\n\";\n    return EXIT_FAILURE;\n  }\n\n  cout \u003C\u003C \"数据加载完成\" \u003C\u003C endl;\n\n  \u002F\u002F打印一些关于训练数据的统计信息\n  trainingData.printStats();\n\n  \u002F\u002F将训练数据划分为训练集和测试集。80 表示 80% 的数据将用于训练，20% 将作为测试集返回\n  cout \u003C\u003C \"正在将数据拆分为训练\u002F测试集...\" \u003C\u003C endl;\n  ClassificationData testData = trainingData.split(80);\n\n  \u002F\u002F创建一个新的手势识别流水线\n  GestureRecognitionPipeline pipeline;\n\n  \u002F\u002F向流水线中添加 KNN 分类器，K 值为 10\n  pipeline \u003C\u003C KNN(10);\n\n  \u002F\u002F使用训练数据训练流水线\n  cout \u003C\u003C \"正在训练模型...\" \u003C\u003C endl;\n  if (!pipeline.train(trainingData)) {\n    cout \u003C\u003C \"错误：未能训练流水线！\\n\";\n    return EXIT_FAILURE;\n  }\n\n  \u002F\u002F将流水线保存到文件\n  if (!pipeline.save(\"HelloWorldPipeline.grt\")) {\n    cout \u003C\u003C \"错误：未能保存流水线！\\n\";\n    return EXIT_FAILURE;\n  }\n\n  \u002F\u002F从文件加载流水线\n  if (!pipeline.load(\"HelloWorldPipeline.grt\")) {\n    cout \u003C\u003C \"错误：未能加载流水线！\\n\";\n    return EXIT_FAILURE;\n  }\n\n  \u002F\u002F使用测试数据测试流水线\n  cout \u003C\u003C \"正在测试模型...\" \u003C\u003C endl;\n  if (!pipeline.test(testData)) {\n    cout \u003C\u003C \"错误：未能测试流水线！\\n\";\n    return EXIT_FAILURE;\n  }\n\n  \u002F\u002F打印一些关于测试的统计信息\n  cout \u003C\u003C \"流水线测试准确率：\" \u003C\u003C pipeline.getTestAccuracy() \u003C\u003C endl;\n\n  \u002F\u002F手动将测试数据集输入流水线进行预测\n  Float testAccuracy = 0.0;\n  for (UINT i=0; i\u003CtestData.getNumSamples(); i++) {\n    pipeline.predict(testData[i].getSample());\n\n    if (testData[i].getClassLabel() == pipeline.getPredictedClassLabel()) {\n      testAccuracy++;\n    }\n  }\n  cout \u003C\u003C \"手动测试准确率：\" \u003C\u003C testAccuracy \u002F testData.getNumSamples() * 100.0 \u003C\u003C endl;\n   \n  \u002F\u002F获取流水线中的类别标签向量\n  Vector\u003C UINT > classLabels = pipeline.getClassLabels();\n\n  \u002F\u002F打印精确率\n  cout \u003C\u003C \"精确率：\";\n  for (UINT k=0; k\u003Cpipeline.getNumClassesInModel(); k++) {\n    cout \u003C\u003C \"\\t\" \u003C\u003C pipeline.getTestPrecision(classLabels[k]);\n  }cout \u003C\u003C endl;\n\n  \u002F\u002F打印召回率\n  cout \u003C\u003C \"召回率：\";\n  for (UINT k=0; k\u003Cpipeline.getNumClassesInModel(); k++) {\n    cout \u003C\u003C \"\\t\" \u003C\u003C pipeline.getTestRecall(classLabels[k]);\n  }cout \u003C\u003C endl;\n\n  \u002F\u002F打印 F1 分数\n  cout \u003C\u003C \"F1 分数：\";\n  for (UINT k=0; k\u003Cpipeline.getNumClassesInModel(); k++) {\n    cout \u003C\u003C \"\\t\" \u003C\u003C pipeline.getTestFMeasure(classLabels[k]);\n  }cout \u003C\u003C endl;\n\n  \u002F\u002F打印混淆矩阵\n  MatrixFloat confusionMatrix = pipeline.getTestConfusionMatrix();\n  cout \u003C\u003C \"混淆矩阵：\\n\";\n  for (UINT i=0; i\u003CconfusionMatrix.getNumRows(); i++) {\n    for (UINT j=0; j\u003CconfusionMatrix.getNumCols(); j++) {\n      cout \u003C\u003C confusionMatrix[i][j] \u003C\u003C \"\\t\";\n    }cout \u003C\u003C endl;\n  }\n\n  return EXIT_SUCCESS;\n}\n```\n## 教程和示例\n\n您可以在 examples 文件夹中找到大量的教程和示例。此外，您还可以在 GRT 的官方维基上找到丰富的示例和参考资料：\n\nhttp:\u002F\u002Fwww.nickgillian.com\u002Fwiki\u002Fpmwiki.php?n=GRT.GestureRecognitionToolkit\n\n如果您使用 CMake 构建 GRT，在成功构建主 GRT 库之后，构建目录中会自动生成一个 examples 文件夹。然后您可以直接从该示例目录运行示例应用程序。要运行任何示例，请在 grt\u002Fbuild\u002Fexamples 目录下打开终端并运行：\n\n    .\u002FExampleName\n\n其中 *ExampleName* 是您想要运行的示例应用程序的名称。\n\n## 论坛\n\n请注意，目前论坛服务器出现故障，我们正在努力修复。在此期间，请使用 GitHub 的问题和拉取请求。\n\n旧论坛的链接如下：[http:\u002F\u002Fwww.nickgillian.com\u002Fforum\u002F](http:\u002F\u002Fwww.nickgillian.com\u002Fforum\u002F)\n\n## Bug 报告\n\n请将 Bug 提交到 [GitHub Bug 跟踪器](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fissues)。\n\n## 贡献\n\n欢迎所有贡献，用户可以通过以下几种方式为工具包做出贡献：\n\n* 改进由 Doxygen 生成的 [API](http:\u002F\u002Fnickgillian.com\u002Fgrt\u002Fapi\u002F0.2.5)（通过提高现有代码文档的覆盖率和质量）\n* 改进可在 [维基](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fwiki) 中找到的高级文档\n* 添加新的示例或教程，或改进现有示例和教程\n* 添加新的 [单元测试](https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Ftree\u002Fmaster\u002Ftests)，以帮助确保当前函数的质量并及早发现潜在的 Bug\n\n请为任何贡献提交 [拉取请求](https:\u002F\u002Fhelp.github.com\u002Farticles\u002Fabout-pull-requests\u002F)。\n\n## GRT 浮点精度\nGRT 默认使用双精度浮点值。工具包的精度由以下 **Float** 类型定义指定：\n\n```C++\ntypedef double Float; \u002F\u002F\u002F\u003C 此类型定义用于在整个 GRT 中设置浮点精度\n```\n\n如果需要，可以通过修改 GRT\u002FUtil\u002FGRTTypedefs.h 头文件中定义的主 GRT **Float** 类型定义值，轻松将其更改为单精度精度。\n\n## VectorFloat 和 MatrixFloat 数据结构\nGRT 在整个工具包中使用两种主要的数据结构：*Vector* 和 *Matrix*。它们都是模板类，因此可以泛化为任何 C++ 类型。关于这些数据类型，需要了解的主要内容如下：\n\n- **Vector:** 继承自 [STL vector 类](http:\u002F\u002Fwww.cplusplus.com\u002Freference\u002Fvector\u002Fvector\u002F)。\n```C++\n\u002F\u002F 创建一个包含 3 个元素的整数向量\nVector\u003C int > vec1(3);\n\n\u002F\u002F 创建一个包含 2 个元素的字符串向量\nVector\u003C string > vec2(2);\n\n\u002F\u002F 创建一个包含 5 个 Foo 对象的向量\nVector\u003C Foo > vec3(5);\n```\n\n- **Matrix:** 提供用于存储二维数组的基类。\n```C++\n\u002F\u002F 创建一个 3x2 大小的整数矩阵\nMatrix\u003C int > mat1(3,2);\n\n\u002F\u002F 创建一个 2x2 大小的字符串矩阵\nMatrix\u003C string > mat2(2,2);\n\n\u002F\u002F 创建一个 5x3 大小的 Foo 矩阵\nMatrix\u003C Foo > mat3(5,3);\n```\n\n- **VectorFloat:** 提供用于存储浮点向量数据的主要数据结构。VectorFloat 的精度将自动与 GRT Float 的精度保持一致。\n```C++\n\u002F\u002F 创建一个包含 10 个元素的新向量\nVectorFloat vector( 10 );\nfor(UINT i=0; i\u003Cvector.getSize(); i++){ \n    vector[i] = i*1.0; \n}\n```\n\n- **MatrixFloat:** 提供用于存储浮点矩阵数据的主要数据结构。MatrixFloat 的精度将自动与 GRT Float 的精度保持一致。\n```C++\n\u002F\u002F 创建一个 5x2 的浮点矩阵\nMatrixFloat matrix(5,2);\n\n\u002F\u002F 遍历矩阵中的数据，并将其设置为一个简单的递增值\nUINT counter = 0;\nfor(UINT i=0; i\u003Cmatrix.getNumRows(); i++){\n    for(UINT j=0; j\u003Cmatrix.getNumCols(); j++){\n        matrix[i][j] = counter++;\n    }\n}\n```\n\n## 构建 GRT\n您可以在 build 文件夹中找到一个 CMakeLists 文件，可用于为您的机器自动生成 Makefile。\n\n请阅读 build 文件夹中的 README 文件，以了解如何将 GRT 构建成适用于 Linux、OS X 或 Windows 的静态库。\n\n## 在您的 C++ 项目中安装和使用 GRT\n有关如何在您的 C++ 项目中构建、安装和使用 GRT 的详细信息，请参阅 build 目录。\n\n## 许可证\n手势识别工具包采用 MIT 许可证授权。\n\n特此授予任何人免费获取本软件及其相关文档文件（以下简称“软件”）副本的权利，允许其在不受限制的情况下处理该软件，包括但不限于使用、复制、修改、合并、发布、分发、再许可和\u002F或销售该软件副本的权利；并允许向任何获得该软件的人提供该软件，但须遵守以下条件：\n\n上述版权声明和本许可声明应包含在该软件的所有副本或实质性部分中。\n本软件按“原样”提供，不提供任何形式的明示或暗示保证，包括但不限于适销性、特定用途适用性和非侵权性的保证。在任何情况下，作者或版权所有者均不对任何索赔、损害或其他责任负责，无论该等责任是基于合同、侵权行为或其他原因而产生，亦无论该等责任是否与本软件或其使用有关，或因其他方式而产生。","# GRT (Gesture Recognition Toolkit) 快速上手指南\n\nGRT 是一个跨平台、开源的 C++ 机器学习库，专为实时手势识别设计。它支持多种传感器输入（如摄像头、Kinect、Leap Motion、加速度计等），并提供丰富的分类、回归和聚类算法。\n\n## 环境准备\n\n### 系统要求\n- **操作系统**: Windows, macOS, Linux (跨平台支持)\n- **编译器**: 支持 C++11 标准的编译器 (如 GCC, Clang, MSVC)\n- **构建工具**: CMake (推荐版本 3.0+)\n\n### 前置依赖\nGRT 核心库主要依赖标准 C++ 库，无重型外部依赖。若需使用图形界面 (GUI) 或特定扩展，请参考官方 Wiki 安装额外依赖（如 openFrameworks, Qt 等）。本指南专注于核心 C++ API 的使用。\n\n## 安装步骤\n\n### 1. 克隆源代码\n从 GitHub 获取最新源码：\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt.git\ncd grt\n```\n\n### 2. 编译与安装\n使用 CMake 进行构建：\n\n```bash\nmkdir build\ncd build\ncmake ..\nmake\nsudo make install\n```\n\n*注：在 Windows 上，可使用 Visual Studio 打开生成的 `.sln` 文件进行编译，或使用 `cmake --build .` 命令。*\n\n### 3. 验证安装\n编译完成后，可在 `build` 目录或示例文件夹中找到可执行文件。确保头文件和库文件已正确链接到您的项目中。\n\n## 基本使用\n\n以下示例演示了如何使用 GRT 加载数据、划分训练\u002F测试集、构建识别管道、训练 KNN 模型并评估准确率。\n\n### 代码示例 (`main.cpp`)\n\n```cpp\n\u002F\u002F 引入 GRT 主头文件\n#include \u003CGRT\u002FGRT.h>\nusing namespace GRT;\nusing namespace std;\n\nint main (int argc, const char * argv[]) {\n  \u002F\u002F 检查命令行参数\n  if (argc != 2) {\n    cout \u003C\u003C \"Error: failed to parse data filename from command line. \";\n    cout \u003C\u003C \"You should run this example with one argument pointing to a data file\\n\";\n    return EXIT_FAILURE;\n  }\n  const string filename = argv[1];\n\n  \u002F\u002F 1. 加载数据集 (支持 .grt 或 .csv 格式)\n  ClassificationData trainingData;\n  cout \u003C\u003C \"Loading dataset...\" \u003C\u003C endl;\n  if (!trainingData.load(filename)) {\n    cout \u003C\u003C \"ERROR: Failed to load training data from file\\n\";\n    return EXIT_FAILURE;\n  }\n  cout \u003C\u003C \"Data Loaded\" \u003C\u003C endl;\n  trainingData.printStats();\n\n  \u002F\u002F 2. 划分训练集和测试集 (80% 训练，20% 测试)\n  cout \u003C\u003C \"Splitting data into training\u002Ftest split...\" \u003C\u003C endl;\n  ClassificationData testData = trainingData.split(80);\n\n  \u002F\u002F 3. 创建手势识别管道\n  GestureRecognitionPipeline pipeline;\n\n  \u002F\u002F 4. 添加分类器 (此处使用 K-近邻算法)\n  \u002F\u002F KNN 构造函数参数：K 值\n  if (!pipeline.setClassifier( KNN(5) )) {\n    cout \u003C\u003C \"ERROR: Failed to set classifier\\n\";\n    return EXIT_FAILURE;\n  }\n\n  \u002F\u002F 5. 训练模型\n  cout \u003C\u003C \"Training model...\" \u003C\u003C endl;\n  if (!pipeline.train( trainingData )) {\n    cout \u003C\u003C \"ERROR: Failed to train model\\n\";\n    return EXIT_FAILURE;\n  }\n\n  \u002F\u002F 6. 在测试集上评估模型\n  cout \u003C\u003C \"Testing model...\" \u003C\u003C endl;\n  if (!pipeline.test( testData )) {\n    cout \u003C\u003C \"ERROR: Failed to test model\\n\";\n    return EXIT_FAILURE;\n  }\n\n  \u002F\u002F 7. 输出测试结果 (精确率、召回率、混淆矩阵等)\n  pipeline.printTestResults();\n\n  \u002F\u002F 8. 保存训练好的管道到文件 (.grt 格式)\n  if (!pipeline.save(\"trained_pipeline.grt\")) {\n    cout \u003C\u003C \"ERROR: Failed to save pipeline\\n\";\n    return EXIT_FAILURE;\n  }\n\n  \u002F\u002F 9. (可选) 加载已保存的管道进行实时预测\n  \u002F*\n  GestureRecognitionPipeline loadedPipeline;\n  if (!loadedPipeline.load(\"trained_pipeline.grt\")) {\n      cout \u003C\u003C \"ERROR: Failed to load pipeline\\n\";\n      return EXIT_FAILURE;\n  }\n  \u002F\u002F 实时预测示例: loadedPipeline.predict(inputVector);\n  *\u002F\n\n  return EXIT_SUCCESS;\n}\n```\n\n### 运行示例\n\n假设您有一个名为 `my_data.csv` 的数据集文件，编译并运行程序的命令如下：\n\n```bash\ng++ -std=c++11 main.cpp -o gesture_example -lgrt\n.\u002Fgesture_example my_data.csv\n```\n\n*注意：实际编译时请根据您的安装路径调整 `-I` (头文件路径) 和 `-L` (库文件路径) 参数，或直接使用 CMake 管理项目依赖。*\n\n### 关键说明\n- **输入数据**: GRT 接受任意维度的浮点向量作为输入，适用于各类传感器数据。\n- **类标签**: 请避免使用 `0` 作为有效手势的类标签，因为 `0` 被保留为“空手势”（用于自动手势检测）。\n- **文件格式**: 支持自定义 `.grt` 格式以及通用的 `.csv` 格式进行数据导入导出。\n- **核心函数**: 几乎所有模块都支持 `train()`, `predict()`, `save()`, `load()`, `reset()` 和 `clear()` 方法。","某康复医疗团队正在开发一套基于惯性传感器（IMU）的上肢康复训练系统，需要实时识别患者是否标准完成了“前举”、“侧平举”等特定复健动作。\n\n### 没有 grt 时\n- 开发者需从零编写信号滤波、特征提取及分类算法，耗时数周且难以保证实时性，导致动作反馈延迟高达数百毫秒。\n- 缺乏统一的模型管理格式，每次迭代都需手动处理复杂的二进制数据读写，训练好的模型难以在不同设备间迁移部署。\n- 无法有效区分“无动作”状态与具体手势，系统常将患者的静止休息误判为错误动作，严重影响训练数据的准确性。\n- 调整算法参数依赖反复修改代码并重新编译，缺乏可视化工具辅助调试，极大拖慢了原型验证进度。\n\n### 使用 grt 后\n- 直接调用 grt 内置的预处理管道和机器学习算法（如 HMM 或 SVM），将开发周期缩短至几天，并实现了毫秒级的低延迟实时识别。\n- 利用 grt 专有的 `.grt` 文件格式，一键保存和加载训练好的模型与数据集，轻松实现从开发机到嵌入式设备的无缝部署。\n- 借助 grt 预留的“零类标签”机制自动处理空手势检测，精准过滤静止状态，显著提升了动作捕捉的信噪比和判定准确率。\n- 配合 grt 提供的图形化界面（GUI），研究人员可直观地录制数据、训练模型并实时观察识别效果，无需编写额外代码即可快速调优。\n\ngrt 通过提供标准化的实时机器学习流水线，让开发团队从繁琐的底层算法实现中解放出来，专注于康复逻辑本身的创新与优化。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnickgillian_grt_c5993de5.png","nickgillian","Nicholas Gillian","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fnickgillian_a7f622c8.png","Founder, CTO @ Archetype AI.\r\nPreviously Google, MIT, GRT",null,"Palo Alto, California","http:\u002F\u002Fwww.nickgillian.com","https:\u002F\u002Fgithub.com\u002Fnickgillian",[81,85,89,93,96,100,103,107,111],{"name":82,"color":83,"percentage":84},"C++","#f34b7d",93.6,{"name":86,"color":87,"percentage":88},"Python","#3572A5",2.3,{"name":90,"color":91,"percentage":92},"Processing","#0096D8",1.7,{"name":94,"color":95,"percentage":92},"Groovy","#4298b8",{"name":97,"color":98,"percentage":99},"CMake","#DA3434",0.4,{"name":101,"color":76,"percentage":102},"QMake",0.2,{"name":104,"color":105,"percentage":106},"HTML","#e34c26",0.1,{"name":108,"color":109,"percentage":110},"Makefile","#427819",0,{"name":112,"color":113,"percentage":110},"Shell","#89e051",887,287,"2026-04-03T14:32:55",4,"Linux, macOS, Windows","未说明",{"notes":121,"python":122,"dependencies":123},"该工具核心为 C++ 机器学习库，非 Python 项目。支持跨平台编译，输入数据为 N 维浮点向量，适用于各类传感器（如摄像头、Kinect、加速度计等）。提供预编译的图形用户界面 (GUI)，也可作为代码库集成到 C++、openFrameworks、Max\u002FMSP 等环境中。类标签 0 被保留为空手势类别，训练时请避免使用。","不适用 (核心库为 C++)",[124,125,126,127],"C++ 编译器 (支持 C++11 或更高版本)","openFrameworks (可选，用于 ofGrt 扩展)","Max\u002FMSP 或 Pure Data (可选，用于 ml-lib 扩展)","Arduino IDE (可选，用于 ESP 项目)",[14],[130,64,131,132,133,134,135,136,137,138],"gesture-recognition","machine-learning","gesture-recognition-toolkit","support-vector-machine","random-forest","kmeans","dynamic-time-warping","softmax","linear-regression","2026-03-27T02:49:30.150509","2026-04-07T08:26:22.240868",[142,147,152,157,162,167],{"id":143,"question_zh":144,"answer_zh":145,"source_url":146},21401,"如何在 Ubuntu 14.04 上构建 GUI 或使用 gdb 调试段错误？","若要调试，可以修改 `gui\u002FGRT\u002FGRT.pro` 文件，在 unix 非 macx 部分添加 `-g` 标志以启用调试信息：\n```\nunix:!macx {\n QMAKE_CXXFLAGS += -std=c++0x\n QMAKE_CXXFLAGS += -DOSC_HOST_LITTLE_ENDIAN\n QMAKE_CXXFLAGS += -g\n}\n```\n重新编译 GRT GUI 后，使用 gdb 运行：\n```\ngdb .\u002FGRT\nr\n# 如果发生段错误\nbt\n```","https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fissues\u002F13",{"id":148,"question_zh":149,"answer_zh":150,"source_url":151},21402,"GUI 无法保存训练数据或加载文件时显示警告怎么办？","请尝试以下两个步骤：\n1. 确保保存文件时使用了 `.csv` 或 `.grt` 扩展名。\n2. 确保将文件保存到您拥有写入权限的位置（避免权限问题）。\n如果问题依旧，可能是操作系统版本更新导致的兼容性问题，建议等待或尝试重新编译适配当前系统的版本。","https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fissues\u002F39",{"id":153,"question_zh":154,"answer_zh":155,"source_url":156},21403,"训练 HMM 连续模型时报错\"Failed to resize matrix, rows and cols == zero!\"是什么原因？","这通常是因为设置的 `downsampleFactor`（下采样因子）大于时间序列数据的实际长度，导致下采样后的矩阵行数为零。\n解决方案：\n1. 检查您的手势数据长度（行数）。\n2. 减小 `downsampleFactor` 的值，确保它小于时间序列的长度。\n维护者已在 GRT 0.2.1 版本中修复了相关逻辑，建议更新到最新版本。","https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fissues\u002F84",{"id":158,"question_zh":159,"answer_zh":160,"source_url":161},21404,"运行示例程序时出现\"Classifier Module Not Set!\"错误或测试失败如何解决？","这通常是由于开发分支（dev branch）的代码不稳定或缺少必要的资源文件导致的。\n解决方案：\n1. 拉取最新的开发分支代码，维护者曾推送修复以解决 HelloWorld 和 GettingStarted 示例的问题。\n2. 检查示例文件夹中是否缺少 `HelloWorldTraining.grt` 等必要的训练数据文件，如有缺失需手动补充或重新克隆仓库。","https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fissues\u002F103",{"id":163,"question_zh":164,"answer_zh":165,"source_url":166},21405,"在 Windows 上编译时遇到 LNK2019 未解析的外部符号错误（如 VectorFloat 析构函数）怎么办？","该错误通常与 Visual Studio 的项目配置或 DLL 导入导出设置有关。虽然具体解决方案在讨论中未完全定论，但建议检查以下几点：\n1. 确保正确链接了 GRT 库文件。\n2. 检查是否正确定义了宏以处理 `__declspec(dllimport)`。\n3. 尝试使用 CMake 重新生成项目文件，确保构建配置与源码分支（master 或 dev）匹配。\n注意：部分用户反馈在较新版本的 VS 或更新代码库后问题可能依然存在，需关注后续官方修复。","https:\u002F\u002Fgithub.com\u002Fnickgillian\u002Fgrt\u002Fissues\u002F133",{"id":168,"question_zh":169,"answer_zh":170,"source_url":166},21406,"如何处理已弃用方法（如 partition）的编译警告？","当编译器提示 `partition(...) is deprecated` 时，请按照警告建议将代码中的 `partition` 方法调用替换为 `split` 方法。例如：\n原代码：`trainingData.partition(...)`\n新代码：`trainingData.split(...)`\n这将消除警告并确保代码与最新版本的 API 兼容。",[172,177,182],{"id":173,"version":174,"summary_zh":175,"released_at":176},127427,"v0.2.4","本版本是手势识别工具包在 transitioning to version v0.2.4 之前的一个快照，当时工具包尚未引入一些重大更新。\n\n该版本的 API 可以在以下网址找到：nickgillian.com\u002Fgrt\u002Fapi\u002F0.2.4","2016-12-05T04:03:19",{"id":178,"version":179,"summary_zh":180,"released_at":181},127428,"v0.2.0","本版本是手势识别工具包在即将推出重大更新、 transitioning to version v0.2.0 之前的快照。\n\n该版本的 API 可在此处查阅：nickgillian.com\u002Fgrt\u002Fapi\u002F0.2.0\n","2016-08-08T02:13:42",{"id":183,"version":184,"summary_zh":185,"released_at":186},127429,"v0.1.0","此版本是手势识别工具包在迈向 v0.1.0 版本并引入一些重大更改之前的快照。\n\n该版本的 API 可在此处找到：nickgillian.com\u002Fgrt\u002Fapi\u002F0.1.0\n","2016-02-21T02:15:38"]