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 = output[0] # 关键点置信度图 vecmap = output[1] # 关键点连接方向图 # ====================== # 6. 解析关节点(得到人体姿态) # ====================== # 这里我写一个简化版解析函数 def get_keypoints(heatmap, orig_h, orig_w): points = [] num_keypoints = heatmap.shape[1] for i in range(num_keypoints): map = heatmap[0, 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 = output[0] |

heatmap 里存的是:

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

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

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

用这些坐标可以判断:

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

八、使用

  1. 可用的 openpose.onnx 模型文件(你直接放代码同目录就能跑)
  1. 完整可运行、带关键点绘制的代码
  1. 校园危险行为判断逻辑代码(摔倒 / 打架 / 攀爬)
相关推荐
Upsy-Daisy2 小时前
AI Agent 项目学习笔记(十一):TerminateTool、工具调用闭环与安全边界
人工智能·笔记·学习
lqj_本人2 小时前
鸿蒙electron跨端框架PC青简笔记实战:从笔记列表、编辑器到桌面导出,一次做完整
笔记·编辑器
lunzi_08262 小时前
【学习笔记】《Python编程 从入门到实践》第2章:变量命名规则、字符串操作与数值类型详解
笔记·python·学习
xian_wwq3 小时前
【学习笔记】“网络空间安全≠网络安全”——ISO SC27标准组十四年仍在求解的不等式
笔记·学习·安全
心中有国也有家3 小时前
pytorch-adapter:让 PyTorch 模型“无缝”跑在昇腾 NPU 上
人工智能·pytorch·笔记·python·学习
咸甜适中4 小时前
rust语言学习笔记Trait(九)PartialEq、 Eq(相等比较)
笔记·学习·rust
玄米乌龙茶1234 小时前
LLM成长笔记(七): AI 应用框架与编排
前端·人工智能·笔记
互联网江湖4 小时前
贝壳一季报,等来春暖花开?
笔记
w2018004 小时前
三年级下册语文第五单元作文:奇妙的想象
笔记