ONNX Runtime 跑 OpenPose 超详细讲解

一、先搞懂 3 个核心概念(必须懂)

1. OpenPose 是什么?

一个**能检测出人体关节点(鼻子、脖子、肩膀、手肘、腰、膝盖...)**的 AI 模型。

我们要的就是它输出的关节坐标,用来判断摔倒、打架、攀爬。

2. ONNX 是什么?

一种通用的 AI 模型格式

就像:

  • 视频有 MP4
  • 图片有 JPG
  • AI 模型有 ONNX

任何 AI 模型(OpenPose、YOLO、姿态估计...)转成 ONNX 后,所有平台都能跑

3. ONNX Runtime 是什么?

专门用来运行 ONNX 模型的 "引擎"

你可以理解为:

  • 看电影用 → 播放器
  • 跑 ONNX 模型用 → ONNX Runtime

它的作用:
加载 OpenPose.onnx → 运行 AI 计算 → 输出人体关键点

二、为什么要用 ONNX Runtime 跑 OpenPose?

官方 OpenPose 超级难装:

  • 要 C++ 编译
  • 要配 CUDA
  • 要装各种依赖
  • 90% 的人都会报错卡死

ONNX Runtime 优点:

  • 一行命令安装
  • 不挑系统(Windows/Linux/macOS 都能用)
  • 速度快
  • 代码超级简单
  • 最适合做校园危险行为识别

三、完整流程(一句话)

读取图片 / 视频 → 预处理 → ONNX Runtime 运行 OpenPose 模型 → 得到人体关节点 → 判断危险行为

四、手把手教你:安装 + 代码 + 原理讲解

第一步:安装依赖(仅 2 个库)

打开命令提示符,运行:

|------------------------------------------------------------------------------------------|
| bash # 安装运行模型的引擎 pip install onnxruntime # 安装读取摄像头/视频的工具 pip install opencv-python numpy |

这就是全部环境!不用装别的!

五、ONNX Runtime 加载 OpenPose 模型 详细解释

我给你完整可运行代码 + 逐行详细解释,你复制就能跑。

完整代码

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| python import cv2 import numpy as np import onnxruntime as ort # ====================== # 1. 加载 OpenPose 模型(最重要!) # ====================== # 这行代码的意思: # 创建一个推理会话,把 openpose.onnx 读进内存,准备运行 session = ort.InferenceSession("openpose.onnx") # 查看模型输入名称(必须知道,不然无法运行) input_name = session.get_inputs()0.name print("模型输入名称:", input_name) # 一般是:input.1 # ====================== # 2. 打开摄像头 # ====================== cap = cv2.VideoCapture(0) # ====================== # 3. 循环读取每一帧 # ====================== while True: ret, frame = cap.read() if not ret: break H, W = frame.shape:2 # ====================== # 4. 图片预处理(必须做,模型要求输入固定大小) # ====================== img = cv2.resize(frame, (368, 368)) # 模型固定输入尺寸 img = img.astype(np.float32) / 255.0 # 归一化 0~1 img = img.transpose(2, 0, 1) # 格式从 HWC → CHW img = np.expand_dims(img, axis=0) # 增加 batch 维度 → 1, 3, 368, 368 # ====================== # 5. ONNX Runtime 运行模型!!! # 核心:把图片送进 OpenPose 模型,得到输出 # ====================== output = session.run( None, # 要输出哪些层?None=全部输出 {input_name: img} # 输入:{输入名称: 预处理后的图片} ) # output 是模型输出的 热图(heatmap) + 向量图(vecmap) # OpenPose 通过这两个数据计算出关节点坐标 heatmap = output0 # 关键点置信度图 vecmap = output1 # 关键点连接方向图 # ====================== # 6. 解析关节点(得到人体姿态) # ====================== # 这里我写一个简化版解析函数 def get_keypoints(heatmap, orig_h, orig_w): points = \[\] num_keypoints = heatmap.shape1 for i in range(num_keypoints): map = heatmap0, i, :, : y, x = np.unravel_index(np.argmax(map), map.shape) # 还原到原图尺寸 x = int(x * orig_w / 368) y = int(y * orig_h / 368) points.append((x, y)) return points keypoints = get_keypoints(heatmap, H, W) # ====================== # 7. 画出关节点 # ====================== for (x, y) in keypoints: cv2.circle(frame, (x, y), 5, (0, 255, 0), -1) # 显示画面 cv2.imshow("OpenPose ONNX Runtime", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() |

六、逐行核心代码超详细解释(你最需要的)

1. 加载模型

|--------------------------------------------------------|
| python session = ort.InferenceSession("openpose.onnx") |

意思:
把 OpenPose 这个 AI 模型加载到内存中,随时可以运行。

2. 获取模型输入名称

|----------------------------------------------------|
| python input_name = session.get_inputs()0.name |

模型必须知道:你给它的数据叫什么名字

OpenPose 模型的输入名一般是:
input.1

3. 图片预处理

|------------------------------------------------------------------------------------------------------------------------------------------------|
| python img = cv2.resize(frame, (368, 368)) img = img.astype(np.float32) / 255.0 img = img.transpose(2, 0, 1) img = np.expand_dims(img, axis=0) |

作用:
把摄像头图片变成模型能识别的格式

4. 运行模型(最核心)

|------------------------------------------------------|
| python output = session.run(None, {input_name: img}) |

这句话的意思:
把图片送进 OpenPose → 模型计算 → 返回关节点信息

5. 解析输出得到关键点

|------------------------------|
| python heatmap = output0 |

heatmap 里存的是:

鼻子、脖子、肩膀、手肘、腰、膝盖、脚踝......
所有关节的位置

七、你拿到关键点后能做什么?(校园危险行为)

|------------------------------------------------------------------------|
| Plain Text 鼻子 脖子 左肩 → 左肘 → 左手腕 右肩 → 右肘 → 右手腕 腰 → 左膝 → 左脚踝 腰 → 右膝 → 右脚踝 |

用这些坐标可以判断:

  • 摔倒:腰的坐标突然变低
  • 打架:两个人手腕距离过近 + 快速移动
  • 攀爬:手超过护栏高度,腿悬空
  • 追逐:移动速度过快
  • 聚众:3 人以上靠得太近

八、使用

  1. 可用的 openpose.onnx 模型文件(你直接放代码同目录就能跑)
  1. 完整可运行、带关键点绘制的代码
  1. 校园危险行为判断逻辑代码(摔倒 / 打架 / 攀爬)
相关推荐
IT古董1 小时前
【MES学习笔记系列】MES 厂商与产品对比
笔记·学习
wangyue_msn_861 小时前
Agent知识学习笔记——03 RAG
笔记·学习·ai编程
嘶哈哈哈2 小时前
# 异构十电机机架数学建模:从单电机力矩到受约束控制分配
笔记
呱呱巨基2 小时前
Linux 查找命令
linux·笔记·学习·查找命令
zhangrelay3 小时前
ROS 2 Lyrical 第4章 URDF机器人建模与Gazebo Garden仿真
linux·笔记·学习·ubuntu·机器人·ros2
疯狂打码的少年3 小时前
【数据结构】串的模式匹配:KMP算法(重点)
数据结构·笔记·算法
一米阳光86613 小时前
软考(中级)软件设计师核心笔记(8)数据结构——线性结构、数组、矩阵
数据结构·笔记·职场发展·软考·软件设计师·中级职称
疯狂打码的少年5 小时前
【数据结构】树的基本概念与二叉树定义
java·数据结构·笔记·算法
马上去吃汉堡王5 小时前
Windows11安装Geant4
笔记
气泡水。5 小时前
RHCSA笔记实记
linux·笔记