iOS-এ ML Kit-এর সাহায্যে ছবিতে টেক্সট শনাক্ত করুন

আপনি ছবি বা ভিডিওতে লেখা, যেমন রাস্তার সাইনের লেখা, শনাক্ত করতে ML Kit ব্যবহার করতে পারেন। এই বৈশিষ্ট্যের প্রধান বৈশিষ্ট্যগুলি হল:

টেক্সট রিকগনিশন v2 API
বিবরণ ছবি বা ভিডিওতে লেখা শনাক্ত করুন, ল্যাটিন, চীনা, দেবনাগরী, জাপানি এবং কোরিয়ান লিপি এবং বিভিন্ন ধরণের ভাষার জন্য সমর্থন।
SDK নাম GoogleMLKit/TextRecognition
GoogleMLKit/TextRecognitionChinese
GoogleMLKit/TextRecognitionDevanagari
GoogleMLKit/TextRecognitionJapanese
GoogleMLKit/TextRecognitionKorean
বাস্তবায়ন বিল্ড টাইমে সম্পদগুলি আপনার অ্যাপের সাথে স্ট্যাটিক্যালি লিঙ্ক করা থাকে
অ্যাপের আকারের প্রভাব প্রতি স্ক্রিপ্ট SDK-তে প্রায় 38 MB
কর্মক্ষমতা ল্যাটিন স্ক্রিপ্ট SDK-এর জন্য বেশিরভাগ ডিভাইসে রিয়েল-টাইম, অন্যদের জন্য ধীর।

চেষ্টা করে দেখো

শুরু করার আগে

  1. আপনার পডফাইলে নিম্নলিখিত ML কিট পডগুলি অন্তর্ভুক্ত করুন:
    # To recognize Latin script
    pod 'GoogleMLKit/TextRecognition', '8.0.0'
    # To recognize Chinese script
    pod 'GoogleMLKit/TextRecognitionChinese', '8.0.0'
    # To recognize Devanagari script
    pod 'GoogleMLKit/TextRecognitionDevanagari', '8.0.0'
    # To recognize Japanese script
    pod 'GoogleMLKit/TextRecognitionJapanese', '8.0.0'
    # To recognize Korean script
    pod 'GoogleMLKit/TextRecognitionKorean', '8.0.0'
    
  2. আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পর, .xcworkspace ব্যবহার করে আপনার Xcode প্রোজেক্টটি খুলুন। ML Kit Xcode সংস্করণ 12.4 বা তার বেশি সংস্করণে সমর্থিত।

১. TextRecognizer একটি উদাহরণ তৈরি করুন

+textRecognizer(options:) কল করে TextRecognizer এর একটি উদাহরণ তৈরি করুন, উপরে আপনার দ্বারা ঘোষিত SDK সম্পর্কিত বিকল্পগুলি পাস করুন:

সুইফট

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

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

// 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 উল্লেখ করতে ভুলবেন না।

    সুইফট

    let image = VisionImage(image: UIImage)
    visionImage.orientation = image.imageOrientation

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

    MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image];
    visionImage.orientation = image.imageOrientation;

আপনি যদি CMSampleBuffer ব্যবহার করেন, তাহলে এই পদক্ষেপগুলি অনুসরণ করুন:

  • CMSampleBuffer এ থাকা চিত্রের ডেটার ওরিয়েন্টেশন নির্দিষ্ট করুন।

    ছবির ওরিয়েন্টেশন পেতে:

    সুইফট

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

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

    - (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 অবজেক্ট তৈরি করুন:

    সুইফট

    let image = VisionImage(buffer: sampleBuffer)
    image.orientation = imageOrientation(
      deviceOrientation: UIDevice.current.orientation,
      cameraPosition: cameraPosition)

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

     MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer];
     image.orientation =
       [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                    cameraPosition:cameraPosition];

৩. ছবিটি প্রক্রিয়া করুন

তারপর, ছবিটি process(_:completion:) পদ্ধতিতে পাস করুন:

সুইফট

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

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

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

৪. স্বীকৃত টেক্সটের ব্লক থেকে টেক্সট বের করুন

যদি টেক্সট শনাক্তকরণ অপারেশন সফল হয়, তাহলে এটি একটি Text অবজেক্ট ফেরত পাঠায়। একটি Text অবজেক্টে ছবিতে স্বীকৃত সম্পূর্ণ টেক্সট এবং শূন্য বা তার বেশি TextBlock অবজেক্ট থাকে।

প্রতিটি TextBlock একটি আয়তক্ষেত্রাকার টেক্সট ব্লককে প্রতিনিধিত্ব করে, যাতে শূন্য বা তার বেশি TextLine অবজেক্ট থাকে। প্রতিটি TextLine অবজেক্টে শূন্য বা তার বেশি TextElement অবজেক্ট থাকে, যা শব্দ এবং তারিখ এবং সংখ্যার মতো শব্দের মতো সত্তাকে প্রতিনিধিত্ব করে।

প্রতিটি TextBlock , TextLine , এবং TextElement অবজেক্টের জন্য, আপনি অঞ্চলের টেক্সট এবং অঞ্চলের বাউন্ডিং স্থানাঙ্কগুলি সনাক্ত করতে পারেন।

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

সুইফট

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

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

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

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

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

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

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

  • যদি আপনি রিয়েল-টাইম অ্যাপ্লিকেশনে টেক্সট শনাক্ত করেন, তাহলে আপনার ইনপুট ইমেজের সামগ্রিক মাত্রা বিবেচনা করা উচিত। ছোট ইমেজ দ্রুত প্রক্রিয়া করা যায়। ল্যাটেন্সি কমাতে, নিশ্চিত করুন যে টেক্সট যতটা সম্ভব ছবির বেশি অংশ দখল করে এবং কম রেজোলিউশনে ছবি ক্যাপচার করুন (উপরে উল্লিখিত নির্ভুলতার প্রয়োজনীয়তাগুলি মাথায় রেখে)। আরও তথ্যের জন্য, কর্মক্ষমতা উন্নত করার টিপস দেখুন।

কর্মক্ষমতা উন্নত করার টিপস

  • ভিডিও ফ্রেম প্রক্রিয়াকরণের জন্য, ডিটেক্টরের results(in:) সিঙ্ক্রোনাস API ব্যবহার করুন। প্রদত্ত ভিডিও ফ্রেম থেকে সিঙ্ক্রোনাসভাবে ফলাফল পেতে AVCaptureVideoDataOutputSampleBufferDelegate এর captureOutput(_, didOutput:from:) ফাংশন থেকে এই পদ্ধতিটি কল করুন। ডিটেক্টরে থ্রোটল কলের জন্য AVCaptureVideoDataOutput এর alwaysDiscardsLateVideoFrames কে true হিসাবে রাখুন। ডিটেক্টর চলাকালীন যদি একটি নতুন ভিডিও ফ্রেম উপলব্ধ হয়, তবে এটি বাদ দেওয়া হবে।
  • যদি আপনি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য ডিটেক্টরের আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফলটি পান, তারপর ইমেজটি রেন্ডার করুন এবং এক ধাপে ওভারলে করুন। এটি করার মাধ্যমে, আপনি প্রতিটি প্রক্রিয়াজাত ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার ডিসপ্লে সারফেসে রেন্ডার করবেন। উদাহরণের জন্য ML Kit কুইকস্টার্ট নমুনায় updatePreviewOverlayViewWithLastFrame দেখুন।
  • কম রেজোলিউশনে ছবি তোলার কথা বিবেচনা করুন। তবে, এই API-এর ছবির মাত্রার প্রয়োজনীয়তাগুলিও মনে রাখবেন।
  • সম্ভাব্য কর্মক্ষমতা হ্রাস এড়াতে, বিভিন্ন স্ক্রিপ্ট বিকল্প সহ একাধিক TextRecognizer ইন্সট্যান্স একসাথে চালাবেন না।