मशीन लर्निंग किट का इस्तेमाल, इमेज या वीडियो में मौजूद टेक्स्ट की पहचान करने के लिए किया जा सकता है. जैसे, स्ट्रीट साइन का टेक्स्ट. इस सुविधा की खास बातें ये हैं:
टेक्स्ट की पहचान v2 एपीआई | |
---|---|
ब्यौरा | इमेज या वीडियो में मौजूद टेक्स्ट की पहचान करें. साथ ही, यह लैटिन, चाइनीज़, देवनागरी, जैपनीज़, और कोरियन स्क्रिप्ट और कई भाषाओं में उपलब्ध होने पर भी काम करता है. |
SDK टूल के नाम | GoogleMLKit/TextRecognition |
लागू करने का तरीका | बिल्ड के समय ऐसेट, आपके ऐप्लिकेशन से स्टैटिक रूप से लिंक होती हैं |
ऐप्लिकेशन के साइज़ का असर | हर स्क्रिप्ट SDK टूल के लिए, करीब 38 एमबी |
परफ़ॉर्मेंस | लैटिन स्क्रिप्ट SDK टूल के लिए ज़्यादातर डिवाइसों पर रीयल-टाइम, अन्य डिवाइसों के लिए धीमा. |
इसे आज़माएं
- इस एपीआई के इस्तेमाल का उदाहरण देखने के लिए, ऐप्लिकेशन के सैंपल को आज़माएं.
- कोडलैब की मदद से, खुद ही कोड आज़माकर देखें.
शुरू करने से पहले
- अपने Podfile में, एमएल किट के ये पॉड शामिल करें:
# To recognize Latin script pod 'GoogleMLKit/TextRecognition', '3.2.0' # To recognize Chinese script pod 'GoogleMLKit/TextRecognitionChinese', '3.2.0' # To recognize Devanagari script pod 'GoogleMLKit/TextRecognitionDevanagari', '3.2.0' # To recognize Japanese script pod 'GoogleMLKit/TextRecognitionJapanese', '3.2.0' # To recognize Korean script pod 'GoogleMLKit/TextRecognitionKorean', '3.2.0'
- अपने प्रोजेक्ट के पॉड को इंस्टॉल या अपडेट करने के बाद, Xcode प्रोजेक्ट के
.xcworkspace
का इस्तेमाल करें. ML किट, Xcode 12.4 या इसके बाद के वर्शन पर काम करती है.
1. TextRecognizer
का एक इंस्टेंस बनाएं
आपने ऊपर जिस SDK टूल को निर्भरता के तौर पर बताया है उससे जुड़े विकल्पों को पास करके, +textRecognizer(options:)
को कॉल करके TextRecognizer
का इंस्टेंस बनाएं:
Swift
// When using Latin script recognition SDK let latinOptions = TextRecognizerOptions() let latinTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Chinese script recognition SDK let chineseOptions = ChineseTextRecognizerOptions() let chineseTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Devanagari script recognition SDK let devanagariOptions = DevanagariTextRecognizerOptions() let devanagariTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Japanese script recognition SDK let japaneseOptions = JapaneseTextRecognizerOptions() let japaneseTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Korean script recognition SDK let koreanOptions = KoreanTextRecognizerOptions() let koreanTextRecognizer = TextRecognizer.textRecognizer(options:options)
Objective-C
// When using Latin script recognition SDK MLKTextRecognizerOptions *latinOptions = [[MLKTextRecognizerOptions alloc] init]; MLKTextRecognizer *latinTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Chinese script recognition SDK MLKChineseTextRecognizerOptions *chineseOptions = [[MLKChineseTextRecognizerOptions alloc] init]; MLKTextRecognizer *chineseTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Devanagari script recognition SDK MLKDevanagariTextRecognizerOptions *devanagariOptions = [[MLKDevanagariTextRecognizerOptions alloc] init]; MLKTextRecognizer *devanagariTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Japanese script recognition SDK MLKJapaneseTextRecognizerOptions *japaneseOptions = [[MLKJapaneseTextRecognizerOptions alloc] init]; MLKTextRecognizer *japaneseTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Korean script recognition SDK MLKKoreanTextRecognizerOptions *koreanOptions = [[MLKKoreanTextRecognizerOptions alloc] init]; MLKTextRecognizer *koreanTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options];
2. इनपुट इमेज तैयार करें
इमेज कोUIImage
या CMSampleBufferRef
के तौर पर TextRecognizer
के process(_:completion:)
तरीके से पास करें:
UIImage
या
CMSampleBuffer
का इस्तेमाल करके, VisionImage
ऑब्जेक्ट बनाएं.
अगर UIImage
का इस्तेमाल किया जाता है, तो यह तरीका अपनाएं:
UIImage
की मदद सेVisionImage
ऑब्जेक्ट बनाएं. पक्का करें कि आपने सही.orientation
डाला हो.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
अगर CMSampleBuffer
का इस्तेमाल किया जाता है, तो यह तरीका अपनाएं:
-
CMSampleBuffer
में शामिल इमेज डेटा का ओरिएंटेशन बताएं.इमेज ओरिएंटेशन पाने के लिए:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> UIImage.Orientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftMirrored : .right case .landscapeLeft: return cameraPosition == .front ? .downMirrored : .up case .portraitUpsideDown: return cameraPosition == .front ? .rightMirrored : .left case .landscapeRight: return cameraPosition == .front ? .upMirrored : .down case .faceDown, .faceUp, .unknown: return .up } }
Objective-C
- (UIImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored : UIImageOrientationRight; case UIDeviceOrientationLandscapeLeft: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored : UIImageOrientationUp; case UIDeviceOrientationPortraitUpsideDown: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored : UIImageOrientationLeft; case UIDeviceOrientationLandscapeRight: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored : UIImageOrientationDown; case UIDeviceOrientationUnknown: case UIDeviceOrientationFaceUp: case UIDeviceOrientationFaceDown: return UIImageOrientationUp; } }
CMSampleBuffer
ऑब्जेक्ट और ओरिएंटेशन का इस्तेमाल करके,VisionImage
ऑब्जेक्ट बनाएं:Swift
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
Objective-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
3. इमेज को प्रोसेस करें
इसके बाद, इमेज को process(_:completion:)
तरीके से पास करें:
Swift
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // Error handling return } // Recognized text }
Objective-C
[textRecognizer processImage:image completion:^(MLKText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // Error handling return; } // Recognized text }];
4. पहचाने गए टेक्स्ट के ब्लॉक से टेक्स्ट निकालें
अगर टेक्स्ट पहचानने वाली कार्रवाई हो जाती है, तो यह Text
ऑब्जेक्ट दिखाता है. Text
ऑब्जेक्ट में पूरा टेक्स्ट और इमेज में शून्य या उससे ज़्यादा TextBlock
ऑब्जेक्ट होने की पहचान की जा सकती है.
हर TextBlock
, टेक्स्ट के आयताकार ब्लॉक को दिखाता है, जिसमें
शून्य या उससे ज़्यादा TextLine
ऑब्जेक्ट होते हैं. हर TextLine
ऑब्जेक्ट में शून्य या उससे ज़्यादा TextElement
ऑब्जेक्ट हैं, जो शब्दों और शब्द जैसी इकाइयों को दिखाते हैं, जैसे कि तारीख और संख्याएं.
आपके पास हर TextBlock
, TextLine
, और
TextElement
ऑब्जेक्ट के लिए, टेक्स्ट की पहचान करने का विकल्प होता है. इसे क्षेत्र और उस क्षेत्र के निर्देशांकों (बाउंडिंग कोऑर्डिनेट) पर लागू किया जा सकता है.
उदाहरण के लिए:
Swift
let resultText = result.text for block in result.blocks { let blockText = block.text let blockLanguages = block.recognizedLanguages let blockCornerPoints = block.cornerPoints let blockFrame = block.frame for line in block.lines { let lineText = line.text let lineLanguages = line.recognizedLanguages let lineCornerPoints = line.cornerPoints let lineFrame = line.frame for element in line.elements { let elementText = element.text let elementCornerPoints = element.cornerPoints let elementFrame = element.frame } } }
Objective-C
NSString *resultText = result.text; for (MLKTextBlock *block in result.blocks) { NSString *blockText = block.text; NSArray<MLKTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages; NSArray<NSValue *> *blockCornerPoints = block.cornerPoints; CGRect blockFrame = block.frame; for (MLKTextLine *line in block.lines) { NSString *lineText = line.text; NSArray<MLKTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages; NSArray<NSValue *> *lineCornerPoints = line.cornerPoints; CGRect lineFrame = line.frame; for (MLKTextElement *element in line.elements) { NSString *elementText = element.text; NSArray<NSValue *> *elementCornerPoints = element.cornerPoints; CGRect elementFrame = element.frame; } } }
इनपुट इमेज के लिए दिशा-निर्देश
-
एमएल किट की सही तरीके से टेक्स्ट की पहचान करने के लिए, इनपुट इमेज में ऐसा टेक्स्ट होना चाहिए जिसे काफ़ी पिक्सल डेटा से दिखाया गया हो. आम तौर पर, हर वर्ण कम से कम 16x16 पिक्सल का होना चाहिए. आम तौर पर, वर्णों को 24x24 पिक्सल से ज़्यादा सटीक होने का कोई फ़ायदा नहीं होता.
उदाहरण के लिए, 640x480 पिक्सल की इमेज का इस्तेमाल करके, बिज़नेस कार्ड को स्कैन किया जा सकता है. यह कार्ड इमेज की पूरी चौड़ाई को दिखाता है. लेटर साइज़ के पेपर पर प्रिंट किए गए दस्तावेज़ को स्कैन करने के लिए, 720x1280 पिक्सल की इमेज की ज़रूरत पड़ सकती है.
-
खराब इमेज फ़ोकस, टेक्स्ट पहचानने के सटीक तरीके पर असर डाल सकता है. अगर आपको सही नतीजे नहीं मिल रहे हैं, तो उपयोगकर्ता से इमेज को दोबारा कैप्चर करने के लिए कहें.
-
अगर आपको किसी रीयल-टाइम ऐप्लिकेशन में टेक्स्ट की पहचान हो रही है, तो आपको इनपुट इमेज के सभी डाइमेंशन पर ध्यान देना चाहिए. छोटी इमेज को ज़्यादा तेज़ी से प्रोसेस किया जा सकता है. इंतज़ार के समय को कम करने के लिए, पक्का करें कि टेक्स्ट, इमेज के ज़्यादा से ज़्यादा हिस्से का इस्तेमाल करे. साथ ही, कम रिज़ॉल्यूशन में इमेज कैप्चर करें (ऊपर बताई गई सटीक ज़रूरी शर्तों को ध्यान में रखते हुए). ज़्यादा जानकारी के लिए, परफ़ॉर्मेंस बेहतर बनाने के लिए सलाह देखें.
परफ़ॉर्मेंस को बेहतर बनाने के लिए सलाह
- वीडियो फ़्रेम को प्रोसेस करने के लिए, डिटेक्टर के
results(in:)
सिंक्रोनस एपीआई का इस्तेमाल करें. दिए गए वीडियो फ़्रेम से इस तरीके को सिंक करते हुए नतीजे पाने के लिए,AVCaptureVideoDataOutputSampleBufferDelegate
केcaptureOutput(_, didOutput:from:)
फ़ंक्शन से इस तरीके को कॉल करें. डिटेक्टर के पास कॉल रोकने के लिए,AVCaptureVideoDataOutput
केalwaysDiscardsLateVideoFrames
कोtrue
के तौर पर सेट करें. अगर डिटेक्टर के चालू रहने के दौरान कोई नया वीडियो फ़्रेम उपलब्ध हो जाता है, तो उसे हटा दिया जाएगा. - अगर इनपुट इमेज पर ग्राफ़िक ओवरले करने के लिए, डिटेक्टर के आउटपुट का इस्तेमाल किया जाता है, तो सबसे पहले एमएल किट से नतीजा पाएं. इसके बाद, एक ही बार में इमेज और ओवरले को रेंडर करें. ऐसा करने पर, प्रोसेस किए गए हर इनपुट फ़्रेम के लिए सिर्फ़ एक बार डिसप्ले की सतह पर इमेज बनाई जाती है. उदाहरण के लिए, एमएल किट के क्विकस्टार्ट सैंपल में updatePreviewOverlayViewWithLastFrame देखें.
- इससे कम रिज़ॉल्यूशन वाली इमेज कैप्चर की जा सकती हैं. हालांकि, इस एपीआई की इमेज डाइमेंशन से जुड़ी ज़रूरी शर्तों का भी ध्यान रखें.
- परफ़ॉर्मेंस में होने वाली संभावित गिरावट से बचने के लिए, एक साथ
TextRecognizer
को अलग-अलग स्क्रिप्ट के विकल्पों के साथ न चलाएं.