Vous pouvez utiliser Firebase ML pour reconnaître le texte dans les images. Firebase ML dispose à la fois d'une API à usage général adaptée à la reconnaissance du texte dans les images, comme le texte d'un panneau de signalisation, et d'une API optimisée pour la reconnaissance du texte des documents.
Avant que tu commences
- Si vous n'avez pas encore ajouté Firebase à votre application, faites-le en suivant les étapes du guide de démarrage .
- Dans Xcode, avec votre projet d'application ouvert, accédez à File > Add Packages .
- Lorsque vous y êtes invité, ajoutez le dépôt du SDK des plates-formes Apple Firebase :
- Choisissez la bibliothèque Firebase ML.
- Une fois terminé, Xcode commencera automatiquement à résoudre et à télécharger vos dépendances en arrière-plan.
- Dans votre application, importez Firebase :
Rapide
import FirebaseMLModelDownloader
Objectif c
@import FirebaseMLModelDownloader;
Si vous n'avez pas encore activé les API basées sur le cloud pour votre projet, faites-le maintenant :
- Ouvrez la page API Firebase ML de la console Firebase.
Si vous n'avez pas encore mis à niveau votre projet vers le plan tarifaire Blaze, cliquez sur Mettre à niveau pour le faire. (Vous serez invité à mettre à niveau uniquement si votre projet n'est pas sur le plan Blaze.)
Seuls les projets de niveau Blaze peuvent utiliser des API basées sur le cloud.
- Si les API basées sur le cloud ne sont pas déjà activées, cliquez sur Activer les API basées sur le cloud .
Utilisez Swift Package Manager pour installer et gérer les dépendances Firebase.
https://github.com/firebase/firebase-ios-sdk
Ensuite, effectuez une configuration dans l'application :
Vous êtes maintenant prêt à commencer à reconnaître du texte dans des images.
Directives pour les images d'entrée
Pour que Firebase ML reconnaisse avec précision le texte, les images d'entrée doivent contenir du texte représenté par suffisamment de données de pixels. Idéalement, pour le texte latin, chaque caractère doit faire au moins 16 x 16 pixels. Pour le texte chinois, japonais et coréen, chaque caractère doit être de 24 x 24 pixels. Pour toutes les langues, il n'y a généralement aucun avantage en termes de précision pour les caractères supérieurs à 24 x 24 pixels.
Ainsi, par exemple, une image 640x480 peut bien fonctionner pour numériser une carte de visite qui occupe toute la largeur de l'image. Pour numériser un document imprimé sur du papier de format lettre, une image de 720 x 1280 pixels peut être nécessaire.
Une mauvaise mise au point de l'image peut nuire à la précision de la reconnaissance de texte. Si vous n'obtenez pas de résultats acceptables, essayez de demander à l'utilisateur de reprendre l'image.
Reconnaître le texte dans les images
Pour reconnaître du texte dans une image, exécutez la reconnaissance de texte comme décrit ci-dessous.
1. Exécutez la reconnaissance de texte
Transmettez l'image en tant queUIImage
ou CMSampleBufferRef
à la méthode process(_:completion:)
de VisionTextRecognizer
:- Obtenez une instance de
VisionTextRecognizer
en appelantcloudTextRecognizer
:Rapide
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)
Objectif 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];
- Pour appeler Cloud Vision, l'image doit être au format d'une chaîne encodée en base64. Pour traiter une
UIImage
:Rapide
guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
Objectif c
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Ensuite, passez l'image à la méthode
process(_:completion:)
:Rapide
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Objectif c
[textRecognizer processImage:image completion:^(FIRVisionText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. Extraire du texte à partir de blocs de texte reconnu
Si l'opération de reconnaissance de texte réussit, elle renverra un objetVisionText
. Un objet VisionText
contient le texte intégral reconnu dans l'image et zéro ou plusieurs objets VisionTextBlock
. Chaque VisionTextBlock
représente un bloc de texte rectangulaire, qui contient zéro ou plusieurs objets VisionTextLine
. Chaque objet VisionTextLine
contient zéro ou plusieurs objets VisionTextElement
, qui représentent des mots et des entités semblables à des mots (dates, nombres, etc.).
Pour chaque objet VisionTextBlock
, VisionTextLine
et VisionTextElement
, vous pouvez obtenir le texte reconnu dans la région et les coordonnées de délimitation de la région.
Par exemple:
Rapide
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 } } }
Objectif 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; } } }
Prochaines étapes
- Avant de déployer en production une application qui utilise une API Cloud, vous devez prendre des mesures supplémentaires pour empêcher et atténuer les effets d'un accès non autorisé à l'API .
Reconnaître du texte dans des images de documents
Pour reconnaître le texte d'un document, configurez et exécutez la reconnaissance de texte de document comme décrit ci-dessous.
L'API de reconnaissance de texte de document, décrite ci-dessous, fournit une interface conçue pour être plus pratique pour travailler avec des images de documents. Toutefois, si vous préférez l'interface fournie par l'API de texte clairsemé, vous pouvez l'utiliser à la place pour numériser des documents en configurant la reconnaissance de texte en nuage pour utiliser le modèle de texte dense .
Pour utiliser l'API de reconnaissance de texte de document :
1. Exécutez la reconnaissance de texte
Transmettez l'image en tant queUIImage
ou CMSampleBufferRef
à la méthode process(_:completion:)
de VisionDocumentTextRecognizer
:- Obtenez une instance de
VisionDocumentTextRecognizer
en appelantcloudDocumentTextRecognizer
:Rapide
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)
Objectif 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];
- Pour appeler Cloud Vision, l'image doit être au format d'une chaîne encodée en base64. Pour traiter une
UIImage
:Rapide
guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
Objectif c
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Ensuite, passez l'image à la méthode
process(_:completion:)
:Rapide
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Objectif c
[textRecognizer processImage:image completion:^(FIRVisionDocumentText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. Extraire du texte à partir de blocs de texte reconnu
Si l'opération de reconnaissance de texte réussit, elle renverra un objetVisionDocumentText
. Un objet VisionDocumentText
contient le texte intégral reconnu dans l'image et une hiérarchie d'objets qui reflètent la structure du document reconnu : Pour chaque objet VisionDocumentTextBlock
, VisionDocumentTextParagraph
, VisionDocumentTextWord
et VisionDocumentTextSymbol
, vous pouvez obtenir le texte reconnu dans la région et les coordonnées de délimitation de la région.
Par exemple:
Rapide
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 } } } }
Objectif 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; } } } }
Prochaines étapes
- Avant de déployer en production une application qui utilise une API Cloud, vous devez prendre des mesures supplémentaires pour empêcher et atténuer les effets d'un accès non autorisé à l'API .