আপনি ছবিতে টেক্সট চিনতে Firebase ML ব্যবহার করতে পারেন। Firebase ML উভয়ই একটি সাধারণ-উদ্দেশ্য API রয়েছে যা চিত্রগুলিতে পাঠ্য সনাক্ত করার জন্য উপযুক্ত, যেমন একটি রাস্তার চিহ্নের পাঠ্য এবং নথির পাঠ্য সনাক্ত করার জন্য অপ্টিমাইজ করা একটি API।
আপনি শুরু করার আগে
- আপনি যদি ইতিমধ্যে আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে শুরু করার নির্দেশিকাতে দেওয়া ধাপগুলি অনুসরণ করে তা করুন৷
- Xcode-এ, আপনার অ্যাপ প্রকল্প খোলার সাথে, ফাইল > প্যাকেজ যোগ করুন- এ নেভিগেট করুন।
- অনুরোধ করা হলে, Firebase Apple প্ল্যাটফর্ম SDK সংগ্রহস্থল যোগ করুন:
- Firebase ML লাইব্রেরি বেছে নিন।
- আপনার লক্ষ্যের বিল্ড সেটিংসের অন্যান্য লিঙ্কার ফ্ল্যাগ বিভাগে
-ObjC
পতাকা যোগ করুন। - শেষ হয়ে গেলে, Xcode স্বয়ংক্রিয়ভাবে পটভূমিতে আপনার নির্ভরতাগুলি সমাধান এবং ডাউনলোড করা শুরু করবে।
- আপনার অ্যাপে, Firebase আমদানি করুন:
সুইফট
import FirebaseMLModelDownloader
উদ্দেশ্য-C
@import FirebaseMLModelDownloader;
আপনি যদি ইতিমধ্যে আপনার প্রকল্পের জন্য ক্লাউড-ভিত্তিক API সক্ষম না করে থাকেন তবে এখনই তা করুন:
- Firebase কনসোলের Firebase ML APIs পৃষ্ঠা খুলুন।
আপনি যদি ইতিমধ্যেই আপনার প্রোজেক্টকে ব্লেজ প্রাইসিং প্ল্যানে আপগ্রেড না করে থাকেন, তা করতে আপগ্রেড এ ক্লিক করুন। (যদি আপনার প্রকল্পটি ব্লেজ প্ল্যানে না থাকে তবেই আপনাকে আপগ্রেড করার জন্য অনুরোধ করা হবে।)
শুধুমাত্র ব্লেজ-স্তরের প্রকল্পগুলি ক্লাউড-ভিত্তিক API ব্যবহার করতে পারে।
- যদি ক্লাউড-ভিত্তিক APIগুলি ইতিমধ্যে সক্ষম না থাকে, তাহলে ক্লাউড-ভিত্তিক APIগুলি সক্ষম করুন ক্লিক করুন৷
ফায়ারবেস নির্ভরতা ইনস্টল এবং পরিচালনা করতে সুইফট প্যাকেজ ম্যানেজার ব্যবহার করুন।
https://github.com/firebase/firebase-ios-sdk.git
এরপরে, কিছু ইন-অ্যাপ সেটআপ সম্পাদন করুন:
এখন আপনি চিত্রগুলিতে পাঠ্য সনাক্তকরণ শুরু করতে প্রস্তুত৷
ইনপুট ইমেজ নির্দেশিকা
Firebase ML সঠিকভাবে পাঠ্য সনাক্ত করতে, ইনপুট চিত্রগুলিতে পাঠ্য থাকতে হবে যা পর্যাপ্ত পিক্সেল ডেটা দ্বারা উপস্থাপন করা হয়। আদর্শভাবে, ল্যাটিন পাঠ্যের জন্য, প্রতিটি অক্ষর কমপক্ষে 16x16 পিক্সেল হওয়া উচিত। চীনা, জাপানি এবং কোরিয়ান পাঠ্যের জন্য, প্রতিটি অক্ষর 24x24 পিক্সেল হওয়া উচিত। সমস্ত ভাষার জন্য, সাধারণত 24x24 পিক্সেলের চেয়ে বড় অক্ষরগুলির জন্য কোনও নির্ভুলতা সুবিধা নেই৷
সুতরাং, উদাহরণস্বরূপ, একটি 640x480 চিত্র একটি ব্যবসায়িক কার্ড স্ক্যান করতে ভাল কাজ করতে পারে যা চিত্রটির সম্পূর্ণ প্রস্থ দখল করে। অক্ষর আকারের কাগজে মুদ্রিত একটি নথি স্ক্যান করতে, একটি 720x1280 পিক্সেল চিত্রের প্রয়োজন হতে পারে।
খারাপ ইমেজ ফোকাস টেক্সট স্বীকৃতি সঠিকতা আঘাত করতে পারে. আপনি যদি গ্রহণযোগ্য ফলাফল না পান, তাহলে ব্যবহারকারীকে ছবিটি পুনরায় ক্যাপচার করতে বলার চেষ্টা করুন।
চিত্রে পাঠ্য চিনুন
একটি ছবিতে পাঠ্য সনাক্ত করতে, নীচে বর্ণিত হিসাবে পাঠ্য শনাক্তকারী চালান।
1. পাঠ্য শনাক্তকারী চালান
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)
উদ্দেশ্য-C
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];
- ক্লাউড ভিশন কল করার জন্য, ছবিটি একটি বেস 64-এনকোডেড স্ট্রিং হিসাবে ফর্ম্যাট করা আবশ্যক। একটি
UIImage
প্রক্রিয়া করতে:সুইফট
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
উদ্দেশ্য-C
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 }
উদ্দেশ্য-C
[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 } } }
উদ্দেশ্য-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; } } }
পরবর্তী পদক্ষেপ
- আপনি একটি ক্লাউড 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];
- ক্লাউড ভিশন কল করার জন্য, ছবিটি একটি বেস 64-এনকোডেড স্ট্রিং হিসাবে ফর্ম্যাট করা আবশ্যক। একটি
UIImage
প্রক্রিয়া করতে:সুইফট
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
উদ্দেশ্য-C
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 }
উদ্দেশ্য-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 অ্যাক্সেসের প্রভাব প্রতিরোধ ও প্রশমিত করার জন্য আপনাকে কিছু অতিরিক্ত পদক্ষেপ নিতে হবে।