一、先搞懂 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. 校园危险行为判断逻辑代码(摔倒 / 打架 / 攀爬)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐