我是靠谱客的博主 积极雪碧,最近开发中收集的这篇文章主要介绍C++通过onnxruntime部署Pytorch训练的YOLOV3,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

C++ onnxruntime模块加载Pytorch中的onnx模型
 
1.Python中Torch导出onnx文件
"""YOLOv3 onnx模块导出"""
model.eval()
torch.onnx.export(model=model,args=im,f="./yolov3.onnx",input_names=["inputs"]
                  ,output_names=["output"])
利用torch.onnx.export()导出onnx模型,前提是model是加载好的Yolov3模型,这里不懂的可以看我之前写过YOLOv3调试的文章。
44398068d88c4b80a4438daad2752bd1.png
就是在detect.py中加入上述代码。
错误一:opset version版本错误
6b7fbf1e4a4d4f58a1e6286dc6e7aadd.png
在上述代码中指定,opset version=11 版本即可。
8ff32686c4c5404aa13385efb392f5f9.png
导出成功后就可以在根目录下发现yolov3.onnx了
77cee45f4e3840199fb1968f2c5fc804.png
 
测试代码:
import onnx

# Load the ONNX model
model = onnx.load("yolov3.onnx")

# Check that the IR is well formed
onnx.checker.check_model(model)

# Print a human readable representation of the graph
print(onnx.helper.printable_graph(model.graph))
2.安装onnxruntime
首先去官网下载onnxruntime版本:
cpu版本: NuGet Gallery | Microsoft.ML.OnnxRuntime 1.11.0
gpu版本: NuGet Gallery | Microsoft.ML.OnnxRuntime.Gpu 1.13.1
本文下载的cpu版本
下载完成后将安装文件放在一个文件夹里,然后打开需要配置onnxruntime的VS工程。
 
工具->NuGet包管理器->程序包管理控制台
在打开的控制台中输入以下命令:
PM> Install-Package Microsoft.ML.OnnxRuntime -Source D:onnxruntimesetup
后面的路径可以根据自己配置的路径自行修改。
0e304baa140940bcb04724d92a335ca6.jpeg
上述操作完成后在你的工程目录下就会多出packages,点进去找到onnxruntime的头文件目录,把该目录配置到工程中
 
8285262fe1cb4c6c9468bcc0c573a892.png
df5ef1ad9e1b4318aa56a01c33234368.png
测试以下是否可用。
 
3.测试yolov3.onnx是否可用
#include<opencv2/core.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/opencv.hpp>
#include <iostream>
#include<assert.h>
#include<vector>
#include <onnxruntime_cxx_api.h>
using namespace std;
using namespace cv;
int main(int argc,char *argv)
{
    //初始化环境
    Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");
    //onnx文件路径
    const wchar_t* model_path = L"yolov3.onnx";
    //初始化Session 选项,申请一个线程,使用基础的优化器
    Ort::SessionOptions session_options;
    session_options.SetIntraOpNumThreads(1);
     session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_BASIC);
    //按上述的配置创建Session,加入到运行内存中
    cout << "Using Onnxruntime C++ API..."<<endl;
    Ort::Session session(env, model_path, session_options);
    //打印模型的输入层(node names, types, shape etc.)
    Ort::AllocatorWithDefaultOptions allocator;
    size_t num_input_nodes = session.GetInputCount();         //输入节点数量
    size_t num_output_nodes = session.GetOutputCount();       //输出节点数量
    vector<const char*>input_node_names(num_input_nodes);     //输入节点的名称
    vector<const char*>output_node_names(num_output_nodes);   //输出节点的名称
    //打印模型输入节点的数量
    for (int i=0;i<num_input_nodes;i++)
    {
        char* input_name = session.GetInputName(i, allocator);
        input_node_names[i] = input_name;            //输入节点名称
        Ort::TypeInfo type_info = session.GetInputTypeInfo(i);  //输入节点类型
        auto tensor_info = type_info.GetTensorTypeAndShapeInfo();
        ONNXTensorElementDataType type = tensor_info.GetElementType();
        auto input_node_dims = tensor_info.GetShape();
        cout << "第" << i + 1 << "个输入节点的名称:" << input_name <<endl;
        cout << "第" << i + 1 << "个输入节点的类型:" << type << endl;
        cout << "第" << i + 1 << "个输入节点的维度:" ;
        for (int j=0;j<input_node_dims.size();j++)
        {
            cout << input_node_dims[j] << ",";
        }
        cout << endl;
    }
    cout << "输出数据的数量是" << num_output_nodes << endl;
    return 0;
}

 

 

 

最后

以上就是积极雪碧为你收集整理的C++通过onnxruntime部署Pytorch训练的YOLOV3的全部内容,希望文章能够帮你解决C++通过onnxruntime部署Pytorch训练的YOLOV3所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部