基于深度学习的人体姿势跌倒检测算法
效果展示
基于深度学习mediape实现人员跌倒人体姿势跌倒检测算法
📋 项目简介
本项目是一个基于深度学习和人体姿态估计的实时跌倒检测系统。通过MediaPipe姿态检测模型提取人体33个关键骨架点,结合多种算法综合判断是否发生跌倒事件,可用于老年人看护、安全监控等场景。
🧠 算法原理
本项目采用多算法融合的策略,通过以下四个模块协同工作实现跌倒检测:
1. 人体姿态检测 (PoseDetector)
- 使用 MediaPipe Pose 模型实时检测人体33个关键骨架点
- 支持视频流和摄像头实时检测
- 提供骨架点可视化功能
2. 质心下降检测 (CGDD - Center of Gravity Drop Detection)
- 原理:追踪人体质心(左右髋部中点)的垂直位置变化
- 算法:维护一个滑动窗口(默认7帧),计算窗口内质心Y坐标的变化量
- 判断:当质心下降幅度超过阈值(默认0.06)时,判定为快速下降
- 特点:有效检测突然的下落动作
3. 身体倾斜检测 (BTD - Body Tilt Detection)
- 原理:计算人体躯干的倾斜角度(肩部中点到髋部中点的连线与垂直方向的夹角)
- 算法:使用反正切函数计算倾斜角度
- 判断:当倾斜角度超过阈值(默认45°)时,判定为身体过度倾斜
- 特点:有效区分站立和倾斜/倒地状态
4. 宽高比检测 (SCDD - Shape Change Detection)
- 原理:计算人体骨架包围盒的宽高比
- 算法:提取所有骨架点的X、Y坐标,计算宽度(max_x - min_x)和高度(max_y - min_y)的比值
- 判断:当宽高比超过阈值(默认0.9)时,判定为人体横向展开(倒地)
- 特点:直接反映人体姿态从竖直到水平的变化
5. 姿态状态机 (PostureState)
- 原理:综合质心位置和倾斜角度,通过状态机判定最终跌倒状态
- 算法:当质心Y坐标>0.75(屏幕下方)且倾斜角度>60°时,累计计数
- 判断:连续10帧满足条件,判定为"FALLEN"(已跌倒)状态
- 特点:避免瞬时误判,提高检测稳定性
💻 环境要求
操作系统
- Windows 10/11
- macOS
- Linux
Python版本
- Python 3.8 或更高版本(推荐 Python 3.8-3.10)
硬件要求
- CPU:支持常规视频处理的多核处理器
- 内存:4GB RAM 以上
- 摄像头(可选):用于实时检测
📦 安装步骤
1. 克隆或下载项目
bash
git clone <项目地址>
cd <目录>
2. 安装依赖库
bash
pip install opencv-python
pip install mediapipe
pip install numpy
或使用一行命令安装所有依赖:
bash
pip install opencv-python mediapipe numpy
3. 验证安装
bash
python -c "import cv2; import mediapipe; import numpy; print('所有依赖安装成功!')"
🚀 运行步骤
方式一:检测视频文件
-
将视频文件放入
videos文件夹 -
修改
main.py第16行,指定视频路径:pythoncap = cv2.VideoCapture("videos/你的视频.mp4") -
运行程序:
bashpython main.py
方式二:使用摄像头实时检测
-
修改
main.py第15-16行:pythoncap = cv2.VideoCapture(0) # 取消注释此行 # cap = cv2.VideoCapture("videos/2.mp4") # 注释掉此行 -
运行程序:
bashpython main.py
3. 退出程序
- 按 ESC 键退出视频播放
4. 检测结果说明
程序会在视频画面上显示以下检测结果:
- CGDD(红色):检测到质心快速下降
- BTD(绿色):检测到身体过度倾斜
- SCDD(蓝色):检测到人体宽高比异常
- STATE FALLEN(黄色):综合判定为跌倒状态
⚙️ 参数调整
如需调整检测灵敏度,可修改以下参数:
CGDD(质心下降检测)
python
cgdd = CGDD(window_size=7, threshold=0.06)
window_size:滑动窗口大小(帧数),越小越敏感threshold:下降阈值,越小越敏感
BTD(身体倾斜检测)
python
btd = BTD(angle_threshold=45)
angle_threshold:倾斜角度阈值(度),越小越敏感
SCDD(宽高比检测)
python
scdd = SCDD(ratio_threshold=0.9)
ratio_threshold:宽高比阈值,越小越敏感
PostureState(姿态状态机)
在 posture_state.py 中修改:
python
if cog_y > 0.75 and tilt_angle > 60: # 质心位置和倾斜角度阈值
if self.low_frames > 10: # 连续帧数阈值
⚠️ 注意事项
- 视频质量:确保视频清晰度足够,光线充足,避免严重遮挡
- 拍摄角度:建议摄像头与人体保持正面或侧面,避免俯视或仰视角度过大
- 检测距离:人体应占据画面的适当比例,不要太远或太近
- 误判处理:弯腰、蹲下等动作可能被误判为跌倒,可根据实际场景调整参数
- 性能优化:高分辨率视频可能导致处理延迟,可适当降低视频分辨率
- 多人场景:当前版本仅支持单人检测,多人场景需要额外开发
- 依赖版本:建议使用稳定的依赖库版本,避免API变更导致的问题
- 实时检测:使用摄像头时,确保摄像头权限已开启
📁 文件夹结构
Fall-detection-algorithm-main/
├── main.py # 主程序入口,整合所有检测模块
├── pose_detector.py # 人体姿态检测模块(基于MediaPipe)
├── cgdd.py # 质心下降检测算法(CGDD)
├── btd.py # 身体倾斜检测算法(BTD)
├── scdd.py # 宽高比检测算法(SCDD)
├── posture_state.py # 姿态状态机模块
├── videos/ # 测试视频文件夹
│ ├── 1.mp4 # 测试视频1
│ └── 2.mp4 # 测试视频2
├── README.md # 项目说明文档
└── 基于深度学习的人体姿势跌倒检测算法.pdf # 算法详细说明文档
核心模块说明
| 文件名 | 功能描述 | 输入 | 输出 |
|---|---|---|---|
| main.py | 主程序,视频流处理和结果显示 | 视频帧 | 带标注的视频画面 |
| pose_detector.py | MediaPipe姿态检测封装 | BGR图像帧 | 骨架点坐标 |
| cgdd.py | 质心下降检测 | 左右髋部坐标 | 是否检测到下降(bool) |
| btd.py | 身体倾斜角度检测 | 肩部中点、髋部中点 | 是否倾斜+角度值 |
| scdd.py | 人体宽高比检测 | 33个骨架点坐标 | 是否异常+宽高比 |
| posture_state.py | 跌倒状态判定 | 质心Y坐标、倾斜角度 | 当前姿态状态 |
🔧 技术栈
- Python:主要编程语言
- OpenCV:图像处理和视频流处理
- MediaPipe:Google开源的机器学习框架,用于人体姿态估计
- NumPy:数值计算库
📊 算法流程
视频帧输入
↓
MediaPipe姿态检测(33个骨架点)
↓
┌──────────────────────────────────┐
│ 并行运行三个检测算法: │
│ • CGDD:质心下降检测 │
│ • BTD:身体倾斜检测 │
│ • SCDD:宽高比检测 │
└──────────────────────────────────┘
↓
PostureState状态机综合判定
↓
输出跌倒状态 + 可视化标注
📝 参考资料
- 项目附带文档:
基于深度学习的人体姿势跌倒检测算法.pdf