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, suivez les
les étapes du guide de démarrage.
- Dans Xcode, ouvrez le projet de votre application, puis accédez à File > Ajouter des packages.
- Lorsque vous y êtes invité, ajoutez le dépôt du SDK des plates-formes Firebase pour Apple :
- Sélectionnez 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 dans le cloud pour votre projet, faites-le dès maintenant:
- Ouvrez le Firebase ML page des API 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 des API dans 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 points de repère
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-les avec un objet VisionCloudDetectorOptions
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 VisionCloudDetectorOptions
lorsque vous créez l'objet "Détecteur de cloud".
Exécuter le détecteur de points de repère
Pour reconnaître les points de repère dans une image, transmettez-la en tant queUIImage
ou
CMSampleBufferRef
jusqu'au detect(in:)
de VisionCloudLandmarkDetector
méthode:
- 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 que vous puissiez appeler Cloud Vision, l'image doit être 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 points de repère 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.