基于 Raspberry Pi 5 的边缘端跌倒检测系统:摄像头实时检测人体姿态,识别跌倒事件后自动录制视频并推送微信告警,同时提供本地 Web 监控面板。
- 人体检测 & 姿态估计 — YOLOv8n 检测人体 + MoveNet Lightning 17 点关键点估计
- 实时跌倒判断 — 基于宽高比 + 髋部高度变化的状态机,三阶段判断(站立 → 可疑 → 跌倒/恢复)
- 多目标追踪 — 自写 ByteTrack 核心,Kalman 滤波 + IoU 匹配,支持多人场景
- 告警自动录制 — 跌倒事件触发前后各 N 秒视频录制,环形缓冲区无丢帧
- 微信告警推送 — 通过 Server酱 实时推送跌倒告警到微信
- SQLite 持久化 — 告警事件记录入库,支持历史查询
- Web 实时监控 — 本地 MJPEG 视频流 + 状态面板(FPS / 追踪数 / 告警),深色主题,响应式布局
| 项目 | 要求 |
|---|---|
| 硬件 | Raspberry Pi 5(4GB+ RAM),USB 摄像头 |
| OS | Ubuntu 24.04 arm64(其他 Linux 发行版也可运行) |
| 编译器 | g++(支持 C++17) |
| 构建系统 | CMake 3.10+ |
| 推理引擎 | ONNX Runtime 1.16.3 |
| 视觉库 | OpenCV 4.x |
| 数据库 | SQLite3 |
| 其他依赖 | yaml-cpp、libssl-dev、Eigen3(已内置于 third_party/) |
git clone https://github.com/Piggy-two/FallGuard.git
cd FallGuardbash scripts/setup.shbash scripts/download_models.shYOLOv8n:需将
yolov8n.onnx放置在~/VersionGateway/yolov8n.onnx,脚本会自动创建软链接。MoveNet Lightning:脚本自动从 PINTO model zoo 下载。
mkdir build && cd build
cmake ..
make -j4编译产物位于 build/ 目录,可执行文件列表:
| 文件 | 说明 |
|---|---|
fallguard |
🎯 主程序 |
fallguard_test |
人体检测测试 |
fallguard_pose_test |
姿态估计测试(图片) |
fallguard_pose_live |
姿态估计测试(摄像头) |
fallguard_fall_test |
跌倒判断测试 |
fallguard_pipeline_test |
完整流水线测试 |
fallguard_web_test |
Web 服务测试 |
fallguard_db_test |
数据库测试 |
fallguard_alert_test |
告警管理测试 |
# 从 build/ 目录运行,指定配置文件路径
./fallguard ../config/config.yaml启动后:
- 摄像头自动打开,开始实时检测
- 终端输出 FPS、追踪数、告警信息
- Web 监控面板:
http://<设备IP>:8080
按 Ctrl+C 优雅退出。
配置文件位于 config/config.yaml,关键字段解释:
camera:
device_id: 0 # 摄像头设备 ID(默认 0 为第一个 USB 摄像头)
width: 640 # 采集分辨率宽度
height: 480 # 采集分辨率高度
fps: 15 # 目标帧率
models:
detector: "models/yolov8n.onnx" # 人体检测模型路径
pose: "models/movenet_lightning.onnx" # 姿态估计模型路径
inference:
detector_threads: 2 # ONNX 推理线程数
confidence_threshold: 0.4 # 检测置信度阈值
nms_threshold: 0.4 # NMS 阈值
fall_detection:
aspect_ratio_standing: 1.2 # 站立时人体框宽高比阈值(h/w > 此值认为站立)
aspect_ratio_lying: 0.8 # 躺倒时人体框宽高比阈值(h/w < 此值认为躺倒)
hip_drop_ratio: 0.25 # 髋部高度下降比例阈值
hip_drop_window_ms: 500 # 髋部下降检测时间窗口(毫秒)
suspicious_duration_ms: 5000 # 可疑状态持续时间阈值(超过触发跌倒)
recovery_duration_ms: 1000 # 恢复状态持续时间阈值(超过取消跌倒)
alert:
server_chan_key: "" # Server酱 SendKey(见下方告警推送配置)
clip_pre_seconds: 5 # 跌倒事件前录制秒数
clip_post_seconds: 5 # 跌倒事件后录制秒数
web:
port: 8080 # Web 服务端口
mjpeg_quality: 75 # MJPEG 流 JPEG 质量(1-100)
mjpeg_fps_limit: 15 # MJPEG 流帧率限制
database:
path: "data/alerts.db" # SQLite 告警数据库路径启动主程序后,浏览器访问 http://<设备IP>:8080 即可打开监控面板。
| 区域 | 说明 |
|---|---|
| 顶部状态栏 | 显示 FPS、追踪目标数、实时时钟 |
| 告警横幅 | 红色脉冲动画,显示跌倒告警详情,点击可关闭 |
| 视频区域 | MJPEG 实时视频流,带目标框 + 骨架线标注 |
| 底部状态栏 | 连接状态指示(绿色 Connected / 红色 Disconnected) |
| 路由 | 方法 | 说明 |
|---|---|---|
/ |
GET | 返回监控面板 HTML 页面 |
/style.css |
GET | 返回深色主题样式表 |
/stream |
GET | MJPEG 视频流(multipart/x-mixed-replace) |
/api/status |
GET | JSON 状态接口:{"fps":N,"tracks":N,"alert":"..."} |
- 深色主题(GitHub Dark 风格),长时间监控不刺眼
- 客户端 FPS 备用计算(基于 MJPEG 帧到达计时)
- 响应式布局,支持手机/平板访问
- 告警横幅 5 秒无新告警自动消失
FallGuard 使用 Server酱 推送跌倒告警到微信。
- 访问 sc.ftqq.com 注册并登录
- 获取你的 SendKey
- 将 SendKey 填入
config/config.yaml:
alert:
server_chan_key: "SCTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"- 重启主程序即可生效
跌倒事件触发时,推送消息包含:
- 事件内容:轨迹 ID + 跌倒原因
- 发生时间:系统时间戳
提示:如果
server_chan_key为空或未配置,告警推送功能自动跳过,不影响其他功能正常运行。
| # | 名称 | 状态 | 完成时间 | 备注 |
|---|---|---|---|---|
| M1 | 项目骨架 + 单帧检测 | ✅ 已完成 | 2026-05-18 | YOLOv8n ONNX 推理,detector 模块 + 测试 |
| M2 | MoveNet 姿态估计集成 | ✅ 已完成 | 2026-05-19 | 17 点关键点估计,站立图片验收通过 |
| M3 | 跌倒判断状态机 | ✅ 已完成 | 2026-05-19 | 三阶段状态机,4 个测试全部通过 |
| M4 | ByteTrack + 完整流水线 | ✅ 已完成 | 2026-05-19 | 自写 ByteTrack,Pipeline 串联全模块 |
| M5 | Web 监控面板 | ✅ 已完成 | 2026-05-20 | cpp-httplib MJPEG 流 + 深色主题前端 |
| M6 | 告警录制推送持久化 | ✅ 已完成 | 2026-05-20 | 环形缓冲区录制 + Server酱推送 + SQLite |
| M7 | Systemd + README | ✅ 已完成 | 2026-05-20 | systemd 服务配置 + 项目文档 |
FallGuard/
├── CMakeLists.txt # CMake 构建配置
├── config/
│ └── config.yaml # 主配置文件
├── models/ # 模型文件(gitignored)
│ ├── yolov8n.onnx # YOLOv8n 人体检测
│ └── movenet_lightning.onnx # MoveNet Lightning 姿态估计
├── src/
│ ├── main.cpp # 主程序入口
│ ├── detector.h/cpp # M1: YOLOv8n 人体检测
│ ├── pose_estimator.h/cpp # M2: MoveNet 姿态估计
│ ├── fall_detector.h/cpp # M3: 跌倒判断状态机
│ ├── tracker.h/cpp # M4: ByteTrack 封装
│ ├── pipeline.h/cpp # M4: 完整流水线
│ ├── config_reader.h # 轻量 YAML 配置读取
│ ├── web_server.h/cpp # M5: HTTP 服务
│ ├── alert.h/cpp # M6: 告警录制+推送+持久化
│ ├── db.h/cpp # M6: SQLite3 告警数据库
│ └── sqlite3_mini.h # SQLite3 最小化头文件
├── tests/ # 测试代码
│ ├── test_detector.cpp # M1 验收
│ ├── test_pose.cpp # M2 验收(图片)
│ ├── test_pose_live.cpp # M2 验收(摄像头)
│ ├── test_fall.cpp # M3 验收
│ ├── test_pipeline.cpp # M4 验收
│ ├── test_web.cpp # M5 验收
│ ├── test_db.cpp # M6 验收(数据库)
│ ├── test_alert.cpp # M6 验收(告警)
│ └── test_data/ # 测试图片
├── web/ # 前端资源
│ ├── index.html # 监控面板 HTML
│ └── style.css # 深色主题样式
├── third_party/ # 第三方库
│ ├── bytetrack/ # 自写 ByteTrack 核心
│ ├── eigen/ # Eigen3 线性代数
│ └── httplib.h # cpp-httplib v0.18.3
├── scripts/
│ ├── setup.sh # 一键安装系统依赖
│ └── download_models.sh # 下载/链接模型文件
├── data/ # 运行时数据(gitignored)
│ └── clips/ # 告警视频文件
└── build/ # CMake 构建产物(gitignored)
| 组件 | 版本/来源 |
|---|---|
| 语言标准 | C++17 |
| 编译器 | g++ |
| 构建系统 | CMake 3.10+ |
| 推理引擎 | ONNX Runtime 1.16.3 |
| 视觉库 | OpenCV 4.x |
| 目标追踪 | ByteTrack(自写,third_party/) |
| HTTP 服务 | cpp-httplib v0.18.3(single header) |
| 配置文件 | yaml-cpp |
| 数据库 | SQLite3 |
| 检测模型 | YOLOv8n ONNX |
| 姿态模型 | MoveNet Lightning ONNX |
| 告警推送 | Server酱 HTTP API |
- 文件编码:UTF-8
- 缩进:4 空格,不用 Tab
- 头文件 guard:
#pragma once - 日志:
std::cerr << "[模块名] " << 消息 << std::endl - 异常处理:构造函数失败抛
std::runtime_error,主循环捕获打印后继续 - 智能指针:优先用
std::unique_ptr,共享资源用std::shared_ptr - 多线程:数据共享用
std::mutex+std::lock_guard
This project is for educational and research purposes.