Skip to content

Piggy-two/FallGuard

Repository files navigation

🛡️ FallGuard — 边缘端跌倒检测与实时监控系统

基于 Raspberry Pi 5 的边缘端跌倒检测系统:摄像头实时检测人体姿态,识别跌倒事件后自动录制视频并推送微信告警,同时提供本地 Web 监控面板。

Platform C++ CMake ONNX Runtime

✨ 功能亮点

  • 人体检测 & 姿态估计 — 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/)

🚀 快速开始

1. 克隆仓库

git clone https://github.com/Piggy-two/FallGuard.git
cd FallGuard

2. 安装系统依赖

bash scripts/setup.sh

3. 下载模型文件

bash scripts/download_models.sh

YOLOv8n:需将 yolov8n.onnx 放置在 ~/VersionGateway/yolov8n.onnx,脚本会自动创建软链接。

MoveNet Lightning:脚本自动从 PINTO model zoo 下载。

4. 编译

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 告警管理测试

5. 运行

# 从 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 告警数据库路径

🖥️ Web 监控面板

启动主程序后,浏览器访问 http://<设备IP>:8080 即可打开监控面板。

页面功能

区域 说明
顶部状态栏 显示 FPS、追踪目标数、实时时钟
告警横幅 红色脉冲动画,显示跌倒告警详情,点击可关闭
视频区域 MJPEG 实时视频流,带目标框 + 骨架线标注
底部状态栏 连接状态指示(绿色 Connected / 红色 Disconnected)

API 端点

路由 方法 说明
/ 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酱 推送跌倒告警到微信。

配置步骤

  1. 访问 sc.ftqq.com 注册并登录
  2. 获取你的 SendKey
  3. 将 SendKey 填入 config/config.yaml
alert:
  server_chan_key: "SCTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  1. 重启主程序即可生效

推送内容

跌倒事件触发时,推送消息包含:

  • 事件内容:轨迹 ID + 跌倒原因
  • 发生时间:系统时间戳

提示:如果 server_chan_key 为空或未配置,告警推送功能自动跳过,不影响其他功能正常运行。

📊 Milestone 进度

# 名称 状态 完成时间 备注
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

📄 License

This project is for educational and research purposes.

About

Edge-based fall detection system on Raspberry Pi 5 — YOLOv8 + MoveNet + real-time web monitor + WeChat alerts

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors