Vous pouvez utiliser Firebase ML pour reconnaître des repères bien connus dans une image.
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 :
Swift
import FirebaseMLModelDownloader
Objective-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 migré votre projet vers le forfait Blaze, cliquez sur Mettre à niveau pour le faire. (Vous ne serez invité à effectuer la migration que si votre projet n'est pas associé au forfait 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
Effectuez ensuite une configuration dans l'application:
Configurer le détecteur de repères
Par défaut, le détecteur Cloud utilise la version stable du modèle et renvoie jusqu'à 10 résultats. Si vous souhaitez modifier l'un de ces paramètres, spécifiez-le avec un objet VisionCloudDetectorOptions
, comme dans l'exemple suivant:
Swift
let options = VisionCloudDetectorOptions() options.modelType = .latest options.maxResults = 20
Objective-C
FIRVisionCloudDetectorOptions *options = [[FIRVisionCloudDetectorOptions alloc] init]; options.modelType = FIRVisionCloudModelTypeLatest; options.maxResults = 20;
À l'étape suivante, transmettez l'objet VisionCloudDetectorOptions
lorsque vous créez l'objet détecteur Cloud.
Exécuter le détecteur de points de repère
Pour reconnaître des repères dans une image, transmettez l'image en tant queUIImage
ou CMSampleBufferRef
à la méthode detect(in:)
de VisionCloudLandmarkDetector
:
- Obtenez une instance de
VisionCloudLandmarkDetector
:Swift
lazy var vision = Vision.vision() let cloudDetector = vision.cloudLandmarkDetector(options: options) // Or, to use the default settings: // let cloudDetector = vision.cloudLandmarkDetector()
Objective-C
FIRVision *vision = [FIRVision vision]; FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector]; // Or, to change the default settings: // FIRVisionCloudLandmarkDetector *landmarkDetector = // [vision cloudLandmarkDetectorWithOptions: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
detect(in:)
:Swift
cloudDetector.detect(in: visionImage) { landmarks, error in guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else { // ... return } // Recognized landmarks // ... }
Objective-C
[landmarkDetector detectInImage:image completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks, NSError *error) { if (error != nil) { return; } else if (landmarks != nil) { // Got landmarks } }];
Obtenir des informations sur les repères reconnus
Si la reconnaissance de repère aboutit, un tableau d'objetsVisionCloudLandmark
est transmis au gestionnaire de finalisation. Pour chaque objet, vous pouvez obtenir des informations sur un repère reconnu dans l'image.
Exemple :
Swift
for landmark in landmarks { let landmarkDesc = landmark.landmark let boundingPoly = landmark.frame let entityId = landmark.entityId // A landmark can have multiple locations: for example, the location the image // was taken, and the location of the landmark depicted. for location in landmark.locations { let latitude = location.latitude let longitude = location.longitude } let confidence = landmark.confidence }
Objective-C
for (FIRVisionCloudLandmark *landmark in landmarks) { NSString *landmarkDesc = landmark.landmark; CGRect frame = landmark.frame; NSString *entityId = landmark.entityId; // A landmark can have multiple locations: for example, the location the image // was taken, and the location of the landmark depicted. for (FIRVisionLatitudeLongitude *location in landmark.locations) { double latitude = [location.latitude doubleValue]; double longitude = [location.longitude doubleValue]; } float confidence = [landmark.confidence floatValue]; }
Étapes suivantes
- 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 l'impact d'un accès non autorisé à l'API.