iOS-এ Firebase ML-এর সাহায্যে ইমেজে টেক্সট চিনুন

ছবিতে লেখা শনাক্ত করার জন্য আপনি Firebase ML ব্যবহার করতে পারেন। Firebase ML একটি সাধারণ-উদ্দেশ্য API রয়েছে যা ছবিতে লেখা শনাক্ত করার জন্য উপযুক্ত, যেমন রাস্তার চিহ্নের লেখা, এবং নথির লেখা শনাক্ত করার জন্য অপ্টিমাইজ করা একটি API।

শুরু করার আগে

    যদি আপনি ইতিমধ্যেই আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে শুরু করার নির্দেশিকার ধাপগুলি অনুসরণ করে তা করুন।

    ফায়ারবেস নির্ভরতা ইনস্টল এবং পরিচালনা করতে সুইফট প্যাকেজ ম্যানেজার ব্যবহার করুন।

    1. Xcode-এ, আপনার অ্যাপ প্রজেক্ট খোলা থাকা অবস্থায়, File > Add Packages- এ নেভিগেট করুন।
    2. অনুরোধ করা হলে, Firebase Apple platforms SDK সংগ্রহস্থল যোগ করুন:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Firebase ML লাইব্রেরিটি বেছে নিন।
    5. আপনার টার্গেটের বিল্ড সেটিংসের অন্যান্য লিঙ্কার ফ্ল্যাগ বিভাগে -ObjC ফ্ল্যাগ যোগ করুন।
    6. শেষ হয়ে গেলে, Xcode স্বয়ংক্রিয়ভাবে ব্যাকগ্রাউন্ডে আপনার নির্ভরতাগুলি সমাধান এবং ডাউনলোড করা শুরু করবে।

    এরপর, কিছু ইন-অ্যাপ সেটআপ করুন:

    1. আপনার অ্যাপে, Firebase আমদানি করুন:

      সুইফট

      import FirebaseMLModelDownloader

      অবজেক্টিভ-সি

      @import FirebaseMLModelDownloader;
  1. যদি আপনি ইতিমধ্যেই আপনার প্রকল্পের জন্য ক্লাউড-ভিত্তিক API সক্রিয় না করে থাকেন, তাহলে এখনই তা করুন:

    1. Firebase কনসোলে Firebase ML API পৃষ্ঠাটি খুলুন।
    2. যদি আপনি ইতিমধ্যেই আপনার প্রকল্পটিকে পে-অ্যাজ-ইউ-গো ব্লেজ প্রাইসিং প্ল্যানে আপগ্রেড না করে থাকেন, তাহলে আপগ্রেডে ক্লিক করে তা করুন। (আপনার প্রকল্পটি ব্লেজ প্রাইসিং প্ল্যানে না থাকলেই আপনাকে আপগ্রেড করতে বলা হবে।)

      শুধুমাত্র ব্লেজ প্রাইসিং প্ল্যানের প্রকল্পগুলিই ক্লাউড-ভিত্তিক API ব্যবহার করতে পারবে।

    3. যদি ক্লাউড-ভিত্তিক API গুলি ইতিমধ্যেই সক্ষম না থাকে, তাহলে ক্লাউড-ভিত্তিক API গুলি সক্ষম করুন এ ক্লিক করুন।

এখন আপনি ছবিতে লেখা চিনতে শুরু করতে প্রস্তুত।

ছবির নির্দেশিকা ইনপুট করুন

  • Firebase ML সঠিকভাবে টেক্সট শনাক্ত করতে, ইনপুট ছবিতে এমন টেক্সট থাকতে হবে যা পর্যাপ্ত পিক্সেল ডেটা দ্বারা প্রতিনিধিত্ব করে। আদর্শভাবে, ল্যাটিন টেক্সটের জন্য, প্রতিটি অক্ষর কমপক্ষে 16x16 পিক্সেল হওয়া উচিত। চীনা, জাপানি এবং কোরিয়ান টেক্সটের জন্য, প্রতিটি অক্ষর 24x24 পিক্সেল হওয়া উচিত। সমস্ত ভাষার জন্য, 24x24 পিক্সেলের চেয়ে বড় অক্ষরের জন্য সাধারণত কোনও নির্ভুলতার সুবিধা নেই।

    উদাহরণস্বরূপ, একটি 640x480 চিত্র একটি ব্যবসায়িক কার্ড স্ক্যান করার জন্য ভাল কাজ করতে পারে যা ছবির সম্পূর্ণ প্রস্থ দখল করে। অক্ষর আকারের কাগজে মুদ্রিত একটি নথি স্ক্যান করার জন্য, একটি 720x1280 পিক্সেল চিত্রের প্রয়োজন হতে পারে।

  • ছবির দুর্বল ফোকাস টেক্সট শনাক্তকরণের নির্ভুলতার ক্ষতি করতে পারে। যদি আপনি গ্রহণযোগ্য ফলাফল না পান, তাহলে ব্যবহারকারীকে ছবিটি পুনরায় ক্যাপচার করতে বলুন।


ছবিতে লেখা চিনুন

একটি ছবিতে টেক্সট চিনতে, নীচে বর্ণিত পদ্ধতিতে টেক্সট রিকগনিজার চালান।

১. টেক্সট রিকগনিজার চালান

ছবিটিকে UIImage অথবা CMSampleBufferRef হিসেবে VisionTextRecognizer এর process(_:completion:) পদ্ধতিতে পাঠান:

  1. cloudTextRecognizer কল করে VisionTextRecognizer এর একটি উদাহরণ পান:

    সুইফট

    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)

    অবজেক্টিভ-সি

    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. ক্লাউড ভিশন কল করার জন্য, ছবিটিকে base64-এনকোডেড স্ট্রিং হিসেবে ফরম্যাট করতে হবে। UIImage প্রক্রিয়া করতে:

    সুইফট

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

    অবজেক্টিভ-সি

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. তারপর, ছবিটি process(_:completion:) পদ্ধতিতে পাস করুন:

    সুইফট

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

    অবজেক্টিভ-সি

    [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 অবজেক্টের জন্য, আপনি অঞ্চলের টেক্সট এবং অঞ্চলের সীমানা স্থানাঙ্কগুলি সনাক্ত করতে পারেন।

উদাহরণস্বরূপ:

সুইফট

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
        }
    }
}

অবজেক্টিভ-সি

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;
    }
  }
}

পরবর্তী পদক্ষেপ


ডকুমেন্টের ছবিতে লেখা চিনুন

একটি নথির টেক্সট চিনতে, নীচে বর্ণিত পদ্ধতিতে ডকুমেন্ট টেক্সট রিকগনিজারটি কনফিগার করুন এবং চালান।

নিচে বর্ণিত ডকুমেন্ট টেক্সট রিকগনিশন API, এমন একটি ইন্টারফেস প্রদান করে যা ডকুমেন্টের ছবিগুলির সাথে কাজ করার জন্য আরও সুবিধাজনক হওয়ার উদ্দেশ্যে তৈরি করা হয়েছে। তবে, যদি আপনি স্পার্স টেক্সট API দ্বারা প্রদত্ত ইন্টারফেস পছন্দ করেন, তাহলে আপনি ক্লাউড টেক্সট রিকগনিজারকে ঘন টেক্সট মডেল ব্যবহার করার জন্য কনফিগার করে ডকুমেন্ট স্ক্যান করার জন্য এটি ব্যবহার করতে পারেন।

ডকুমেন্ট টেক্সট রিকগনিশন API ব্যবহার করতে:

১. টেক্সট রিকগনিজার চালান

ছবিটিকে UIImage অথবা CMSampleBufferRef হিসেবে VisionDocumentTextRecognizer এর process(_:completion:) পদ্ধতিতে পাঠান:

  1. cloudDocumentTextRecognizer কল করে VisionDocumentTextRecognizer এর একটি উদাহরণ পান:

    সুইফট

    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)

    অবজেক্টিভ-সি

    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. ক্লাউড ভিশন কল করার জন্য, ছবিটিকে base64-এনকোডেড স্ট্রিং হিসেবে ফরম্যাট করতে হবে। UIImage প্রক্রিয়া করতে:

    সুইফট

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

    অবজেক্টিভ-সি

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. তারপর, ছবিটি process(_:completion:) পদ্ধতিতে পাস করুন:

    সুইফট

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

    অবজেক্টিভ-সি

    [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 অবজেক্টের জন্য, আপনি অঞ্চলের টেক্সট এবং অঞ্চলের বাউন্ডিং স্থানাঙ্কগুলি সনাক্ত করতে পারেন।

উদাহরণস্বরূপ:

সুইফট

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
            }
        }
    }
}

অবজেক্টিভ-সি

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;
      }
    }
  }
}

পরবর্তী পদক্ষেপ