Vous pouvez utiliser Firebase ML pour reconnaître du texte dans des images. Firebase ML a une API à usage général adaptée à la reconnaissance de texte dans des images, le texte d'un panneau indicateur et une API optimisée pour reconnaître documents.
Avant de commencer
-
Si vous n'avez pas encore ajouté Firebase à votre application, faites-le en suivant la procédure décrite dans le guide de démarrage.
- Dans Xcode, à partir de votre projet d'application ouvert, accédez à File > Add Packages (Fichier > Ajouter des packages).
- Lorsque vous y êtes invité, ajoutez le dépôt du SDK des plates-formes Firebase pour Apple :
- Choisissez la bibliothèque Firebase ML.
- Ajoutez l'indicateur
-ObjC
à la section Other Linker Flags (Autres indicateurs Linker) des paramètres de compilation de votre cible. - Lorsque vous avez terminé, Xcode commence à résoudre et à télécharger automatiquement vos dépendances en arrière-plan.
- Dans votre application, importez Firebase:
<ph type="x-smartling-placeholder">
</ph> Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
Si vous n'avez pas encore activé les API dans le cloud pour votre projet, faites-le dès maintenant:
- Ouvrez la page API Firebase ML de la console Firebase.
-
Si vous n'avez pas encore fait passer votre projet au forfait Blaze, cliquez sur Pour ce faire, effectuez une mise à niveau. (Vous ne serez invité à effectuer la mise à niveau projet n'est pas inclus dans la formule Blaze.)
Seuls les projets de niveau Blaze peuvent utiliser les API basées sur le cloud.
- Si les API cloud ne sont pas déjà activées, cliquez sur Activer les API cloud.
Utilisez Swift Package Manager pour installer et gérer les dépendances Firebase.
https://github.com/firebase/firebase-ios-sdk.git
Ensuite, effectuez la configuration dans l'application:
Vous êtes maintenant prêt à commencer à reconnaître du texte dans des images.
Consignes concernant les images d'entrée
-
Pour que Firebase ML reconnaisse le texte avec précision, les images d'entrée doivent contenir du texte représenté par suffisamment de données de pixels. Dans l'idéal, pour le texte latin, chaque caractère doit mesurer au moins 16x16 pixels. Pour le texte en chinois, en coréen et en japonais, chaque caractère doit mesurer 24 x 24 pixels. Pour toutes les langues, il n'y a généralement aucun avantage de précision à ce que les caractères soient plus grands que 24 x 24 pixels.
Par exemple, une image de 640 x 480 pixels peut convenir pour numériser une carte de visite qui occupe toute la largeur de l'image. Pour numériser un document imprimé sur du papier au format lettre, une image de 720 x 1 280 pixels peut être requise.
-
Une mise au point médiocre de l'image peut nuire à la précision de la reconnaissance du texte. Si vous n'obtenez pas de résultats acceptables, essayez de demander à l'utilisateur de reprendre la photo.
Détectez du texte dans des images
Pour reconnaître du texte dans une image, exécutez le service de reconnaissance de texte comme décrit ci-dessous.
1. Exécuter la reconnaissance de texte
Transmettez l'image en tant queUIImage
ou CMSampleBufferRef
à la
process(_:completion:)
de VisionTextRecognizer
méthode:
- Obtenez une instance de
VisionTextRecognizer
en appelantcloudTextRecognizer
: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];
-
Pour appeler Cloud Vision, l'image doit être mise en forme sous la forme d'une chaîne encodée en base64. Pour traiter un
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];
-
Transmettez ensuite l'image à la méthode
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. Extraire le texte de blocs de texte reconnu
Si l'opération de reconnaissance de texte réussit, elle renvoie une objetVisionText
. Un objet VisionText
contient le texte complet 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
:
pour que le texte soit reconnu dans la région et les coordonnées
la région.
Exemple :
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; } } }
Étapes suivantes
- Avant de déployer en production une application qui utilise une API Cloud, vous devez effectuer quelques mesures supplémentaires pour prévenir et atténuer l'effet 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 de documents texte comme décrit ci-dessous.
L'API de reconnaissance de document texte, décrite ci-dessous, fournit une interface qui est conçu 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 le lecteur de texte cloud pour qu'il utilise le modèle de texte dense.
Pour utiliser l'API de reconnaissance de texte dans les documents :
1. Exécuter la reconnaissance de texte
Transmettez l'image en tant queUIImage
ou CMSampleBufferRef
à la
process(_:completion:)
de VisionDocumentTextRecognizer
méthode:
- Obtenez une instance de
VisionDocumentTextRecognizer
en appelantcloudDocumentTextRecognizer
: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];
-
Pour appeler Cloud Vision, l'image doit être mise en forme sous la forme d'une chaîne encodée en base64. Pour traiter un
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];
-
Transmettez ensuite l'image à la méthode
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. Extraire du texte à partir de blocs de texte reconnu
Si l'opération de reconnaissance de texte aboutit, elle renvoie un objetVisionDocumentText
. Un objet VisionDocumentText
contient le texte intégral reconnu dans l'image et une hiérarchie d'objets
reflètent la structure du document reconnu:
Pour chaque VisionDocumentTextBlock
, VisionDocumentTextParagraph
,
VisionDocumentTextWord
et VisionDocumentTextSymbol
, vous pouvez obtenir
texte reconnu dans la région et ses coordonnées de délimitation.
Exemple :
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; } } } }
Étapes suivantes
- Avant de déployer en production une application qui utilise une API Cloud, vous devez effectuer quelques mesures supplémentaires pour prévenir et atténuer l'effet d'un accès non autorisé à l'API.