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

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

টেক্সট রিকগনিশন API
বর্ণনা ছবি বা ভিডিওতে ল্যাটিন-স্ক্রিপ্টের পাঠ্য চিনুন।
SDK নাম GoogleMLKit/TextRecognition (version 2.2.0)
বাস্তবায়ন বিল্ড টাইমে অ্যাসেটগুলি আপনার অ্যাপের সাথে স্ট্যাটিকভাবে লিঙ্ক করা থাকে।
অ্যাপের আকারের প্রভাব প্রায় 20 এমবি
কর্মক্ষমতা বেশিরভাগ ডিভাইসে রিয়েল-টাইম।

চেষ্টা কর

তুমি শুরু করার আগে

  1. আপনার পডফাইলে নিম্নলিখিত ML কিট পডগুলি অন্তর্ভুক্ত করুন:
    pod 'GoogleMLKit/TextRecognition','2.2.0'
    
  2. আপনি আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পরে, এটির .xcworkspace ব্যবহার করে আপনার Xcode প্রকল্পটি খুলুন। ML Kit Xcode সংস্করণ 12.4 বা তার বেশিতে সমর্থিত।

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

+textRecognizer কল করে TextRecognizer এর একটি উদাহরণ তৈরি করুন:
let textRecognizer = TextRecognizer.textRecognizer()
     
MLKTextRecognizer *textRecognizer = [MLKTextRecognizer textRecognizer];
     

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

3. চিত্রটি প্রক্রিয়া করুন

তারপরে, ছবিটিকে 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
}];

4. স্বীকৃত পাঠ্যের ব্লকগুলি থেকে পাঠ্য বের করুন

পাঠ্য শনাক্তকরণ অপারেশন সফল হলে, এটি একটি 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 's captureOutput(_, didOutput:from:) ফাংশন থেকে এই পদ্ধতিতে কল করুন। AVCaptureVideoDataOutput এর alwaysDiscardsLateVideoFrames ডিটেক্টরে কল থ্রোটল করার জন্য true হিসাবে রাখুন৷ ডিটেক্টর চলাকালীন একটি নতুন ভিডিও ফ্রেম উপলব্ধ হলে, এটি বাদ দেওয়া হবে৷
  • আপনি যদি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য ডিটেক্টরের আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফল পান, তারপর একটি একক ধাপে চিত্র এবং ওভারলে রেন্ডার করুন। এটি করার মাধ্যমে, আপনি প্রতিটি প্রক্রিয়াকৃত ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার প্রদর্শন পৃষ্ঠে রেন্ডার করবেন। একটি উদাহরণের জন্য ML কিট কুইকস্টার্ট নমুনায় UpdatePreviewOverlayViewWithLastFrame দেখুন।
  • কম রেজোলিউশনে ছবি তোলার কথা বিবেচনা করুন। যাইহোক, এই API এর চিত্র মাত্রা প্রয়োজনীয়তাও মনে রাখবেন।