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. 校园危险行为判断逻辑代码(摔倒 / 打架 / 攀爬)
相关推荐
佛系豪豪吖5 分钟前
AtomCode 部署流程与使用经验
笔记·chatgpt·github·ai编程·gitcode
疯狂打码的少年42 分钟前
【程序语言与编译】NFA转DFA(子集构造法)
前端·笔记
咸甜适中1 小时前
rust语言学习笔记Trait(十七)Send、Sync(线程间数据所有权)
笔记·学习·rust
尘汐筠竹1 小时前
Day1-2 学习笔记:在 AMD 云环境上部署 Gemma 4 大模型
笔记·学习·datawhale·amdev
逸模1 小时前
逸模 VS CAD+SU系列(三)工程量---逸模模型级智能算量,数据同源闭环 助力公装项目精准控本高效拓店
人工智能·笔记·算量·公装·构件库
zhangrelay1 小时前
个体智能大模型使用的主观数据复盘-节选-2026-
笔记·学习·课程设计
lunzi_08261 小时前
【学习笔记】《Python编程 从入门到实践》第9章:类、继承、组合与面向对象编程
笔记·python·学习
神明不懂浪漫2 小时前
【第二章】Java中的数据类型,运算符与程序逻辑控制
java·开发语言·经验分享·笔记
05候补工程师2 小时前
【408考研复习】数据结构核心笔记:字符串模式匹配与内部排序算法全解析
数据结构·经验分享·笔记·考研·算法·排序算法
问心无愧05132 小时前
ctf show web入门107
android·前端·笔记·android studio