Bilder mit einem von AutoML trainierten Modell unter iOS mit Labels versehen
<ph type="x-smartling-placeholder">Nachdem Sie Ihr eigenes Modell mit AutoML Vision Edge trainiert haben, führen Sie folgende Schritte aus: können Sie sie in Ihrer App zum Beschriften von Bildern verwenden.
Es gibt zwei Möglichkeiten, mit AutoML Vision Edge trainierte Modelle einzubinden. Sie können bündeln Sie das Modell, indem Sie die Modelldateien in Ihr Xcode-Projekt kopieren, oder kann es dynamisch aus Firebase herunterladen.
Optionen für Modellbündelung | |
---|---|
In deiner App enthalten |
|
Mit Firebase gehostet |
|
Jetzt ausprobieren
- Probieren Sie die Beispiel-App aus, um sehen Sie sich ein Anwendungsbeispiel für diese API an.
Hinweis
1. Fügen Sie die ML Kit-Bibliotheken in die Podfile-Datei ein:So bündeln Sie ein Modell mit Ihrer App:
pod 'GoogleMLKit/ImageLabelingAutoML'Fügen Sie zum dynamischen Herunterladen eines Modells aus Firebase den
LinkFirebase
hinzu.
Abhängigkeit:
pod 'GoogleMLKit/ImageLabelingAutoML' pod 'GoogleMLKit/LinkFirebase'2. Öffnen Sie nach der Installation oder Aktualisierung der Pods Ihres Projekts das Xcode-Projekt. unter Verwendung seines
.xcworkspace
code>. ML Kit wird in Xcode unterstützt
Version 13.2.1 oder höher.
3. Wenn Sie ein Modell herunterladen möchten, müssen Sie
Firebase zu Ihrem iOS-Projekt hinzufügen,
falls noch nicht geschehen. Dies ist nicht erforderlich, wenn Sie
Modell.
1. Modell laden
Lokale Modellquelle konfigurieren
So bündeln Sie das Modell mit Ihrer App:1. Modell und seine Metadaten aus dem heruntergeladenen ZIP-Archiv extrahieren aus der Firebase Console in einen Ordner:
your_model_directory |____dict.txt |____manifest.json |____model.tfliteAlle drei Dateien müssen sich im selben Ordner befinden. Wir empfehlen, die Dateien wie sie heruntergeladen wurden, ohne Änderungen (einschließlich der Dateinamen).
2. Kopieren Sie den Ordner in Ihr Xcode-Projekt und wählen Sie Erstellen Sie in diesem Fall Ordnerverweise. Die Modelldatei und Metadaten ist im App Bundle enthalten und für ML Kit verfügbar.
3. Erstellen Sie ein
AutoMLImageLabelerLocalModel
-Objekt und geben Sie dabei den Pfad zum
Manifestdatei des Modells:
Swift
guard let manifestPath = Bundle.main.path( forResource: "manifest", ofType: "json", inDirectory: "your_model_directory" ) else { return } let localModel = AutoMLImageLabelerLocalModel(manifestPath: manifestPath)
Objective-C
NSString *manifestPath = [NSBundle.mainBundle pathForResource:@"manifest" ofType:@"json" inDirectory:@"your_model_directory"]; MLKAutoMLImageLabelerLocalModel *localModel = [[MLKAutoMLImageLabelerLocalModel alloc] initWithManifestPath:manifestPath];
Von Firebase gehostete Modellquelle konfigurieren
Erstellen Sie ein AutoMLImageLabelerRemoteModel
, um das remote gehostete Modell zu verwenden
und geben Sie den Namen an, den Sie dem Modell bei der Veröffentlichung zugewiesen haben:
Swift
let remoteModel = AutoMLImageLabelerRemoteModel( name: "your_remote_model" // The name you assigned in // the Firebase console. )
Objective-C
MLKAutoMLImageLabelerRemoteModel *remoteModel = [[MLKAutoMLImageLabelerRemoteModel alloc] initWithName:@"your_remote_model"]; // The name you assigned in // the Firebase console.
Starten Sie dann den Modelldownload und geben Sie die Bedingungen an, unter denen Sie Downloads zulassen möchten. Wenn das Modell nicht auf dem Gerät installiert ist oder ein neueres Modell Version des Modells verfügbar ist, lädt die Task asynchron die aus Firebase verwenden:
Swift
let downloadConditions = ModelDownloadConditions( allowsCellularAccess: true, allowsBackgroundDownloading: true ) let downloadProgress = ModelManager.modelManager().download( remoteModel, conditions: downloadConditions )
Objective-C
MLKModelDownloadConditions *downloadConditions = [[MLKModelDownloadConditions alloc] initWithAllowsCellularAccess:YES allowsBackgroundDownloading:YES]; NSProgress *downloadProgress = [[MLKModelManager modelManager] downloadModel:remoteModel conditions:downloadConditions];
Viele Apps starten die Download-Aufgabe im Initialisierungscode, aber Sie können jederzeit tun, bevor Sie das Modell verwenden müssen.
Labelersteller für Bilder aus Ihrem Modell erstellen
Nachdem Sie die Modellquellen konfiguriert haben, erstellen Sie ein ImageLabeler
-Objekt aus einer
von ihnen.
Wenn Sie nur ein lokal gebündeltes Modell haben, erstellen Sie einfach einen Labelersteller
AutoMLImageLabelerLocalModel
-Objekt und konfigurieren Sie den Konfidenzwert
Grenzwert, den Sie verlangen möchten (siehe Modus auswerten:
Swift
let options = AutoMLImageLabelerOptions(localModel: localModel) options.confidenceThreshold = NSNumber(value: 0.0) // Evaluate your model in the Firebase console // to determine an appropriate value. let imageLabeler = ImageLabeler.imageLabeler(options: options)
Objective-C
MLKAutoMLImageLabelerOptions *options = [[MLKAutoMLImageLabelerOptions alloc] initWithLocalModel:localModel]; options.confidenceThreshold = @(0.0); // Evaluate your model in the Firebase console // to determine an appropriate value. MLKImageLabeler *imageLabeler = [MLKImageLabeler imageLabelerWithOptions:options];
Wenn Sie ein extern gehostetes Modell haben, müssen Sie prüfen,
die Sie vor der Ausführung heruntergeladen haben. Sie können den Status des Modelldownloads
Aufgabe mithilfe der Methode isModelDownloaded
(remoteModel:) des Modellmanagers an.
Sie müssen dies nur vor dem Ausführen des Labelerstellers bestätigen. Wenn Sie
ein remote gehostetes und ein lokal gebündeltes Modell haben,
sinnvoll, diese Prüfung bei der Instanziierung von ImageLabeler
durchzuführen:
Labelersteller aus dem Remote-Modell, falls es heruntergeladen wurde, und vom lokalen Modell
sonst.
Swift
var options: AutoMLImageLabelerOptions! if (ModelManager.modelManager().isModelDownloaded(remoteModel)) { options = AutoMLImageLabelerOptions(remoteModel: remoteModel) } else { options = AutoMLImageLabelerOptions(localModel: localModel) } options.confidenceThreshold = NSNumber(value: 0.0) // Evaluate your model in the Firebase console // to determine an appropriate value. let imageLabeler = ImageLabeler.imageLabeler(options: options)
Objective-C
MLKAutoMLImageLabelerOptions *options; if ([[MLKModelManager modelManager] isModelDownloaded:remoteModel]) { options = [[MLKAutoMLImageLabelerOptions alloc] initWithRemoteModel:remoteModel]; } else { options = [[MLKAutoMLImageLabelerOptions alloc] initWithLocalModel:localModel]; } options.confidenceThreshold = @(0.0); // Evaluate your model in the Firebase console // to determine an appropriate value. MLKImageLabeler *imageLabeler = [MLKImageLabeler imageLabelerWithOptions:options];
Wenn Sie nur ein remote gehostetes Modell haben, sollten Sie die modellbezogenen wie z. B. das Ausgrauen oder Ausblenden eines Teils der Benutzeroberfläche, bis bestätigen Sie, dass das Modell heruntergeladen wurde.
Sie können den Downloadstatus des Modells abrufen, indem Sie Beobachter an die Standardeinstellung anhängen
Benachrichtigungscenter. Achten Sie darauf, im Beobachter einen schwachen Verweis auf self
zu verwenden
-Block, da Downloads einige Zeit in Anspruch nehmen können und das ursprüngliche Objekt
wird erst wieder freigegeben, wenn der Download abgeschlossen ist. Beispiel:
Swift
NotificationCenter.default.addObserver( forName: .mlkitModelDownloadDidSucceed, object: nil, queue: nil ) { [weak self] notification in guard let strongSelf = self, let userInfo = notification.userInfo, let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue] as? RemoteModel, model.name == "your_remote_model" else { return } // The model was downloaded and is available on the device } NotificationCenter.default.addObserver( forName: .mlkitModelDownloadDidFail, object: nil, queue: nil ) { [weak self] notification in guard let strongSelf = self, let userInfo = notification.userInfo, let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue] as? RemoteModel else { return } let error = userInfo[ModelDownloadUserInfoKey.error.rawValue] // ... }
Objective-C
__weak typeof(self) weakSelf = self; [NSNotificationCenter.defaultCenter addObserverForName:MLKModelDownloadDidSucceedNotification object:nil queue:nil usingBlock:^(NSNotification *_Nonnull note) { if (weakSelf == nil | note.userInfo == nil) { return; } __strong typeof(self) strongSelf = weakSelf; MLKRemoteModel *model = note.userInfo[MLKModelDownloadUserInfoKeyRemoteModel]; if ([model.name isEqualToString:@"your_remote_model"]) { // The model was downloaded and is available on the device } }]; [NSNotificationCenter.defaultCenter addObserverForName:MLKModelDownloadDidFailNotification object:nil queue:nil usingBlock:^(NSNotification *_Nonnull note) { if (weakSelf == nil | note.userInfo == nil) { return; } __strong typeof(self) strongSelf = weakSelf; NSError *error = note.userInfo[MLKModelDownloadUserInfoKeyError]; }];
2. Eingabebild vorbereiten
Erstellen Sie ein VisionImage
-Objekt mithilfe von UIImage
oder einem
CMSampleBuffer
Wenn du ein UIImage
verwendest, gehe so vor:
- Erstellen Sie ein
VisionImage
-Objekt mit derUIImage
. Geben Sie die richtige.orientation
an.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Wenn du ein CMSampleBuffer
verwendest, gehe so vor:
-
Geben Sie die Ausrichtung der Bilddaten an, die in der
CMSampleBuffer
So ermitteln Sie die Bildausrichtung:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> UIImage.Orientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftMirrored : .right case .landscapeLeft: return cameraPosition == .front ? .downMirrored : .up case .portraitUpsideDown: return cameraPosition == .front ? .rightMirrored : .left case .landscapeRight: return cameraPosition == .front ? .upMirrored : .down case .faceDown, .faceUp, .unknown: return .up } }
Objective-C
- (UIImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored : UIImageOrientationRight; case UIDeviceOrientationLandscapeLeft: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored : UIImageOrientationUp; case UIDeviceOrientationPortraitUpsideDown: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored : UIImageOrientationLeft; case UIDeviceOrientationLandscapeRight: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored : UIImageOrientationDown; case UIDeviceOrientationUnknown: case UIDeviceOrientationFaceUp: case UIDeviceOrientationFaceDown: return UIImageOrientationUp; } }
- Erstellen Sie ein
VisionImage
-Objekt mithilfe derCMSampleBuffer
-Objekt und Ausrichtung:Swift
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
Objective-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
3. Labelersteller für Bilder ausführen
Asynchron:
Swift
imageLabeler.process(image) { labels, error in guard error == nil, let labels = labels, !labels.isEmpty else { // Handle the error. return } // Show results. }
Objective-C
[imageLabeler processImage:image completion:^(NSArray*_Nullable labels, NSError *_Nullable error) { if (labels.count == 0) { // Handle the error. return; } // Show results. }];
Synchron:
Swift
var labels: [ImageLabel] do { labels = try imageLabeler.results(in: image) } catch let error { // Handle the error. return } // Show results.
Objective-C
NSError *error; NSArray*labels = [imageLabeler resultsInImage:image error:&error]; // Show results or handle the error.
4. Informationen zu Objekten mit Label abrufen
Wenn der Vorgang zur Labelerstellung erfolgreich war, wird ein Array vonImageLabel
Jede ImageLabel
steht für etwas, das
im Bild beschriftet sind. Sie können die Textbeschreibung für jedes Label abrufen (falls verfügbar unter
die Metadaten der TensorFlow Lite-Modelldatei),
den Konfidenzwert und den Index.
Beispiel:
Swift
for label in labels { let labelText = label.text let confidence = label.confidence let index = label.index }
Objective-C
for (MLKImageLabel *label in labels) { NSString *labelText = label.text; float confidence = label.confidence; NSInteger index = label.index; }
Tipps zum Verbessern der Leistung in Echtzeit
Wenn Sie Bilder in einer Echtzeitanwendung mit Labels versehen möchten, gehen Sie so vor: um optimale Framerates zu erzielen:
- Verwende zum Verarbeiten von Videoframes die synchrone
results(in:)
API des Detektors. Anruf diese Methode aus demAVCaptureVideoDataOutputSampleBufferDelegate
<ph type="x-smartling-placeholder"></ph>captureOutput(_, didOutput:from:)
-Funktion, um synchron Ergebnisse aus dem angegebenen Video abzurufen Frame. beibehalten vonAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
alstrue
, um Aufrufe an den Detektor zu drosseln. Wenn ein neuer Videoframe verfügbar ist, während der Detektor ausgeführt wird, wird er verworfen. - Wenn Sie die Ausgabe des Detektors verwenden, um Grafiken Eingabebild, rufen Sie zuerst das Ergebnis aus ML Kit ab und rendern Sie das Bild in einem Schritt übereinanderlegen. Dadurch rendern Sie auf der Anzeigeoberfläche pro verarbeitetem Eingabeframe nur einmal. Weitere Informationen finden Sie im Abschnitt updatePreviewOverlayViewWithLastFrame. im Beispiel der ML Kit-Kurzanleitung finden Sie ein Beispiel.