首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >opencv中的负荷onnx模型

opencv中的负荷onnx模型
EN

Stack Overflow用户
提问于 2021-10-19 15:22:16
回答 2查看 5.9K关注 0票数 1

使用给定的代码在OpenCV++ (4.6.0-dev)中加载onnx模型(从这里下载)时,我得到以下错误。我做错了什么?请帮我解决这个问题。

错误:0@0.003全局/home/opencv_build/opencv/modules/dnn/src/onnx/onnx_importer.cpp (2564) parseShape DNN/ONNX(形状):不支持动态“零”形状,输入24300-051全局/home/opencv_build/opencv/modules/dnn/src/onnx/onnx_importer.cpp (1042) handleNode DNN/ONNX:在处理节点时出现错误,其中有一个输入和一个输出:域=‘ai.onnx’在抛出'cv::Exception‘实例后调用parseShape:(onnx_node!Shape_70) /home/opencv_build/opencv/modules/dnn/src/onnx/onnx_importer.cpp:1064:错误:(-2:未指定的错误)函数'handleNode‘中的 节点Shape@ai.onnx:(onnx_node!Shape_70)解析错误: OpenCV(4.6.0-dev) OpenCV错误:(-215:断言失败) !isDynamicShape中的函数'parseShape‘

中止(核心倾弃)

代码语言:javascript
复制
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/dnn/dnn.hpp>

using namespace std;
using namespace cv;
using namespace dnn;

int main()
{
    // load the neural network model
    cv::dnn::Net net = cv::dnn::readNetFromONNX("yunet.onnx");
}  

我可以使用以下两种方法成功地在Python中加载模型:方法1:

代码语言:javascript
复制
import onnx
onnx_model = onnx.load('yunet.onnx')
onnx.checker.check_model(onnx_model)

方法2:

代码语言:javascript
复制
#net = cv2.dnn.readNet('yunet.onnx')
net = cv2.dnn.readNetFromONNX('yunet.onnx')

在从源头构建OpenCV的过程中,我是不是遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2022-03-13 07:16:12

看起来opencv不支持具有动态输入形状的onnx模型,检查这个链接。尝试构建opencv的最新版本。另外,检查这个链接。有人提到要用一个固定的输入形状来表示云彩。如果以前的建议不起作用,请使用以下方法。

如果您使用的是tf2,如果您的权重是以.h5形式表示的,那么您将能够处理onnx问题。您可以从您的.pb生成.h5,然后在c++中轻松地使用aim生成.pb,使用以下代码:

在此之后,通过使用opencv,您将能够导入您的模型,然后享受!

代码语言:javascript
复制
import tensorflow as tf
from tensorflow import keras
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2
from tensorflow.keras.models import load_model
import numpy as np                    
#path of the directory where you want to save your model
frozen_out_path = '/path.../freez/'             # name of the .pb file
frozen_graph_filename = "freez_graph_6cls_try1" #“frozen_graph”

model = load_model("/cls_vgg16_6_cl.h5")
# model = ""# Your model# Convert Keras model to ConcreteFunction
full_model = tf.function(lambda x: model(x))
full_model = full_model.get_concrete_function(
tf.TensorSpec(model.inputs[0].shape, model.inputs[0].dtype))# Get frozen ConcreteFunction
frozen_func = convert_variables_to_constants_v2(full_model)
frozen_func.graph.as_graph_def()
layers = [op.name for op in frozen_func.graph.get_operations()]
print("-" * 60)
print("Frozen model layers: ")
for layer in layers:
   print(layer)
   print("-" * 60)
print("Frozen model inputs: ")
print(frozen_func.inputs)
print("Frozen model outputs: ")
print(frozen_func.outputs)# Save frozen graph to disk
tf.io.write_graph(graph_or_graph_def=frozen_func.graph,
                  logdir=frozen_out_path,
                  name=f"{frozen_graph_filename}.pb",
                  as_text=False)# Save its text representation
tf.io.write_graph(graph_or_graph_def=frozen_func.graph,
                logdir=frozen_out_path,
                name=f"{frozen_graph_filename}.pbtxt",
                as_text=True)
票数 2
EN

Stack Overflow用户

发布于 2022-08-22 07:53:37

您使用的模型具有动态输入形状。OpenCV神经网络不支持具有动态输入形状[参考文献]的ONNX模型。但是,您可以使用固定输入形状加载ONNX模型,并使用OpenCV DNN推断其他输入形状。

您可以下载2022mar.onnx,这是您正在使用的模型的固定输入形状版本。

您可以在OpenCV 4.6.0-dev中使用以下代码成功地加载和使用该模型。

代码语言:javascript
复制
cv::String fd_modelPath = "face_detection_yunet_2022mar.onnx";
float scoreThreshold = 0.9;
float nmsThreshold = 0.3;
int topK = 5000;

cv::Ptr<cv::FaceDetectorYN> detector = cv::FaceDetectorYN::create(fd_modelPath, "", cv::Size(320, 320), scoreThreshold, nmsThreshold, topK);

如何将动态输入形状转换为固定形状?请阅读这个页面

如何在OPENCV DNN中读取SAVEDMODEL格式?

代码语言:javascript
复制
# In python 3.6 to 3.10

# load frozengraph.pb
net = cv2.dnn.readNet(path2frozengraph)
# You can easily convert your model to frozengraph using
# https://github.com/fisakhan/convert_model_x2y

# preprocess input if needed
imgn = (img-127.5)/128.0# preprocess input if needed
imgn = imgn.astype(np.float32)# convert to float32 if needed

# opencv dnn way of pre-processing (must be NCHW in cv2 dnn) 
input_blob = cv2.dnn.blobFromImage(imgn, 1, (100,100), 0, swapRB=False, crop=False)

# inference
net.setInput(input_blob)
feature_vector_dnn = net.forward()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69633595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档