আপনি চিত্রে পাঠ্য সনাক্ত করতে ML কিট ব্যবহার করতে পারেন। ML Kit-এ উভয়ই একটি সাধারণ-উদ্দেশ্য API রয়েছে যা চিত্রগুলিতে পাঠ্য সনাক্ত করার জন্য উপযুক্ত, যেমন একটি রাস্তার চিহ্নের পাঠ্য এবং নথির পাঠ্য সনাক্ত করার জন্য অপ্টিমাইজ করা একটি API। সাধারণ-উদ্দেশ্য API-এর অন-ডিভাইস এবং ক্লাউড-ভিত্তিক মডেল উভয়ই রয়েছে। ডকুমেন্ট টেক্সট স্বীকৃতি শুধুমাত্র একটি ক্লাউড-ভিত্তিক মডেল হিসাবে উপলব্ধ। ক্লাউড এবং অন-ডিভাইস মডেলের তুলনার জন্য ওভারভিউ দেখুন।
আপনি শুরু করার আগে
- আপনি যদি ইতিমধ্যে আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে শুরু করার নির্দেশিকাতে দেওয়া ধাপগুলি অনুসরণ করে তা করুন৷
- আপনার পডফাইলে এমএল কিট লাইব্রেরি অন্তর্ভুক্ত করুন:
pod 'Firebase/MLVision', '6.25.0' # If using an on-device API: pod 'Firebase/MLVisionTextModel', '6.25.0'
আপনি আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পরে, আপনার Xcode প্রোজেক্ট এর.xcworkspace
ব্যবহার করে খুলতে ভুলবেন না। - আপনার অ্যাপে, Firebase আমদানি করুন:
সুইফট
import Firebase
উদ্দেশ্য-C
@import Firebase;
আপনি যদি ক্লাউড-ভিত্তিক মডেলটি ব্যবহার করতে চান, এবং আপনি ইতিমধ্যে আপনার প্রকল্পের জন্য ক্লাউড-ভিত্তিক API সক্ষম না করে থাকেন, তাহলে এখনই করুন:
- Firebase কনসোলের ML Kit APIs পৃষ্ঠাটি খুলুন।
আপনি যদি ইতিমধ্যেই আপনার প্রোজেক্টকে ব্লেজ প্রাইসিং প্ল্যানে আপগ্রেড না করে থাকেন, তাহলে আপগ্রেড এ ক্লিক করুন। (যদি আপনার প্রকল্পটি ব্লেজ প্ল্যানে না থাকে তবেই আপনাকে আপগ্রেড করার জন্য অনুরোধ করা হবে।)
শুধুমাত্র ব্লেজ-স্তরের প্রকল্পগুলি ক্লাউড-ভিত্তিক API ব্যবহার করতে পারে।
- যদি ক্লাউড-ভিত্তিক APIগুলি ইতিমধ্যে সক্ষম না থাকে, তাহলে ক্লাউড-ভিত্তিক APIগুলি সক্ষম করুন ক্লিক করুন৷
আপনি যদি শুধুমাত্র অন-ডিভাইস মডেল ব্যবহার করতে চান, তাহলে আপনি এই ধাপটি এড়িয়ে যেতে পারেন।
এখন আপনি চিত্রগুলিতে পাঠ্য সনাক্তকরণ শুরু করতে প্রস্তুত৷
ইনপুট ইমেজ নির্দেশিকা
ML Kit সঠিকভাবে পাঠ্য সনাক্ত করার জন্য, ইনপুট চিত্রগুলিতে পাঠ্য থাকতে হবে যা পর্যাপ্ত পিক্সেল ডেটা দ্বারা প্রতিনিধিত্ব করা হয়। আদর্শভাবে, ল্যাটিন পাঠ্যের জন্য, প্রতিটি অক্ষর কমপক্ষে 16x16 পিক্সেল হওয়া উচিত। চীনা, জাপানি এবং কোরিয়ান পাঠ্যের জন্য (শুধুমাত্র ক্লাউড-ভিত্তিক API দ্বারা সমর্থিত), প্রতিটি অক্ষর 24x24 পিক্সেল হওয়া উচিত। সমস্ত ভাষার জন্য, সাধারণত 24x24 পিক্সেলের চেয়ে বড় অক্ষরগুলির জন্য কোনও নির্ভুলতা সুবিধা নেই৷
সুতরাং, উদাহরণস্বরূপ, একটি 640x480 চিত্র একটি ব্যবসায়িক কার্ড স্ক্যান করতে ভাল কাজ করতে পারে যা চিত্রটির সম্পূর্ণ প্রস্থ দখল করে। অক্ষর আকারের কাগজে মুদ্রিত একটি নথি স্ক্যান করতে, একটি 720x1280 পিক্সেল চিত্রের প্রয়োজন হতে পারে।
খারাপ ইমেজ ফোকাস টেক্সট স্বীকৃতি সঠিকতা আঘাত করতে পারে. আপনি যদি গ্রহণযোগ্য ফলাফল না পান, তাহলে ব্যবহারকারীকে ছবিটি পুনরায় ক্যাপচার করতে বলার চেষ্টা করুন।
আপনি যদি একটি রিয়েল-টাইম অ্যাপ্লিকেশনে পাঠ্যকে চিনতে পারেন, তাহলে আপনি ইনপুট চিত্রগুলির সামগ্রিক মাত্রাগুলিও বিবেচনা করতে চাইতে পারেন৷ ছোট ছবিগুলি দ্রুত প্রক্রিয়া করা যেতে পারে, তাই লেটেন্সি কমাতে, কম রেজোলিউশনে ছবিগুলি ক্যাপচার করুন (উপরের নির্ভুলতার প্রয়োজনীয়তাগুলি মনে রেখে) এবং নিশ্চিত করুন যে পাঠ্যটি যতটা সম্ভব ছবির দখল করে। এছাড়াও রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপস দেখুন।
চিত্রে পাঠ্য চিনুন
একটি অন-ডিভাইস বা ক্লাউড-ভিত্তিক মডেল ব্যবহার করে একটি ছবিতে পাঠ্য শনাক্ত করতে, নীচে বর্ণিত হিসাবে পাঠ্য শনাক্তকারী চালান।
1. পাঠ্য শনাক্তকারী চালান
ছবিটিকে `UIImage` বা `CMSampleBufferRef` হিসেবে `VisionTextRecognizer` এর `process(_:completion:)` পদ্ধতিতে পাস করুন:-
onDeviceTextRecognizer
অথবাcloudTextRecognizer
কল করেVisionTextRecognizer
এর একটি উদাহরণ পান:সুইফট
অন-ডিভাইস মডেল ব্যবহার করতে:
let vision = Vision.vision() let textRecognizer = vision.onDeviceTextRecognizer()
ক্লাউড মডেল ব্যবহার করতে:
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)
উদ্দেশ্য-C
অন-ডিভাইস মডেল ব্যবহার করতে:
FIRVision *vision = [FIRVision vision]; FIRVisionTextRecognizer *textRecognizer = [vision onDeviceTextRecognizer];
ক্লাউড মডেল ব্যবহার করতে:
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];
একটি
UIImage
বা একটিCMSampleBufferRef
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন।একটি
UIImage
ব্যবহার করতে:- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
imageOrientation
বৈশিষ্ট্য.up
হয়। - সঠিকভাবে ঘোরানো
UIImage
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন। কোনো ঘূর্ণন মেটাডেটা নির্দিষ্ট করবেন না—ডিফল্ট মান,.topLeft
, ব্যবহার করতে হবে।সুইফট
let image = VisionImage(image: uiImage)
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
একটি
CMSampleBufferRef
ব্যবহার করতে:একটি
VisionImageMetadata
অবজেক্ট তৈরি করুন যাCMSampleBufferRef
বাফারে থাকা চিত্র ডেটার অভিযোজন নির্দিষ্ট করে।ইমেজ ওরিয়েন্টেশন পেতে:
সুইফট
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
উদ্দেশ্য-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
তারপর, মেটাডেটা অবজেক্ট তৈরি করুন:
সুইফট
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
উদ্দেশ্য-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
-
CMSampleBufferRef
অবজেক্ট এবং রোটেশন মেটাডেটা ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
- তারপরে, ছবিটিকে
process(_:completion:)
পদ্ধতিতে পাস করুন:সুইফট
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
উদ্দেশ্য-C
[textRecognizer processImage:image completion:^(FIRVisionText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. স্বীকৃত পাঠ্যের ব্লকগুলি থেকে পাঠ্য বের করুন
টেক্সট রিকগনিশন অপারেশন সফল হলে, এটি একটি [`VisionText`][VisionText] অবজেক্ট ফিরিয়ে দেবে। একটি `VisionText` অবজেক্টে ইমেজে স্বীকৃত সম্পূর্ণ টেক্সট এবং শূন্য বা তার বেশি [`VisionTextBlock`][VisionTextBlock] অবজেক্ট থাকে। প্রতিটি `VisionTextBlock` পাঠ্যের একটি আয়তক্ষেত্রাকার ব্লককে উপস্থাপন করে, যাতে শূন্য বা তার বেশি [`VisionTextLine`][VisionTextLine] অবজেক্ট থাকে। প্রতিটি `VisionTextLine` অবজেক্টে শূন্য বা তার বেশি [`VisionTextElement`][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 } } }
উদ্দেশ্য-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; } } }
রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপস
আপনি যদি একটি রিয়েল-টাইম অ্যাপ্লিকেশনে পাঠ্য সনাক্ত করতে ডিভাইসের মডেল ব্যবহার করতে চান তবে সেরা ফ্রেমরেটগুলি অর্জন করতে এই নির্দেশিকাগুলি অনুসরণ করুন:
- পাঠ্য শনাক্তকারীকে থ্রটল কল। টেক্সট শনাক্তকারী চলাকালীন যদি একটি নতুন ভিডিও ফ্রেম উপলব্ধ হয়, ফ্রেমটি ফেলে দিন।
- আপনি যদি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য টেক্সট শনাক্তকারীর আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফল পান, তারপর একটি একক ধাপে চিত্র এবং ওভারলে রেন্ডার করুন। এটি করার মাধ্যমে, আপনি প্রতিটি ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার প্রদর্শন পৃষ্ঠে রেন্ডার করবেন। উদাহরণের জন্য শোকেস নমুনা অ্যাপে প্রিভিউওভারলেভিউ এবং FIRDetectionOverlayView ক্লাসগুলি দেখুন।
- কম রেজোলিউশনে ছবি তোলার কথা বিবেচনা করুন। যাইহোক, এই API এর চিত্র মাত্রা প্রয়োজনীয়তাও মনে রাখবেন।
পরবর্তী পদক্ষেপ
- আপনি একটি ক্লাউড API ব্যবহার করে এমন একটি অ্যাপ উৎপাদনে স্থাপন করার আগে, অননুমোদিত API অ্যাক্সেসের প্রভাব প্রতিরোধ ও প্রশমিত করার জন্য আপনাকে কিছু অতিরিক্ত পদক্ষেপ নিতে হবে।
নথির ছবিতে পাঠ্য চিনুন
একটি নথির পাঠ্য সনাক্ত করতে, নীচে বর্ণিত হিসাবে ক্লাউড-ভিত্তিক নথি পাঠ শনাক্তকারী কনফিগার করুন এবং চালান৷
ডকুমেন্ট টেক্সট রিকগনিশন API, নীচে বর্ণিত, একটি ইন্টারফেস প্রদান করে যা নথির চিত্রগুলির সাথে কাজ করার জন্য আরও সুবিধাজনক হওয়ার উদ্দেশ্যে। যাইহোক, আপনি যদি স্পার্স টেক্সট API দ্বারা প্রদত্ত ইন্টারফেস পছন্দ করেন, তাহলে ঘন টেক্সট মডেল ব্যবহার করার জন্য ক্লাউড টেক্সট শনাক্তকারী কনফিগার করে ডকুমেন্ট স্ক্যান করতে আপনি এটি ব্যবহার করতে পারেন।
ডকুমেন্ট টেক্সট রিকগনিশন API ব্যবহার করতে:
1. পাঠ্য শনাক্তকারী চালান
VisionDocumentTextRecognizer
এর process(_:completion:)
পদ্ধতিতে UIImage
বা CMSampleBufferRef
হিসাবে ছবিটি পাস করুন:-
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)
উদ্দেশ্য-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];
একটি
UIImage
বা একটিCMSampleBufferRef
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন।একটি
UIImage
ব্যবহার করতে:- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
imageOrientation
বৈশিষ্ট্য.up
হয়। - সঠিকভাবে ঘোরানো
UIImage
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন। কোনো ঘূর্ণন মেটাডেটা নির্দিষ্ট করবেন না—ডিফল্ট মান,.topLeft
, ব্যবহার করতে হবে।সুইফট
let image = VisionImage(image: uiImage)
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
একটি
CMSampleBufferRef
ব্যবহার করতে:একটি
VisionImageMetadata
অবজেক্ট তৈরি করুন যাCMSampleBufferRef
বাফারে থাকা চিত্র ডেটার অভিযোজন নির্দিষ্ট করে।ইমেজ ওরিয়েন্টেশন পেতে:
সুইফট
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
উদ্দেশ্য-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
তারপর, মেটাডেটা অবজেক্ট তৈরি করুন:
সুইফট
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
উদ্দেশ্য-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
-
CMSampleBufferRef
অবজেক্ট এবং রোটেশন মেটাডেটা ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
- তারপরে, ছবিটিকে
process(_:completion:)
পদ্ধতিতে পাস করুন:সুইফট
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
উদ্দেশ্য-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
অবজেক্টের জন্য, আপনি এই অঞ্চলে স্বীকৃত পাঠ্য এবং অঞ্চলের সীমাবদ্ধ স্থানাঙ্ক পেতে পারেন৷
যেমন:
সুইফট
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 } } } }
উদ্দেশ্য-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; } } } }
পরবর্তী পদক্ষেপ
- আপনি একটি ক্লাউড API ব্যবহার করে এমন একটি অ্যাপ উৎপাদনে স্থাপন করার আগে, অননুমোদিত API অ্যাক্সেসের প্রভাব প্রতিরোধ ও প্রশমিত করার জন্য আপনাকে কিছু অতিরিক্ত পদক্ষেপ নিতে হবে।
আপনি চিত্রে পাঠ্য সনাক্ত করতে ML কিট ব্যবহার করতে পারেন। ML Kit-এ উভয়ই একটি সাধারণ-উদ্দেশ্য API রয়েছে যা চিত্রগুলিতে পাঠ্য সনাক্ত করার জন্য উপযুক্ত, যেমন একটি রাস্তার চিহ্নের পাঠ্য এবং নথির পাঠ্য সনাক্ত করার জন্য অপ্টিমাইজ করা একটি API। সাধারণ-উদ্দেশ্য API-এর অন-ডিভাইস এবং ক্লাউড-ভিত্তিক মডেল উভয়ই রয়েছে। ডকুমেন্ট টেক্সট স্বীকৃতি শুধুমাত্র একটি ক্লাউড-ভিত্তিক মডেল হিসাবে উপলব্ধ। ক্লাউড এবং অন-ডিভাইস মডেলের তুলনার জন্য ওভারভিউ দেখুন।
আপনি শুরু করার আগে
- আপনি যদি ইতিমধ্যে আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে শুরু করার নির্দেশিকাতে দেওয়া ধাপগুলি অনুসরণ করে তা করুন৷
- আপনার পডফাইলে এমএল কিট লাইব্রেরি অন্তর্ভুক্ত করুন:
pod 'Firebase/MLVision', '6.25.0' # If using an on-device API: pod 'Firebase/MLVisionTextModel', '6.25.0'
আপনি আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পরে, আপনার Xcode প্রোজেক্ট এর.xcworkspace
ব্যবহার করে খুলতে ভুলবেন না। - আপনার অ্যাপে, Firebase আমদানি করুন:
সুইফট
import Firebase
উদ্দেশ্য-C
@import Firebase;
আপনি যদি ক্লাউড-ভিত্তিক মডেলটি ব্যবহার করতে চান, এবং আপনি ইতিমধ্যে আপনার প্রকল্পের জন্য ক্লাউড-ভিত্তিক API সক্ষম না করে থাকেন, তাহলে এখনই করুন:
- Firebase কনসোলের ML Kit APIs পৃষ্ঠাটি খুলুন।
আপনি যদি ইতিমধ্যেই আপনার প্রোজেক্টকে ব্লেজ প্রাইসিং প্ল্যানে আপগ্রেড না করে থাকেন, তাহলে আপগ্রেড এ ক্লিক করুন। (যদি আপনার প্রকল্পটি ব্লেজ প্ল্যানে না থাকে তবেই আপনাকে আপগ্রেড করার জন্য অনুরোধ করা হবে।)
শুধুমাত্র ব্লেজ-স্তরের প্রকল্পগুলি ক্লাউড-ভিত্তিক API ব্যবহার করতে পারে।
- যদি ক্লাউড-ভিত্তিক APIগুলি ইতিমধ্যে সক্ষম না থাকে, তাহলে ক্লাউড-ভিত্তিক APIগুলি সক্ষম করুন ক্লিক করুন৷
আপনি যদি শুধুমাত্র অন-ডিভাইস মডেল ব্যবহার করতে চান, তাহলে আপনি এই ধাপটি এড়িয়ে যেতে পারেন।
এখন আপনি চিত্রগুলিতে পাঠ্য সনাক্তকরণ শুরু করতে প্রস্তুত৷
ইনপুট ইমেজ নির্দেশিকা
ML Kit সঠিকভাবে পাঠ্য সনাক্ত করার জন্য, ইনপুট চিত্রগুলিতে পাঠ্য থাকতে হবে যা পর্যাপ্ত পিক্সেল ডেটা দ্বারা প্রতিনিধিত্ব করা হয়। আদর্শভাবে, ল্যাটিন পাঠ্যের জন্য, প্রতিটি অক্ষর কমপক্ষে 16x16 পিক্সেল হওয়া উচিত। চীনা, জাপানি এবং কোরিয়ান পাঠ্যের জন্য (শুধুমাত্র ক্লাউড-ভিত্তিক API দ্বারা সমর্থিত), প্রতিটি অক্ষর 24x24 পিক্সেল হওয়া উচিত। সমস্ত ভাষার জন্য, সাধারণত 24x24 পিক্সেলের চেয়ে বড় অক্ষরগুলির জন্য কোনও নির্ভুলতা সুবিধা নেই৷
সুতরাং, উদাহরণস্বরূপ, একটি 640x480 চিত্র একটি ব্যবসায়িক কার্ড স্ক্যান করতে ভাল কাজ করতে পারে যা চিত্রটির সম্পূর্ণ প্রস্থ দখল করে। অক্ষর আকারের কাগজে মুদ্রিত একটি নথি স্ক্যান করতে, একটি 720x1280 পিক্সেল চিত্রের প্রয়োজন হতে পারে।
খারাপ ইমেজ ফোকাস টেক্সট স্বীকৃতি সঠিকতা আঘাত করতে পারে. আপনি যদি গ্রহণযোগ্য ফলাফল না পান, তাহলে ব্যবহারকারীকে ছবিটি পুনরায় ক্যাপচার করতে বলার চেষ্টা করুন।
আপনি যদি একটি রিয়েল-টাইম অ্যাপ্লিকেশনে পাঠ্যকে চিনতে পারেন, তাহলে আপনি ইনপুট চিত্রগুলির সামগ্রিক মাত্রাগুলিও বিবেচনা করতে চাইতে পারেন৷ ছোট ছবিগুলি দ্রুত প্রক্রিয়া করা যেতে পারে, তাই লেটেন্সি কমাতে, কম রেজোলিউশনে ছবিগুলি ক্যাপচার করুন (উপরের নির্ভুলতার প্রয়োজনীয়তাগুলি মনে রেখে) এবং নিশ্চিত করুন যে পাঠ্যটি যতটা সম্ভব ছবির দখল করে। এছাড়াও রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপস দেখুন।
চিত্রে পাঠ্য চিনুন
একটি অন-ডিভাইস বা ক্লাউড-ভিত্তিক মডেল ব্যবহার করে একটি ছবিতে পাঠ্য শনাক্ত করতে, নীচে বর্ণিত হিসাবে পাঠ্য শনাক্তকারী চালান।
1. পাঠ্য শনাক্তকারী চালান
ছবিটিকে `UIImage` বা `CMSampleBufferRef` হিসেবে `VisionTextRecognizer` এর `process(_:completion:)` পদ্ধতিতে পাস করুন:-
onDeviceTextRecognizer
অথবাcloudTextRecognizer
কল করেVisionTextRecognizer
এর একটি উদাহরণ পান:সুইফট
অন-ডিভাইস মডেল ব্যবহার করতে:
let vision = Vision.vision() let textRecognizer = vision.onDeviceTextRecognizer()
ক্লাউড মডেল ব্যবহার করতে:
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)
উদ্দেশ্য-C
অন-ডিভাইস মডেল ব্যবহার করতে:
FIRVision *vision = [FIRVision vision]; FIRVisionTextRecognizer *textRecognizer = [vision onDeviceTextRecognizer];
ক্লাউড মডেল ব্যবহার করতে:
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];
একটি
UIImage
বা একটিCMSampleBufferRef
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন।একটি
UIImage
ব্যবহার করতে:- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
imageOrientation
বৈশিষ্ট্য.up
হয়। - সঠিকভাবে ঘোরানো
UIImage
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন। কোনো ঘূর্ণন মেটাডেটা নির্দিষ্ট করবেন না—ডিফল্ট মান,.topLeft
, ব্যবহার করতে হবে।সুইফট
let image = VisionImage(image: uiImage)
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
একটি
CMSampleBufferRef
ব্যবহার করতে:একটি
VisionImageMetadata
অবজেক্ট তৈরি করুন যাCMSampleBufferRef
বাফারে থাকা চিত্র ডেটার অভিযোজন নির্দিষ্ট করে।ইমেজ ওরিয়েন্টেশন পেতে:
সুইফট
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
উদ্দেশ্য-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
তারপর, মেটাডেটা অবজেক্ট তৈরি করুন:
সুইফট
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
উদ্দেশ্য-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
-
CMSampleBufferRef
অবজেক্ট এবং রোটেশন মেটাডেটা ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
- তারপরে, ছবিটিকে
process(_:completion:)
পদ্ধতিতে পাস করুন:সুইফট
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
উদ্দেশ্য-C
[textRecognizer processImage:image completion:^(FIRVisionText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. স্বীকৃত পাঠ্যের ব্লকগুলি থেকে পাঠ্য বের করুন
টেক্সট রিকগনিশন অপারেশন সফল হলে, এটি একটি [`VisionText`][VisionText] অবজেক্ট ফিরিয়ে দেবে। একটি `VisionText` অবজেক্টে ইমেজে স্বীকৃত সম্পূর্ণ টেক্সট এবং শূন্য বা তার বেশি [`VisionTextBlock`][VisionTextBlock] অবজেক্ট থাকে। প্রতিটি `VisionTextBlock` পাঠ্যের একটি আয়তক্ষেত্রাকার ব্লককে উপস্থাপন করে, যাতে শূন্য বা তার বেশি [`VisionTextLine`][VisionTextLine] অবজেক্ট থাকে। প্রতিটি `VisionTextLine` অবজেক্টে শূন্য বা তার বেশি [`VisionTextElement`][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 } } }
উদ্দেশ্য-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; } } }
রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপস
আপনি যদি একটি রিয়েল-টাইম অ্যাপ্লিকেশনে পাঠ্য সনাক্ত করতে ডিভাইসের মডেল ব্যবহার করতে চান তবে সেরা ফ্রেমরেটগুলি অর্জন করতে এই নির্দেশিকাগুলি অনুসরণ করুন:
- পাঠ্য শনাক্তকারীকে থ্রটল কল। টেক্সট শনাক্তকারী চলাকালীন যদি একটি নতুন ভিডিও ফ্রেম উপলব্ধ হয়, ফ্রেমটি ফেলে দিন।
- আপনি যদি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য টেক্সট শনাক্তকারীর আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফল পান, তারপর একটি একক ধাপে চিত্র এবং ওভারলে রেন্ডার করুন। এটি করার মাধ্যমে, আপনি প্রতিটি ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার প্রদর্শন পৃষ্ঠে রেন্ডার করবেন। উদাহরণের জন্য শোকেস নমুনা অ্যাপে প্রিভিউওভারলেভিউ এবং FIRDetectionOverlayView ক্লাসগুলি দেখুন।
- কম রেজোলিউশনে ছবি তোলার কথা বিবেচনা করুন। যাইহোক, এই API এর চিত্র মাত্রা প্রয়োজনীয়তাও মনে রাখবেন।
পরবর্তী পদক্ষেপ
- আপনি একটি ক্লাউড API ব্যবহার করে এমন একটি অ্যাপ উৎপাদনে স্থাপন করার আগে, অননুমোদিত API অ্যাক্সেসের প্রভাব প্রতিরোধ ও প্রশমিত করার জন্য আপনাকে কিছু অতিরিক্ত পদক্ষেপ নিতে হবে।
নথির ছবিতে পাঠ্য চিনুন
একটি নথির পাঠ্য সনাক্ত করতে, নীচে বর্ণিত হিসাবে ক্লাউড-ভিত্তিক নথি পাঠ শনাক্তকারী কনফিগার করুন এবং চালান৷
ডকুমেন্ট টেক্সট রিকগনিশন API, নীচে বর্ণিত, একটি ইন্টারফেস প্রদান করে যা নথির চিত্রগুলির সাথে কাজ করার জন্য আরও সুবিধাজনক হওয়ার উদ্দেশ্যে। যাইহোক, আপনি যদি স্পার্স টেক্সট API দ্বারা প্রদত্ত ইন্টারফেস পছন্দ করেন, তাহলে ঘন টেক্সট মডেল ব্যবহার করার জন্য ক্লাউড টেক্সট শনাক্তকারী কনফিগার করে ডকুমেন্ট স্ক্যান করতে আপনি এটি ব্যবহার করতে পারেন।
ডকুমেন্ট টেক্সট রিকগনিশন API ব্যবহার করতে:
1. পাঠ্য শনাক্তকারী চালান
VisionDocumentTextRecognizer
এর process(_:completion:)
পদ্ধতিতে UIImage
বা CMSampleBufferRef
হিসাবে ছবিটি পাস করুন:-
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)
উদ্দেশ্য-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];
একটি
UIImage
বা একটিCMSampleBufferRef
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন।একটি
UIImage
ব্যবহার করতে:- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
imageOrientation
বৈশিষ্ট্য.up
হয়। - সঠিকভাবে ঘোরানো
UIImage
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন। কোনো ঘূর্ণন মেটাডেটা নির্দিষ্ট করবেন না—ডিফল্ট মান,.topLeft
, ব্যবহার করতে হবে।সুইফট
let image = VisionImage(image: uiImage)
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
একটি
CMSampleBufferRef
ব্যবহার করতে:একটি
VisionImageMetadata
অবজেক্ট তৈরি করুন যাCMSampleBufferRef
বাফারে থাকা চিত্র ডেটার অভিযোজন নির্দিষ্ট করে।ইমেজ ওরিয়েন্টেশন পেতে:
সুইফট
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
উদ্দেশ্য-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
তারপর, মেটাডেটা অবজেক্ট তৈরি করুন:
সুইফট
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
উদ্দেশ্য-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
-
CMSampleBufferRef
অবজেক্ট এবং রোটেশন মেটাডেটা ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
- তারপরে, ছবিটিকে
process(_:completion:)
পদ্ধতিতে পাস করুন:সুইফট
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
উদ্দেশ্য-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
অবজেক্টের জন্য, আপনি এই অঞ্চলে স্বীকৃত পাঠ্য এবং অঞ্চলের সীমাবদ্ধ স্থানাঙ্ক পেতে পারেন৷
যেমন:
সুইফট
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 } } } }
উদ্দেশ্য-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; } } } }
পরবর্তী পদক্ষেপ
- আপনি একটি ক্লাউড API ব্যবহার করে এমন একটি অ্যাপ উৎপাদনে স্থাপন করার আগে, অননুমোদিত API অ্যাক্সেসের প্রভাব প্রতিরোধ ও প্রশমিত করার জন্য আপনাকে কিছু অতিরিক্ত পদক্ষেপ নিতে হবে।
আপনি চিত্রে পাঠ্য সনাক্ত করতে ML কিট ব্যবহার করতে পারেন। ML Kit-এ উভয়ই একটি সাধারণ-উদ্দেশ্য API রয়েছে যা চিত্রগুলিতে পাঠ্য সনাক্ত করার জন্য উপযুক্ত, যেমন একটি রাস্তার চিহ্নের পাঠ্য এবং নথির পাঠ্য সনাক্ত করার জন্য অপ্টিমাইজ করা একটি API। সাধারণ-উদ্দেশ্য API-এর অন-ডিভাইস এবং ক্লাউড-ভিত্তিক মডেল উভয়ই রয়েছে। ডকুমেন্ট টেক্সট স্বীকৃতি শুধুমাত্র একটি ক্লাউড-ভিত্তিক মডেল হিসাবে উপলব্ধ। ক্লাউড এবং অন-ডিভাইস মডেলের তুলনার জন্য ওভারভিউ দেখুন।
আপনি শুরু করার আগে
- আপনি যদি ইতিমধ্যে আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে শুরু করার নির্দেশিকাতে দেওয়া ধাপগুলি অনুসরণ করে তা করুন৷
- আপনার পডফাইলে এমএল কিট লাইব্রেরি অন্তর্ভুক্ত করুন:
pod 'Firebase/MLVision', '6.25.0' # If using an on-device API: pod 'Firebase/MLVisionTextModel', '6.25.0'
আপনি আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পরে, আপনার Xcode প্রোজেক্ট এর.xcworkspace
ব্যবহার করে খুলতে ভুলবেন না। - আপনার অ্যাপে, Firebase আমদানি করুন:
সুইফট
import Firebase
উদ্দেশ্য-C
@import Firebase;
আপনি যদি ক্লাউড-ভিত্তিক মডেলটি ব্যবহার করতে চান, এবং আপনি ইতিমধ্যে আপনার প্রকল্পের জন্য ক্লাউড-ভিত্তিক API সক্ষম না করে থাকেন, তাহলে এখনই করুন:
- Firebase কনসোলের ML Kit APIs পৃষ্ঠাটি খুলুন।
আপনি যদি ইতিমধ্যেই আপনার প্রোজেক্টকে ব্লেজ প্রাইসিং প্ল্যানে আপগ্রেড না করে থাকেন, তাহলে আপগ্রেড এ ক্লিক করুন। (যদি আপনার প্রকল্পটি ব্লেজ প্ল্যানে না থাকে তবেই আপনাকে আপগ্রেড করার জন্য অনুরোধ করা হবে।)
শুধুমাত্র ব্লেজ-স্তরের প্রকল্পগুলি ক্লাউড-ভিত্তিক API ব্যবহার করতে পারে।
- যদি ক্লাউড-ভিত্তিক APIগুলি ইতিমধ্যে সক্ষম না থাকে, তাহলে ক্লাউড-ভিত্তিক APIগুলি সক্ষম করুন ক্লিক করুন৷
আপনি যদি শুধুমাত্র অন-ডিভাইস মডেল ব্যবহার করতে চান, তাহলে আপনি এই ধাপটি এড়িয়ে যেতে পারেন।
এখন আপনি চিত্রগুলিতে পাঠ্য সনাক্তকরণ শুরু করতে প্রস্তুত৷
ইনপুট ইমেজ নির্দেশিকা
ML Kit সঠিকভাবে পাঠ্য সনাক্ত করার জন্য, ইনপুট চিত্রগুলিতে পাঠ্য থাকতে হবে যা পর্যাপ্ত পিক্সেল ডেটা দ্বারা প্রতিনিধিত্ব করা হয়। আদর্শভাবে, ল্যাটিন পাঠ্যের জন্য, প্রতিটি অক্ষর কমপক্ষে 16x16 পিক্সেল হওয়া উচিত। চীনা, জাপানি এবং কোরিয়ান পাঠ্যের জন্য (শুধুমাত্র ক্লাউড-ভিত্তিক API দ্বারা সমর্থিত), প্রতিটি অক্ষর 24x24 পিক্সেল হওয়া উচিত। সমস্ত ভাষার জন্য, সাধারণত 24x24 পিক্সেলের চেয়ে বড় অক্ষরগুলির জন্য কোনও নির্ভুলতা সুবিধা নেই৷
সুতরাং, উদাহরণস্বরূপ, একটি 640x480 চিত্র একটি ব্যবসায়িক কার্ড স্ক্যান করতে ভাল কাজ করতে পারে যা চিত্রটির সম্পূর্ণ প্রস্থ দখল করে। অক্ষর আকারের কাগজে মুদ্রিত একটি নথি স্ক্যান করতে, একটি 720x1280 পিক্সেল চিত্রের প্রয়োজন হতে পারে।
খারাপ ইমেজ ফোকাস টেক্সট স্বীকৃতি সঠিকতা আঘাত করতে পারে. আপনি যদি গ্রহণযোগ্য ফলাফল না পান, তাহলে ব্যবহারকারীকে ছবিটি পুনরায় ক্যাপচার করতে বলার চেষ্টা করুন।
আপনি যদি একটি রিয়েল-টাইম অ্যাপ্লিকেশনে পাঠ্যকে চিনতে পারেন, তাহলে আপনি ইনপুট চিত্রগুলির সামগ্রিক মাত্রাগুলিও বিবেচনা করতে চাইতে পারেন৷ ছোট ছবিগুলি দ্রুত প্রক্রিয়া করা যেতে পারে, তাই লেটেন্সি কমাতে, কম রেজোলিউশনে ছবিগুলি ক্যাপচার করুন (উপরের নির্ভুলতার প্রয়োজনীয়তাগুলি মনে রেখে) এবং নিশ্চিত করুন যে পাঠ্যটি যতটা সম্ভব ছবির দখল করে। এছাড়াও রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপস দেখুন।
ইমেজ টেক্সট চিনুন
একটি অন-ডিভাইস বা ক্লাউড-ভিত্তিক মডেল ব্যবহার করে একটি ছবিতে পাঠ্য শনাক্ত করতে, নীচে বর্ণিত হিসাবে পাঠ্য শনাক্তকারী চালান।
1. পাঠ্য শনাক্তকারী চালান
ছবিটিকে `UIImage` বা `CMSampleBufferRef` হিসেবে `VisionTextRecognizer` এর `process(_:completion:)` পদ্ধতিতে পাস করুন:-
onDeviceTextRecognizer
অথবাcloudTextRecognizer
কল করেVisionTextRecognizer
এর একটি উদাহরণ পান:সুইফট
অন-ডিভাইস মডেল ব্যবহার করতে:
let vision = Vision.vision() let textRecognizer = vision.onDeviceTextRecognizer()
ক্লাউড মডেল ব্যবহার করতে:
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)
উদ্দেশ্য-C
অন-ডিভাইস মডেল ব্যবহার করতে:
FIRVision *vision = [FIRVision vision]; FIRVisionTextRecognizer *textRecognizer = [vision onDeviceTextRecognizer];
ক্লাউড মডেল ব্যবহার করতে:
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];
একটি
UIImage
বা একটিCMSampleBufferRef
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন।একটি
UIImage
ব্যবহার করতে:- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
imageOrientation
বৈশিষ্ট্য.up
হয়। - সঠিকভাবে ঘোরানো
UIImage
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন। কোনো ঘূর্ণন মেটাডেটা নির্দিষ্ট করবেন না—ডিফল্ট মান,.topLeft
, ব্যবহার করতে হবে।সুইফট
let image = VisionImage(image: uiImage)
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
একটি
CMSampleBufferRef
ব্যবহার করতে:একটি
VisionImageMetadata
অবজেক্ট তৈরি করুন যাCMSampleBufferRef
বাফারে থাকা চিত্র ডেটার অভিযোজন নির্দিষ্ট করে।ইমেজ ওরিয়েন্টেশন পেতে:
সুইফট
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
উদ্দেশ্য-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
তারপর, মেটাডেটা অবজেক্ট তৈরি করুন:
সুইফট
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
উদ্দেশ্য-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
-
CMSampleBufferRef
অবজেক্ট এবং রোটেশন মেটাডেটা ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
- তারপরে, ছবিটিকে
process(_:completion:)
পদ্ধতিতে পাস করুন:সুইফট
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
উদ্দেশ্য-C
[textRecognizer processImage:image completion:^(FIRVisionText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. স্বীকৃত পাঠ্যের ব্লকগুলি থেকে পাঠ্য বের করুন
টেক্সট রিকগনিশন অপারেশন সফল হলে, এটি একটি [`VisionText`][VisionText] অবজেক্ট ফিরিয়ে দেবে। একটি `VisionText` অবজেক্টে ইমেজে স্বীকৃত সম্পূর্ণ টেক্সট এবং শূন্য বা তার বেশি [`VisionTextBlock`][VisionTextBlock] অবজেক্ট থাকে। প্রতিটি `VisionTextBlock` পাঠ্যের একটি আয়তক্ষেত্রাকার ব্লককে উপস্থাপন করে, যাতে শূন্য বা তার বেশি [`VisionTextLine`][VisionTextLine] অবজেক্ট থাকে। প্রতিটি `VisionTextLine` অবজেক্টে শূন্য বা তার বেশি [`VisionTextElement`][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 } } }
উদ্দেশ্য-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; } } }
রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপস
আপনি যদি একটি রিয়েল-টাইম অ্যাপ্লিকেশনে পাঠ্য সনাক্ত করতে ডিভাইসের মডেল ব্যবহার করতে চান তবে সেরা ফ্রেমরেটগুলি অর্জন করতে এই নির্দেশিকাগুলি অনুসরণ করুন:
- পাঠ্য শনাক্তকারীকে থ্রটল কল। টেক্সট শনাক্তকারী চলাকালীন যদি একটি নতুন ভিডিও ফ্রেম উপলব্ধ হয়, ফ্রেমটি ফেলে দিন।
- আপনি যদি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য টেক্সট শনাক্তকারীর আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফল পান, তারপর একটি একক ধাপে চিত্র এবং ওভারলে রেন্ডার করুন। এটি করার মাধ্যমে, আপনি প্রতিটি ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার প্রদর্শন পৃষ্ঠে রেন্ডার করবেন। উদাহরণের জন্য শোকেস নমুনা অ্যাপে প্রিভিউওভারলেভিউ এবং FIRDetectionOverlayView ক্লাসগুলি দেখুন।
- কম রেজোলিউশনে ছবি তোলার কথা বিবেচনা করুন। যাইহোক, এই API এর চিত্র মাত্রা প্রয়োজনীয়তাও মনে রাখবেন।
পরবর্তী পদক্ষেপ
- আপনি একটি ক্লাউড API ব্যবহার করে এমন একটি অ্যাপ উৎপাদনে স্থাপন করার আগে, অননুমোদিত API অ্যাক্সেসের প্রভাব প্রতিরোধ ও প্রশমিত করার জন্য আপনাকে কিছু অতিরিক্ত পদক্ষেপ নিতে হবে।
নথির ছবিতে পাঠ্য চিনুন
একটি নথির পাঠ্য সনাক্ত করতে, নীচে বর্ণিত হিসাবে ক্লাউড-ভিত্তিক নথি পাঠ শনাক্তকারী কনফিগার করুন এবং চালান৷
ডকুমেন্ট টেক্সট রিকগনিশন API, নীচে বর্ণিত, একটি ইন্টারফেস প্রদান করে যা নথির চিত্রগুলির সাথে কাজ করার জন্য আরও সুবিধাজনক হওয়ার উদ্দেশ্যে। যাইহোক, আপনি যদি স্পার্স টেক্সট API দ্বারা প্রদত্ত ইন্টারফেস পছন্দ করেন, তাহলে ঘন টেক্সট মডেল ব্যবহার করার জন্য ক্লাউড টেক্সট শনাক্তকারী কনফিগার করে ডকুমেন্ট স্ক্যান করতে আপনি এটি ব্যবহার করতে পারেন।
ডকুমেন্ট টেক্সট রিকগনিশন API ব্যবহার করতে:
1. পাঠ্য শনাক্তকারী চালান
VisionDocumentTextRecognizer
এর process(_:completion:)
পদ্ধতিতে UIImage
বা CMSampleBufferRef
হিসাবে ছবিটি পাস করুন:-
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)
উদ্দেশ্য-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];
একটি
UIImage
বা একটিCMSampleBufferRef
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন।একটি
UIImage
ব্যবহার করতে:- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
imageOrientation
বৈশিষ্ট্য.up
হয়। - সঠিকভাবে ঘোরানো
UIImage
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন। কোনো ঘূর্ণন মেটাডেটা নির্দিষ্ট করবেন না—ডিফল্ট মান,.topLeft
, ব্যবহার করতে হবে।সুইফট
let image = VisionImage(image: uiImage)
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
একটি
CMSampleBufferRef
ব্যবহার করতে:একটি
VisionImageMetadata
অবজেক্ট তৈরি করুন যাCMSampleBufferRef
বাফারে থাকা চিত্র ডেটার অভিযোজন নির্দিষ্ট করে।ইমেজ ওরিয়েন্টেশন পেতে:
সুইফট
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
উদ্দেশ্য-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
তারপর, মেটাডেটা অবজেক্ট তৈরি করুন:
সুইফট
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
উদ্দেশ্য-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
-
CMSampleBufferRef
অবজেক্ট এবং রোটেশন মেটাডেটা ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
- তারপরে, ছবিটিকে
process(_:completion:)
পদ্ধতিতে পাস করুন:সুইফট
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
উদ্দেশ্য-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
অবজেক্টের জন্য, আপনি এই অঞ্চলে স্বীকৃত পাঠ্য এবং অঞ্চলের সীমাবদ্ধ স্থানাঙ্ক পেতে পারেন৷
যেমন:
সুইফট
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 } } } }
উদ্দেশ্য-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; } } } }
পরবর্তী পদক্ষেপ
- আপনি একটি ক্লাউড API ব্যবহার করে এমন একটি অ্যাপ উৎপাদনে স্থাপন করার আগে, অননুমোদিত API অ্যাক্সেসের প্রভাব প্রতিরোধ ও প্রশমিত করার জন্য আপনাকে কিছু অতিরিক্ত পদক্ষেপ নিতে হবে।
আপনি চিত্রে পাঠ্য সনাক্ত করতে ML কিট ব্যবহার করতে পারেন। ML Kit-এ উভয়ই একটি সাধারণ-উদ্দেশ্য API রয়েছে যা চিত্রগুলিতে পাঠ্য সনাক্ত করার জন্য উপযুক্ত, যেমন একটি রাস্তার চিহ্নের পাঠ্য এবং নথির পাঠ্য সনাক্ত করার জন্য অপ্টিমাইজ করা একটি API। সাধারণ-উদ্দেশ্য API-এর অন-ডিভাইস এবং ক্লাউড-ভিত্তিক মডেল উভয়ই রয়েছে। ডকুমেন্ট টেক্সট স্বীকৃতি শুধুমাত্র একটি ক্লাউড-ভিত্তিক মডেল হিসাবে উপলব্ধ। ক্লাউড এবং অন-ডিভাইস মডেলের তুলনার জন্য ওভারভিউ দেখুন।
আপনি শুরু করার আগে
- আপনি যদি ইতিমধ্যে আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে শুরু করার নির্দেশিকাতে দেওয়া ধাপগুলি অনুসরণ করে তা করুন৷
- আপনার পডফাইলে এমএল কিট লাইব্রেরি অন্তর্ভুক্ত করুন:
pod 'Firebase/MLVision', '6.25.0' # If using an on-device API: pod 'Firebase/MLVisionTextModel', '6.25.0'
আপনি আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পরে, আপনার Xcode প্রোজেক্ট এর.xcworkspace
ব্যবহার করে খুলতে ভুলবেন না। - আপনার অ্যাপে, Firebase আমদানি করুন:
সুইফট
import Firebase
উদ্দেশ্য-C
@import Firebase;
আপনি যদি ক্লাউড-ভিত্তিক মডেলটি ব্যবহার করতে চান, এবং আপনি ইতিমধ্যে আপনার প্রকল্পের জন্য ক্লাউড-ভিত্তিক API সক্ষম না করে থাকেন, তাহলে এখনই করুন:
- Firebase কনসোলের ML Kit APIs পৃষ্ঠাটি খুলুন।
আপনি যদি ইতিমধ্যেই আপনার প্রোজেক্টকে ব্লেজ প্রাইসিং প্ল্যানে আপগ্রেড না করে থাকেন, তাহলে আপগ্রেড এ ক্লিক করুন। (যদি আপনার প্রকল্পটি ব্লেজ প্ল্যানে না থাকে তবেই আপনাকে আপগ্রেড করার জন্য অনুরোধ করা হবে।)
শুধুমাত্র ব্লেজ-স্তরের প্রকল্পগুলি ক্লাউড-ভিত্তিক API ব্যবহার করতে পারে।
- যদি ক্লাউড-ভিত্তিক APIগুলি ইতিমধ্যে সক্ষম না থাকে, তাহলে ক্লাউড-ভিত্তিক APIগুলি সক্ষম করুন ক্লিক করুন৷
আপনি যদি শুধুমাত্র অন-ডিভাইস মডেল ব্যবহার করতে চান, তাহলে আপনি এই ধাপটি এড়িয়ে যেতে পারেন।
এখন আপনি চিত্রগুলিতে পাঠ্য সনাক্তকরণ শুরু করতে প্রস্তুত৷
ইনপুট ইমেজ নির্দেশিকা
ML Kit সঠিকভাবে পাঠ্য সনাক্ত করার জন্য, ইনপুট চিত্রগুলিতে পাঠ্য থাকতে হবে যা পর্যাপ্ত পিক্সেল ডেটা দ্বারা প্রতিনিধিত্ব করা হয়। আদর্শভাবে, ল্যাটিন পাঠ্যের জন্য, প্রতিটি অক্ষর কমপক্ষে 16x16 পিক্সেল হওয়া উচিত। চীনা, জাপানি এবং কোরিয়ান পাঠ্যের জন্য (শুধুমাত্র ক্লাউড-ভিত্তিক API দ্বারা সমর্থিত), প্রতিটি অক্ষর 24x24 পিক্সেল হওয়া উচিত। সমস্ত ভাষার জন্য, সাধারণত 24x24 পিক্সেলের চেয়ে বড় অক্ষরগুলির জন্য কোনও নির্ভুলতা সুবিধা নেই৷
সুতরাং, উদাহরণস্বরূপ, একটি 640x480 চিত্র একটি ব্যবসায়িক কার্ড স্ক্যান করতে ভাল কাজ করতে পারে যা চিত্রটির সম্পূর্ণ প্রস্থ দখল করে। অক্ষর আকারের কাগজে মুদ্রিত একটি নথি স্ক্যান করতে, একটি 720x1280 পিক্সেল চিত্রের প্রয়োজন হতে পারে।
খারাপ ইমেজ ফোকাস টেক্সট স্বীকৃতি সঠিকতা আঘাত করতে পারে. আপনি যদি গ্রহণযোগ্য ফলাফল না পান, তাহলে ব্যবহারকারীকে ছবিটি পুনরায় ক্যাপচার করতে বলার চেষ্টা করুন।
আপনি যদি একটি রিয়েল-টাইম অ্যাপ্লিকেশনে পাঠ্যকে চিনতে পারেন, তাহলে আপনি ইনপুট চিত্রগুলির সামগ্রিক মাত্রাগুলিও বিবেচনা করতে চাইতে পারেন৷ ছোট ছবিগুলি দ্রুত প্রক্রিয়া করা যেতে পারে, তাই লেটেন্সি কমাতে, কম রেজোলিউশনে ছবিগুলি ক্যাপচার করুন (উপরের নির্ভুলতার প্রয়োজনীয়তাগুলি মনে রেখে) এবং নিশ্চিত করুন যে পাঠ্যটি যতটা সম্ভব ছবির দখল করে। এছাড়াও রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপস দেখুন।
চিত্রে পাঠ্য চিনুন
একটি অন-ডিভাইস বা ক্লাউড-ভিত্তিক মডেল ব্যবহার করে একটি ছবিতে পাঠ্য শনাক্ত করতে, নীচে বর্ণিত হিসাবে পাঠ্য শনাক্তকারী চালান।
1. পাঠ্য শনাক্তকারী চালান
ছবিটিকে `UIImage` বা `CMSampleBufferRef` হিসেবে `VisionTextRecognizer` এর `process(_:completion:)` পদ্ধতিতে পাস করুন:-
onDeviceTextRecognizer
অথবাcloudTextRecognizer
কল করেVisionTextRecognizer
এর একটি উদাহরণ পান:সুইফট
অন-ডিভাইস মডেল ব্যবহার করতে:
let vision = Vision.vision() let textRecognizer = vision.onDeviceTextRecognizer()
ক্লাউড মডেল ব্যবহার করতে:
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)
উদ্দেশ্য-C
অন-ডিভাইস মডেল ব্যবহার করতে:
FIRVision *vision = [FIRVision vision]; FIRVisionTextRecognizer *textRecognizer = [vision onDeviceTextRecognizer];
ক্লাউড মডেল ব্যবহার করতে:
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];
একটি
UIImage
বা একটিCMSampleBufferRef
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন।একটি
UIImage
ব্যবহার করতে:- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
imageOrientation
বৈশিষ্ট্য.up
হয়। - সঠিকভাবে ঘোরানো
UIImage
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন। কোনো ঘূর্ণন মেটাডেটা নির্দিষ্ট করবেন না—ডিফল্ট মান,.topLeft
, ব্যবহার করতে হবে।সুইফট
let image = VisionImage(image: uiImage)
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
একটি
CMSampleBufferRef
ব্যবহার করতে:একটি
VisionImageMetadata
অবজেক্ট তৈরি করুন যাCMSampleBufferRef
বাফারে থাকা চিত্র ডেটার অভিযোজন নির্দিষ্ট করে।ইমেজ ওরিয়েন্টেশন পেতে:
সুইফট
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
উদ্দেশ্য-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
তারপর, মেটাডেটা অবজেক্ট তৈরি করুন:
সুইফট
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
উদ্দেশ্য-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
-
CMSampleBufferRef
অবজেক্ট এবং রোটেশন মেটাডেটা ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
- তারপরে, ছবিটিকে
process(_:completion:)
পদ্ধতিতে পাস করুন:সুইফট
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
উদ্দেশ্য-C
[textRecognizer processImage:image completion:^(FIRVisionText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. স্বীকৃত পাঠ্যের ব্লকগুলি থেকে পাঠ্য বের করুন
টেক্সট রিকগনিশন অপারেশন সফল হলে, এটি একটি [`VisionText`][VisionText] অবজেক্ট ফিরিয়ে দেবে। একটি `VisionText` অবজেক্টে ইমেজে স্বীকৃত সম্পূর্ণ টেক্সট এবং শূন্য বা তার বেশি [`VisionTextBlock`][VisionTextBlock] অবজেক্ট থাকে। প্রতিটি `VisionTextBlock` পাঠ্যের একটি আয়তক্ষেত্রাকার ব্লককে উপস্থাপন করে, যাতে শূন্য বা তার বেশি [`VisionTextLine`][VisionTextLine] অবজেক্ট থাকে। প্রতিটি `VisionTextLine` অবজেক্টে শূন্য বা তার বেশি [`VisionTextElement`][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 } } }
উদ্দেশ্য-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; } } }
রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপস
আপনি যদি একটি রিয়েল-টাইম অ্যাপ্লিকেশনে পাঠ্য সনাক্ত করতে ডিভাইসের মডেল ব্যবহার করতে চান তবে সেরা ফ্রেমরেটগুলি অর্জন করতে এই নির্দেশিকাগুলি অনুসরণ করুন:
- পাঠ্য শনাক্তকারীকে থ্রটল কল। টেক্সট শনাক্তকারী চলাকালীন যদি একটি নতুন ভিডিও ফ্রেম উপলব্ধ হয়, ফ্রেমটি ফেলে দিন।
- আপনি যদি ইনপুট চিত্রটিতে ওভারলে গ্রাফিক্সে পাঠ্য স্বীকৃতিটির আউটপুট ব্যবহার করে থাকেন তবে প্রথমে এমএল কিট থেকে ফলাফল পান, তারপরে চিত্রটি রেন্ডার করুন এবং একক পদক্ষেপে ওভারলে করুন। এটি করার মাধ্যমে, আপনি প্রতিটি ইনপুট ফ্রেমের জন্য কেবল একবারে ডিসপ্লে পৃষ্ঠে রেন্ডার করুন। উদাহরণের জন্য শোকেস নমুনা অ্যাপ্লিকেশনটিতে পূর্বরূপ ওভারলভিউ এবং ফায়ারডেটেকশনওভারলভিউ ক্লাসগুলি দেখুন।
- নিম্ন রেজোলিউশনে চিত্রগুলি ক্যাপচার করার বিষয়টি বিবেচনা করুন। তবে, এই এপিআইয়ের চিত্রের মাত্রা প্রয়োজনীয়তাগুলিও মনে রাখবেন।
পরবর্তী পদক্ষেপ
- আপনি ক্লাউড এপিআই ব্যবহার করে এমন একটি অ্যাপ্লিকেশন উত্পাদন করার আগে আপনি অননুমোদিত এপিআই অ্যাক্সেসের প্রভাব রোধ এবং প্রশমিত করতে কিছু অতিরিক্ত পদক্ষেপ নেওয়া উচিত।
নথির ছবিতে পাঠ্য সনাক্ত করুন
কোনও দস্তাবেজের পাঠ্যটি সনাক্ত করতে, নীচে বর্ণিত হিসাবে ক্লাউড-ভিত্তিক নথি পাঠ্য স্বীকৃতিটি কনফিগার করুন এবং চালান।
নীচে বর্ণিত ডকুমেন্ট পাঠ্য স্বীকৃতি এপিআই একটি ইন্টারফেস সরবরাহ করে যা নথির চিত্রগুলির সাথে কাজ করার জন্য আরও সুবিধাজনক হওয়ার উদ্দেশ্যে। তবে, আপনি যদি স্পার্স টেক্সট এপিআই দ্বারা সরবরাহিত ইন্টারফেসটি পছন্দ করেন তবে আপনি ঘন পাঠ্য মডেলটি ব্যবহার করতে ক্লাউড পাঠ্য স্বীকৃতিটি কনফিগার করে নথিগুলি স্ক্যান করতে পরিবর্তে এটি ব্যবহার করতে পারেন।
ডকুমেন্ট পাঠ্য স্বীকৃতি এপিআই ব্যবহার করতে:
1। পাঠ্য স্বীকৃতি চালান
চিত্রটিUIImage
বা একটি CMSampleBufferRef
হিসাবে VisionDocumentTextRecognizer
এর process(_:completion:)
পদ্ধতি:-
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)
উদ্দেশ্য-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];
একটি
UIImage
বা একটিCMSampleBufferRef
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন।একটি
UIImage
ব্যবহার করতে:- যদি প্রয়োজন হয় তবে চিত্রটি ঘোরান যাতে এর
imageOrientation
সম্পত্তি.up
হয়। - সঠিকভাবে ঘূর্ণিত
UIImage
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন। কোনও ঘূর্ণন মেটাডেটা নির্দিষ্ট করবেন না - ডিফল্ট মান,.topLeft
, অবশ্যই ব্যবহার করা উচিত।সুইফট
let image = VisionImage(image: uiImage)
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
একটি
CMSampleBufferRef
ব্যবহার করতে:একটি
VisionImageMetadata
অবজেক্ট তৈরি করুন যাCMSampleBufferRef
বাফারে থাকা চিত্রের ডেটাগুলির ওরিয়েন্টেশন নির্দিষ্ট করে।চিত্র ওরিয়েন্টেশন পেতে:
সুইফট
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
উদ্দেশ্য-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
তারপরে, মেটাডেটা অবজেক্টটি তৈরি করুন:
সুইফট
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
উদ্দেশ্য-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
-
CMSampleBufferRef
অবজেক্ট এবং রোটেশন মেটাডেটা ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- যদি প্রয়োজন হয় তবে চিত্রটি ঘোরান যাতে এর
- তারপরে, চিত্রটি
process(_:completion:)
পদ্ধতি:সুইফট
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
উদ্দেশ্য-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
অবজেক্টের জন্য, আপনি অঞ্চল এবং এই অঞ্চলের সীমাবদ্ধ স্থানাঙ্কগুলিতে পাঠ্যটি স্বীকৃত পেতে পারেন।
যেমন:
সুইফট
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 } } } }
উদ্দেশ্য-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; } } } }
পরবর্তী পদক্ষেপ
- আপনি ক্লাউড এপিআই ব্যবহার করে এমন একটি অ্যাপ্লিকেশন উত্পাদন করার আগে আপনি অননুমোদিত এপিআই অ্যাক্সেসের প্রভাব রোধ এবং প্রশমিত করতে কিছু অতিরিক্ত পদক্ষেপ নেওয়া উচিত।