JAVA onnxruntime 调用ONNX模型进行预测

先看一下onnxruntime 官网写了啥

PS:如果包安装了之后一直用不了提示Can‘t find dependent libraries可以去这里的链接看一看,可能就是你Visual C++ 2019没装的问题

官网写的大概就是先定义一个env一个 session然后再写一个包含{名字:OnnxTensor}的字典,然后把字典放入session的run方法中,现在的问题是OnnxTensor是啥

看看OnnxTensor的文档怎么写的

PS:文档中还写了很多很多种的方法,建议去看看,这里是因为我把图片归一化后转换成了FloatBuffer类型的所以用这个。

 可以用这个创建一个OnnxTensor 需要输入的参数分别是,env(上面你创建的),floatBuffer(你的一维展开的数据),shape(你的数据将要变成什么形状的OnnxTensor)

输出名称和输入名称可以用session.getInputNames()和session.getOutputNames()来查看

然后在results拿到之后

//OutputNames为你的输出名称
Optional<OnnxValue> results = results.get("OutputNames");
results .isPresent()
OnnxValue onnxValue = results .get();
TensorInfo tensorInfo = (TensorInfo) onnxValue.getInfo();

 //获得的数据的形状

long[] outputShape_Long = tensorInfo.getShape();

//获得的数据,onnxValue.getValue()只是一个数据地址如果直接输出将会是这种格式的        
[[[F@4459eb14。所以需要一个同形状同类型的来接收一下,
float[][][] outputValue_Long = (float[][][]) onnxValue.getValue();

/*

现在你已经拿到了数据了可以对数据进行自己的处理了

*/

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OnnxRuntime是一个用于执行ONNX模型的开源引擎,它支持多种平台和硬件设备,包括CPU、GPU和FPGA等。要使用OnnxRuntime调用ONNX格式的模型,可以按照以下步骤进行: 1. 安装OnnxRuntime库:可以在OnnxRuntime官方网站上下载并安装相应版本的库。 2. 加载ONNX模型:使用OnnxRuntime提供的API加载ONNX格式的模型文件,并创建InferenceSession对象。 3. 准备输入数据:为模型准备输入数据,可以使用C++的STL容器或者指针数组来存储数据。 4. 执行推理:调用InferenceSession对象的Run方法,将准备好的输入数据作为参数传入,执行模型推理过程。 5. 获取输出结果:从InferenceSession对象中获取输出结果,可以使用C++的STL容器或者指针数组来接收数据。 以下是一个简单的C++代码示例,演示了如何使用OnnxRuntime调用ONNX格式的模型: ``` #include <iostream> #include <vector> #include <fstream> #include "onnxruntime_cxx_api.h" int main() { // 1. 加载模型 Ort::Env env{ ORT_LOGGING_LEVEL_WARNING, "test" }; Ort::Session session{ env, "model.onnx", Ort::SessionOptions{} }; // 2. 准备输入数据 std::vector<float> input_data(3 * 224 * 224); // 将数据填充到input_data中 // 3. 执行推理 Ort::Value input_tensor{ Ort::Value::CreateTensor<float>(input_data.data(), input_data.size(), { 1, 3, 224, 224 }) }; auto output_tensors = session.Run(Ort::RunOptions{}, { "input" }, { &input_tensor }, { "output" }); // 4. 获取输出结果 std::vector<float> output_data(1000); output_tensors.front().GetTensorMutableData<float>()->CopyTo(output_data.data(), output_data.size()); // 输出结果 for (auto& val : output_data) { std::cout << val << " "; } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值