Mit der Aufgabe „Bildklassifier“ können Sie Bilder klassifizieren. Mit dieser Aufgabe können Sie angeben, was ein Bild aus einer Reihe von Kategorien darstellt, die während des Trainings definiert wurden. In dieser Anleitung erfahren Sie, wie Sie den Bildklassifikator in iOS-Apps verwenden. Das in dieser Anleitung beschriebene Codebeispiel ist auf GitHub verfügbar.
In dieser Webdemo können Sie sich diese Aufgabe in Aktion ansehen. Weitere Informationen zu den Funktionen, Modellen und Konfigurationsoptionen dieser Aufgabe finden Sie in der Übersicht.
Codebeispiel
Der Beispielcode von MediaPipe Tasks ist eine grundlegende Implementierung einer Bildklassifikator-App für iOS. Im Beispiel wird die Kamera eines iOS-Geräts verwendet, um Objekte kontinuierlich zu klassifizieren. Es können auch Bilder und Videos aus der Gerätegalerie verwendet werden, um Objekte statisch zu klassifizieren.
Sie können die App als Ausgangspunkt für Ihre eigene iOS-App verwenden oder sich an ihr orientieren, wenn Sie eine vorhandene App ändern. Der Beispielcode für den Bildklassifikator wird auf GitHub gehostet.
Code herunterladen
Die folgende Anleitung zeigt, wie Sie mit dem git-Befehlszeilentool eine lokale Kopie des Beispielcodes erstellen.
So laden Sie den Beispielcode herunter:
Klonen Sie das Git-Repository mit dem folgenden Befehl:
git clone https://github.com/google-ai-edge/mediapipe-samples
Optional können Sie Ihre Git-Instanz für die Verwendung einer spärlichen Überprüfung konfigurieren, sodass nur die Dateien für die Beispiel-App „Image Classifier“ vorhanden sind:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/image_classification/ios/
Nachdem Sie eine lokale Version des Beispielcodes erstellt haben, können Sie die MediaPipe-Aufgabenbibliothek installieren, das Projekt mit Xcode öffnen und die App ausführen. Eine Anleitung finden Sie im Einrichtungsleitfaden für iOS.
Schlüsselkomponenten
Die folgenden Dateien enthalten den wichtigsten Code für die Beispielanwendung „Image Classifier“:
- ImageClassifierService.swift: Initialisiert den Bildklassifikator, verarbeitet die Modellauswahl und führt Inferenzen auf den Eingabedaten aus.
- CameraViewController.swift: Implementiert die Benutzeroberfläche für den Eingabemodus des Live-Kamerafeeds und visualisiert die Ergebnisse.
- MediaLibraryViewController.swift: Implementiert die Benutzeroberfläche für den Eingabemodus für Standbilder und Videodateien und visualisiert die Ergebnisse.
Einrichtung
In diesem Abschnitt werden die wichtigsten Schritte zur Einrichtung Ihrer Entwicklungsumgebung und Codeprojekte für die Verwendung des Bildklassifikators beschrieben. Allgemeine Informationen zum Einrichten Ihrer Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich Anforderungen an die Plattformversion, finden Sie im Einrichtungsleitfaden für iOS.
Abhängigkeiten
Der Bildklassifikator verwendet die MediaPipeTasksVision
-Bibliothek, die mit CocoaPods installiert werden muss. Die Bibliothek ist sowohl mit Swift- als auch mit Objective-C-Apps kompatibel und erfordert keine zusätzliche sprachspezifische Einrichtung.
Eine Anleitung zum Installieren von CocoaPods unter macOS findest du in der Installationsanleitung für CocoaPods.
Eine Anleitung zum Erstellen eines Podfile
mit den erforderlichen Pods für Ihre Anwendung finden Sie unter CocoaPods verwenden.
Fügen Sie den Pod „MediaPipeTasksVision“ in der Datei Podfile
mit dem folgenden Code hinzu:
target 'MyImageClassifierApp' do
use_frameworks!
pod 'MediaPipeTasksVision'
end
Wenn Ihre App Unit-Testziele enthält, finden Sie im Einrichtungsleitfaden für iOS weitere Informationen zur Einrichtung Ihrer Podfile
.
Modell
Für die Aufgabe „MediaPipe Image Classifier“ ist ein trainiertes Modell erforderlich, das mit dieser Aufgabe kompatibel ist. Weitere Informationen zu den verfügbaren trainierten Modellen für den Bildklassifikator finden Sie in der Aufgabenübersicht im Abschnitt „Modelle“.
Wählen Sie ein Modell aus, laden Sie es herunter und fügen Sie es mit Xcode Ihrem Projektverzeichnis hinzu. Eine Anleitung zum Hinzufügen von Dateien zu Ihrem Xcode-Projekt finden Sie unter Dateien und Ordner in Ihrem Xcode-Projekt verwalten.
Verwenden Sie das Attribut BaseOptions.modelAssetPath
, um den Pfad zum Modell in Ihrem App Bundle anzugeben. Ein Codebeispiel finden Sie im nächsten Abschnitt.
Aufgabe erstellen
Sie können die Bildklassifikatoraufgabe erstellen, indem Sie einen seiner Initialisierer aufrufen. Mit dem ImageClassifier(options:)
-Initialisierer werden Werte für Konfigurationsoptionen festgelegt, darunter der Ausführungsmodus, die Sprache für Anzeigenamen, die maximale Anzahl von Ergebnissen, der Konfidenzgrenzwert sowie die Zulassungs- und Sperrlisten für Kategorien.
Wenn Sie keinen Bildklassifikator benötigen, der mit benutzerdefinierten Konfigurationsoptionen initialisiert wird, können Sie mit dem ImageClassifier(modelPath:)
-Initialisierer einen Bildklassifikator mit den Standardoptionen erstellen. Weitere Informationen zu den Konfigurationsoptionen finden Sie unter Konfigurationsübersicht.
Die Aufgabe „Bildklassifikator“ unterstützt drei Eingabedatentypen: Standbilder, Videodateien und Live-Videostreams. Standardmäßig initialisiert ImageClassifier(modelPath:)
eine Aufgabe für Standbilder. Wenn die Aufgabe für die Verarbeitung von Videodateien oder Live-Videostreams initialisiert werden soll, geben Sie mit ImageClassifier(options:)
den Ausführungsmodus für Video oder Livestream an. Für den Livestream-Modus ist außerdem die zusätzliche Konfigurationsoption imageClassifierLiveStreamDelegate
erforderlich, mit der der Bildklassifikator die Ergebnisse der Bildklassifizierung asynchron an den delegierten Dienst senden kann.
Wählen Sie den Tab für den aktuellen Ausführungsmodus aus, um zu erfahren, wie Sie die Aufgabe erstellen und die Inferenz ausführen.
Swift
Bild
import MediaPipeTasksVision let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite") let options = ImageClassifierOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .image options.maxResults = 5 let imageClassifier = try ImageClassifier(options: options)
Video
import MediaPipeTasksVision let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite") let options = ImageClassifierOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .video options.maxResults = 5 let imageClassifier = try ImageClassifier(options: options)
Livestream
import MediaPipeTasksVision // Class that conforms to the `ImageClassifierLiveStreamDelegate` protocol and // implements the method that the image classifier calls once it // finishes performing classification on each input frame. class ImageClassifierResultProcessor: NSObject, ImageClassifierLiveStreamDelegate { func imageClassifier( _ imageClassifier: ImageClassifier, didFinishClassification result: ImageClassifierResult?, timestampInMilliseconds: Int, error: Error?) { // Process the image classifier result or errors here. } } let modelPath = Bundle.main.path( forResource: "model", ofType: "tflite") let options = ImageClassifierOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .liveStream options.maxResults = 5 // Assign an object of the class to the `imageClassifierLiveStreamDelegate` // property. let processor = ImageClassifierResultProcessor() options.imageClassifierLiveStreamDelegate = processor let imageClassifier = try ImageClassifier(options: options)
Objective-C
Bild
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPImageClassifierOptions *options = [[MPPImageClassifierOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeImage; options.maxResults = 5; MPPImageClassifier *imageClassifier = [[MPPImageClassifier alloc] initWithOptions:options error:nil];
Video
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPImageClassifierOptions *options = [[MPPImageClassifierOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeVideo; options.maxResults = 5; MPPImageClassifier *imageClassifier = [[MPPImageClassifier alloc] initWithOptions:options error:nil];
Livestream
@import MediaPipeTasksVision; // Class that conforms to the `MPPImageClassifierLiveStreamDelegate` protocol // and implements the method that the image classifier calls once it finishes // performing classification on each input frame. @interface APPImageClassifierResultProcessor : NSObject@end @implementation APPImageClassifierResultProcessor - (void)imageClassifier:(MPPImageClassifier *)imageClassifier didFinishClassificationWithResult:(MPPImageClassifierResult *)imageClassifierResult timestampInMilliseconds:(NSInteger)timestampInMilliseconds error:(NSError *)error { // Process the image classifier result or errors here. } @end NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPImageClassifierOptions *options = [[MPPImageClassifierOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeLiveStream; options.maxResults = 5; // Assign an object of the class to the `imageClassifierLiveStreamDelegate` // property. APPImageClassifierResultProcessor *processor = [APPImageClassifierResultProcessor new]; options.imageClassifierLiveStreamDelegate = processor; MPPImageClassifier *imageClassifier = [[MPPImageClassifier alloc] initWithOptions:options error:nil];
Konfigurationsoptionen
Für diese Aufgabe stehen die folgenden Konfigurationsoptionen für iOS-Apps zur Verfügung:
Option | Beschreibung | Wertebereich | Standardwert |
---|---|---|---|
runningMode |
Legt den Ausführungsmodus für die Task fest. Es gibt drei Modi: IMAGE: Der Modus für Eingaben mit einem einzelnen Bild. VIDEO: Der Modus für decodierte Frames eines Videos. LIVE_STREAM: Der Modus für einen Livestream von Eingabedaten, z. B. von einer Kamera. In diesem Modus muss resultListener aufgerufen werden, um einen Listener für den asynchronen Empfang von Ergebnissen einzurichten. |
{RunningMode.image, RunningMode.video, RunningMode.liveStream } |
RunningMode.image |
displayNamesLocale |
Legt die Sprache der Labels fest, die für die Anzeigenamen verwendet werden, die in den Metadaten des Modells der Aufgabe angegeben sind, sofern verfügbar. Der Standardwert ist en für Englisch. Mit der TensorFlow Lite Metadata Writer API können Sie den Metadaten eines benutzerdefinierten Modells lokalisierte Labels hinzufügen. |
Gebietscode | de |
maxResults |
Legt die optionale maximale Anzahl der am besten bewerteten Klassifizierungsergebnisse fest, die zurückgegeben werden sollen. Wenn < 0, werden alle verfügbaren Ergebnisse zurückgegeben. | Beliebige positive Zahlen | -1 |
scoreThreshold |
Legt den Schwellenwert für die Vorhersagebewertung fest, der den in den Modellmetadaten angegebenen Wert (falls vorhanden) überschreibt. Ergebnisse unter diesem Wert werden abgelehnt. | Beliebiger Float | Nicht festgelegt |
categoryAllowlist |
Legt die optionale Liste der zulässigen Kategorienamen fest. Wenn die Liste nicht leer ist, werden Klassifizierungsergebnisse herausgefiltert, deren Kategorienname nicht in dieser Liste enthalten ist. Doppelte oder unbekannte Kategorienamen werden ignoriert.
Diese Option schließt categoryDenylist aus. Die Verwendung beider Optionen führt zu einem Fehler. |
Alle Strings | Nicht festgelegt |
categoryDenylist |
Hiermit wird eine optionale Liste der nicht zulässigen Kategorienamen festgelegt. Wenn der Wert nicht leer ist, werden Klassifizierungsergebnisse herausgefiltert, deren Kategoriename in diesem Set enthalten ist. Doppelte oder unbekannte Kategorienamen werden ignoriert. Diese Option schließt categoryAllowlist aus. Die Verwendung beider Optionen führt zu einem Fehler. |
Beliebige Strings | Nicht festgelegt |
resultListener |
Legt fest, dass der Ergebnisempfänger die Klassifizierungsergebnisse asynchron empfängt, wenn sich der Bildklassifikator im Livestream-Modus befindet. Kann nur verwendet werden, wenn der Ausführungsmodus auf LIVE_STREAM festgelegt ist. |
– | Nicht festgelegt |
Livestreamkonfiguration
Wenn der Ausführungsmodus auf „Livestream“ festgelegt ist, benötigt der Bildklassifikator die zusätzliche Konfigurationsoption imageClassifierLiveStreamDelegate
, mit der der Klassifikator die Klassifizierungsergebnisse asynchron liefern kann. Der Delegate implementiert die Methode imageClassifier(_:didFinishClassification:timestampInMilliseconds:error:)
, die der Bildklassifikator aufruft, nachdem die Klassifizierungsergebnisse für jeden Frame verarbeitet wurden.
Optionsname | Beschreibung | Wertebereich | Standardwert |
---|---|---|---|
imageClassifierLiveStreamDelegate |
Ermöglicht es dem Bildklassifikator, Klassifizierungsergebnisse im Livestream-Modus asynchron zu erhalten. Die Klasse, deren Instanz auf diese Property festgelegt ist, muss die Methode imageClassifier(_:didFinishClassification:timestampInMilliseconds:error:) implementieren. |
Nicht zutreffend | Nicht festgelegt |
Daten vorbereiten
Sie müssen das Eingabebild oder den Eingabeframe vor der Übergabe an den Bildklassifikator in ein MPImage
-Objekt konvertieren. MPImage
unterstützt verschiedene Arten von iOS-Bildformaten und kann sie in jedem ausgeführten Modus für die Inferenz verwenden. Weitere Informationen zu MPImage
finden Sie in der MPImage API.
Wählen Sie ein iOS-Bildformat entsprechend Ihrem Anwendungsfall und dem erforderlichen Ausführungsmodus Ihrer Anwendung aus.MPImage
unterstützt die iOS-Bildformate UIImage
, CVPixelBuffer
und CMSampleBuffer
.
UIImage
Das UIImage
-Format eignet sich gut für die folgenden Laufmodi:
Bilder: Bilder aus einem App-Bundle, einer Nutzergalerie oder einem Dateisystem, das als
UIImage
-Bilder formatiert ist, können in einMPImage
-Objekt umgewandelt werden.Videos: Mit dem AVAssetImageGenerator können Sie Videoframes im CGImage-Format extrahieren und dann in
UIImage
-Bilder konvertieren.
Swift
// Load an image on the user's device as an iOS `UIImage` object. // Convert the `UIImage` object to a MediaPipe's Image object having the default // orientation `UIImage.Orientation.up`. let image = try MPImage(uiImage: image)
Objective-C
// Load an image on the user's device as an iOS `UIImage` object. // Convert the `UIImage` object to a MediaPipe's Image object having the default // orientation `UIImageOrientationUp`. MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
Im Beispiel wird eine MPImage
mit der Standardausrichtung UIImage.Orientation.Up initialisiert. Sie können MPImage
mit jedem der unterstützten Werte für UIImage.Orientation initialisieren. Der Bildklassifikator unterstützt keine gespiegelten Ausrichtungen wie .upMirrored
, .downMirrored
, .leftMirrored
und .rightMirrored
.
Weitere Informationen zu UIImage
finden Sie in der Apple Developer-Dokumentation zu UIImage.
CVPixelBuffer
Das CVPixelBuffer
-Format eignet sich gut für Anwendungen, die Frames generieren und das iOS-CoreImage-Framework für die Verarbeitung verwenden.
Das CVPixelBuffer
-Format eignet sich gut für die folgenden Laufmodi:
Bilder: Apps, die nach einer Verarbeitung mit dem
CoreImage
-Framework von iOSCVPixelBuffer
-Bilder generieren, können im Modus „Bild ausführen“ an den Bildklassifikator gesendet werden.Videos: Videoframes können zur Verarbeitung in das
CVPixelBuffer
-Format konvertiert und dann im Videomodus an den Bildklassifikator gesendet werden.Livestream: Frames, die von Apps mit einer iOS-Kamera generiert werden, können zur Verarbeitung in das
CVPixelBuffer
-Format konvertiert werden, bevor sie im Livestream-Modus an den Bildklassifikator gesendet werden.
Swift
// Obtain a CVPixelBuffer. // Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the default // orientation `UIImage.Orientation.up`. let image = try MPImage(pixelBuffer: pixelBuffer)
Objective-C
// Obtain a CVPixelBuffer. // Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the // default orientation `UIImageOrientationUp`. MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
Weitere Informationen zu CVPixelBuffer
findest du in der CVPixelBuffer-Entwicklerdokumentation von Apple.
CMSampleBuffer
Das Format CMSampleBuffer
speichert Medienbeispiele eines einheitlichen Medientyps und eignet sich gut für den Livestream-Ausführungsmodus. Live-Frames von iOS-Kameras werden von iOS AVCaptureVideoDataOutput asynchron im CMSampleBuffer
-Format bereitgestellt.
Swift
// Obtain a CMSampleBuffer. // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default // orientation `UIImage.Orientation.up`. let image = try MPImage(sampleBuffer: sampleBuffer)
Objective-C
// Obtain a `CMSampleBuffer`. // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the // default orientation `UIImageOrientationUp`. MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
Weitere Informationen zu CMSampleBuffer
findest du in der CMSampleBuffer-Entwicklerdokumentation von Apple.
Aufgabe ausführen
Verwenden Sie zum Ausführen des Bildklassifikators die Methode classify()
, die dem zugewiesenen Ausführungsmodus entspricht:
- Standbild:
classify(image:)
- Video:
classify(videoFrame:timestampInMilliseconds:)
- livestream:
classifyAsync(image:timestampInMilliseconds:)
Der Bildklassifikator gibt die möglichen Kategorien für das Objekt im Eingabebild oder -frame zurück.
Die folgenden Codebeispiele zeigen einfache Beispiele für die Ausführung des Bildklassifikators in diesen verschiedenen Ausführungsmodi:
Swift
Bild
let result = try imageClassifier.classify(image: image)
Video
let result = try imageClassifier.classify( videoFrame: image, timestampInMilliseconds: timestamp)
Livestream
try imageClassifier.classifyAsync( image: image, timestampInMilliseconds: timestamp)
Objective-C
Bild
MPPImageClassifierResult *result = [imageClassifier classifyImage:image error:nil];
Video
MPPImageClassifierResult *result = [imageClassifier classifyVideoFrame:image timestampInMilliseconds:timestamp error:nil];
Livestream
BOOL success = [imageClassifier classifyAsyncImage:image timestampInMilliseconds:timestamp error:nil];
Im Codebeispiel für den Bildklassifikator werden die Implementierungen der einzelnen Modi classify(image:)
, classify(videoFrame:timestampInMilliseconds:)
und classifyAsync(image:timestampInMilliseconds:)
genauer erläutert. Mit dem Beispielcode kann der Nutzer zwischen Verarbeitungsmodi wechseln, die für Ihren Anwendungsfall möglicherweise nicht erforderlich sind.
Wichtige Hinweise:
Im Video- oder Livestream-Modus müssen Sie der Bildklassifikatoraufgabe auch den Zeitstempel des Eingabe-Frames zur Verfügung stellen.
Wenn die Ausführung im Bild- oder Videomodus erfolgt, blockiert die Aufgabe „Bildklassifikator“ den aktuellen Thread, bis die Verarbeitung des Eingabebilds oder ‑frames abgeschlossen ist. Um das Blockieren des aktuellen Threads zu vermeiden, führen Sie die Verarbeitung in einem Hintergrund-Thread mithilfe der iOS-Frameworks Dispatch oder NSOperation aus.
Wenn die Ausführung im Livestream-Modus erfolgt, gibt die Aufgabe „Bildklassifikator“ sofort ein Ergebnis zurück und blockiert den aktuellen Thread nicht. Nach der Verarbeitung jedes Eingabeframes wird die Methode
imageClassifier(_:didFinishClassification:timestampInMilliseconds:error:)
mit dem Klassifizierungsergebnis aufgerufen. Der Bildklassifikator ruft diese Methode asynchron in einer speziellen seriellen Dispatch-Warteschlange auf. Wenn Sie Ergebnisse auf der Benutzeroberfläche anzeigen möchten, senden Sie sie nach der Verarbeitung an die Hauptwarteschlange. Wenn die FunktionclassifyAsync
aufgerufen wird, während die Aufgabe „Bildklassifier“ gerade einen anderen Frame verarbeitet, wird der neue Eingabeframe vom Bildklassifier ignoriert.
Ergebnisse verarbeiten und anzeigen
Beim Ausführen einer Inferenz gibt die Aufgabe des Bildklassifikators ein ImageClassifierResult
-Objekt zurück, das die Liste der möglichen Kategorien für die Objekte im Eingabebild oder -frame enthält.
Im Folgenden sehen Sie ein Beispiel für die Ausgabedaten dieser Aufgabe:
ImageClassifierResult:
Classifications #0 (single classification head):
head index: 0
category #0:
category name: "/m/01bwb9"
display name: "Passer domesticus"
score: 0.91406
index: 671
category #1:
category name: "/m/01bwbt"
display name: "Passer montanus"
score: 0.00391
index: 670
Dieses Ergebnis wurde mit dem Vogelklassifikator für folgende Bilder erzielt:
Im Beispielcode für den Bildklassifikator wird gezeigt, wie die Klassifizierungsergebnisse angezeigt werden, die von der Aufgabe zurückgegeben werden. Weitere Informationen finden Sie im Codebeispiel.