ONNX 模型分析与使用

本文大部分内容为对 ONNX 官方资料的总结和翻译,部分知识点参考网上质量高的博客。

一,ONNX 概述

深度学习算法大多通过计算数据流图来完成神经网络的深度学习过程。 一些框架(例如CNTK,Caffe2,Theano和TensorFlow)使用静态图形,而其他框架(例如 PyTorch 和 Chainer)使用动态图形。 但是这些框架都提供了接口,使开发人员可以轻松构建计算图和运行时,以优化的方式处理图。 这些图用作中间表示(IR),捕获开发人员源代码的特定意图,有助于优化和转换在特定设备(CPU,GPU,FPGA等)上运行。

ONNX 的本质只是一套开放的 ML 模型标准,模型文件存储的只是网络的拓扑结构和权重(其实每个深度学习框架最后保存的模型都是类似的),脱离开框架是没办法对模型直接进行 inference

1.1,为什么使用通用 IR

现在很多的深度学习框架提供的功能都是类似的,但是在 API、计算图和 runtime 方面却是独立的,这就给 AI 开发者在不同平台部署不同模型带来了很多困难和挑战,ONNX 的目的在于提供一个跨框架的模型中间表达框架,用于模型转换和部署。ONNX 提供的计算图是通用的,格式也是开源的。

二,ONNX 规范

Open Ne

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
YOLOv7是一种目标检测算法,可以在一张图片中快速地识别出多个不同类别的物体,并给出它们的位置和大小信息。 ONNX是一种开放的深度学习模型交换格式,可以将深度学习模型从一个框架转移到另一个框架。YOLOv7的ONNX模型可以在不同的平台和框架之间进行交互和部署。 为了分析解读YOLOv7的ONNX模型,我们可以采用以下步骤: 1. 加载ONNX模型 使用ONNX库加载YOLOv7的ONNX模型,代码如下: ```python import onnx model = onnx.load("yolov7.onnx") ``` 2. 查看模型结构 使用以下代码可以查看模型的输入、输出以及各层的参数: ```python print(model.graph.input) print(model.graph.output) print(model.graph.value_info) print(model.graph.node) ``` 3. 解析模型输出 YOLOv7模型的输出包含了目标检测的结果,需要进行解析才能得到物体的位置、类别和置信度等信息。通常情况下,可以使用以下代码来解析模型输出: ```python import numpy as np import onnxruntime as rt ort_session = rt.InferenceSession("yolov7.onnx") def to_numpy(tensor): return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy() def postprocess(result, num_classes, conf_thres=0.7, nms_thres=0.4): if isinstance(result, tuple): result = result[0] # 确定输出维度和大小 assert result.ndim == 4 assert result.shape[1] == (5 + num_classes) # 将输出转换为numpy数组 pred = result[0].reshape((-1, result.shape[2], result.shape[3])) # 根据置信度过滤结果 pred_boxes = pred[:, :, :4] pred_conf = pred[:, :, 4:5] pred_cls = pred[:, :, 5:] score = pred_conf * pred_cls keep = (score > conf_thres).nonzero() # 应用非极大抑制 boxes = [] scores = [] classes = [] for i in range(keep[0].shape[0]): box = pred_boxes[keep[0][i], keep[1][i], :] score = pred_conf[keep[0][i], keep[1][i], 0] * pred_cls[keep[0][i], keep[1][i], keep[2][i]] cls = keep[2][i] boxes.append(box) scores.append(score) classes.append(cls) boxes = np.array(boxes) scores = np.array(scores) classes = np.array(classes) idxs = cv2.dnn.NMSBoxes(boxes.tolist(), scores.tolist(), conf_thres, nms_thres) if len(idxs) > 0: boxes = boxes[idxs[:, 0]] scores = scores[idxs[:, 0]] classes = classes[idxs[:, 0]] return boxes, scores, classes ``` 4. 进行目标检测 使用ONNXRuntime库对输入图像进行预处理,然后将其传递给YOLOv7模型进行目标检测。最后,使用解析函数对输出进行解析,得到物体的位置、类别和置信度等信息。代码如下: ```python import cv2 # 加载图像 img = cv2.imread("test.jpg") # 缩放图像 img = cv2.resize(img, (416, 416)) # 将图像转换为输入张量 input_tensor = np.expand_dims(img.transpose((2, 0, 1)), axis=0) # 运行模型 result = ort_session.run(None, {"input": to_numpy(input_tensor)}) # 解析输出 boxes, scores, classes = postprocess(result, num_classes=80) ``` 以上是解析YOLOv7 ONNX模型的基本步骤,根据需要可以进行进一步的分析和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式视觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值