मैं एक ओसीआर कार्य करने के लिए यहां से डाउनलोड किए गए एक पूर्व-प्रशिक्षित मॉडल का परीक्षण करना चाहता था। डाउनलोड करने के लिए लिंक, इसका नाम CRNN_VGG_BiLSTM_CTC.onnx है। यह मॉडल यहां से निकाला गया है। नमूना-image.png को यहां से डाउनलोड किया जा सकता है (नीचे दिए गए कोड को देखें) )

जब मैं ब्लॉब में भविष्यवाणी (ओसीआर) करने के लिए तंत्रिका नेटवर्क के आगे करता हूं तो मुझे निम्न त्रुटि मिलती है:

त्रुटि: OpenCV (4.4.0) /tmp/pip-req-build-xgme2194/opencv/modules/dnn/src/layers/convolution_layer.cpp:348: त्रुटि: (-215: अभिकथन विफल) समूह> 0 && inpCn % ngroups == 0 && outCn % ngroups == 0 फ़ंक्शन 'getMemoryShapes' में

नीचे दिए गए कोड को पढ़ने के लिए स्वतंत्र महसूस करें। मैंने कई चीजों की कोशिश की, यह अजीब है क्योंकि इस मॉडल को पूर्व निर्धारित इनपुट आकार की आवश्यकता नहीं है। यदि आप इस मॉडल को पढ़ने और आगे बढ़ाने का कोई तरीका जानते हैं तो यह भी मददगार होगा लेकिन मैं ओपनसीवी का उपयोग करके हल करना चाहता हूं।

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()

अग्रिम में बहुत बहुत धन्यवाद।

4
Tom 30 पद 2020, 00:26

1 उत्तर

सबसे बढ़िया उत्तर

आपकी समस्या वास्तव में यह है कि आप अपने मॉडल को जो इनपुट डेटा खिलाते हैं वह उस डेटा के आकार से मेल नहीं खाता जिस पर मॉडल को प्रशिक्षित किया गया था।

मैंने आपके onnx मॉडल का निरीक्षण करने के लिए इस उत्तर का उपयोग किया और ऐसा प्रतीत होता है कि यह (1, 1, 32, 100) आकार के इनपुट की अपेक्षा करता है। मैंने छवि को 1 x 32 x 100 पिक्सल में बदलने के लिए आपके कोड को संशोधित किया है और अनुमान वास्तव में त्रुटि के बिना चलता है।

संपादित करें

मैंने अनुमान के परिणाम की व्याख्या करने के लिए कुछ कोड जोड़ा है। अब हम छवि और अनुमानित OCR टेक्स्ट प्रदर्शित करते हैं। ऐसा लगता है कि यह काम नहीं कर रहा है, लेकिन OpenCV पर ट्यूटोरियल पढ़ रहा है, दो मॉडल होने चाहिए:

  1. एक जो यह पता लगाता है कि छवि में पाठ कहाँ है। यह नेटवर्क विभिन्न आकारों की छवियों को स्वीकार करता है, यह छवि के भीतर पाठ के स्थानों को लौटाता है और फिर छवि के क्रॉप किए गए हिस्सों को 100x32 आकार के दूसरे को पास किया जाता है
  2. वह जो वास्तव में "रीडिंग" करता है और छवि के दिए गए पैच, वर्ण लौटाता है। इसके लिए, एक फ़ाइल 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()

आशा है कि इससे सहायता मिलेगी। चियर्स

3
Christian 9 जिंदा 2021, 16:19
हैलो, क्रिसिटियन, उत्तर देने के लिए आपका बहुत-बहुत धन्यवाद। मुझे पूरा विश्वास था कि इस नेट के आर्किटेक्चर के लिए एक निश्चित इनपुट आकार की आवश्यकता नहीं थी (क्योंकि उनके अंदर कनवल्शन ऑपरेशन के कारण) लेकिन मैं सही नहीं था। ऐसी गलती! आपने निश्चित रूप से मेरे द्वारा पोस्ट की गई समस्या का समाधान किया है और इसलिए सही के रूप में चिह्नित उत्तर के योग्य हैं। कैसे भी, यह नेट ओसीआर मॉडल के लिए है, क्या आपको पता है कि 100,32 का आकार बदलने से कोई फर्क क्यों पड़ता है? मैंने सोचा था कि यह ओसीआर मॉडल शब्दों के लिए काम करेगा। लेकिन हो सकता है कि यह मॉडल सिर्फ पात्रों के लिए काम करे और इसके लिए पिछले सेगमेंटेशन मॉडल की क्या जरूरत है?
 – 
Tom
8 जिंदा 2021, 20:49
यदि आप इस बारे में अपने विचार साझा करना चाहते हैं तो यह बहुत मददगार होगा। अग्रिम में बहुत बहुत धन्यवाद!
 – 
Tom
8 जिंदा 2021, 20:49
हैलो टॉम, आपका स्वागत है! ठीक है, मैं इस विशेष नेटवर्क से परिचित नहीं हूँ (क्या आपके पास इसकी वास्तुकला कहीं कागज से है या तो?)
 – 
Christian
8 जिंदा 2021, 21:03
इस बारे में कि क्या आकार बदलना समझ में आता है, यह एक अच्छा सवाल है। यह समझ में आता है कि अक्षर लगभग एक ही आकार के हैं आकार बदलने के बाद प्रशिक्षण के समय की तुलना में। यदि नहीं, तो नेटवर्क शायद सही वर्णों को वापस करने के लिए संघर्ष करेगा।
 – 
Christian
8 जिंदा 2021, 21:05
हाय टॉम, मेरे उत्तर में मेरे संपादन देखें, मुझे आशा है कि यह आपकी और मदद करेगा
 – 
Christian
9 जिंदा 2021, 16:20