gpt4 book ai didi

python - 使用 .onnx 模型的 OpenCV(Ptyhon)的 DNN 模块中的前向方法错误

转载 作者:行者123 更新时间:2023-12-03 18:57:39 25 4
gpt4 key购买 nike

我想测试从这里下载的预训练模型以执行 ocr 任务。 Link to download ,它的名字是CRNN_VGG_BiLSTM_CTC.onnx。此模型摘自 here . sample-image.png 可以从 here 下载(见下面的代码)。
当我在 blob 中执行神经网络的前向预测 (ocr) 时,出现以下错误:

error: OpenCV(4.4.0) /tmp/pip-req-build-xgme2194/opencv/modules/dnn/src/layers/convolution_layer.cpp:348: error: (-215:Assertion failed) ngroups > 0 && inpCn % ngroups == 0 && outCn % ngroups == 0 in function 'getMemoryShapes'


随意阅读下面的代码。我尝试了很多东西,这很奇怪,因为这个模型不需要预先确定的输入形状。如果您知道阅读此模型并进行转发的任何方法,那么它也会有所帮助,但我宁愿使用 OpenCV 解决。
import cv2 as cv
# The model is downloaded from here https://drive.google.com/drive/folders/1cTbQ3nuZG-EKWak6emD_s8_hHXWz7lAr
# model path
modelRecognition = os.path.join(MODELS_PATH,'CRNN_VGG_BiLSTM_CTC.onnx')
# read net
recognizer = cv.dnn.readNetFromONNX(modelRecognition)

# Download sample_image.png from https://i.ibb.co/fMmCB7J/sample-image.png (image host website)
sample_image = cv.imread('sample-image.png')
# Height , Width and number of channels of the image
H, W, C = sample_image.shape

# Create a 4D blob from cropped image
blob = cv.dnn.blobFromImage(sample_image, size = (H, W))

recognizer.setInput(blob)

# Here is where i get the errror that I mentioned before
result = recognizer.forward()
非常感谢你。

最佳答案

您的问题实际上是您提供给模型的输入数据与训练模型的数据的形状不匹配。
我用了this answer检查您的 onnx 模型,它似乎需要一个形状为 (1, 1, 32, 100) 的输入.我修改了您的代码以将图像 reshape 为 1 x 32 x 100像素和推理实际上运行没有错误。
编辑
我添加了一些代码来解释推理的结果。我们现在显示图像和推断的 OCR 文本。
这似乎不起作用,但阅读 the tutorial on OpenCV ,应该有两个模型:

  • 一种检测图像中存在文本的位置。该网络接受各种大小的图像,它返回图像中文本的位置,然后裁剪图像的部分,大小为 100x32 的图像传递给第二个
  • 一个真正执行“阅读”并给定图像补丁的人返回字符。为此,有一个文件 alphabet_36.txt它与预训练模型一起提供。

  • 我不清楚使用哪个网络进行文本检测。希望下面编辑的代码可以帮助您进一步开发您的应用程序。
    import cv2 as cv
    import os
    import numpy as np
    import matplotlib.pyplot as plt
    # The model is downloaded from here https://drive.google.com/drive/folders/1cTbQ3nuZG-EKWak6emD_s8_hHXWz7lAr
    # model path
    MODELS_PATH = './'
    modelRecognition = os.path.join(MODELS_PATH,'CRNN_VGG_BiLSTM_CTC.onnx')

    # read net
    recognizer = cv.dnn.readNetFromONNX(modelRecognition)

    # Download sample_image.png from https://i.ibb.co/fMmCB7J/sample-image.png (image host website)
    sample_image = cv.imread('sample-image.png', cv.IMREAD_GRAYSCALE)
    sample_image = cv.resize(sample_image, (100, 32))
    sample_image = sample_image[:,::-1].transpose()

    # Height and Width of the image
    H,W = sample_image.shape

    # Create a 4D blob from image
    blob = cv.dnn.blobFromImage(sample_image, size=(H,W))
    recognizer.setInput(blob)

    # network inference
    result = recognizer.forward()

    # load alphabet
    with open('alphabet_36.txt') as f:
    alphabet = f.readlines()
    alphabet = [f.strip() for f in alphabet]

    # interpret inference results
    res = []
    for i in range(result.shape[0]):
    ind = np.argmax(result[i,0])
    res.append(alphabet[ind])
    ocrtxt = ''.join(res)

    # show image and detected OCR characters
    plt.imshow(sample_image)
    plt.title(ocrtxt)
    plt.show()
    希望能帮助到你。
    干杯

    关于python - 使用 .onnx 模型的 OpenCV(Ptyhon)的 DNN 模块中的前向方法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65498975/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com