Mit ML Kit können Sie Entitäten in einem Bild erkennen und mit Labels versehen. Diese API unterstützt eine breite Palette benutzerdefinierter Bildklassifizierungsmodelle. Bitte Weitere Informationen finden Sie unter Benutzerdefinierte Modelle mit ML Kit. Anforderungen an die Modellkompatibilität, wo Sie vortrainierte Modelle finden, und wie Sie eigene Modelle trainieren.
Es gibt zwei Möglichkeiten, ein benutzerdefiniertes Modell zu integrieren. Sie können das Modell nach in den Asset-Ordner Ihrer App verschieben oder dynamisch herunterladen, von Firebase. In der folgenden Tabelle werden die beiden Optionen verglichen.
Gebündeltes Modell | Gehostetes Modell |
---|---|
Das Modell ist Teil des APK Ihrer App, wodurch die Größe erhöht wird. | Das Modell ist nicht Teil Ihres APK. Sie wird gehostet, indem Firebase Machine Learning. |
Das Modell ist sofort verfügbar, auch wenn das Android-Gerät offline ist | Das Modell wird on demand heruntergeladen |
Kein Firebase-Projekt erforderlich | Firebase-Projekt erforderlich |
Du musst deine App noch einmal veröffentlichen, um das Modell zu aktualisieren | Modellaktualisierungen senden, ohne die App neu zu veröffentlichen |
Keine integrierten A/B-Tests | Einfache A/B-Tests mit Firebase Remote Config |
Jetzt ausprobieren
- Kurzanleitung zur Vision finden Sie ein Anwendungsbeispiel für das gebündelte Modell und den automl-Schnellstartanwendung für eine Verwendungsbeispiel für das gehostete Modell.
Hinweis
Fügen Sie die ML Kit-Bibliotheken in Ihre Podfile-Datei ein:
So bündeln Sie ein Modell mit Ihrer App:
pod 'GoogleMLKit/ImageLabelingCustom', '3.2.0'
Fügen Sie zum dynamischen Herunterladen eines Modells aus Firebase den
LinkFirebase
hinzu. Abhängigkeit:pod 'GoogleMLKit/ImageLabelingCustom', '3.2.0' pod 'GoogleMLKit/LinkFirebase', '3.2.0'
Öffnen Sie nach der Installation oder Aktualisierung der Pods Ihres Projekts das Xcode-Projekt. mit
.xcworkspace
. ML Kit wird in Xcode-Version 13.2.1 unterstützt oder höher.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 modellieren.
1. Modell laden
Lokale Modellquelle konfigurieren
So bündeln Sie das Modell mit Ihrer App:
Kopieren Sie die Modelldatei (in der Regel mit der Endung
.tflite
oder.lite
) in Xcode. Projekt und wählen Sie dabeiCopy bundle resources
aus. Die Modelldatei ist im App Bundle enthalten und für ML Kit verfügbar.Erstellen Sie das Objekt
LocalModel
und geben Sie den Pfad zur Modelldatei an:Swift
let localModel = LocalModel(path: localModelFilePath)
Objective-C
MLKLocalModel *localModel = [[MLKLocalModel alloc] initWithPath:localModelFilePath];
Von Firebase gehostete Modellquelle konfigurieren
Wenn Sie das extern gehostete Modell verwenden möchten, erstellen Sie ein RemoteModel
-Objekt und geben Sie dabei den Parameter
Name, den Sie dem Modell bei der Veröffentlichung zugewiesen haben:
Swift
let firebaseModelSource = FirebaseModelSource( name: "your_remote_model") // The name you assigned in // the Firebase console. let remoteModel = CustomRemoteModel(remoteModelSource: firebaseModelSource)
Objective-C
MLKFirebaseModelSource *firebaseModelSource = [[MLKFirebaseModelSource alloc] initWithName:@"your_remote_model"]; // The name you assigned in // the Firebase console. MLKCustomRemoteModel *remoteModel = [[MLKCustomRemoteModel alloc] initWithRemoteModelSource:firebaseModelSource];
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 Aufgabe asynchron das 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 konfigurieren
Nachdem Sie die Modellquellen konfiguriert haben, erstellen Sie ein ImageLabeler
-Objekt aus einer
von ihnen.
Folgende Optionen sind verfügbar:
Optionen | |
---|---|
confidenceThreshold
|
Minimaler Konfidenzwert erkannter Labels. Wenn nicht festgelegt, alle Der in den Metadaten des Modells angegebene Klassifikator-Schwellenwert wird verwendet. Wenn das Modell keine Metadaten enthält oder die Metadaten keine für den Klassifikator einen Standardgrenzwert von 0, 0 verwendet. |
maxResultCount
|
Maximale Anzahl der zurückzugebenden Labels. Wenn nichts festgelegt ist, gilt der Standardwert von 10 werden verwendet. |
Wenn Sie nur ein lokal gebündeltes Modell haben, erstellen Sie einfach einen Labelersteller
Objekt LocalModel
:
Swift
let options = CustomImageLabelerOptions(localModel: localModel) options.confidenceThreshold = NSNumber(value: 0.0) let imageLabeler = ImageLabeler.imageLabeler(options: options)
Objective-C
MLKCustomImageLabelerOptions *options = [[MLKCustomImageLabelerOptions alloc] initWithLocalModel:localModel]; options.confidenceThreshold = @(0.0); 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
mit der Methode isModelDownloaded(remoteModel:)
des Modellmanagers.
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
auszuführen:
Labelersteller aus dem Remote-Modell, falls es heruntergeladen wurde, und vom lokalen Modell
sonst.
Swift
var options: CustomImageLabelerOptions! if (ModelManager.modelManager().isModelDownloaded(remoteModel)) { options = CustomImageLabelerOptions(remoteModel: remoteModel) } else { options = CustomImageLabelerOptions(localModel: localModel) } options.confidenceThreshold = NSNumber(value: 0.0) let imageLabeler = ImageLabeler.imageLabeler(options: options)
Objective-C
MLKCustomImageLabelerOptions *options; if ([[MLKModelManager modelManager] isModelDownloaded:remoteModel]) { options = [[MLKCustomImageLabelerOptions alloc] initWithRemoteModel:remoteModel]; } else { options = [[MLKCustomImageLabelerOptions alloc] initWithLocalModel:localModel]; } options.confidenceThreshold = @(0.0); 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
Um Objekte in einem Bild mit einem Label zu versehen, übergeben Sie das image
-Objekt an das ImageLabeler
-
process()
-Methode.
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 (label.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 Entitäten mit Labels 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 zu erhalten Frame. beibehalten vonAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
alstrue
, um Aufrufe an den Detektor zu drosseln. Wenn ein neuer verfügbar wird, während der Detektor läuft, 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.