मैं एक ओसीआर कार्य करने के लिए यहां से डाउनलोड किए गए एक पूर्व-प्रशिक्षित मॉडल का परीक्षण करना चाहता था। डाउनलोड करने के लिए लिंक, इसका नाम 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()
अग्रिम में बहुत बहुत धन्यवाद।
1 उत्तर
आपकी समस्या वास्तव में यह है कि आप अपने मॉडल को जो इनपुट डेटा खिलाते हैं वह उस डेटा के आकार से मेल नहीं खाता जिस पर मॉडल को प्रशिक्षित किया गया था।
मैंने आपके onnx मॉडल का निरीक्षण करने के लिए इस उत्तर का उपयोग किया और ऐसा प्रतीत होता है कि यह (1, 1, 32, 100)
आकार के इनपुट की अपेक्षा करता है। मैंने छवि को 1 x 32 x 100
पिक्सल में बदलने के लिए आपके कोड को संशोधित किया है और अनुमान वास्तव में त्रुटि के बिना चलता है।
संपादित करें
मैंने अनुमान के परिणाम की व्याख्या करने के लिए कुछ कोड जोड़ा है। अब हम छवि और अनुमानित OCR टेक्स्ट प्रदर्शित करते हैं। ऐसा लगता है कि यह काम नहीं कर रहा है, लेकिन 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
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।