使用给定的代码在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‘
中止(核心倾弃)
#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:
import onnx
onnx_model = onnx.load('yunet.onnx')
onnx.checker.check_model(onnx_model)方法2:
#net = cv2.dnn.readNet('yunet.onnx')
net = cv2.dnn.readNetFromONNX('yunet.onnx')在从源头构建OpenCV的过程中,我是不是遗漏了什么?
发布于 2022-03-13 07:16:12
看起来opencv不支持具有动态输入形状的onnx模型,检查这个链接。尝试构建opencv的最新版本。另外,检查这个链接。有人提到要用一个固定的输入形状来表示云彩。如果以前的建议不起作用,请使用以下方法。
如果您使用的是tf2,如果您的权重是以.h5形式表示的,那么您将能够处理onnx问题。您可以从您的.pb生成.h5,然后在c++中轻松地使用aim生成.pb,使用以下代码:
在此之后,通过使用opencv,您将能够导入您的模型,然后享受!
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)发布于 2022-08-22 07:53:37
您使用的模型具有动态输入形状。OpenCV神经网络不支持具有动态输入形状[参考文献]的ONNX模型。但是,您可以使用固定输入形状加载ONNX模型,并使用OpenCV DNN推断其他输入形状。
您可以下载2022mar.onnx,这是您正在使用的模型的固定输入形状版本。
您可以在OpenCV 4.6.0-dev中使用以下代码成功地加载和使用该模型。
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格式?
# 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()https://stackoverflow.com/questions/69633595
复制相似问题