আপনি ছবির মধ্যে থাকা লেখা শনাক্ত করতে Firebase ML ব্যবহার করতে পারেন। Firebase ML দুটি এপিআই রয়েছে: একটি সাধারণ এপিআই যা রাস্তার সাইনবোর্ডের লেখার মতো ছবির মধ্যে থাকা লেখা শনাক্ত করার জন্য উপযুক্ত, এবং আরেকটি এপিআই যা ডকুমেন্টের লেখা শনাক্ত করার জন্য বিশেষভাবে তৈরি।
শুরু করার আগে
- আপনি যদি এখনও আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে গেটিং স্টার্টেড গাইডের ধাপগুলো অনুসরণ করে তা করে নিন।
- Xcode-এ আপনার অ্যাপ প্রজেক্টটি খুলে, File > Add Packages- এ যান।
- অনুরোধ করা হলে, Firebase Apple প্ল্যাটফর্ম SDK রিপোজিটরিটি যোগ করুন:
- Firebase ML লাইব্রেরিটি নির্বাচন করুন।
- আপনার টার্গেটের বিল্ড সেটিংসের ' Other Linker Flags' সেকশনে
-ObjCফ্ল্যাগটি যোগ করুন। - কাজ শেষ হলে, Xcode স্বয়ংক্রিয়ভাবে ব্যাকগ্রাউন্ডে আপনার ডিপেন্ডেন্সিগুলো রিজলভ ও ডাউনলোড করা শুরু করবে।
- আপনার অ্যাপে Firebase ইম্পোর্ট করুন:
সুইফট
import FirebaseMLModelDownloader
উদ্দেশ্য-সি
@import FirebaseMLModelDownloader;
আপনি যদি আপনার প্রোজেক্টের জন্য এখনও ক্লাউড-ভিত্তিক এপিআই চালু না করে থাকেন, তবে এখনই তা করুন:
- Firebase কনসোলে Firebase ML APIs পৃষ্ঠাটি খুলুন।
আপনি যদি এখনও আপনার প্রজেক্টটি পে-অ্যাজ-ইউ-গো ব্লেজ প্রাইসিং প্ল্যানে আপগ্রেড না করে থাকেন, তাহলে তা করার জন্য 'আপগ্রেড' বাটনে ক্লিক করুন। (শুধুমাত্র যদি আপনার প্রজেক্টটি ব্লেজ প্রাইসিং প্ল্যানে না থাকে, তবেই আপনাকে আপগ্রেড করার জন্য অনুরোধ করা হবে।)
শুধুমাত্র ব্লেজ প্রাইসিং প্ল্যানে থাকা প্রজেক্টগুলোই ক্লাউড-ভিত্তিক এপিআই ব্যবহার করতে পারে।
- যদি ক্লাউড-ভিত্তিক এপিআই আগে থেকে সক্রিয় করা না থাকে, তাহলে ‘ক্লাউড-ভিত্তিক এপিআই সক্রিয় করুন’ এ ক্লিক করুন।
ফায়ারবেস ডিপেন্ডেন্সিগুলো ইনস্টল ও পরিচালনা করতে সুইফট প্যাকেজ ম্যানেজার ব্যবহার করুন।
https://github.com/firebase/firebase-ios-sdk.git
এরপর, অ্যাপের ভেতরে কিছু সেটআপ সম্পন্ন করুন:
এখন আপনি ছবির মধ্যে থাকা লেখা শনাক্ত করা শুরু করতে প্রস্তুত।
ইনপুট ছবির নির্দেশিকা
Firebase ML পক্ষে টেক্সট সঠিকভাবে শনাক্ত করার জন্য, ইনপুট ইমেজগুলিতে এমন টেক্সট থাকতে হবে যা পর্যাপ্ত পিক্সেল ডেটা দ্বারা উপস্থাপিত। আদর্শগতভাবে, ল্যাটিন টেক্সটের জন্য প্রতিটি অক্ষর কমপক্ষে ১৬x১৬ পিক্সেল হওয়া উচিত। চীনা, জাপানি এবং কোরিয়ান টেক্সটের জন্য প্রতিটি অক্ষর ২৪x২৪ পিক্সেল হওয়া উচিত। সব ভাষার ক্ষেত্রেই, অক্ষরগুলো ২৪x২৪ পিক্সেলের চেয়ে বড় হলে নির্ভুলতার দিক থেকে সাধারণত কোনো সুবিধা হয় না।
সুতরাং, উদাহরণস্বরূপ, একটি বিজনেস কার্ড স্ক্যান করার জন্য একটি 640x480 সাইজের ছবি বেশ কার্যকর হতে পারে, যদি কার্ডটি ছবির সম্পূর্ণ প্রস্থ জুড়ে থাকে। লেটার-সাইজের কাগজে প্রিন্ট করা কোনো ডকুমেন্ট স্ক্যান করার জন্য 720x1280 পিক্সেলের একটি ছবির প্রয়োজন হতে পারে।
ছবির ফোকাস ঠিক না থাকলে টেক্সট শনাক্তকরণের নির্ভুলতা কমে যেতে পারে। যদি আপনি গ্রহণযোগ্য ফলাফল না পান, তবে ব্যবহারকারীকে ছবিটি পুনরায় তুলতে বলুন।
ছবিতে থাকা লেখা শনাক্ত করুন
কোনো ছবিতে থাকা লেখা শনাক্ত করতে, নিচে বর্ণিত পদ্ধতি অনুযায়ী টেক্সট রিকগনাইজারটি চালান।
১. টেক্সট রিকগনাইজারটি চালান।
VisionTextRecognizer এর process(_:completion:) মেথডে ইমেজটিকে একটি UIImage অথবা একটি CMSampleBufferRef হিসেবে পাস করুন:-
cloudTextRecognizerকল করেVisionTextRecognizerএর একটি ইনস্ট্যান্স পান:সুইফট
let vision = Vision.vision() let textRecognizer = vision.cloudTextRecognizer() // Or, to provide language hints to assist with language detection: // See https://cloud.google.com/vision/docs/languages for supported languages let options = VisionCloudTextRecognizerOptions() options.languageHints = ["en", "hi"] let textRecognizer = vision.cloudTextRecognizer(options: options)
উদ্দেশ্য-সি
FIRVision *vision = [FIRVision vision]; FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizer]; // Or, to provide language hints to assist with language detection: // See https://cloud.google.com/vision/docs/languages for supported languages FIRVisionCloudTextRecognizerOptions *options = [[FIRVisionCloudTextRecognizerOptions alloc] init]; options.languageHints = @[@"en", @"hi"]; FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizerWithOptions:options];
- ক্লাউড ভিশন কল করার জন্য, ছবিটিকে অবশ্যই একটি বেস৬৪-এনকোডেড স্ট্রিং হিসাবে ফরম্যাট করতে হবে। একটি
UIImageপ্রসেস করতে:সুইফট
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
উদ্দেশ্য-সি
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- তারপর, ছবিটি
process(_:completion:)মেথডে পাঠান:সুইফট
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
উদ্দেশ্য-সি
[textRecognizer processImage:image completion:^(FIRVisionText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
২. শনাক্তকৃত টেক্সটের ব্লকগুলো থেকে টেক্সট বের করুন।
টেক্সট শনাক্তকরণ প্রক্রিয়া সফল হলে, এটি একটিVisionText অবজেক্ট রিটার্ন করবে। একটি VisionText অবজেক্টে ছবিতে শনাক্ত করা সম্পূর্ণ টেক্সট এবং শূন্য বা তার বেশি VisionTextBlock অবজেক্ট থাকে। প্রতিটি VisionTextBlock একটি আয়তাকার টেক্সট ব্লক উপস্থাপন করে, যার মধ্যে শূন্য বা একাধিক VisionTextLine অবজেক্ট থাকে। প্রতিটি VisionTextLine অবজেক্টের মধ্যে শূন্য বা একাধিক VisionTextElement অবজেক্ট থাকে, যা শব্দ এবং শব্দের মতো সত্তা (তারিখ, সংখ্যা ইত্যাদি) উপস্থাপন করে।
প্রতিটি VisionTextBlock , VisionTextLine , এবং VisionTextElement অবজেক্টের জন্য, আপনি ঐ অঞ্চলে শনাক্তকৃত টেক্সট এবং অঞ্চলটির বাউন্ডিং স্থানাঙ্ক পেতে পারেন।
উদাহরণস্বরূপ:
সুইফট
let resultText = result.text for block in result.blocks { let blockText = block.text let blockConfidence = block.confidence let blockLanguages = block.recognizedLanguages let blockCornerPoints = block.cornerPoints let blockFrame = block.frame for line in block.lines { let lineText = line.text let lineConfidence = line.confidence let lineLanguages = line.recognizedLanguages let lineCornerPoints = line.cornerPoints let lineFrame = line.frame for element in line.elements { let elementText = element.text let elementConfidence = element.confidence let elementLanguages = element.recognizedLanguages let elementCornerPoints = element.cornerPoints let elementFrame = element.frame } } }
উদ্দেশ্য-সি
NSString *resultText = result.text; for (FIRVisionTextBlock *block in result.blocks) { NSString *blockText = block.text; NSNumber *blockConfidence = block.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages; NSArray<NSValue *> *blockCornerPoints = block.cornerPoints; CGRect blockFrame = block.frame; for (FIRVisionTextLine *line in block.lines) { NSString *lineText = line.text; NSNumber *lineConfidence = line.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages; NSArray<NSValue *> *lineCornerPoints = line.cornerPoints; CGRect lineFrame = line.frame; for (FIRVisionTextElement *element in line.elements) { NSString *elementText = element.text; NSNumber *elementConfidence = element.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *elementLanguages = element.recognizedLanguages; NSArray<NSValue *> *elementCornerPoints = element.cornerPoints; CGRect elementFrame = element.frame; } } }
পরবর্তী পদক্ষেপ
- ক্লাউড এপিআই ব্যবহার করে এমন কোনো অ্যাপ প্রোডাকশনে ডেপ্লয় করার আগে, অননুমোদিত এপিআই অ্যাক্সেসের প্রভাব প্রতিরোধ ও প্রশমিত করার জন্য আপনার কিছু অতিরিক্ত পদক্ষেপ নেওয়া উচিত।
নথির ছবিতে থাকা লেখা শনাক্ত করুন
কোনো ডকুমেন্টের টেক্সট শনাক্ত করতে, নিচে বর্ণিত পদ্ধতি অনুযায়ী ডকুমেন্ট টেক্সট রিকগনাইজারটি কনফিগার ও রান করুন।
নীচে বর্ণিত ডকুমেন্ট টেক্সট রিকগনিশন এপিআই এমন একটি ইন্টারফেস প্রদান করে যা ডকুমেন্টের ছবি নিয়ে কাজ করার জন্য আরও সুবিধাজনক। তবে, আপনি যদি স্পার্স টেক্সট এপিআই দ্বারা প্রদত্ত ইন্টারফেসটি পছন্দ করেন, তাহলে ক্লাউড টেক্সট রিকগনাইজারকে ডেন্স টেক্সট মডেল ব্যবহার করার জন্য কনফিগার করে ডকুমেন্ট স্ক্যান করতে পারেন।
ডকুমেন্ট টেক্সট রিকগনিশন এপিআই ব্যবহার করতে:
১. টেক্সট রিকগনাইজারটি চালান।
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)
উদ্দেশ্য-সি
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প্রসেস করতে:সুইফট
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
উদ্দেশ্য-সি
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- তারপর, ছবিটি
process(_:completion:)মেথডে পাঠান:সুইফট
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
উদ্দেশ্য-সি
[textRecognizer processImage:image completion:^(FIRVisionDocumentText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
২. শনাক্তকৃত টেক্সটের ব্লকগুলো থেকে টেক্সট বের করুন।
টেক্সট শনাক্তকরণ প্রক্রিয়াটি সফল হলে, এটি একটিVisionDocumentText অবজেক্ট রিটার্ন করবে। একটি VisionDocumentText অবজেক্টে ছবিতে শনাক্ত করা সম্পূর্ণ টেক্সট এবং শনাক্তকৃত ডকুমেন্টের কাঠামো প্রতিফলিত করে এমন অবজেক্টের একটি স্তরক্রম থাকে: প্রতিটি VisionDocumentTextBlock , VisionDocumentTextParagraph , VisionDocumentTextWord , এবং VisionDocumentTextSymbol অবজেক্টের জন্য, আপনি ঐ অঞ্চলে শনাক্তকৃত টেক্সট এবং অঞ্চলটির বাউন্ডিং স্থানাঙ্ক পেতে পারেন।
উদাহরণস্বরূপ:
সুইফট
let resultText = result.text for block in result.blocks { let blockText = block.text let blockConfidence = block.confidence let blockRecognizedLanguages = block.recognizedLanguages let blockBreak = block.recognizedBreak let blockCornerPoints = block.cornerPoints let blockFrame = block.frame for paragraph in block.paragraphs { let paragraphText = paragraph.text let paragraphConfidence = paragraph.confidence let paragraphRecognizedLanguages = paragraph.recognizedLanguages let paragraphBreak = paragraph.recognizedBreak let paragraphCornerPoints = paragraph.cornerPoints let paragraphFrame = paragraph.frame for word in paragraph.words { let wordText = word.text let wordConfidence = word.confidence let wordRecognizedLanguages = word.recognizedLanguages let wordBreak = word.recognizedBreak let wordCornerPoints = word.cornerPoints let wordFrame = word.frame for symbol in word.symbols { let symbolText = symbol.text let symbolConfidence = symbol.confidence let symbolRecognizedLanguages = symbol.recognizedLanguages let symbolBreak = symbol.recognizedBreak let symbolCornerPoints = symbol.cornerPoints let symbolFrame = symbol.frame } } } }
উদ্দেশ্য-সি
NSString *resultText = result.text; for (FIRVisionDocumentTextBlock *block in result.blocks) { NSString *blockText = block.text; NSNumber *blockConfidence = block.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *blockRecognizedLanguages = block.recognizedLanguages; FIRVisionTextRecognizedBreak *blockBreak = block.recognizedBreak; CGRect blockFrame = block.frame; for (FIRVisionDocumentTextParagraph *paragraph in block.paragraphs) { NSString *paragraphText = paragraph.text; NSNumber *paragraphConfidence = paragraph.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *paragraphRecognizedLanguages = paragraph.recognizedLanguages; FIRVisionTextRecognizedBreak *paragraphBreak = paragraph.recognizedBreak; CGRect paragraphFrame = paragraph.frame; for (FIRVisionDocumentTextWord *word in paragraph.words) { NSString *wordText = word.text; NSNumber *wordConfidence = word.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *wordRecognizedLanguages = word.recognizedLanguages; FIRVisionTextRecognizedBreak *wordBreak = word.recognizedBreak; CGRect wordFrame = word.frame; for (FIRVisionDocumentTextSymbol *symbol in word.symbols) { NSString *symbolText = symbol.text; NSNumber *symbolConfidence = symbol.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *symbolRecognizedLanguages = symbol.recognizedLanguages; FIRVisionTextRecognizedBreak *symbolBreak = symbol.recognizedBreak; CGRect symbolFrame = symbol.frame; } } } }
পরবর্তী পদক্ষেপ
- ক্লাউড এপিআই ব্যবহার করে এমন কোনো অ্যাপ প্রোডাকশনে ডেপ্লয় করার আগে, অননুমোদিত এপিআই অ্যাক্সেসের প্রভাব প্রতিরোধ ও প্রশমিত করার জন্য আপনার কিছু অতিরিক্ত পদক্ষেপ নেওয়া উচিত।