opencv C++ onnx 模型如何得到多个输出

有时候咱的模型会输出多个值,怎么拿到呢?
如果只输出一个值,我看很多博客都写了,这篇水文给个例子来看怎么拿到多个返回值

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>

如果你暂时还没搞定 opencv 的 C++ 环境问题,可以看一下介篇水文:
https://blog.csdn.net/HaoZiHuang/article/details/127288350
只针对 Linux/mac 哈,windows 自己搜搜吧hhhh


下边是 onnx 模型前向传播的一个demo

// 读入 onnx 模型
std::string model = "onnx_model/xxxxx.onnx";
cv::dnn::Net net = cv::dnn::readNetFromONNX(model);

// 读图
std::string image_path = 图片路径;
cv::Mat frame = cv::imread(image_path);

// OpenCV预处理图片
const float scalefactor = 1.0;
const bool swapRB = true;
const bool crop = false;
const int ddepth = CV_32F;
cv::Size new_size(960, 540);

cv::Mat input_blob = cv::dnn::blobFromImage(frame, scalefactor, new_size, cv::Scalar(), swapRB, crop, ddepth);

// 设置模型输入
net.setInput(input_blob);
std::vector<cv::Mat> output_probs;
net.forward(output_probs, std::vector<cv::String>{"xx", "keps", "offset", "instance", "mhu"});

单输入与多输入不同的是,要用一个 std::vector<cv::Mat> 来接收一下
同时,forward 的第二个参数要传入一个 std::vector<cv::String> 来拿需要的输出值

但是有时候不知道 onnx 模型的输出怎么办,可以用 Python API 搞一下, 看看输入输出名字:
https://blog.csdn.net/HaoZiHuang/article/details/126168132

from pprint import pprint
import onnxruntime

onnx_path = "xxxx.onnx"

provider = "CPUExecutionProvider"
onnx_session = onnxruntime.InferenceSession(onnx_path, providers=[provider])

print("----------------- 输入部分 -----------------")
input_tensors = onnx_session.get_inputs()  # 该 API 会返回列表
for input_tensor in input_tensors:         # 因为可能有多个输入,所以为列表
    
    input_info = {
        "name" : input_tensor.name,
        "type" : input_tensor.type,
        "shape": input_tensor.shape,
    }
    pprint(input_info)

print("----------------- 输出部分 -----------------")
output_tensors = onnx_session.get_outputs()  # 该 API 会返回列表
for output_tensor in output_tensors:         # 因为可能有多个输出,所以为列表
    
    output_info = {
        "name" : output_tensor.name,
        "type" : output_tensor.type,
        "shape": output_tensor.shape,
    }
    pprint(output_info)

----------------- 输入部分 -----------------
{'name': 'input', 'shape': [1, 3, 540, 960], 'type': 'tensor(float)'}
----------------- 输出部分 -----------------
{'name': 'xx', 'shape': [1, 1, 168, 120], 'type': 'tensor(float)'}
{'name': 'keps', 'shape': [1, 1, 168, 120], 'type': 'tensor(float)'}
{'name': 'offset', 'shape': [1, 2, 168, 120], 'type': 'tensor(float)'}
{'name': 'instance', 'shape': [1, 16, 168, 120], 'type': 'tensor(float)'}
{'name': 'mhu', 'shape': [1, 9, 168, 120], 'type': 'tensor(float)'}

把那几个输出的名字传入就行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值