相关文章推荐
含蓄的四季豆  ·  Asserting Log ...·  4 月前    · 
打篮球的红酒  ·  nodejs环境变量 ...·  1 年前    · 
威武的帽子  ·  arrays - Scala way ...·  1 年前    · 

模型加载速度区别

模型加载速度的快慢通常取决于多个因素,包括模型格式、模型的大小和复杂性、使用的框架以及底层硬件。关于 OpenVINO IR (.xml/.bin) 和 ONNX 格式在模型加载上的对比,以下是一些主要考虑因素:

  1. 优化和兼容性:

    • OpenVINO IR: OpenVINO Toolkit 专为 Intel 架构优化,可以提供针对 Intel CPU、GPU、VPU 等的特定优化。IR 格式是为了与 OpenVINO 兼容和优化而设计的,可以更好地利用 Intel 硬件的特性。
    • ONNX: ONNX 是一个开放格式,用于在不同的深度学习框架之间移植模型。虽然它在不同框架之间提供了良好的兼容性,但它可能不会针对特定硬件进行优化。
  2. 加载时间:

    • 加载模型的时间不仅取决于模型的格式,还受到底层解析和编译过程的影响。OpenVINO 在将模型转换为 IR 格式时进行了优化,这可能在加载时提供速度上的优势。
    • 使用 ONNX 格式时,模型加载速度可能受限于框架对 ONNX 的支持和解析效率。
  3. 运行时推理性能:

    • OpenVINO IR 格式的模型在推理时可能表现更佳,尤其是在 Intel 硬件上,因为 OpenVINO 会针对这些硬件进行特定的优化。
    • ONNX 模型在不同框架下的推理性能可能因框架的实现和优化水平而异。
  4. 硬件依赖性:

    • 如果您使用的是 Intel 的硬件,特别是 CPU 或 Movidius VPU,使用 OpenVINO IR 格式可能会提供更好的性能。
    • 对于非 Intel 硬件,ONNX 可能是一个更通用的选择,尽管可能需要额外的优化以实现最佳性能。

总之,如果您在 Intel 硬件上进行模型部署,使用 OpenVINO IR 格式可能会在模型加载和运行时推理上提供性能上的优势。这是因为 OpenVINO 对 Intel 硬件有针对性的优化。而在非特定于 Intel 的硬件或需要跨框架兼容性的情况下,ONNX 可能是一个更灵活的选择。

整体部署代码实现

window
onnx版:pth——onnx——C++部署onnx
IR版:pth——onnx——xml/bin——C++部署xml

onnx版

pth转化为onnx(python版)

import torch
import torch.onnx
import os.path as osp
import numpy as np
import onnx
import onnxruntime as ort
import torchvision
checkpoint_path = "model.pth"
model = Yourmodel(10, 2, 12)
model_dict = model.load_state_dict(torch.load(checkpoint_path))  # 获取自定义模型的参数字典
model.eval()
dummy_input = torch.randn(1,3,256,256)
onnx_path = 'model.onnx'
torch.onnx.export(model,
                  (dummy_input, class_code),
                  onnx_path,
                  verbose = True,
                  opset_version=10,
                  input_names='input',
                  output_names="output"   
print(f"ONNX模型已保存")

onnx部署(C++版)

void loadModel(const std::string& onnxModelPath) {
    // 仅在模型未加载时加载模型
    if (!model) {
        model = core.read_model(onnxModelPath);
        compiled_model = core.compile_model(model, "CPU");
        std::cout << "ONNX 模型已加载" << std::endl;
    else {
        std::cout << "ONNX 模型已经加载,无需再次加载" << std::endl;
int main() {
    auto start_time = std::chrono::high_resolution_clock::now();
    string onnxModelPath = "model.onnx";
    // 打印推理时间
    loadModel(onnxModelPath);
    auto end_time = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);
    std::cout << "模型加载时间: " << duration.count() << " 毫秒" << std::endl;
    return 0;

在实现过程中,我发现很多都是基于openvino2021版中安装的路径下:openvino2021.x/deployment_tools/model_optimizer中的mo_onnx.py 进行转化,但是openvino2022之后就没有这个文件夹,我也并没有找到,所以我尝试了另一种方法

onnx转xml/bin

通过wsl在win下安装ubuntu,在ubuntu虚拟环境中通过openvino进行转化,具体方法请见
在这里插入图片描述

xml C++部署

直接将onnx文件换成xml即可,运行时会自动找到对应相同路径下的bin文件

做深度学习神经网络的设计、训练与部署,往往会困扰于不同的操作系统,不同的深度学习框架,不同的部署硬件,以及不同的版本。由于相互之间的不兼容,给开发使用者造成了很大的不便。 联合使用OpenVINOONNX,便可以解决从不同框架模型不同硬件之间快速部署的问题。 最近参加“英特尔®OpenVINO™领航者联盟 DFRobot行业AI开发者大赛”活动,主办方提供了拿铁熊猫LattePanda和Intel神经计算棒NCS2,本文所列数据都是在该平台上运行得到的。 硬件1:拿铁熊猫LattePanda De
使用python API,对openvinoONNX Runtime的推理时间进行比较。有学习并借用一些其他up的代码。 #openvino from openvino.inference_engine import IECore import numpy as np import cv2 import time ie = IECore() model="shufflenet-v2-10.onnx" #model="shufflenet-v2-10/shufflenet-v2-10.xml"
段错误(Segment error)一般解释为内存溢出导致的结果 参考 github 上开源的Openvino cpp 解释推理仓库代码, 在后期 Yolov5 模型训练完之后出现(Segment error) 因为原仓库代码使用的是 YolvoV5 3官方模型推理的结果,结果的输出层和现在最新的 Yolov5输出层有点不用,3layer->4layer,所以在结果推理的时候因为出现随机的map 数值,在出现负数的时候会导致代码中的循环片段无效。 在 detect.cp p代码片段为在这里插入代码
我把YOLOv5最新版本的模型分别用OpenCV DNN(Python、C++)部署、OpenVINO(Python、C++)部署、ONNXRUNTIME-GPU(Python、C++)部署,然后还测试了CPU/GPU不同平台上的运行速度比较。 软件版本与硬件规格 测试用的硬件与软件信息: GPU 1050Ti CPU i7八代 OS:Win10 64位 OpenVINO2021.4 ONNXRUNTIME:1.4 OpenCV4.5.4
openvino安装步骤https://docs.openvinotoolkit.org/latest/openvino_docs_install_guides_installing_openvino_windows.html#Update-Path 错误1 安装程序没找到python和gpu 在安装openvino过程会遇到这样的错误,不用管直接继续安装(电脑已经安装anaconda python 3.6),之后在cmd执行Configure the Model Optimizer命令的时候会找到pyth
OpenVINO可以将动态batchsize的ONNX模型转换为其支持的静态batchsize的模型。下面是一种实现方式: 首先,安装OpenVINO工具包,并将模型优化器(Model Optimizer)集成到环境中。该工具用于将ONNX模型转换为OpenVINO可以加载和推理的IR模型。 在转换ONNX模型之前,我们需要了解该模型的动态输入形状。通常,动态batchsize的模型在网络的输入节点上会标记为-1或None。我们可以使用ONNX Runtime库来动态推理模型并获取输入形状。 下一步是使用Model Optimizer将ONNX模型转换为IR模型。为了支持静态batchsize,我们需要在转换过程中指定batch参数。命令行示例如下: python mo.py --input_model model.onnx --output_dir output --input_shape [B,C,H,W] --mean_values [mean_values] --scale_values [scale_values] --batch B 在命令行中,我们需要提供转换的ONNX模型,输出目录,输入形状,均值和缩放值。重要的是,在输入形状中指定batch维度并将其设置为所需的静态batchsize。 完成转换后,我们可以使用OpenVINO进行推理,输入静态batchsize的数据进行推理。 需要注意的是,在转换和推理过程中,我们需要确保模型和数据的形状匹配,以避免错误发生。如果需要批量推理,可以使用循环迭代每个批量进行推理。 这就是使用OpenVINO将动态batchsize的ONNX模型转换为静态batchsize模型的简要步骤。通过这种方式,我们可以使用OpenVINO不同大小的批量进行高效推理。