一、先搞懂 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 人以上靠得太近
八、使用
- 可用的 openpose.onnx 模型文件(你直接放代码同目录就能跑)
- 完整可运行、带关键点绘制的代码
- 校园危险行为判断逻辑代码(摔倒 / 打架 / 攀爬)