簡體   English   中英

OpenCV::dnn::readNet 拋出異常

[英]OpenCV::dnn::readNet throwing exception

我正在按照本教程使用 OpenCV DNN 模塊加載yolov5*.onnx模型並使用它進行推理。 嘗試加載 model 時出現以下錯誤:

[錯誤: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 個輸出的節點時出錯:[Identity]:(onnx_node.Identity_0) from domain='ai.onnx' OpenCV(4.6.0-dev)

E:\Libraries\C++\opencv_gpu\opencv_source\modules\dnn\src\onnx\onnx_importer.cpp:1040: 錯誤: (-2:Unspecified error) in function 'cv::dnn::dnn4_v20220524::ONNXImporter:: ' > 節點 [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: error: (-215.Assertion failed) inputs:size() in function 'cv: :dnn::dnn4_v20220524::Layer::getMemoryShapes' >

重現錯誤的最小代碼如下:

#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
}

我使用 cmake 從 CUDA / CuDNN 其他相關模塊的源代碼構建 OpenCV 在 Z0F4137ED1502B5044526 上。 (OpenCV 版本 4.6.0)。

為什么我得到這個異常? 如何正確加載onnxyolo

免責聲明:除了 C++ 之外,我沒有使用任何列出的技術的經驗。

您看到的錯誤消息的最后一行

E:\Libraries\C++\opencv_gpu\opencv_source\modules\dnn\src\layer.cpp:246: error: (-215:Assertion failed) inputs.size() in function 'cv::dnn::dnn4_v20220524::Layer::getMemoryShapes' >

未能斷言inputs.size()為非零。 我認為這可能是由於您沒有為Net object 設置輸入。 在您鏈接到的教程中,在第 4.3.4 節中,他們實現了一個幫助器 function“ pre_process ”,它獲取輸入圖像,將其轉換為 blob,並將其設置為網絡的輸入。 有關他們在main function 中調用pre_process的方式/位置,請參見第 4.3.6 節。 您是否在您提供的最小可重現示例之外遵循本教程的那一部分?

我對 ONNX 一無所知,所以如果您的輸入設置在您的 ONNX 文件中,請將文件正文添加到您的最小可重現示例中。

我使用了你很好的最小示例,並使用 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)

我似乎是以下任何一個的版本問題:

  1. opencv 讀取 onnx 文件(我可以毫無問題地讀取其他onnx例如 restnet onnx 文件)
  2. onnx v.1.12 的pip package正在生成 Z94756EA97E3998E2B121DA8BB2DE5 尚無法處理的文件版本(稱為 onnx 'opset 版本')

我還沒有找到正確的組合(我嘗試了一些),但是您提到的文章的評論部分中的一些人建議使用 opencv 版本4.5.4.60

另一種選擇 A) 是使用其他格式,例如 TensorFlow GraphDef *.pb 文件函數cv::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/)

yolov5 項目的export.py腳本提供了一些選項: 格式 | export.py --include | Model --- | --- | --- PyTorch | - | yolov5s.pt TorchScript | torchscript | yolov5s.torchscript ONNX | onnx | yolov5s.onnx OpenVINO | openvino | yolov5s_openvino_model/ TensorRT | engine | yolov5s.engine CoreML | coreml | yolov5s.mlmodel TensorFlow SavedModel | saved_model | yolov5s_saved_model/ TensorFlow GraphDef | pb | yolov5s.pb TensorFlow Lite | tflite | yolov5s.tflite TensorFlow Edge TPU | edgetpu | yolov5s_edgetpu.tflite TensorFlow.js | tfjs | yolov5s_web_model/

替代 B) 可以使用 pip package onnx 來轉換文件版本。 請參閱此處的文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM