# desklamp-tiny-pose **Repository Path**: r-mango/desklamp-tiny-pose ## Basic Information - **Project Name**: desklamp-tiny-pose - **Description**: 代码开源,没有其它变更 - **Primary Language**: C++ - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-18 - **Last Updated**: 2025-08-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 智能台灯 - 落座检测与推流触发器 > 基于YOLO姿态检测的实时用户状态监测系统 ## 项目简介 本项目是"智能台灯"视觉系统的完整技术实现指南,通过实时姿态检测技术来监测用户的落座状态,为台灯的智能化场景(如自动推流)提供可靠的触发信号 ### 核心特性 - **高性能检测**: 基于YOLOv11姿态模型,经INT8量化优化 - **低资源占用**: 专为CPU环境优化,适合嵌入式设备 - **稳定触发**: 内置防抖机制,避免误触发 - **实时响应**: 毫秒级检测延迟 --- ## 核心工作流 项目分为四个主要阶段: ```mermaid graph LR A[模型准备] --> B[环境配置] B --> C[编译程序] C --> D[运行与开发] ``` | 阶段 | 描述 | 输出 | |------|------|------| | **模型准备** | 导出并量化YOLO模型 | `.xml` + `.bin` 文件 | | **环境配置** | 安装C++编译依赖 | 开发环境 | | **编译程序** | 构建可执行文件 | 推理程序 | | **运行与开发** | 实现业务逻辑 | 完整系统 | --- ## 快速开始 ### 阶段一:模型准备 将PyTorch格式的YOLOv11姿态模型导出为INT8 OpenVINO格式 #### 1.1 安装依赖 ```bash # 确保Python版本 >= 3.12 pip install ultralytics "openvino-dev[pytorch]" ``` #### 1.2 获取预训练模型 下载YOLOv11姿态检测模型: - [下载 yolo11n-pose.pt](https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n-pose.pt) #### 1.3 导出与量化 创建 `export_model.py` 文件: ```python from ultralytics import YOLO # 加载预训练模型 model = YOLO("yolo11n-pose.pt") # 导出为INT8量化的OpenVINO格式 model.export( format='openvino', int8=True, data='coco8-pose.yaml' ) ``` 运行导出脚本: ```bash python export_model.py ``` #### 1.4 部署模型文件 导出成功后,将生成 `yolo11n-pose_int8_openvino_model` 文件夹,包含: - `yolo11n-pose.xml` - 模型结构 - `yolo11n-pose.bin` - 模型权重 - `metadata.yaml` - 元数据 **将整个文件夹移动到C++项目根目录** --- ### 阶段二:环境配置 #### 2.1 安装构建工具 **macOS:** ```bash # 安装Xcode命令行工具 xcode-select --install ``` **Linux (Ubuntu/Debian):** ```bash sudo apt-get update sudo apt-get install build-essential cmake git ``` #### 2.2 安装OpenCV **macOS (推荐Homebrew):** ```bash brew install opencv ``` **Linux:** ```bash sudo apt-get install libopencv-dev ``` #### 2.3 安装OpenVINO **macOS (推荐Homebrew):** ```bash brew install openvino ``` **Linux:** 请参照[Intel官方文档](https://docs.openvino.ai/latest/openvino_docs_install_guides_overview.html)进行安装 --- ### 阶段三:编译程序 #### 3.1 获取源代码 ```bash git clone https://gitee.com/r-mango/desklamp-tiny-pose.git cd desklamp-tiny-pose ``` #### 3.2 构建项目 ```bash # 创建构建目录 mkdir build && cd build # CMake配置 cmake .. # 编译 make ``` > **提示**: 如果CMake找不到库,使用 `-DOpenCV_DIR` 和 `-DOpenVINO_DIR` 参数手动指定路径 编译成功后,在 `build` 目录下会生成 `DesklampTinyPoseInference` 可执行文件 --- ### 阶段四:运行与开发 #### 4.1 运行程序 ```bash # 在build目录下运行 ./DesklampTinyPoseInference ``` - 程序启动后会打开摄像头 - 实时显示姿态检测结果 - 按 `q` 键退出 #### 4.2 实现落座检测逻辑 ##### 核心思路 1. **检测存在性**: 判断每帧是否有检测结果 2. **状态稳定化**: 使用计数器避免误触发 3. **状态管理**: 维护推流状态标志 ##### 代码实现 在主循环中添加以下逻辑: ```cpp // 状态管理变量 (在主函数循环外定义) int person_present_frames = 0; // 连续检测到人的帧数 int person_absent_frames = 0; // 连续未检测到人的帧数 const int PRESENT_THRESHOLD = 30; // 稳定出现阈值 (或者根据帧率计算1-2秒) const int ABSENT_THRESHOLD = 90; // 稳定离开阈值 (或者根据帧率计算3-5秒) bool is_streaming = false; // 推流状态标志 // 在while循环内, NMS处理后添加: if (!detections.empty()) { // 检测到人 person_present_frames++; person_absent_frames = 0; } else { // 未检测到人 person_absent_frames++; person_present_frames = 0; } // 触发开始推流 if (person_present_frames > PRESENT_THRESHOLD && !is_streaming) { std::cout << "检测到用户稳定出现,触发推流!" << std::endl; // TODO: 在这里实现推流启动逻辑 is_streaming = true; } // 触发停止推流 if (person_absent_frames > ABSENT_THRESHOLD && is_streaming) { std::cout << "检测到用户已离开,停止推流..." << std::endl; // TODO: 在这里实现推流停止逻辑 is_streaming = false; } ``` --- ## 参数调优 ### 检测阈值 | 参数 | 推荐值 | 说明 | |------|--------|------| | `PRESENT_THRESHOLD` | 30帧 | 防止路过误触发,(或者根据帧率计算1-2秒) | | `ABSENT_THRESHOLD` | 90帧 | 防止暂时遮挡(或者根据帧率计算3-5秒) | ### 模型配置 - **置信度阈值**: 0.5 (默认) - **NMS阈值**: 0.4 (默认) - **输入图像尺寸**: 640x640 (可调)