KingArthuritus/Slide-Kick

GitHub: KingArthuritus/Slide-Kick

基于网络摄像头与机器学习的实时手臂挥动检测系统,用于无硬件控制幻灯片翻页。

Stars: 0 | Forks: 0

# SlideKick **用手臂动作控制你的演示文稿 —— 不需要翻页笔、键盘或任何硬件。** SlideKick 使用你的网络摄像头和机器学习模型实时检测手臂挥动,并将其转化为幻灯片导航命令。向左挥动前进,向右挥动后退。就这么简单。 ## 包含内容 ``` Slide-Kick/ ├── main.py # Launch the app ├── app/ │ ├── session_ui.py # Session tab — live gesture control │ ├── training_ui.py # Label & Train tab — data labelling │ ├── training_vision_ui.py# Test Model tab — evaluate & generate data │ ├── pose_tracker.py # MediaPipe pose tracking + person lock │ ├── recorder.py # Session video + landmark recorder │ └── config.py # All tuning constants (edit here) ├── utils/ │ ├── smoothing.py # OneEuro landmark smoother │ └── one_euro.py ├── swipe_hero/ # Gesture rhythm game │ ├── game.py # Main game entry point │ ├── beatmap_editor.py # Create beatmaps for songs │ ├── beatmaps/ # Song beatmap JSON files │ └── songs/ # Place .wav / .mp3 / .ogg files here ├── models/ # MediaPipe model (auto-downloaded) ├── recordings/ # Saved session videos + landmark JSON ├── dataset/ # Labelled gesture segments ├── model.pkl # Trained gesture classifier ├── train_model.py # Train the classifier ├── generate_results.py # Evaluate model + k-fold cross validation ├── results_dashboard.py # Visual performance charts └── comparison_tool.py # Compare ML vs hardcoded detection ``` ## 安装说明 **环境要求:** Python 3.10+,网络摄像头 ``` # Clone 并 install dependencies pip install -r requirements.txt # 下载 MediaMedia pose model(首次运行时自动下载) # 或者手动将 pose_landmarker_full.task 放置在 models/ 中 # 启动 app python main.py ``` **核心依赖:** - `mediapipe` — 姿态关键点提取 - `opencv-python` — 摄像头画面 - `scikit-learn` — 手势分类器 - `joblib` — 模型序列化 - `Pillow` — 在 tkinter 中显示图像 - `pyautogui` — 幻灯片控制按键 - `pygame` — Swipe Hero 游戏 ## 如何使用 ### 1. 收集训练数据 打开 **Session** 标签页并点击 **START SESSION**。在摄像头前清晰地挥动你的手臂。视频和关键点数据将自动保存到 `recordings/` 目录中。 ### 2. 标注数据 打开 **Label & Train** 标签页,加载一段录像,并标记每次挥动的起始和结束帧。为其分配一个手势标签。标记的片段会保存到 `dataset/` 目录中。 **手势标签:** | 标签 | 含义 | |-------|---------| | `left_arm_swipe_left` | 左臂向左挥动 | | `left_arm_swipe_right` | 左臂向右挥动 | | `right_arm_swipe_left` | 右臂向左挥动 | | `right_arm_swipe_right` | 右臂向右挥动 | | `non_gesture` | 无挥动 —— 背景动作 | ### 3. 训练模型 ``` python train_model.py ``` 此操作会读取 `dataset/` 中的所有片段,训练一个 Random Forest 分类器,并保存 `model.pkl`。只需几秒钟。 ### 4. 评估性能 ``` python generate_results.py # runs 5-fold cross validation python results_dashboard.py # opens visual charts ``` ### 5. 控制你的幻灯片 在 **Session** 标签页中,勾选 **Presentation Mode**。将摄像头对准自己,在任意应用程序(如 Google Slides、PowerPoint、Keynote)中打开你的演示文稿,然后挥动手臂: - **向左挥动**(任意一只手臂) → 下一页幻灯片 - **向右挥动**(任意一只手臂) → 上一页幻灯片 ## 调优 所有检测设置都位于 `app/config.py` 中。只需修改一次,即可在全局生效。 ``` GESTURE_WINDOW = 3 # frames of history for feature extraction CONFIDENCE_THRESH = 0.60 # minimum confidence to fire a gesture COOLDOWN_FRAMES = 5 # frames to ignore after a detection fires ``` **指南:** - 降低 `CONFIDENCE_THRESH` → 灵敏度更高,但可能会出现误报 - 提高 `CONFIDENCE_THRESH` → 灵敏度更低,减少误报 - 降低 `COOLDOWN_FRAMES` → 可以更快地再次触发 - 提高 `GESTURE_WINDOW` → 更平滑,但会增加少许延迟 ## Swipe Hero 这是一款由手势控制的音乐节奏游戏,旨在让手势训练变得有趣,并在游戏过程中生成额外的 ML 训练数据。 ``` python swipe_hero/game.py ``` **操作按键:** | 按键 | 动作 | |-----|--------| | `↑ / ↓` | 导航菜单 | | `← / →` | 切换歌曲 | | `Enter` | 选择 | | `A` | 左臂向左挥动 | | `S` | 左臂向右挥动 | | `K` | 右臂向左挥动 | | `L` | 右臂向右挥动 | | `P / Esc` | 暂停 | | `F11` | 全屏 | **添加歌曲:** 1. 将 `.wav`、`.mp3` 或 `.ogg` 文件放入 `swipe_hero/songs/` 目录 2. 运行谱面编辑器:`python swipe_hero/beatmap_editor.py` 3. 输入歌曲名称(必须与音频文件名一致),跟着节拍敲击音符,然后按 Enter 键保存 ## 项目结构说明 - `recordings/` — 会话视频命名为 `session_YYYYMMDD_HHMMSS.mp4`,Swipe Hero 录像命名为 `swipe_hero_YYYYMMDD_HHMMSS.mp4` - `dataset/` — 每个已标注的片段都是一个 `.json` 文件,包含关键点和元数据 - `model.pkl` — 训练好的分类器;每次运行 `train_model.py` 时都会重新生成 - `results.json` — 由 `generate_results.py` 生成;供 `results_dashboard.py` 读取 ## 架构 SlideKick 采用包含五层结构的**分层架构** (Layered Architecture): | 层级 | 组件 | |-------|-----------| | 表示层 | Session 标签页,训练界面,Swipe Hero | | 应用层 | Session 协调器,手势检测器,录像机 | | 手势识别层 | 姿态追踪器,关键点平滑器,分类器 | | 幻灯片指令层 | 键盘分发器,演示模式 | | 硬件层 | 摄像头读取器,文件系统,OS 输入 | 各层之间的通信采用**观察者模式** (Observer Pattern) —— 手势检测器会广播已确认的挥动事件,多个独立的观察者(幻灯片控制器、界面反馈、错误处理器)各自独立进行响应。 ## 已知局限性 - 在距离摄像头 2 到 4 米的范围内效果最佳 - 需要合理的照明条件 —— 环境过暗会降低关键点质量 - Swipe Hero 中的双人模式尚未实现
标签:Apex, MediaPipe, 人机交互, 手势识别, 机器学习, 演示工具, 计算机视觉, 逆向工具