# 居家看护监控盒子 ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- 本项目是一个基于 Quectel Pi M2 智能主控板实现的居家看护监控示例。 系统通过 USB 摄像头采集实时画面,在板端 NPU 上运行 YOLOv8n-Pose 人体姿态模型进行多人骨骼检测与跌倒判定,结合板载麦克风声音能量监测、声光告警与事件录像,完整展示"**视频采集 → NPU 推理 → 跌倒判定 → 声光告警/事件录像**"的端到端链路。检测到跌倒时,板载红灯点亮、扬声器播放警笛,并自动保存事件前后带音频标注的录像片段;图形界面实时显示画面骨骼、帧率、推理耗时、人数与声音强度等指标。 ```{image} images/image_O1o4biSjGoXeSNxso2HcubgSnAc.webp :width: 1301px :height: 879px :align: center ``` ## 开发资源汇总 ### 开发配件清单 Note: tips 开发配件只是作为参考,不同的开发环境可能会有所差异 | **配件名称** | **数量** | **规格参数** | | --- | --- | --- | | Quectel Pi M2 智能主控板 | 1 块 | - | | USB 摄像头(含麦克风) | 1 个 | UVC 协议,支持 720p MJPG | | 扬声器 | 1 个 | [2030腔体喇叭8Ω 2W方形喇叭高音质小体积扬声器]() | | HDMI 显示器(可选) | 1 个 | 有 HDMI 显示器也可,无屏可运行无界面模式 | | 网线 | 1 根 | 用于 SSH 登录与代码拉取 | | Type-C 电源适配器 | 1 个 | 主控板供电 | | 杜邦线/螺丝刀 | 若干 | - | ### 配件实物参考 ```{image} images/image_CPYWbiA7HoQSJJxXUBZcc1PAnuf.webp :width: 1067px :height: 602px :align: center ``` ## 快速上手 ### 开发准备 Quectel Pi M2 智能主控板出厂默认搭载 Debian 13 系统镜像,因此无需再次烧录镜像,仅需按照如下步骤操作即可。NPU 运行时库、Python 3.12 环境及全部依赖由项目自带的一键部署脚本自动完成安装。 ### 硬件连接 完成以下所有硬件连接操作: 1. **摄像头连接**:将 USB 摄像头接入主控板 USB-A 口。可用 `v4l2-ctl --list-devices` 确认设备序号(示例机型为 PC Camera = `/dev/video73`),后续在配置文件中填写。 2. **拾音连接**:默认使用摄像头内置麦克风拾音(`arecord -l` 中对应 plughw:1,0),无需额外接线;板载 es8389 麦克风作为备用。 3. **扬声器连接**:将扬声器接至板载 es8389 声卡音频输出座(对应 plughw:0,0),功放使能由内核自动完成,无需软件干预。 4. **显示连接**(可选):接入 HDMI 显示器用于本地查看图形界面;无显示器时可运行无界面(Headless)模式,通过 SSH 远程查看事件日志与录像。 5. **网络与供电**:接入网线,最后连接 Type-C 电源上电。 Note: tips 连接完成后可用 `v4l2-ctl --list-devices` 验证摄像头在位、`arecord -l` 与 `aplay -l` 验证录音/播音设备在位。若摄像头设备号与配置不一致,修改 `config.yaml` 中的 `camera.index` 即可。 ## 项目实现 ### 获取代码 在智能主控板上打开终端,使用 git 克隆项目代码。 ``` sudo apt update sudo apt install -y git git clone https://github.com/Quectel-Pi/demo_fall_detect.git cd demo_fall_detect ``` 执行完成后,进入 `fall_detect_demo` 目录,该目录即为本项目的全部源码。 ### 环境部署 运行项目自带的一键部署脚本,自动完成 Python 3.12 独立环境、推理依赖、RKNN 运行时库的安装: ``` sudo bash deploy/board_setup.sh ``` 脚本支持 **在线/离线双模式**:在线模式下通过 uv 自动安装 Python 3.12 与 pip 依赖;离线模式下使用随包分发的 wheels 与 Python 离线包。同时会将 NPU 运行时 `librknnrt.so` 安装至系统目录,并将代码部署到 `/opt/fall_detect_demo`。 ### 自检测试 首次运行前建议依次执行内置自检,确认软硬件链路正常: ``` /opt/py312/bin/python3.12 selftest.py # 离线自测: 后处理/跌倒判定/警笛生成等, 无需摄像头与 NPU sudo bash run.sh --test-alarm # 声光告警测试: 红灯 + 警笛 5 秒 sudo bash run.sh --test-audio # 声音标定: 实时打印环境底噪与声音强度 (dB) ``` `--test-audio` 可用于按现场环境标定声音触发阈值(`config.yaml` 中 `audio` 段),避免误触发或漏触发。 Note: tips 板端依赖均安装于部署脚本创建的 `/opt/py312` 独立环境,请勿直接使用系统自带 `python3` 运行本项目(会报 `ModuleNotFoundError`);`run.sh` 会自动定位该环境,日常运行一律通过 `run.sh` 启动。 ### 运行程序 ``` sudo bash run.sh ``` `run.sh` 会自动定位部署目录与 Python 环境、补全桌面显示授权后启动程序。若程序正常启动,会弹出"跌倒检测监控系统"窗口,左侧为带人体骨骼标注的实时画面,右侧为状态指标与控制面板。 无显示器场景可运行无界面模式: ``` sudo bash run.sh --no-ui ``` ### 界面与功能 程序正常运行后,窗口顶部状态徽标为绿色"●正常监控";检测到跌倒时变为红色"⚠检测到跌倒!",同时触发声光告警与事件录像。 | **界面元素** | **功能说明** | | --- | --- | | 实时画面(左侧) | 带人体骨骼关键点标注的视频预览,实测约 13~16fps(摄像头采集为 30fps,显示帧率受 NPU 推理耗时限制) | | 状态徽标(顶栏) | 绿色"正常监控" / 红色"检测到跌倒" | | 帧率 / 推理耗时 | 实时 FPS 与单帧 NPU 推理耗时(约 60ms) | | 画面人数 | 当前画面中检测到的人数,每人独立判定 | | 环境底噪 / 声音强度 | 麦克风实时 dB 读数与进度条,用于标定声音阈值 | | 测试告警按钮 | 手动触发 5 秒声光告警 | | 静音/取消按钮 | 停止当前正在进行的告警 | | 手动录像按钮 | 立即保存一段事件录像 | | 事件日志(底部) | 按时间戳记录跌倒/声音事件 | ### 工作原理 系统数据流:摄像头 720p@30fps 采集 → letterbox 缩放至 640×640 → RK3576 NPU 运行 YOLOv8n-Pose(fp16,约 60ms/帧)→ 后处理输出多人 17 关键点 → 跌倒判定 → 触发告警/录像。 **跌倒判定** 采用打分制,对画面中每个检测到的人独立判定: - 前提条件:该人可信骨骼节点比例 ≥ 70%; - 特征打分:躯干倾角、腿部水平、身体长宽比横向、关键点贴地、横向分布等特征加权累计,总分 ≥ 3 判为"倒地姿态"; - 硬门槛:躯干直立(倾角不足阈值 0.6 倍,约 33°)时直接否决,过滤坐姿、蹲姿、弯腰捡物等直立躯干场景的误报; - 辅助判定:髋部观察窗内快速下坠且倾角超标时直接判定; - 去抖:连续 15 帧(约 0.9 秒)保持倒地姿态才触发告警,连续 30 帧恢复正常姿态才解除。 **事件触发后**:板载红灯点亮、扬声器循环播放警笛(默认 10 秒,跌倒未恢复期间持续告警),并自动保存事件前 4 秒回溯 + 共 10 秒的带音频录像至 `records/日期/` 目录,索引写入 `records/events.jsonl`。异常声音事件(音量突增)只触发录像,不拉响警笛。 判定阈值、摄像头参数、声音阈值、录像时长等均可在 `config.yaml` 中调整;可使用 `tools/fall_feat_debug.py` 实时打印躯干倾角等特征值,辅助现场标定。 ### 应用演示
fall_detect_demo
## 常见问题及解决方案 ### 程序找不到摄像头 现象: ``` Camera open failed ``` 解决方案: - 使用命令确认摄像头设备号:`v4l2-ctl --list-devices`; - 修改 `config.yaml` 中 `camera.index` 为实际设备序号(本项目示例机型为 73)。 ### 有人出现但检测不到 / 坐姿误报 现象:画面中有人但人数为 0,或正常坐姿被判定为跌倒。 解决方案: - 适当调低 `model.conf_threshold` / `model.kpt_threshold`(默认 0.35 / 0.40); - 距离过远导致关键点不可见时,判定会被"可见节点 ≥ 70%"门槛拦截,属正常保护逻辑; - 坐姿误报场景可运行 `tools/fall_feat_debug.py`,实时查看 torso_angle 与各项得分,必要时微调 `fall.torso_angle_threshold`(默认 55°,直立硬门槛为 0.6 倍即 33°)。 ### 声音误触发或一直不触发 现象:环境安静时频繁录像,或拍手、呼喊无反应。 解决方案: - 运行 `sudo bash run.sh --test-audio`,观察环境底噪与拍手时的实时 dB 读数; - 按现场环境调整 `config.yaml` 中 `audio.abs_threshold_db`(默认 -10 dBFS,另有高于底噪 15dB 的相对阈值联动); - 默认拾音设备为摄像头内置麦克风(plughw:1,0),若被桌面音频服务占用,程序会自动回切板载麦克风(plughw:0,0)。 ### 图形界面无法启动 现象:桌面环境下运行后无窗口弹出,程序回退到命令行模式。 解决方案: - 确认通过 `sudo bash run.sh` 启动,脚本已自动处理 Wayland 桌面下的显示授权(DISPLAY / XAUTHORITY); - 若日志提示 Qt xcb 插件加载失败,安装缺失的系统库:`sudo apt install -y libxcb-cursor0`(部署脚本已内置自动安装兜底); - 无显示器场景请直接使用 `sudo bash run.sh --no-ui`。 ### NPU 推理报错或模型加载失败 现象: ``` RKNN run error / librknnrt version mismatch ``` 解决方案: - 确认 `librknnrt.so` 与板端 `rknn-toolkit-lite2` 版本匹配(重新执行 `sudo bash deploy/board_setup.sh` 可自动对齐); - 确认模型文件为 RK3576 目标平台编译的 `.rknn`(项目 `models/` 目录自带);调试阶段也可临时改用 `.onnx` 走 CPU 推理(`--model` 参数指定)。 ## 技术支持与贡献 如在使用过程中遇到问题,欢迎在移远官方论坛提交技术咨询,我们的技术支持团队将及时为您解答。 项目开源地址: https://github.com/Quectel-Pi/demo_fall_detect 欢迎提交 Issue 反馈问题或 Pull Request 贡献代码改进!