跌倒警报设备

Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.


该应用是一个基于 Quectel Pi H1 智能主控板,通过USB摄像头进行实时人体姿态识别,采用YOLOv8-Pose和多人跌倒分类器,自动检测用户是否发生跌倒事件的智能应用。

该项目通过调用摄像头实时采集画面,当检测到跌倒事件时会启动本地报警器并发送通知到手机,用户在手机端通过APK查看跌倒图片,可作为老年人/患者安全监护、跌倒预警系统的参考示例。

../../../_images/image_BWS2blqDbo4poZxm8JYcMQZJnbc.webp

开发资源汇总

开发配件清单

配件名称

数量

规格参数

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套件

../../../_images/image_U3rObBYBloblMVxMQ2QcyRbPnGc.webp

快速上手

开发准备

Quectel Pi H1 智能主控板出厂默认搭载 Debian 13 系统镜像,因此无需再次烧录镜像,仅需按照如下步骤操作即可。

硬件连接

显示连接

将HDMI线一端接入智能主控板的HDMI接口,另一端接入显示器的HDMI接口。

../../../_images/image_ZGSOb7segosD3PxkE21cIk6Dnde.webp

输入设备连接

将USB键盘、鼠标接入智能主控板的两个USB-A接口上,若用无线输入设备,将接收器插入USB口即可。

../../../_images/image_MbaKb1VDjoBDO9xoRf9cGb9CnZb.webp

网线连接

将网线一端接入智能主控板的千兆网口,另一端接入路由器的网口(确保路由器已联网)。

../../../_images/image_Rp3Bbdrl4oHLRcxKjtLcYL5Gngb.webp

USB警报灯连接(可选)

使用USB线将警报灯与智能主控板的空闲USB接口连接(可根据购买的警报器的文档操作)

电源连接

将USB-A电源线的USB-A端接入电源适配器,USB-C端接入智能主控板的电源口(通常标注 POWER IN)。

../../../_images/image_LpTxbTxFso8n5Hxu7S2cC0H5ngc.webp

项目实现

安装前置

确认有网络连接后,打开终端输入命令:

sudo apt update && sudo apt install -y python3-pip libatlas-base-dev libjasper-dev

上述命令将更新软件源并安装项目运行所需的一些库,具体包括:

  • libatlas-base-devlibjasper-dev:支持科学计算库的依赖;

  • python3-pip:Python包管理器,用于安装项目依赖。

获取代码

下载代码

代码解压到设备

安装Python依赖

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.pklfeature_scaler_multi.pkl 已放置在model目录下

运行应用

完成模型准备后,运行主程序:

cd src
python3 main.py

程序启动后将显示图形界面,提供以下功能:

../../../_images/image_Dk60baOkwoEOP2xcnWFca60en1c.webp

功能界面说明

界面区域

功能说明

摄像头预览区域

实时显示摄像头采集的画面,标注检测到的人体和跌倒状态

日志输出区域

显示应用运行过程中的实时日志和检测信息

跌倒警报提示

在顶部显示跌倒检测结果,自动触发警报灯并保存报警图片

相机选择

支持多个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个关键点:

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维

跌倒判断逻辑

应用使用多种方法判断是否发生跌倒:

# 特征提取和分类
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

常见问题及解决方案

模型加载相关问题

模型文件找不到

现象:

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.ptfall_multi_person_model.pklfeature_scaler_multi.pkl 都放在 model/ 目录下

  • 检查文件路径是否正确,使用绝对路径测试

  • 第一次运行可以让程序自动下载YOLOv8模型(需要网络连接)

摄像头相关问题

摄像头无法识别

现象:

Warning: No available cameras detected

解决方案:

  • 检查摄像头是否正确连接到USB接口

  • 使用命令检查摄像头是否被识别:

# Linuxls -la /dev/video*

# 使用v4l2-ctl列出摄像头
v4l2-ctl --list-devices
  • 尝试使用其他USB接口

  • 如果还是不行,使用USB集线器并连接电源

  • 检查是否需要安装摄像头驱动程序

摄像头画面卡顿或延迟大

现象:

检测到画面延迟超过1秒,或摄像头预览画面不流畅

原因分析:

  • 摄像头分辨率过高导致处理延迟

  • CPU占用率过高

  • 网络上传导致主线程阻塞

解决方案:

  • 降低摄像头分辨率(改为1280×720而非更高)

  • 调整 DETECT_INTERVAL 参数增加检测间隔:

DETECT_INTERVAL = 0.25  # 从0.15增加到0.25秒
  • 降低 YOLO_IMG_SIZE 以加快推理速度:

YOLO_IMG_SIZE = 320  # 可降低到256
  • 禁用服务器上传功能进行本地测试

跌倒检测相关问题

误报率高(误检测正常动作为跌倒)

现象:

用户正在弯腰、坐下或躺着休息时被误检为跌倒

解决方案:

  1. 调整分类器置信度阈值:提高阈值可减少误报

FALL_MIN_CONFIDENCE = 0.80  # 从0.75增加到0.80
  1. 增加确认帧数:只有连续多帧检测到才判断为跌倒

FALL_CONFIRM_FRAMES = 5  # 从3增加到5
  1. 优化角度和比例阈值

FALL_BODY_ANGLE_THRESHOLD = 65  # 增加角度阈值
FALL_HEIGHT_RATIO_THRESHOLD = 1.4  # 增加高宽比阈值
  1. 重新训练分类器:使用更多多样化的训练数据

    • 增加坐下、弯腰等动作的负样本

    • 确保跌倒样本的多样性(不同角度、速度、人物)

    • 增加训练数据集大小

漏检率高(没有检测到实际跌倒)

现象:

实际发生跌倒时没有进行警报

解决方案:

  1. 降低分类器置信度阈值

FALL_MIN_CONFIDENCE = 0.65  # 从0.75降低到0.65
  1. 降低确认帧数

FALL_CONFIRM_FRAMES = 2  # 从3降低到2
  1. 检查关键点检测质量

# 增加关键点需求或降低置信度阈值
MIN_CONFIDENCE = 0.3  # 从0.4降低
MIN_KEYPOINTS = 8     # 从10降低
  1. 优化视角:确保摄像头能够看到整个身体

    • 摄像头应该距离用户1-3米

    • 摄像头安装高度应该在1.5-2米

    • 避免侧面或接近垂直的视角

  2. 改善光照条件

    • 保证光线充足,避免阴影和逆光

    • 使用均匀的环境光而非局部强光

警报和上传相关问题

警报灯无法启动

现象:

检测到跌倒但警报灯没有亮起

解决方案:

  • 检查串口连接是否正确

  • 验证警报灯设备是否正常工作

  • 检查 light_control.py 中的串口配置:

port = '/dev/ttyUSB0'        # 根据实际设备修改
baudrate = 9600              # 根据设备规格修改
  • 检查串口权限:

sudo chmod 666 /dev/ttyUSB0
  • 根据购买报警灯的文档进行调试,确保发送的命令格式正确

图片上传失败

现象:

ERROR - Upload failed: fall_20240326_143022.jpg

原因分析:

  • 网络连接不稳定

  • 服务器地址错误或服务器不可用

  • 请求超时

解决方案:

  • 检查网络连接:ping SERVER_IP

  • 验证服务器是否运行:curl http://SERVER_IP:8000/upload_fall

  • 检查防火墙设置是否允许出站连接

  • 修改服务器地址:

SERVER_IP = "your.server.ip"

性能优化问题

CPU占用率过高

现象:

应用运行时CPU占用率 > 80%,系统响应缓慢

解决方案:

  • 降低检测频率(增加 DETECT_INTERVAL

  • 减小视频分辨率(改为640×480或更低)

  • 禁用实时日志显示或降低日志更新频率

  • 使用GPU加速(如果硬件支持)

内存泄漏导致占用率持续上升

现象:

应用运行数小时后内存占用从200MB增长到1GB

解决方案:

  • 检查是否在循环中创建了未释放的对象

  • 定期清空日志缓冲区:

if len(LogManager._logs) > 100:
    LogManager.clear_logs()
  • 确保线程正确关闭

  • 使用内存分析工具检测泄漏:python3 -m memory_profiler


技术支持与贡献

如在使用过程中遇到问题,欢迎在 移远官方论坛 提交技术咨询,我们的技术支持团队将及时为您解答。

项目开源地址:https://github.com/Quectel-Pi/demo-fall-alarm-device

欢迎提交Issue反馈问题或Pull Request贡献代码改进!