我遵循本教程,用OpenCV DNN模块加载yolov5*.onnx模型,并使用它进行推理。当试图加载模型时,我得到以下错误:
错误:0@10.376全局E:\Libraries\C++\opencv_gpu\opencv_source\modules\dnn\src\onnx\onnx_importer.cpp (1021) cv::dnn::dnn4_v20220524::ONNXImporter::handleNode DNN/ONNX:在处理节点时出现错误,输入1,输出1:标识:(onnx_node!Identity_0)从域=‘ai.onnx’OpenCV(4.6.0-dev) E:\Libraries\C++\opencv_gpu\opencv_source\modules\dnn\src\onnx\onnx_importer.cpp:1040:错误:(-2:未指定的错误)函数'cv::dnn::dnn4_v20220524::ONNXImporter::handleNode‘> Node Identity@ai.onnx:(onnx_node!Identity_0)解析错误: OpenCV(4.6.0-dev) E:\Libraries\C++\opencv_gpu\opencv_source\modules\dnn\src\layer.cpp:246:错误:(-215:断言失败)函数'cv::dnn::dnn4_v20220524::Layer::getMemoryShapes‘>中的inputs.size()
再现错误的最小代码如下:
#include <iostream>
#include <fstream>
// openCV related includes
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
using namespace cv::dnn;
using namespace cuda;
int main()
{
printCudaDeviceInfo(0);
// Load model.
Net net;
try
{
//net = readNet("yolov5s.onnx");
net = readNetFromONNX("yolov5s.onnx");
}
catch (cv::Exception& e)
{
cerr << endl << endl << e.msg << endl << endl; // output exception message
return -1;
}
return 0
}我在windows上使用cmake从源代码中构建了OpenCV和CUDA / CuDNN其他相关模块。(OpenCV版本4.6.0)。
我为什么要得到这个例外?如何正确加载onnx模型的yolo
发布于 2022-08-04 20:25:38
免责声明:除C++外,我没有使用任何列出的技术的经验。
所看到的错误消息的最后一行。
E:\Libraries\C++\opencv_gpu\opencv_source\modules\dnn\src\layer.cpp:246:错误:(-215:断言失败)函数'cv::dnn::dnn4_v20220524::Layer::getMemoryShapes‘>中的inputs.size()
inputs.size()是非零的断言失败了.我认为这可能是由于您没有为Net对象设置输入。在您链接到的教程中,在4.3.4节中,它们实现了一个助手函数"pre_process",该函数接受输入图像,将其转换为blob,并将其设置为网络的输入。有关在main函数中如何/在何处调用main,请参见4.3.6节。在您提供的最小可复制示例之外,您是否遵循了本教程的这一部分?
我对ONNX一无所知,所以如果您的输入是在您的ONNX文件中设置的,请将该文件的正文添加到您的最小可复制示例中。
发布于 2022-08-11 07:36:40
我使用了您最好的最小示例,并使用opencv 4.6.0 (从源代码构建)复制了错误:
[ERROR:0] global ../modules/dnn/src/onnx/onnx_importer.cpp (1876) handleNode DNN/ONNX: ERROR during processing node with 1 inputs and 1 outputs: [Identity]:(onnx::Reshape_475)我似乎是一个版本问题:
我还没有找到正确的组合(我尝试了一些),但是在您提到的文章的评论部分,有人建议使用opencv版本的4.5.4.60
另一种方法是使用其他格式,如TensorFlow GraphDef *.pb文件,funtion 简历::dnn::readNet建议了更多的选项:
*.caffemodel (Caffe, http://caffe.berkeleyvision.org/)
*.pb (TensorFlow, https://www.tensorflow.org/)
*.t7 | *.net (Torch, http://torch.ch/)
*.weights (Darknet, https://pjreddie.com/darknet/)
*.bin (DLDT, https://software.intel.com/openvino-toolkit)
*.onnx (ONNX, https://onnx.ai/)该项目的export.py脚本yolov5提供了一些选项: Format \x、export.py --include、export.py --include、yolov5s.torchscript ONNX / onnx,yolov5s.onnx,OpenVINO,openvino,openvino,yolov5s_openvino_model/ TensorRT,engine,yolov5s.engine CoreML,coremlyolov5s.mlmodel TensorFlow SavedModel saved_model saved_model yolov5s_saved_model/ TensorFlow GraphDef pb pb yolov5s.pb TensorFlow Lite Lite yolov5s.pb TensorFlow tflite yolov5s.tflite TensorFlow边缘TPU edgetpu yolov5s_edgetpu.tflite TensorFlow.js D23 _ yolov5s_web_model/
另一种方法是使用pip包onnx来转换文件版本。见多库。
https://stackoverflow.com/questions/73195979
复制相似问题