首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV::dnn::readNet抛出异常

OpenCV::dnn::readNet抛出异常
EN

Stack Overflow用户
提问于 2022-08-01 15:19:32
回答 2查看 775关注 0票数 3

我遵循本教程,用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()

再现错误的最小代码如下:

代码语言:javascript
复制
#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

EN

回答 2

Stack Overflow用户

发布于 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文件中设置的,请将该文件的正文添加到您的最小可复制示例中。

票数 1
EN

Stack Overflow用户

发布于 2022-08-11 07:36:40

我使用了您最好的最小示例,并使用opencv 4.6.0 (从源代码构建)复制了错误:

代码语言:javascript
复制
[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)

我似乎是一个版本问题:

  1. opencv读取onnx文件(我能够读取其他onnx文件,例如restnet文件这里 )
  2. onnx诉1.12的pip包正在生成一个文件版本(称为onnx 'opset版本‘),该版本还不能由opencv处理。

我还没有找到正确的组合(我尝试了一些),但是在您提到的文章的评论部分,有人建议使用opencv版本的4.5.4.60

另一种方法是使用其他格式,如TensorFlow GraphDef *.pb文件,funtion 简历::dnn::readNet建议了更多的选项:

代码语言:javascript
复制
*.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 --includeexport.py --include、yolov5s.torchscript ONNX / onnx,yolov5s.onnx,OpenVINO,openvinoopenvino,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来转换文件版本。见多库

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73195979

复制
相关文章

相似问题

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