אפשר להשתמש ב-Firebase ML כדי לזהות טקסט בתמונות. ל-Firebase ML יש ממשק API למטרות כלליות שמתאים לזיהוי טקסט בתמונות, כמו הטקסט של שלט רחוב, וגם ממשק API מותאם לזיהוי טקסט במסמכים.
לפני שמתחילים
-
אם עדיין לא הוספתם את Firebase לאפליקציה, תוכלו לפעול לפי השלבים שמפורטים במדריך לתחילת העבודה.
- ב-Xcode, כשפרויקט האפליקציה פתוח, עוברים אל קובץ > הוספת חבילות.
- כשמופיעה בקשה, מוסיפים את המאגר של Firebase SDK לפלטפורמות של Apple:
- בוחרים את הספרייה Firebase ML.
- מוסיפים את הדגל
-ObjC
לקטע סימונים של מקשר אחר בהגדרות ה-build של היעד. - בסיום, Xcode יתחיל לפתור את הבעיה ותוריד את של יחסי התלות ברקע.
- מייבאים את Firebase לאפליקציה:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
אם עדיין לא הפעלתם ממשקי API מבוססי-Cloud בפרויקט, עליכם לעשות זאת עכשיו:
- פותחים את דף ממשקי ה-API של Firebase ML במסוף Firebase.
-
אם עדיין לא שדרגתם את הפרויקט לתוכנית התמחור Blaze, לוחצים על שדרוג. (הבקשה לשדרוג תוצג רק אם הפרויקט לא בתוכנית Blaze).
רק בפרויקטים ברמת Blaze אפשר להשתמש בממשקי API מבוססי-ענן.
- אם ממשקי API מבוססי-ענן עדיין לא מופעלים, לוחצים על Enable Cloud-based APIs. ממשקי API.
שימוש ב-Swift Package Manager כדי להתקין ולנהל יחסי תלות של Firebase.
https://github.com/firebase/firebase-ios-sdk.git
עכשיו מבצעים הגדרה בתוך האפליקציה:
עכשיו אפשר להתחיל לזהות טקסט בתמונות.
הנחיות לתמונות קלט
-
כדי ש-Firebase ML יוכל לזהות טקסט באופן מדויק, תמונות הקלט צריכות לכלול שמיוצג על ידי כמות מספקת של נתוני פיקסלים. באופן אידיאלי, לטקסט לטינית, כל תו צריך להיות בגודל של 16x16 פיקסלים לפחות. בסינית, טקסט ביפנית ובקוריאנית, כל אחד צריך להיות בגודל 24x24 פיקסלים. בכל השפות, בדרך כלל אין לשיפור הדיוק של התווים, כך שהם יהיו גדולים מ-24x24 פיקסלים.
כך, לדוגמה, תמונה בגודל 640x480 יכולה להתאים לסריקת כרטיס ביקור שתופס את כל הרוחב של התמונה. כדי לסרוק מסמך שמודפס על נייר בגודל Letter, יכול להיות שתצטרכו תמונה בגודל 720x1280 פיקסלים.
-
מיקוד לקוי של התמונה עלול לפגוע בדיוק זיהוי הטקסט. אם התוצאות לא מתקבלות, נסו לבקש מהמשתמש לצלם מחדש את התמונה.
זיהוי טקסט בתמונות
כדי לזהות טקסט בתמונה, מריצים את הכלי לזיהוי טקסט כפי שמתואר בהמשך.
1. הרצה של מזהה הטקסט
מעבירים את התמונה כ-UIImage
או כ-CMSampleBufferRef
אל
process(_:completion:)
של VisionTextRecognizer
method:
- כדי לקבל מופע של
VisionTextRecognizer
, קוראים ל-cloudTextRecognizer
:Swift
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)
Objective-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];
-
כדי לקרוא ל-Cloud Vision, התמונה צריכה להיות בפורמט של קידוד base64
String. כדי לעבד
UIImage
:Swift
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
-
לאחר מכן, מעבירים את התמונה לשיטה
process(_:completion:)
:Swift
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Objective-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
, אפשר לקבל את הטקסט שזוהה באזור ואת קואורדינטות הגבול של האזור.
לדוגמה:
Swift
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 } } }
Objective-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; } } }
השלבים הבאים
- לפני שפורסים לסביבת ייצור אפליקציה שמשתמשת ב-Cloud API, צריך לבצע את הפעולות הבאות צעדים נוספים למניעה ולצמצום ההשפעה של גישה לא מורשית ל-API.
זיהוי טקסט בתמונות של מסמכים
כדי לזהות טקסט של מסמך, יש להגדיר ולהריץ את מזהה טקסט של מסמכים, כמו שמתואר בהמשך.
ממשק ה-API לזיהוי טקסט במסמכים, שמתואר בהמשך, מספק ממשק שנועד להקל על העבודה עם תמונות של מסמכים. אבל, לפעמים אם אתם מעדיפים את הממשק שמסופק על ידי ה-sparse text API, תוכלו להשתמש בו במקום לסרוק מסמכים על ידי הגדרת מזהה הטקסט בענן להשתמש במודל הטקסט הדחיסה.
כדי להשתמש בממשק ה-API לזיהוי טקסט במסמך:
1. הרצת הכלי לזיהוי טקסט
מעבירים את התמונה כ-UIImage
או כ-CMSampleBufferRef
אל
process(_:completion:)
של VisionDocumentTextRecognizer
method:
- כדי לקבל מופע של
VisionDocumentTextRecognizer
, צריך להתקשרcloudDocumentTextRecognizer
:Swift
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)
Objective-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];
-
כדי לקרוא ל-Cloud Vision, התמונה צריכה להיות בפורמט של קידוד base64
String. כדי לעבד
UIImage
:Swift
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
-
לאחר מכן, מעבירים את התמונה לשיטה
process(_:completion:)
:Swift
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Objective-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
, אפשר לקבל את הטקסט שזוהה באזור ואת קואורדינטות הגבול של האזור.
לדוגמה:
Swift
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 } } } }
Objective-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; } } } }
השלבים הבאים
- לפני שפורסים לסביבת ייצור אפליקציה שמשתמשת ב-Cloud API, צריך לבצע את הפעולות הבאות צעדים נוספים למניעה ולצמצום ההשפעה של גישה לא מורשית ל-API.