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