Vous pouvez utiliser ML Kit pour étiqueter les objets reconnus dans une image, à l'aide d'un modèle sur l'appareil ou d'un modèle cloud. Consultez la présentation pour en savoir plus sur les avantages de chaque approche.
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 .
- Incluez les bibliothèques ML Kit dans votre Podfile :
pod 'Firebase/MLVision', '6.25.0'
Après avoir installé ou mis à jour les pods de votre projet, assurez-vous d'ouvrir votre projet Xcode à l'aide de son# If using the on-device API: pod 'Firebase/MLVisionLabelModel', '6.25.0'
.xcworkspace
. - Dans votre application, importez Firebase :
Rapide
import Firebase
Objectif c
@import Firebase;
Si vous souhaitez utiliser le modèle basé sur le cloud et que vous n'avez pas encore activé les API basées sur le cloud pour votre projet, faites-le maintenant :
- Ouvrez la page API du kit ML de la console Firebase.
Si vous n'avez pas encore mis à niveau votre projet vers un 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 .
Si vous souhaitez utiliser uniquement le modèle sur appareil, vous pouvez ignorer cette étape.
Vous êtes maintenant prêt à étiqueter des images à l'aide d'un modèle sur appareil ou d'un modèle basé sur le cloud.
1. Préparez l'image d'entrée
Créez un objet VisionImage
à l'aide d'un UIImage
ou d'un CMSampleBufferRef
.
Pour utiliser une UIImage
:
- Si nécessaire, faites pivoter l'image afin que sa propriété
imageOrientation
soit.up
. - Créez un objet
VisionImage
à l'aide de l'objetUIImage
correctement pivoté. Ne spécifiez aucune métadonnée de rotation—la valeur par défaut,.topLeft
, doit être utilisée.Rapide
let image = VisionImage(image: uiImage)
Objectif c
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
Pour utiliser un CMSampleBufferRef
:
Créez un objet
VisionImageMetadata
qui spécifie l'orientation des données d'image contenues dans le tamponCMSampleBufferRef
.Pour obtenir l'orientation de l'image :
Rapide
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
Objectif c
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
Créez ensuite l'objet de métadonnées :
Rapide
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Objectif c
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
- Créez un objet
VisionImage
à l'aide de l'objetCMSampleBufferRef
et des métadonnées de rotation :Rapide
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objectif c
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
2. Configurer et exécuter l'étiqueteuse d'image
Pour étiqueter des objets dans une image, transmettez l'objetVisionImage
à la VisionImageLabeler
processImage()
de VisionImageLabeler .Tout d'abord, obtenez une instance de
VisionImageLabeler
.Si vous souhaitez utiliser l'étiqueteur d'images intégré à l'appareil :
Rapide
let labeler = Vision.vision().onDeviceImageLabeler() // Or, to set the minimum confidence required: // let options = VisionOnDeviceImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = Vision.vision().onDeviceImageLabeler(options: options)
Objectif c
FIRVisionImageLabeler *labeler = [[FIRVision vision] onDeviceImageLabeler]; // Or, to set the minimum confidence required: // FIRVisionOnDeviceImageLabelerOptions *options = // [[FIRVisionOnDeviceImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // FIRVisionImageLabeler *labeler = // [[FIRVision vision] onDeviceImageLabelerWithOptions:options];
Si vous souhaitez utiliser l'éditeur d'étiquettes d'images cloud :
Rapide
let labeler = Vision.vision().cloudImageLabeler() // Or, to set the minimum confidence required: // let options = VisionCloudImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = Vision.vision().cloudImageLabeler(options: options)
Objectif c
FIRVisionImageLabeler *labeler = [[FIRVision vision] cloudImageLabeler]; // Or, to set the minimum confidence required: // FIRVisionCloudImageLabelerOptions *options = // [[FIRVisionCloudImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // FIRVisionImageLabeler *labeler = // [[FIRVision vision] cloudImageLabelerWithOptions:options];
Ensuite, passez l'image à la méthode
processImage()
:Rapide
labeler.process(image) { labels, error in guard error == nil, let labels = labels else { return } // Task succeeded. // ... }
Objectif c
[labeler processImage:image completion:^(NSArray<FIRVisionImageLabel *> *_Nullable labels, NSError *_Nullable error) { if (error != nil) { return; } // Task succeeded. // ... }];
3. Obtenir des informations sur les objets étiquetés
Si l'étiquetage d'image réussit, un tableau d'objetsVisionImageLabel
sera transmis au gestionnaire d'achèvement. A partir de chaque objet, vous pouvez obtenir des informations sur une caractéristique reconnue dans l'image.Par exemple:
Rapide
for label in labels {
let labelText = label.text
let entityId = label.entityID
let confidence = label.confidence
}
Objectif c
for (FIRVisionImageLabel *label in labels) {
NSString *labelText = label.text;
NSString *entityId = label.entityID;
NSNumber *confidence = label.confidence;
}
Conseils pour améliorer les performances en temps réel
Si vous souhaitez étiqueter des images dans une application en temps réel, suivez ces instructions pour obtenir les meilleures fréquences d'images :
- Limiter les appels à l'étiqueteur d'images. Si une nouvelle image vidéo devient disponible pendant que l'étiqueteuse d'image est en cours d'exécution, supprimez l'image.
- Si vous utilisez la sortie de l'étiqueteuse d'image pour superposer des graphiques sur l'image d'entrée, obtenez d'abord le résultat de ML Kit, puis affichez l'image et la superposition en une seule étape. Ce faisant, vous effectuez le rendu sur la surface d'affichage une seule fois pour chaque image d'entrée. Voir les classes previewOverlayView et FIRDetectionOverlayView dans l'exemple d'application vitrine pour un exemple.
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 .