新闻详情

新闻详情

首页 / 资讯中心 / 详情

yolov5+openpose:摔倒检测系统复现与工程实战

发布时间:2026/9/24 22:27:57来源:尧图网络
yolov5+openpose:摔倒检测系统复现与工程实战
简介资源包聚焦YOLOv5人体检测与OpenPose姿态检测的联合应用面向做摔倒检测或自定义姿态识别项目的中高级开发者。项目提供完整可运行代码与模型文件整体流程覆盖数据准备、关键点生成、目标检测与姿态估计等环节先通过YOLOv5定位人体并按框体宽高比过滤目标再裁剪人体区域交给OpenPose提取关键点runOpenpose.py可批量生成人体关键点图保存位置可在pose.py中调整方便后续训练分类模型。若需扩展其他姿态收集图片后运行该脚本得到关键点图分类放入data/train与data/test执行action_detect/train.py即可完成自定义训练。资源共183个文件包括75张jpg、11张jpeg图像样本39个Python脚本17个yaml配置以及2个jit、2个pt等模型权重压缩包整体约40.24MB。目前已有1062人浏览学习适合希望快速搭建检测与姿态估计流程、进一步训练摔倒识别模型的开发者。1. 摔倒检测这个需求yolov5openpose 的组合为什么值得复现独居老人摔倒后昏迷无人发现这类新闻每隔一段时间就会出现一次。市面上商用跌倒报警器多依赖穿戴设备老人不愿意戴实际落地效果并不好。用摄像头做无感摔倒检测技术路径基本都是目标检测加姿态估计两段式先找到人再判断人的姿态是否异常。这个项目正好把这条链路完整跑通了用 yolov5 做人体检测用 openpose 做姿态关键点提取最后把关键点数据交给分类模型判断摔倒动作。整套代码拿到手就能跑出人体关键点骨骼图也能改造成其他姿态识别场景——比如打架、举手、蹲起。这个项目适合两类人一类是有深度学习基础、想找一个多模型串联实战案例的开发者另一类是正在做智慧养老、安防监控项目需要快速验证方案的工程师。项目里拆成三个闭环阶段先用 openpose 单独采集关键点数据再用 yolov5 检测并裁剪出人体区域送入 openpose最后训练 action 分类模型完成摔倒识别。三个阶段的产物和代码是分开的可以单独跑通也可以串起来跑完整流程。2. 先看清数据流和项目结构两个 .jit 模型和三个 py 入口这个项目的精髓不在代码量而在数据流转的设计。我把整个项目拉下来之后第一件事不是跑代码而是把目录结构、模型文件和三个 py 脚本的调用关系摸清楚。很多初学者栽跟头就是因为拿到项目直接 run结果 openpose 的模型起不来、yolo 权重路径配不对整个人懵掉。2.1 数据闭环原始图 → 人体框 → 关键点图 → 分类结果整个项目的逻辑链路是这样的一张原始图片进来先进 yolov5 检测。yolov5 负责输出人体边界框detect.py 里对框做一轮宽高比过滤把明显不是人形或者姿态异常的框剔除掉。通过过滤的框把对应区域从原图里裁剪出来resize 成 openpose 能接受的大小再喂给 openpose 做关键点提取。openpose 输出的是 18 个关键点的坐标和置信度这些关键点可以用来绘制骨骼图也可以作为后续分类模型的特征输入。最后一步是 action 分类模型输入是关键点图输出是摔倒还是正常姿态的类别。需要强调的一点是项目里两个 .jit 文件是不同用途的。openpose.jit是 TorchScript 格式的 openpose 模型负责从人体图像提取 18 个关键点输出的是关键点坐标和热力图。action.jit是姿态分类模型输入是关键点图输出的是姿态类别概率。这两个模型用torch.jit.load()加载后即可使用不需要重新搭建网络结构这也意味着如果你想换模型权重直接替换 .jit 文件就行代码一行不用改。2.2 环境准备conda 创建虚拟环境与依赖安装这个项目依赖比较多我建议用 conda 建独立环境别直接往 base 环境里装。Python 版本我实测 3.8 和 3.9 都能跑通torch 用 1.8 以上的版本问题不大。项目根目录没有 requirements.txt这点比较坑依赖都是靠 import 报错后手动补的。conda create -n fall_detection python3.8 conda activate fall_detection pip install torch1.10.0 torchvision0.11.0 --index-url https://download.pytorch.org/whl/cu113 pip install opencv-python numpy pandas matplotlib pyyaml tqdm pip install seaborn # yolov5 的 plots.py 会用到创建完环境后进入项目根目录执行python runOpenpose.py如果报ModuleNotFoundError缺什么装什么。常见缺的是seaborn和pandas还有个细节是 yolov5 的general.py会 importrequests也要提前装好。2.3 项目文件逐一说明知道每个文件是干嘛的再动手我把项目里几个关键文件的用途梳理一下对照着看代码会顺畅很多文件作用关键点runOpenpose.pyopenpose 单模型推理入口draw 方法控制关键点图的生成与保存位置detect.pyyolov5 人体检测 人体裁剪169 行宽高比过滤逻辑pose.pyopenpose 后处理与可视化关键点绘制、BGR 通道处理action_detect/train.pyaction.jit 分类模型训练读 data/train 和 data/test 分类图片openpose.jitopenpose TorchScript 模型torch.jit.load 直接加载action.jit姿态分类模型输入关键点图输出分类概率Dockerfile容器化部署配置需要注意 PyTorch 官方镜像基础labels.cache训练标签缓存文件删掉会自动重建不影响结果这里建议你按这个顺序执行先跑runOpenpose.py看关键点图效果再改detect.py跑完整检测 姿态估计流程最后跑action_detect/train.py训练自己的分类模型。跳过第一步直接跑完整流程出问题了很难定位是哪个环节的锅。3. openpose 关键点图采集训练数据从哪来、怎么存runOpenpose.py的核心任务就是对单张图片做姿态估计输出关键点图。这一步本质上是数据准备环节因为你后续要训练自己的摔倒分类模型第一步得有标注好的关键点图数据。原始图片经过 openpose 推理后生成一张骨骼关键点图这张图才是分类模型的输入。3.1 模型加载与推理流程TorchScript 格式的便利与限制openpose 的 .jit 模型加载方式和普通 PyTorch 模型不一样它不需要重建网络结构直接torch.jit.load()就能拿到完整的模型对象。这在部署阶段非常方便因为模型结构和权重已经打包在一个文件里不用操心网络定义代码和权重文件版本匹配的问题。import torch import cv2 import numpy as np # 加载 TorchScript 模型 openpose_model torch.jit.load(openpose.jit, map_locationcpu) openpose_model.eval() # 读取图片并预处理 image cv2.imread(test.jpg) image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 关键opencv 读入是 BGR模型训练时用的是 RGB image_resized cv2.resize(image, (368, 368)) input_tensor torch.from_numpy(image_resized.astype(np.float32) / 255.0) input_tensor input_tensor.permute(2, 0, 1).unsqueeze(0) # HWC - CHW, 加 batch 维度 # 推理 with torch.no_grad(): heatmaps, pafs openpose_model(input_tensor)这段代码里的permute(2, 0, 1)很多人第一次写会漏掉。OpenCV 读进来的图像维度是 H×W×C而 PyTorch 模型要求输入是 C×H×W不转维度模型能跑但结果完全是乱的。unsqueeze(0)是加一个 batch 维度因为模型默认输入是四维张量。除以 255.0 是为了归一化到 01 区间这个项目的 openpose 模型训练时就是这么做的不做归一化会导致关键点置信度整体偏低。heatmaps 是 18 个关键点的热力图pafs 是部位亲和场。后续从热力图里取最大值位置就能得到关键点坐标。这个过程的输出质量直接决定 action 分类模型的训练效果关键点图如果歪了或者关键点缺失后续分类必然不准。3.2 draw 方法和保存路径控制关键点图存到哪去项目里pose.py的draw方法封装了关键点可视化和保存逻辑。摘要里专门提到「draw 方法中最后面可以控制保存关键点图的位置」说明作者在这里留了比较明显的配置入口。# pose.py draw 方法末尾的保存逻辑 def draw(image, key_points, save_dirdata/test): # 绘制关键点和骨骼连线 for point in key_points: if point[2] 0.3: # 置信度阈值 cv2.circle(image, (int(point[0]), int(point[1])), 3, (0, 255, 0), -1) # 保存位置控制 save_path os.path.join(save_dir, fkeypoint_{time.time()}.jpg) cv2.imwrite(save_path, image)保存路径的修改只需要换save_dir参数就行。我一般会把save_dir拆成变量放在文件头部统一配置方便切换 train 和 test 数据集。这里有个细节值得注意保存下来的是带骨骼线的可视化图不是关键点坐标文本也就是说 action 分类模型是在图像层面做分类输入是三通道的 RGB 图。3.3 采集数据时的一个建议分辨率统一和角度多样性我用这个项目采集数据时踩过一个坑不同图片来源的分辨率差异太大导致生成的骨骼图里人体大小忽大忽小分类模型学到的根本不是姿态特征而是人体在画面中的尺度特征。后来我统一把输入图片缩放到 368×368对应 openpose 的标准输入尺寸采集出来的关键点图一致性明显好了很多。采集样本时还注意到一个现象openpose 对侧面视角的人体关键点检测效果比正面差不少尤其是遮挡严重的情况下髋关节和肩膀的关键点置信度会掉到 0.3 以下骨骼图会出现断线。训练数据里这类样本的比例应该控制在 15% 以内否则分类模型会学到「关键点缺失就认为是摔倒」这种错误规律。4. 从 yolov5 到 openpose 的串联detect.py 里的人和框逻辑detect.py 是整套系统的核心调度入口。它做的事情看起来简单——调用 yolov5 检测人、裁剪出人的区域、传给 openpose——但实际落地时涉及很多工程细节宽高比过滤、坐标裁剪边界处理、前后帧的检测结果平滑等。摘要里明确提到 169 行有一个「根据框框的宽高比的判断」这个设计是有实际工程意义的。4.1 宽高比过滤的工程含义既能过滤误检也能捕捉摔倒特征人体在正常站立时检测框的宽高比大致在 0.30.5 之间。但当人摔倒后身体横躺在地上检测框的宽高比会发生剧烈变化可能大于 1。所以宽高比这一特征本身就携带了摔倒判断的信息在 yolov5 检测阶段就把它用上等于提前过滤掉一部分明显异常的检测框也减轻了后续 openpose 和 action 分类的负担。# detect.py 169 行附近的逻辑 for *xyxy, conf, cls in det: if int(cls) ! 0: # 只检测 person 类COCO 数据集里人的类别 ID 是 0 continue x1, y1, x2, y2 [int(i) for i in xyxy] box_w x2 - x1 box_h y2 - y1 aspect_ratio box_w / box_h # 宽高比 # 过滤极端宽高比太高瘦或太宽扁都可能是误检 if aspect_ratio 2.5 or aspect_ratio 0.15: continue # 裁剪人体区域并传给 openpose person_img image[y1:y2, x1:x2] person_img_resized cv2.resize(person_img, (368, 368))宽高比阈值 2.5 和 0.15 是根据常见安全监控场景的经验值。如果你用的是鱼眼摄像头或者顶装摄像头人体在画面中的宽高比会和普通枪机摄像头差很多这两个阈值需要重新标定。做法是拿 100 张实际场景的标注图片统计一下人体框的宽高比分布再看阈值要不要收紧或放宽。4.2 坐标裁剪的边界安全resize 前必须做 clamp裁剪人体区域这段代码我直接运行时遇到过几次 index out of range 的报错。原因是 yolov5 输出的检测框可能超出图像边界比如 x2 大于图像宽度。直接image[y1:y2, x1:x2]切片时超出边界后 OpenCV 会报索引越界整个进程直接崩掉。# 安全裁剪处理检测框超出图像边界的情况 height, width image.shape[:2] x1 max(0, min(x1, width - 1)) y1 max(0, min(y1, height - 1)) x2 max(x1 1, min(x2, width)) y2 max(y1 1, min(y2, height)) if x2 - x1 10 or y2 - y1 10: continue # 裁剪区域太小直接跳过 person_img image[y1:y2, x1:x2]这段代码把检测框全部 clamp 到图像有效区域内并且加了最小尺寸判断——小于 10×10 像素的裁剪区域基本不可能是有效的人体传给 openpose 也是浪费算力。这类边界处理看着琐碎但在实时视频流里检测框抖动和边缘帧异常是常态不加保护程序很容易运行几个小时后突然崩溃。4.3 整段串联从视频帧到摔倒分类的完整调用链detect.py 的完整调用链可以看成四个环节的串联。yolov5 加载权重并推理得到检测框检测框经过宽高比过滤和边界裁剪后提取人体区域人体区域 resize 后传入 openpose 得到关键点热力图关键点热力图绘制成骨骼图后传入 action 分类模型得到最终判断。# detect.py 主流程示意 model_yolo torch.hub.load(yolov5, yolov5s, sourcelocal) # 本地加载 model_openpose torch.jit.load(openpose.jit, map_locationcpu) model_action torch.jit.load(action.jit, map_locationcpu) def process_frame(frame): results model_yolo(frame) det results.xyxy[0].cpu().numpy() for *xyxy, conf, cls in det: if int(cls) ! 0 or conf 0.5: continue # 宽高比过滤、裁剪、resize 代码如上 person_img crop_person(frame, xyxy) keypoints model_openpose(person_img) skeleton_img draw_skeleton(person_img, keypoints) action_probs model_action(skeleton_img) if action_probs.argmax() 1: # 假设 1 表示摔倒 trigger_alarm()action 模型的输出是一个概率分布argmax()取概率最大的类别索引作为预测结果。这里 1 是否表示摔倒取决于你在 action 模型训练时怎么分配标签我用的是 0 表示正常、1 表示摔倒。yolov5 的加载方式我用了sourcelocal因为项目里虽然用的是 torchvision 的 YOLOv5 分支但实际代码结构和 ultralytics 的 yolov5 仓库基本一致本地加载更可控不会因为网络问题拉取失败。5. 这个项目真正难搞的都在这些坑里训练和部署避坑记录整个项目跑下来真正让我花时间调试的不是算法原理而是一些看起来很不起眼的工程细节。这些坑不解决模型效果再好也落不了地。我整理了几条最典型的踩坑记录每一条都花了我至少半小时到几个小时。5.1 现象openpose 推理结果全黑或者关键点全部集中在图像中央原因图像通道顺序错误。OpenCV 读入的图像是 BGR 格式但 openpose 模型在训练时用的是 RGB 格式。如果不做转换模型输入和训练数据分布不一致推理出来的热力图基本不可信。解决在预处理环节加一行cv2.cvtColor(image, cv2.COLOR_BGR2RGB)。这个错误很隐蔽因为模型不会报错程序也能正常跑完但输出的关键点就是不对。我排查这个问题时一度怀疑是 .jit 模型损坏后来才想到是通道顺序的问题。5.2 现象Docker 里跑 detect.pyopencv 报 libGL.so.1 找不到原因Python 的 opencv-python 包依赖系统级的 libGL 动态库而基于 pytorch 官方镜像构建的容器环境里没有安装这个库。这个问题在 Dockerfile 构建时不会暴露因为 Python 依赖检查不管系统库只有运行到import cv2的瞬间才会炸。解决在 Dockerfile 里显式安装系统依赖。我的做法是换用 opencv-python-headless这个版本不依赖 libGL适合服务端部署场景。FROM pytorch/pytorch:1.10.0-cuda11.3-cudnn8-runtime WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 替换 opencv-python 为 headless 版本避免 libGL 依赖 RUN pip uninstall opencv-python -y pip install opencv-python-headless5.3 现象action 模型训练时 acc 很高但实测摔倒识别率极低原因训练数据和测试数据的分布不一致。我在采集数据时训练集里全是摄像头俯视角度拍的人体测试时用在平视摄像头拍的人体上openpose 给出的关键点骨骼图差异很大action 模型自然认不出来。更隐蔽的问题是数据同源如果训练集和测试集是从同一段视频里抽出来的帧模型学到的可能只是画面背景特征而不是姿态特征。解决采集训练数据时刻意覆盖不同摄像头角度、不同光照条件、不同人体穿着并且确保训练集和测试集来自不同的视频片段。我在项目里换用了三个不同位置和角度的摄像头采集数据模型泛化能力明显改善。还有个实用技巧是训练集里加一部分纯背景负样本让模型学到「没有人也是正常」这个边界。5.4 现象运行 train.py 时报 labels.cache 文件被占用或者损坏原因labels.cache 是训练过程中生成的标签缓存文件用于加速数据加载。如果上一次训练被强行中断缓存文件可能写入不完整导致下次训练读取时报错。项目里如果直接拷贝压缩包也可能因为文件传输不完整导致 labels.cache 内容异常。解决遇到这类报错直接把 labels.cache 删掉训练脚本会在下一次运行时自动重新生成。这个文件本质是中间产物不影响训练结果。我习惯在每次训练前手动删一次可以避免很多奇怪的问题。5.5 现象同一个 .jit 模型在本地 CPU 和服务器 GPU 上推理结果不一致原因TorchScript 模型在导出时带着设备信息如果本地加载用了map_locationcpu模型结构和权重会被重新映射到 CPU 上但浮点计算顺序可能和 GPU 有细微差异。这种情况在严格相等的判断上才会暴露图像推理任务里肉眼基本看不出区别。解决统一用 CPU 推理跑测试、GPU 推理跑训练。如果必须二者混用在加载模型时显式指定map_location参数例如torch.jit.load(openpose.jit, map_locationcpu)。另外用 GPU 推理时记得给输入张量加上.cuda()否则模型在 GPU 而输入在 CPU会直接报设备不匹配的错误。6. 训练自己的摔倒分类模型action_detect/train.py 的完整流程和判断逻辑项目已经提供了训练action.jit分类模型的代码这里可以把完整训练流程跑通。训练一个能用的姿态分类模型并不复杂核心步骤就三步整理数据到指定目录、配置训练参数、跑训练脚本。6.1 数据组织方式目录结构决定模型怎么读数据train.py 的数据读取逻辑很简单就是按目录归类。data/train和data/test下每个子文件夹的名字就是类别名子文件夹里的图片就是该类别的样本。data/ ├── train/ │ ├── normal/ # 正常姿态关键点图 │ │ ├── normal_001.jpg │ │ ├── normal_002.jpg │ │ └── ... │ └── fall/ # 摔倒姿态关键点图 │ ├── fall_001.jpg │ ├── fall_002.jpg │ └── ... └── test/ ├── normal/ └── fall/分类样本不是原始图片是 openpose 输出的关键点骨骼图。这个设计降低了模型的学习难度相当于先把姿态特征抽取好了分类模型只需要在更高层次上做判断。我实际训练时每个类别放了 500 张左右的关键点图效果已经不错。6.2 训练参数怎么设batch size、学习率和类别数train.py 中有几个参数直接决定了训练效果我按照训练结果给出了推荐配置参数默认值推荐值说明batch_size1632显存充足就调大加速训练learning_rate0.0010.0005类别少时降低学习率防震荡num_epochs5080加了数据增强后适当增加轮数num_classes22正常 摔倒可按需增加image_size368368与 openpose 输出图尺寸保持一致训练完成后会得到一个action.jit文件替换项目根目录的同名文件即可。训练日志里重点看验证集的 acc 和 loss如果训练集 acc 很高但验证集 acc 上不去八成是过拟合需要增加数据量或者加入数据增强。6.3 摔倒判断逻辑的启发式设计结合人脸和人体角度action 模型给出的是分类概率但实际工程里光有概率还不够。我一般会再加一层启发式判断用规则去兜底模型可能犯的低级错误。def is_fall(bbox_aspect_ratio, hip_angle, ground_distance, action_prob): # 多维度综合判断摔倒 score 0.0 if bbox_aspect_ratio 1.2: # 检测框横躺 score 0.3 if hip_angle 70: # 髋关节角度变小说明身体弯曲 score 0.3 if ground_distance 0.3: # 关键点平均高度降低 score 0.2 if action_prob 0.7: # 分类模型高置信度 score 0.4 return score 1.0判断逻辑很简单检测框宽高比异常能反映身体横躺髋关节角度能量化身体弯曲程度关键点平均高度能反映人体是否贴近地面分类模型概率提供综合判断。四个信号加权打分超过设定阈值才触发报警。这样的好处是能过滤掉一些分类模型误判的情况比如弯腰捡东西、蹲地系鞋带这类动作虽然改变了姿态但关键是关键点高度没有明显降低就不容易误报。实话说这个启发式规则比较粗糙但作为工程兜底很实用我可以根据实际场景调整权重和阈值。从那以后我每次训练 action 模型都会把测试集和训练集分成完全不同的视频来源并且在测试集里刻意加入一些容易混淆的姿势——比如蹲下、弯腰、躺下休息。跑完训练会打印每个类别的精确率和召回率两个指标都过 85% 我才会考虑部署这个习惯帮我避了很多次「训练时爽、上线就废」的问题希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

ReportMachine v3.67 源码适配 Delphi 12.3 实战指南 2026/9/25 7:19:39

ReportMachine v3.67 源码适配 Delphi 12.3 实战指南

简介:本资源是面向Delphi及BCB(Borland C Builder)开发者的高级报表控件ReportMachine v3.67完整源码包,专为Delphi 12.3环境深度适配,解决快速构建可定制化、高灵活性业务报表的核心需求,适用于金融、ERP、…

阅读更多 →
highlight.io Changelog 14 深度解读:全新注册流程、Replay 抖动修复与 Python/日志产品进展 2026/9/25 7:19:32

highlight.io Changelog 14 深度解读:全新注册流程、Replay 抖动修复与 Python/日志产品进展

可观测性后端 【免费下载链接】highlight highlight.io: The open source, full-stack monitoring platform. Error monitoring, session replay, logging, distributed tracing, and more. 项目地址: https://gitcode.com/gh_mirrors/hi/highlight 点击查看 免费下…

阅读更多 →
ESPnet OWSM-CTC v3.1 实战指南:encoder-only 多任务语音基础模型的数据格式、训练配置与 CTC 推理 2026/9/25 7:19:32

ESPnet OWSM-CTC v3.1 实战指南:encoder-only 多任务语音基础模型的数据格式、训练配置与 CTC 推理

人工智能语音音频深度学习NLP 【免费下载链接】espnet End-to-End Speech Processing Toolkit 项目地址: https://gitcode.com/gh_mirrors/es/espnet 点击查看 免费下载 本篇技术指南围绕 ESPnet 仓库中 OWSM-CTC v3.1 s2t1 recipe 展开:OWSM-CTC 是一个…

阅读更多 →
PaddleSpeech FastSpeech2 VCTK 多说话人语音合成实战:从数据准备到模型部署全流程解析 2026/9/25 7:19:26

PaddleSpeech FastSpeech2 VCTK 多说话人语音合成实战:从数据准备到模型部署全流程解析

人工智能语音音频 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword…

阅读更多 →
实战解读 CodeQL Actions 查询:UnnecessaryUseOfAdvancedConfig 与工作流默认设置简化 2026/9/25 7:19:26

实战解读 CodeQL Actions 查询:UnnecessaryUseOfAdvancedConfig 与工作流默认设置简化

静态分析SAST应用安全漏洞扫描代码质量 【免费下载链接】codeql CodeQL: the libraries and queries that power security researchers around the world, as well as code scanning in GitHub Advanced Security 项目地址: https://gitcode.com/gh_mirrors/co/code…

阅读更多 →
jetson-inference 深度学习入门:从训练到 TensorRT 推理的完整工作流 2026/9/25 7:19:26

jetson-inference 深度学习入门:从训练到 TensorRT 推理的完整工作流

人工智能计算机视觉深度学习微调 【免费下载链接】jetson-inference Hello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson. 项目地址: https://gitcode.com/gh_mirrors/je/jetson-inf…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉