אתה יכול להשתמש ב-Firebase ML כדי לזהות טקסט בתמונות. ל-Firebase ML יש גם API לשימוש כללי המתאים לזיהוי טקסט בתמונות, כגון טקסט של שלט רחוב, וגם API המותאם לזיהוי טקסט של מסמכים.
לפני שאתה מתחיל
- אם עדיין לא הוספת את Firebase לאפליקציה שלך, עשה זאת על ידי ביצוע השלבים במדריך לתחילת העבודה .
- ב-Xcode, כשפרויקט האפליקציה שלך פתוח, נווט אל קובץ > הוסף חבילות .
- כשתתבקש, הוסף את מאגר Firebase Apple platforms SDK:
- בחר את ספריית Firebase ML.
- הוסף את הדגל
-ObjC
לקטע Other Linker Flags של הגדרות הבנייה של היעד שלך. - בסיום, Xcode יתחיל באופן אוטומטי לפתור ולהוריד את התלות שלך ברקע.
- באפליקציה שלך, ייבא את Firebase:
מָהִיר
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
אם עדיין לא הפעלת ממשקי API מבוססי ענן עבור הפרויקט שלך, עשה זאת כעת:
- פתח את הדף Firebase ML APIs של מסוף Firebase.
אם עדיין לא שדרגת את הפרויקט שלך לתוכנית התמחור של Blaze, לחץ על שדרג כדי לעשות זאת. (תתבקש לשדרג רק אם הפרויקט שלך אינו בתוכנית Blaze.)
רק פרויקטים ברמת Blaze יכולים להשתמש בממשקי API מבוססי ענן.
- אם ממשקי API מבוססי ענן עדיין לא מופעלים, לחץ על הפעל ממשקי 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
:- קבל מופע של
VisionTextRecognizer
על ידי קריאה ל-cloudTextRecognizer
:מָהִיר
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. כדי לעבד
UIImage
:מָהִיר
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:)
:מָהִיר
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
, אתה יכול לזהות את הטקסט באזור ואת הקואורדינטות התוחמות של האזור.
לדוגמה:
מָהִיר
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 לזיהוי טקסט של מסמכים, המתואר להלן, מספק ממשק שנועד להיות נוח יותר לעבודה עם תמונות של מסמכים. עם זאת, אם אתה מעדיף את הממשק המסופק על ידי API של טקסט דליל, אתה יכול להשתמש בו במקום לסרוק מסמכים על ידי הגדרת מזהה הטקסט בענן לשימוש במודל הטקסט הדחוס .
כדי להשתמש ב-API לזיהוי טקסט של מסמכים:
1. הפעל את מזהה הטקסט
העבר את התמונה כ-UIImage
או CMSampleBufferRef
לשיטת process(_:completion:)
של VisionDocumentTextRecognizer
:- קבל מופע של
VisionDocumentTextRecognizer
על ידי קריאה ל-cloudDocumentTextRecognizer
:מָהִיר
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. כדי לעבד
UIImage
:מָהִיר
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:)
:מָהִיר
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
, ניתן לזהות את הטקסט באזור ואת הקואורדינטות התוחמות של האזור.
לדוגמה:
מָהִיר
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 .