ONNX Runtime 跑 OpenPose 超详细讲解
一、先搞懂 3 个核心概念必须懂1. OpenPose 是什么一个**能检测出人体关节点鼻子、脖子、肩膀、手肘、腰、膝盖…**的 AI 模型。我们要的就是它输出的关节坐标用来判断摔倒、打架、攀爬。2. ONNX 是什么一种通用的 AI 模型格式。就像视频有 MP4图片有 JPGAI 模型有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 模型 详细解释我给你完整可运行代码 逐行详细解释你复制就能跑。完整代码pythonimport cv2import numpy as npimport onnxruntime as ort# # 1. 加载 OpenPose 模型最重要# # 这行代码的意思# 创建一个推理会话把 openpose.onnx 读进内存准备运行session ort.InferenceSession(openpose.onnx)# 查看模型输入名称必须知道不然无法运行input_name session.get_inputs()[0].nameprint(模型输入名称:, input_name) # 一般是input.1# # 2. 打开摄像头# cap cv2.VideoCapture(0)# # 3. 循环读取每一帧# while True:ret, frame cap.read()if not ret:breakH, W frame.shape[:2]# # 4. 图片预处理必须做模型要求输入固定大小# img cv2.resize(frame, (368, 368)) # 模型固定输入尺寸img img.astype(np.float32) / 255.0 # 归一化 0~1img img.transpose(2, 0, 1) # 格式从 HWC → CHWimg np.expand_dims(img, axis0) # 增加 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 pointskeypoints 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):breakcap.release()cv2.destroyAllWindows()六、逐行核心代码超详细解释你最需要的1. 加载模型pythonsession ort.InferenceSession(openpose.onnx)意思把 OpenPose 这个 AI 模型加载到内存中随时可以运行。2. 获取模型输入名称pythoninput_name session.get_inputs()[0].name模型必须知道你给它的数据叫什么名字OpenPose 模型的输入名一般是input.13. 图片预处理pythonimg cv2.resize(frame, (368, 368))img img.astype(np.float32) / 255.0img img.transpose(2, 0, 1)img np.expand_dims(img, axis0)作用把摄像头图片变成模型能识别的格式4. 运行模型最核心pythonoutput session.run(None, {input_name: img})这句话的意思把图片送进 OpenPose → 模型计算 → 返回关节点信息5. 解析输出得到关键点pythonheatmap output[0]heatmap里存的是鼻子、脖子、肩膀、手肘、腰、膝盖、脚踝……所有关节的位置七、你拿到关键点后能做什么校园危险行为Plain Text鼻子脖子左肩 → 左肘 → 左手腕右肩 → 右肘 → 右手腕腰 → 左膝 → 左脚踝腰 → 右膝 → 右脚踝用这些坐标可以判断摔倒腰的坐标突然变低打架两个人手腕距离过近 快速移动攀爬手超过护栏高度腿悬空追逐移动速度过快聚众3 人以上靠得太近八、使用可用的 openpose.onnx 模型文件你直接放代码同目录就能跑完整可运行、带关键点绘制的代码校园危险行为判断逻辑代码摔倒 / 打架 / 攀爬