# 跌倒警报设备
***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.***
---
该应用是一个基于 **Quectel Pi H1** 智能主控板,通过USB摄像头进行实时人体姿态识别,采用YOLOv8-Pose和多人跌倒分类器,自动检测用户是否发生跌倒事件的智能应用。
该项目通过调用摄像头实时采集画面,当检测到跌倒事件时会启动本地报警器并发送通知到手机,用户在手机端通过APK查看跌倒图片,可作为老年人/患者安全监护、跌倒预警系统的参考示例。
```{image} images/image_BWS2blqDbo4poZxm8JYcMQZJnbc.webp
:width: 1280px
:height: 800px
```
# 开发资源汇总
## 开发配件清单
| **配件名称** | **数量** | **规格参数** |
| --- | --- | --- |
| Quectel Pi H1智能主控板 | 1块 | Quectel Pi H1智能生态开发板 |
| USB摄像头 | 1个 | 推荐分辨率:1280×720或更高;输出格式:MJPG/YUYV |
| USB-C电源线充电器 | 1个 | 27W USB Type-C接口充电器1.2米线长中规电源PD电源适用于树莓派5代 |
| USB-C DP显示线/HDMI线 | 1根 | 规格:DP 1.4;线长:1m;接口:USB-C(公头)- USB-C(公头)
规格:HDMI 2.0;线长:1m;接口:HDMI-A(公头)-HDMI-D(公头) |
| CPU散热风扇(可选) | 1个 | 树莓派5代官方原装散热器带导热贴 |
| 显示屏 | 1个 | 24英寸HDMI显示器 |
| USB可编程警报灯(可选) | 1个 | 通过串口(/dev/ttyUSB0)控制的LED警报灯 |
## 配件实物参考
### Quectel套件
```{image} images/image_U3rObBYBloblMVxMQ2QcyRbPnGc.webp
:width: 854px
:height: 482px
```
# 快速上手
## 开发准备
**Quectel Pi H1** 智能主控板出厂默认搭载 **Debian 13** 系统镜像,因此无需再次烧录镜像,仅需按照如下步骤操作即可。
## 硬件连接
### 显示连接
将HDMI线一端接入智能主控板的HDMI接口,另一端接入显示器的HDMI接口。
```{image} images/image_ZGSOb7segosD3PxkE21cIk6Dnde.webp
:width: 800px
:height: 480px
```
### 输入设备连接
将USB键盘、鼠标接入智能主控板的两个USB-A接口上,若用无线输入设备,将接收器插入USB口即可。
```{image} images/image_MbaKb1VDjoBDO9xoRf9cGb9CnZb.webp
:width: 800px
:height: 468px
```
### 网线连接
将网线一端接入智能主控板的千兆网口,另一端接入路由器的网口(确保路由器已联网)。
```{image} images/image_Rp3Bbdrl4oHLRcxKjtLcYL5Gngb.webp
:width: 800px
:height: 501px
```
### USB警报灯连接(可选)
使用USB线将警报灯与智能主控板的空闲USB接口连接(可根据购买的警报器的文档操作)
### 电源连接
将USB-A电源线的USB-A端接入电源适配器,USB-C端接入智能主控板的电源口(通常标注 **POWER IN**)。
```{image} images/image_LpTxbTxFso8n5Hxu7S2cC0H5ngc.webp
:width: 800px
:height: 549px
```
## 项目实现
### 安装前置
确认有网络连接后,打开终端输入命令:
```plaintext
sudo apt update && sudo apt install -y python3-pip libatlas-base-dev libjasper-dev
```
上述命令将更新软件源并安装项目运行所需的一些库,具体包括:
- **libatlas-base-dev** 和 **libjasper-dev**:支持科学计算库的依赖;
- **python3-pip**:Python包管理器,用于安装项目依赖。
### 获取代码
[下载代码]()
代码解压到设备
### 安装Python依赖
```plaintext
pip install -r requirements.txt
```
依赖包说明:
- **PySide6**:Qt6的Python绑定,用于构建图形用户界面;
- **opencv-python**:OpenCV图像处理库,用于摄像头采集和图像处理;
- **ultralytics**:YOLOv8目标检测框架,用于人体关键点检测;
- **numpy**:数值计算库,用于矩阵运算和特征提取;
- **scikit-learn**:机器学习库,用于提供随机森林分类器;
- **joblib**:序列化库,用于加载预训练模型。
### 准备模型文件
跌倒检测应用需要预加载以下模型文件,请放置在 *model/* 目录下:
1. **yolov8n-pose.pt** - YOLOv8-Nano Pose模型,用于检测人体17个关键点
2. **fall_multi_person_model.pkl** -随机森林分类器,用于判断是否跌倒
3. **feature_scaler_multi.pkl** -特征缩放器,用于标准化输入特征
这些模型文件可以从以下方式获取:
- **yolov8n-pose.pt**:从Ultralytics官方GitHub下载或通过代码自动下载
- **fall_multi_person_model.pkl** 和 **feature_scaler_multi.pkl** 已放置在model目录下
### 运行应用
完成模型准备后,运行主程序:
```plaintext
cd src
python3 main.py
```
程序启动后将显示图形界面,提供以下功能:
```{image} images/image_Dk60baOkwoEOP2xcnWFca60en1c.webp
:width: 1648px
:height: 957px
```
#### 功能界面说明
| **界面区域** | **功能说明** |
| --- | --- |
| 摄像头预览区域 | 实时显示摄像头采集的画面,标注检测到的人体和跌倒状态 |
| 日志输出区域 | 显示应用运行过程中的实时日志和检测信息 |
| 跌倒警报提示 | 在顶部显示跌倒检测结果,自动触发警报灯并保存报警图片 |
| 相机选择 | 支持多个USB摄像头,可自动检测并选择可用摄像头 |
#### 日志显示区域
右侧区域可输出应用运行过程中的日志信息,包括:
- **模型加载日志**:显示是否成功加载YOLOv8模型和分类器
- **检测日志**:显示检测到的人体数量和跌倒状态
- **警报日志**:显示跌倒警报和图片上传状态
#### 实时检测参数
程序使用以下参数进行跌倒检测(可根据实际需求调整):
| **参数** | **说明** | **默认值** |
| --- | --- | --- |
| MIN_CONFIDENCE | 关键点置信度阈值 | 0.4 |
| MIN_KEYPOINTS | 有效关键点最少数量 | 10 |
| FALL_BODY_ANGLE_THRESHOLD | 身体倾角阈值 | 55° |
| FALL_HEIGHT_RATIO_THRESHOLD | 身体高宽比阈值 | 1.2 |
| FALL_MIN_CONFIDENCE | 分类器置信度阈值 | 0.75 |
| FALL_CONFIRM_FRAMES | 跌倒确认帧数 | 3 |
| DETECT_INTERVAL | 检测间隔(秒) | 0.15 |
### 跌倒检测原理
#### 关键点检测
应用使用YOLOv8-Pose模型检测人体17个关键点:
```plaintext
0: 鼻子 1: 左眼 2: 右眼 3: 左耳 4: 右耳
5: 左肩 6: 右肩 7: 左肘 8: 右肘 9: 左手腕
10: 右手腕 11: 左髋 12: 右髋 13: 左膝 14: 右膝
15: 左脚踝 16: 右脚踝
```
#### 特征提取
从关键点提取以下特征用于分类:
1. **关键点坐标**:17个关键点的(x, y)坐标和置信度,共51维
2. **身体角度**:计算8个关键点之间的角度特征,共8维
3. **相对坐标**:相对于髋部中心点的相对坐标,共26维
4. **身体形态**:身体高度、宽度及高宽比,共3维
#### 跌倒判断逻辑
应用使用多种方法判断是否发生跌倒:
```python
# 特征提取和分类
features = detector.extract_features(keypoints, confidences)if scaler is available:
features_scaled = scaler.transform(features)else:
features_scaled = features
# 获取分类器预测
probabilities = classifier.predict_proba(features_scaled)
is_falling = probabilities[0, 1] > FALL_MIN_CONFIDENCE # 类别1表示跌倒# 确认帧计数(减少误报)if is_falling:
fall_count += 1if fall_count >= FALL_CONFIRM_FRAMES:
trigger_alarm()
```
**判断标准:**
- 随机森林分类器概率 > 0.75且连续3帧检测到跌倒
- 或者同时满足身体角度 > 55° 且身体高宽比 > 1.2
### 警报和查看
当检测到跌倒时,应用会:
1. **启动警报灯**:通过串口向警报灯设备发送闪光和报警命令
2. **保存报警图片**:在 *picture/* 目录保存包含时间戳的JPEG图片
3. **上传服务器**:将报警图片上传到指定服务器地址
- 上传地址:* http://SERVER_IP:8000/upload_fall* (可自行替换服务器地址和上传接口)
- 支持后台异步上传,不阻断主程序运行
4. **APK端查看**:可通过APK端实时接收跌倒通知,并查看报警图片
# 应用演示
fall_alarm_demo
# 常见问题及解决方案
## 模型加载相关问题
### 模型文件找不到
**现象:**
```plaintext
ERROR - Pose model not found: /path/to/model/yolov8n-pose.pt
ERROR - Classifier model not found: /path/to/model/fall_multi_person_model.pkl
```
**解决方案:**
- 确保 *yolov8n-pose.pt*、*fall_multi_person_model.pkl*、*feature_scaler_multi.pkl* 都放在 *model/* 目录下
- 检查文件路径是否正确,使用绝对路径测试
- 第一次运行可以让程序自动下载YOLOv8模型(需要网络连接)
## 摄像头相关问题
### 摄像头无法识别
**现象:**
```plaintext
Warning: No available cameras detected
```
**解决方案:**
- 检查摄像头是否正确连接到USB接口
- 使用命令检查摄像头是否被识别:
```bash
# Linuxls -la /dev/video*
# 使用v4l2-ctl列出摄像头
v4l2-ctl --list-devices
```
- 尝试使用其他USB接口
- 如果还是不行,使用USB集线器并连接电源
- 检查是否需要安装摄像头驱动程序
### 摄像头画面卡顿或延迟大
**现象:**
```plaintext
检测到画面延迟超过1秒,或摄像头预览画面不流畅
```
**原因分析:**
- 摄像头分辨率过高导致处理延迟
- CPU占用率过高
- 网络上传导致主线程阻塞
**解决方案:**
- 降低摄像头分辨率(改为1280×720而非更高)
- 调整 *DETECT_INTERVAL* 参数增加检测间隔:
```python
DETECT_INTERVAL = 0.25 # 从0.15增加到0.25秒
```
- 降低 *YOLO_IMG_SIZE* 以加快推理速度:
```python
YOLO_IMG_SIZE = 320 # 可降低到256
```
- 禁用服务器上传功能进行本地测试
## 跌倒检测相关问题
### 误报率高(误检测正常动作为跌倒)
**现象:**
```plaintext
用户正在弯腰、坐下或躺着休息时被误检为跌倒
```
**解决方案:**
1. **调整分类器置信度阈值**:提高阈值可减少误报
```python
FALL_MIN_CONFIDENCE = 0.80 # 从0.75增加到0.80
```
1. **增加确认帧数**:只有连续多帧检测到才判断为跌倒
```python
FALL_CONFIRM_FRAMES = 5 # 从3增加到5
```
1. **优化角度和比例阈值**:
```python
FALL_BODY_ANGLE_THRESHOLD = 65 # 增加角度阈值
FALL_HEIGHT_RATIO_THRESHOLD = 1.4 # 增加高宽比阈值
```
1. **重新训练分类器**:使用更多多样化的训练数据
- 增加坐下、弯腰等动作的负样本
- 确保跌倒样本的多样性(不同角度、速度、人物)
- 增加训练数据集大小
### 漏检率高(没有检测到实际跌倒)
**现象:**
```plaintext
实际发生跌倒时没有进行警报
```
**解决方案:**
1. **降低分类器置信度阈值**:
```python
FALL_MIN_CONFIDENCE = 0.65 # 从0.75降低到0.65
```
1. **降低确认帧数**:
```python
FALL_CONFIRM_FRAMES = 2 # 从3降低到2
```
1. **检查关键点检测质量**:
```python
# 增加关键点需求或降低置信度阈值
MIN_CONFIDENCE = 0.3 # 从0.4降低
MIN_KEYPOINTS = 8 # 从10降低
```
1. **优化视角**:确保摄像头能够看到整个身体
- 摄像头应该距离用户1-3米
- 摄像头安装高度应该在1.5-2米
- 避免侧面或接近垂直的视角
2. **改善光照条件**:
- 保证光线充足,避免阴影和逆光
- 使用均匀的环境光而非局部强光
## 警报和上传相关问题
### 警报灯无法启动
**现象:**
```plaintext
检测到跌倒但警报灯没有亮起
```
**解决方案:**
- 检查串口连接是否正确
- 验证警报灯设备是否正常工作
- 检查 *light_control.py* 中的串口配置:
```python
port = '/dev/ttyUSB0' # 根据实际设备修改
baudrate = 9600 # 根据设备规格修改
```
- 检查串口权限:
```bash
sudo chmod 666 /dev/ttyUSB0
```
- 根据购买报警灯的文档进行调试,确保发送的命令格式正确
### 图片上传失败
**现象:**
```plaintext
ERROR - Upload failed: fall_20240326_143022.jpg
```
**原因分析:**
- 网络连接不稳定
- 服务器地址错误或服务器不可用
- 请求超时
**解决方案:**
- 检查网络连接:*ping SERVER_IP*
- 验证服务器是否运行:*curl http://SERVER_IP:8000/upload_fall*
- 检查防火墙设置是否允许出站连接
- 修改服务器地址:
```python
SERVER_IP = "your.server.ip"
```
## 性能优化问题
### CPU占用率过高
**现象:**
```plaintext
应用运行时CPU占用率 > 80%,系统响应缓慢
```
**解决方案:**
- 降低检测频率(增加 *DETECT_INTERVAL*)
- 减小视频分辨率(改为640×480或更低)
- 禁用实时日志显示或降低日志更新频率
- 使用GPU加速(如果硬件支持)
### 内存泄漏导致占用率持续上升
**现象:**
```plaintext
应用运行数小时后内存占用从200MB增长到1GB
```
**解决方案:**
- 检查是否在循环中创建了未释放的对象
- 定期清空日志缓冲区:
```python
if len(LogManager._logs) > 100:
LogManager.clear_logs()
```
- 确保线程正确关闭
- 使用内存分析工具检测泄漏:*python3 -m memory_profiler*
---
# 技术支持与贡献
如在使用过程中遇到问题,欢迎在 [移远官方论坛]() 提交技术咨询,我们的技术支持团队将及时为您解答。
项目开源地址:[https://github.com/Quectel-Pi/demo-fall-alarm-device]()
欢迎提交Issue反馈问题或Pull Request贡献代码改进!