iOS पर Firebase एमएल की मदद से, इमेज में मौजूद टेक्स्ट की पहचान करें

इमेज में मौजूद टेक्स्ट की पहचान करने के लिए, Firebase एमएल का इस्तेमाल किया जा सकता है. Firebase ML में अलग-अलग कामों के लिए इस्तेमाल किए जाने वाले ऐसे एपीआई हैं जो इमेज में मौजूद टेक्स्ट की पहचान करने के लिए सही हैं, जैसे कि सड़क के निशान का टेक्स्ट और दस्तावेज़ों के टेक्स्ट की पहचान करने के लिए ऑप्टिमाइज़ किया गया एपीआई.

वेब कंटेनर इंस्टॉल करने से पहले

    अगर आपने पहले से अपने ऐप्लिकेशन में Firebase नहीं जोड़ा है, तो शुरुआती निर्देश में दिए गए निर्देशों का पालन करके ऐसा करें.

    Firebase डिपेंडेंसी इंस्टॉल और मैनेज करने के लिए, Swift पैकेज मैनेजर का इस्तेमाल करें.

    1. Xcode में, अपना ऐप्लिकेशन प्रोजेक्ट खोलने के लिए, फ़ाइल > पैकेज जोड़ें पर जाएं.
    2. जब कहा जाए, तब Firebase Apple प्लैटफ़ॉर्म SDK टूल का रिपॉज़िटरी जोड़ें:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Firebase ML लाइब्रेरी चुनें.
    5. अपने टारगेट की बिल्ड सेटिंग के अन्य लिंकर फ़्लैग सेक्शन में -ObjC फ़्लैग जोड़ें.
    6. यह काम पूरा होने के बाद, Xcode बैकग्राउंड में आपकी डिपेंडेंसी को अपने-आप रिज़ॉल्व और डाउनलोड करना शुरू कर देगा.

    इसके बाद, कुछ इन-ऐप्लिकेशन सेटअप करें:

    1. अपने ऐप्लिकेशन में, Firebase इंपोर्ट करें:

      Swift

      import FirebaseMLModelDownloader

      Objective-C

      @import FirebaseMLModelDownloader;
  1. अगर आपने पहले से अपने प्रोजेक्ट के लिए क्लाउड-आधारित एपीआई चालू नहीं किए हैं, तो अभी करें:

    1. Firebase कंसोल का Firebase ML एपीआई पेज खोलें.
    2. अगर आपने अपने प्रोजेक्ट को पहले से ब्लेज़ प्राइसिंग प्लान में अपग्रेड नहीं किया है, तो ऐसा करने के लिए अपग्रेड करें पर क्लिक करें. (अगर आपका प्रोजेक्ट ब्लेज़ प्लान में नहीं है, तो आपको अपग्रेड करने के लिए कहा जाएगा.)

      सिर्फ़ ब्लेज़-लेवल के प्रोजेक्ट ही क्लाउड-आधारित एपीआई का इस्तेमाल कर सकते हैं.

    3. अगर क्लाउड-आधारित एपीआई पहले से चालू नहीं हैं, तो क्लाउड-आधारित एपीआई चालू करें पर क्लिक करें.

अब आप इमेज में मौजूद टेक्स्ट की पहचान करने के लिए तैयार हैं.

इनपुट इमेज के लिए दिशा-निर्देश

  • Firebase एमएल, टेक्स्ट की सही पहचान कर सके, इसके लिए इनपुट इमेज में ऐसा टेक्स्ट होना चाहिए जो ज़रूरत के मुताबिक पिक्सल डेटा के ज़रिए दिखाया गया हो. आम तौर पर, लैटिन टेक्स्ट के लिए हर वर्ण कम से कम 16x16 पिक्सल का होना चाहिए. चाइनीज़, जैपनीज़, और कोरियन टेक्स्ट के लिए, हर वर्ण 24x24 पिक्सल का होना चाहिए. सभी भाषाओं के लिए, आम तौर पर वर्णों के लिए 24x24 पिक्सल से बड़े साइज़ का कोई सटीक फ़ायदा नहीं होता.

    उदाहरण के लिए, पूरी चौड़ाई में दिखने वाले बिज़नेस कार्ड को स्कैन करने के लिए, 640x480 इमेज का इस्तेमाल करना सही रहेगा. अक्षरों के साइज़ के पेपर पर प्रिंट किए गए दस्तावेज़ को स्कैन करने के लिए, 720x1280 पिक्सल की इमेज की ज़रूरत पड़ सकती है.

  • इमेज पर फ़ोकस खराब होने से, टेक्स्ट की पहचान करने के तरीके पर बुरा असर पड़ सकता है. अगर आपको मान्य नतीजे नहीं मिल रहे हैं, तो उपयोगकर्ता को इमेज दोबारा कैप्चर करने के लिए कहें.


इमेज में मौजूद टेक्स्ट की पहचान करें

किसी इमेज में मौजूद टेक्स्ट की पहचान करने के लिए, टेक्स्ट आइडेंटिफ़ायर को नीचे बताए गए तरीके से चलाएं.

1. टेक्स्ट आइडेंटिफ़ायर चलाएं

VisionTextRecognizer के process(_:completion:) वाले तरीके के लिए, इमेज को UIImage या CMSampleBufferRef के तौर पर पास करें:

  1. cloudTextRecognizer को कॉल करके VisionTextRecognizer का इंस्टेंस पाएं:

    Swift

    let vision = Vision.vision()
    let textRecognizer = vision.cloudTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudTextRecognizer(options: options)
    

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudTextRecognizerOptions *options =
            [[FIRVisionCloudTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizerWithOptions:options];
    
  2. Cloud Vision को कॉल करने के लिए, इमेज को base64 कोड में बदली गई स्ट्रिंग के तौर पर फ़ॉर्मैट किया जाना चाहिए. UIImage प्रोसेस करने के लिए:

    Swift

    guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return }
    let base64encodedImage = imageData.base64EncodedString()

    Objective-C

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. इसके बाद, process(_:completion:) तरीके से इमेज पास करें:

    Swift

    textRecognizer.process(visionImage) { result, error in
      guard error == nil, let result = result else {
        // ...
        return
      }
    
      // Recognized text
    }
    

    Objective-C

    [textRecognizer processImage:image
                      completion:^(FIRVisionText *_Nullable result,
                                   NSError *_Nullable error) {
      if (error != nil || result == nil) {
        // ...
        return;
      }
    
      // Recognized text
    }];
    

2. पहचाने गए टेक्स्ट के ब्लॉक से टेक्स्ट निकालें

अगर टेक्स्ट की पहचान करने की कार्रवाई पूरी हो जाती है, तो यह एक VisionText ऑब्जेक्ट दिखाएगा. VisionText ऑब्जेक्ट में, इमेज में पहचाना गया पूरा टेक्स्ट और शून्य या उससे ज़्यादा VisionTextBlock ऑब्जेक्ट शामिल हैं.

हर VisionTextBlock, टेक्स्ट के ऐसे आयताकार ब्लॉक को दिखाता है जिसमें शून्य या उससे ज़्यादा VisionTextLine ऑब्जेक्ट होते हैं. हर VisionTextLine ऑब्जेक्ट में शून्य या उससे ज़्यादा VisionTextElement ऑब्जेक्ट होते हैं. ये ऑब्जेक्ट, शब्दों और शब्द जैसी इकाइयों (तारीख, संख्या वगैरह) को दिखाते हैं.

हर VisionTextBlock, VisionTextLine, और VisionTextElement ऑब्जेक्ट के लिए, आपको इलाके में टेक्स्ट और क्षेत्र के बाउंडिंग कोऑर्डिनेट की पहचान की जा सकती है.

उदाहरण के लिए:

Swift

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockConfidence = block.confidence
    let blockLanguages = block.recognizedLanguages
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for line in block.lines {
        let lineText = line.text
        let lineConfidence = line.confidence
        let lineLanguages = line.recognizedLanguages
        let lineCornerPoints = line.cornerPoints
        let lineFrame = line.frame
        for element in line.elements {
            let elementText = element.text
            let elementConfidence = element.confidence
            let elementLanguages = element.recognizedLanguages
            let elementCornerPoints = element.cornerPoints
            let elementFrame = element.frame
        }
    }
}

Objective-C

NSString *resultText = result.text;
for (FIRVisionTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages;
  NSArray<NSValue *> *blockCornerPoints = block.cornerPoints;
  CGRect blockFrame = block.frame;
  for (FIRVisionTextLine *line in block.lines) {
    NSString *lineText = line.text;
    NSNumber *lineConfidence = line.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages;
    NSArray<NSValue *> *lineCornerPoints = line.cornerPoints;
    CGRect lineFrame = line.frame;
    for (FIRVisionTextElement *element in line.elements) {
      NSString *elementText = element.text;
      NSNumber *elementConfidence = element.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *elementLanguages = element.recognizedLanguages;
      NSArray<NSValue *> *elementCornerPoints = element.cornerPoints;
      CGRect elementFrame = element.frame;
    }
  }
}

अगले चरण


दस्तावेज़ों की इमेज में मौजूद टेक्स्ट की पहचान करें

किसी दस्तावेज़ के टेक्स्ट की पहचान करने के लिए, दस्तावेज़ के टेक्स्ट आइडेंटिफ़ायर को कॉन्फ़िगर करें और उसे चलाएं. इसके बारे में नीचे बताया गया है.

दस्तावेज़ टेक्स्ट की पहचान करने वाला एपीआई, जिसके बारे में नीचे बताया गया है. इस एपीआई की मदद से, ऐसा इंटरफ़ेस मिलता है जिसकी मदद से दस्तावेज़ों की इमेज पर आसानी से काम किया जा सकता है. हालांकि, अगर आपको Spirse text API का इंटरफ़ेस पसंद है, तो इसका इस्तेमाल दस्तावेज़ों को स्कैन करने के लिए किया जा सकता है. इसके लिए, क्लाउड टेक्स्ट आइडेंटिफ़ायर को डेंस टेक्स्ट मॉडल का इस्तेमाल करने के लिए कॉन्फ़िगर करें.

दस्तावेज़ टेक्स्ट की पहचान करने वाले एपीआई का इस्तेमाल करने के लिए:

1. टेक्स्ट आइडेंटिफ़ायर चलाएं

VisionDocumentTextRecognizer के process(_:completion:) वाले तरीके के लिए, इमेज को UIImage या CMSampleBufferRef के तौर पर पास करें:

  1. cloudDocumentTextRecognizer को कॉल करके VisionDocumentTextRecognizer का इंस्टेंस पाएं:

    Swift

    let vision = Vision.vision()
    let textRecognizer = vision.cloudDocumentTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudDocumentTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudDocumentTextRecognizer(options: options)
    

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudDocumentTextRecognizerOptions *options =
            [[FIRVisionCloudDocumentTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizerWithOptions:options];
    
  2. Cloud Vision को कॉल करने के लिए, इमेज को base64 कोड में बदली गई स्ट्रिंग के तौर पर फ़ॉर्मैट किया जाना चाहिए. UIImage प्रोसेस करने के लिए:

    Swift

    guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return }
    let base64encodedImage = imageData.base64EncodedString()

    Objective-C

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. इसके बाद, process(_:completion:) तरीके से इमेज पास करें:

    Swift

    textRecognizer.process(visionImage) { result, error in
      guard error == nil, let result = result else {
        // ...
        return
      }
    
      // Recognized text
    }
    

    Objective-C

    [textRecognizer processImage:image
                      completion:^(FIRVisionDocumentText *_Nullable result,
                                   NSError *_Nullable error) {
      if (error != nil || result == nil) {
        // ...
        return;
      }
    
        // Recognized text
    }];
    

2. पहचाने गए टेक्स्ट के ब्लॉक से टेक्स्ट निकालें

अगर टेक्स्ट की पहचान करने की कार्रवाई पूरी हो जाती है, तो यह एक VisionDocumentText ऑब्जेक्ट दिखाएगा. VisionDocumentText ऑब्जेक्ट में, इमेज में पहचाना गया पूरा टेक्स्ट और उन ऑब्जेक्ट की हैरारकी होती है जो मान्य दस्तावेज़ के स्ट्रक्चर को दिखाते हैं:

हर VisionDocumentTextBlock, VisionDocumentTextParagraph, VisionDocumentTextWord, और VisionDocumentTextSymbol ऑब्जेक्ट के लिए, आपके पास क्षेत्र और इलाके के बाउंडिंग कोऑर्डिनेट के टेक्स्ट की पहचान करने का विकल्प है.

उदाहरण के लिए:

Swift

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockConfidence = block.confidence
    let blockRecognizedLanguages = block.recognizedLanguages
    let blockBreak = block.recognizedBreak
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for paragraph in block.paragraphs {
        let paragraphText = paragraph.text
        let paragraphConfidence = paragraph.confidence
        let paragraphRecognizedLanguages = paragraph.recognizedLanguages
        let paragraphBreak = paragraph.recognizedBreak
        let paragraphCornerPoints = paragraph.cornerPoints
        let paragraphFrame = paragraph.frame
        for word in paragraph.words {
            let wordText = word.text
            let wordConfidence = word.confidence
            let wordRecognizedLanguages = word.recognizedLanguages
            let wordBreak = word.recognizedBreak
            let wordCornerPoints = word.cornerPoints
            let wordFrame = word.frame
            for symbol in word.symbols {
                let symbolText = symbol.text
                let symbolConfidence = symbol.confidence
                let symbolRecognizedLanguages = symbol.recognizedLanguages
                let symbolBreak = symbol.recognizedBreak
                let symbolCornerPoints = symbol.cornerPoints
                let symbolFrame = symbol.frame
            }
        }
    }
}

Objective-C

NSString *resultText = result.text;
for (FIRVisionDocumentTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockRecognizedLanguages = block.recognizedLanguages;
  FIRVisionTextRecognizedBreak *blockBreak = block.recognizedBreak;
  CGRect blockFrame = block.frame;
  for (FIRVisionDocumentTextParagraph *paragraph in block.paragraphs) {
    NSString *paragraphText = paragraph.text;
    NSNumber *paragraphConfidence = paragraph.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *paragraphRecognizedLanguages = paragraph.recognizedLanguages;
    FIRVisionTextRecognizedBreak *paragraphBreak = paragraph.recognizedBreak;
    CGRect paragraphFrame = paragraph.frame;
    for (FIRVisionDocumentTextWord *word in paragraph.words) {
      NSString *wordText = word.text;
      NSNumber *wordConfidence = word.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *wordRecognizedLanguages = word.recognizedLanguages;
      FIRVisionTextRecognizedBreak *wordBreak = word.recognizedBreak;
      CGRect wordFrame = word.frame;
      for (FIRVisionDocumentTextSymbol *symbol in word.symbols) {
        NSString *symbolText = symbol.text;
        NSNumber *symbolConfidence = symbol.confidence;
        NSArray<FIRVisionTextRecognizedLanguage *> *symbolRecognizedLanguages = symbol.recognizedLanguages;
        FIRVisionTextRecognizedBreak *symbolBreak = symbol.recognizedBreak;
        CGRect symbolFrame = symbol.frame;
      }
    }
  }
}

अगले चरण