Leitfaden zur Bildklassifizierung für iOS

Mit der Aufgabe „Bildklassifikator“ können Sie Bilder klassifizieren. Sie können Aufgabe zu identifizieren, was ein Bild aus einer Reihe von definierten Kategorien darstellt während der Trainingsphase. In dieser Anleitung erfahren Sie, wie Sie den Bildklassifikator in iOS-Apps. Das in dieser Anleitung beschriebene Codebeispiel ist auf GitHub

Sie können diese Aufgabe in Aktion sehen, indem Sie dieses Web- Für über die Funktionen, Modelle und Konfigurationsoptionen finden Sie in der Übersicht:

Codebeispiel

Der Beispielcode von MediaPipe Tasks ist eine einfache Implementierung eines Bildklassifikators. App für iOS. In diesem Beispiel wird die Kamera eines physischen iOS-Geräts verwendet, um können Objekte kontinuierlich klassifizieren und auch Bilder und Videos aus dem Gerätegalerie verwenden, um Objekte statisch zu klassifizieren.

Du kannst die App als Ausgangspunkt für deine eigene iOS-App verwenden oder darauf verweisen wenn Sie eine vorhandene App ändern. Der Beispielcode für den Bildklassifikator wird auf GitHub

Code herunterladen

In der folgenden Anleitung erfahren Sie, wie Sie eine lokale Kopie des Beispiels erstellen. mit dem Befehlszeilentool git erstellen.

<ph type="x-smartling-placeholder">

So laden Sie den Beispielcode herunter:

  1. Klonen Sie das Git-Repository mit dem folgenden Befehl:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Konfigurieren Sie optional Ihre Git-Instanz für den Sparse-Checkout, damit Sie nur die Dateien für die Beispiel-App für den Bildklassifikator:

    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 den MediaPipe-Aufgabenbibliothek, öffnen Sie das Projekt mit Xcode und führen Sie die App aus. Für finden Sie im Einrichtungsleitfaden für iOS.

Schlüsselkomponenten

Die folgenden Dateien enthalten den wichtigen Code für das Beispiel des Bildklassifikators. Anwendung:

  • ImageClassifierService.swift: Initialisiert den Bildklassifikator, übernimmt die Modellauswahl und führt eine Inferenz auf die Eingabedaten aus.
  • CameraViewController.swift: Implementiert die Benutzeroberfläche für den Live-Kamerafeed-Eingabemodus 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 zum Einrichten Ihrer Entwicklungsumgebung und für die Verwendung des Bildklassifikators programmieren. Allgemeine Informationen zum Einrichten der Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich Plattformversion finden Sie im Einrichtungsleitfaden für iOS.

<ph type="x-smartling-placeholder">

Abhängigkeiten

Bildklassifikator verwendet die Bibliothek MediaPipeTasksVision, die installiert werden muss mit CocoaPods. Die Bibliothek ist sowohl mit Swift- als auch mit Objective-C-Apps kompatibel. und erfordert keine zusätzliche sprachspezifische Einrichtung.

Eine Anleitung zur Installation von CocoaPods unter macOS findest du im Artikel zu CocoaPods Installationsanleitung. Eine Anleitung zum Erstellen eines Podfile mit den für Ihr Projekt erforderlichen Pods erhalten Sie unter Verwendung CocoaPods

Fügen Sie den MediaPipeTasksVision-Pod mit dem folgenden Code in Podfile ein:

target 'MyImageClassifierApp' do
  use_frameworks!
  pod 'MediaPipeTasksVision'
end

Falls Ihre App Einheitentestziele enthält, lesen Sie den Einrichtungsleitfaden für iOS: Weitere Informationen zur Einrichtung Dein Podfile.

Modell

Für die Aufgabe „MediaPipe Image Classifier“ ist ein trainiertes Modell erforderlich, bei dieser Aufgabe. Weitere Informationen zu den verfügbaren trainierten Modellen für Bildklassifikator, siehe Aufgabenübersicht 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 Verwalten von Dateien und Ordner in Ihrem Xcode Projekt.

Verwenden Sie das Attribut BaseOptions.modelAssetPath, um den Pfad zum Modell anzugeben in deinem App Bundle. Ein Codebeispiel finden Sie im nächsten Abschnitt.

Aufgabe erstellen

Sie können die Bildklassifikatoraufgabe erstellen, indem Sie einen seiner Initialisierer aufrufen. Die ImageClassifier(options:)-Initialisierer legt Werte für Konfigurationsoptionen fest einschließlich Laufmodus, Gebietsschema für Anzeigenamen, maximale Anzahl von Ergebnissen, Konfidenz Schwellenwert, Kategorie-Zulassungs- und Sperrliste.

Wenn Sie keinen Bildklassifikator benötigen, der mit einer benutzerdefinierten Konfiguration initialisiert wurde können Sie mit dem ImageClassifier(modelPath:)-Initialisierer ein Bildklassifikator mit den Standardoptionen. Weitere Informationen zur Konfiguration finden Sie unter Konfigurationsübersicht.

Die Aufgabe „Bildklassifikator“ unterstützt drei Eingabedatentypen: Standbilder und Videodateien. und Live-Videostreams. Standardmäßig initialisiert ImageClassifier(modelPath:) einen für Standbilder angelangt. Wenn Sie möchten, dass Ihre Aufgabe für die Verarbeitung von Videos initialisiert wird Dateien oder Live-Videostreams verwenden, geben Sie mit ImageClassifier(options:) an, Video- oder Livestream-Laufmodus. Für den Livestream-Modus ist außerdem die zusätzliche imageClassifierLiveStreamDelegate-Konfigurationsoption, die ermöglicht es dem Bildklassifikator, Bildklassifizierungsergebnisse an den asynchron delegieren.

Wählen Sie den Tab für Ihren Ausführungsmodus aus, um zu sehen, wie die Aufgabe erstellt wird und eine 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

Diese Aufgabe bietet die folgenden Konfigurationsoptionen für iOS-Apps:

Option Beschreibung Wertebereich Standardwert
runningMode Legt den Ausführungsmodus für die Task fest. Es gibt drei Modi:

IMAGE: Der Modus für Einzelbildeingaben.

VIDEO: Der Modus für decodierte Frames eines Videos.

LIVE_STREAM: Der Modus für einen Livestream mit Eingabe zum Beispiel von einer Kamera. In diesem Modus muss der resultListener wird aufgerufen, um einen Listener für den Empfang von Ergebnissen einzurichten asynchron programmiert.
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
displayNamesLocale Legt die Sprache der Labels fest, die für Anzeigenamen in der Metadaten des Aufgabenmodells, falls verfügbar. Standardwert ist en für Englisch. Sie können den Metadaten eines benutzerdefinierten Modells lokalisierte Labels hinzufügen mit der TensorFlow Lite Metadata Writer API Gebietsschemacode de
maxResults Legt die optionale maximale Anzahl der am besten bewerteten Klassifizierungsergebnisse fest auf zurückgeben. Wenn < 0 setzen, werden alle verfügbaren Ergebnisse zurückgegeben. Beliebige positive Zahlen -1
scoreThreshold Legt den Schwellenwert für die Vorhersagepunktzahl fest, der den Wert in die Modellmetadaten (falls vorhanden). Ergebnisse unter diesem Wert werden abgelehnt. Beliebiger Gleitkommawert Nicht festgelegt
categoryAllowlist Legt die optionale Liste der zulässigen Kategorienamen fest. Wenn das Feld nicht leer ist, Klassifizierungsergebnisse, deren Kategoriename nicht in dieser Gruppe enthalten ist, werden herausgefiltert. Doppelte oder unbekannte Kategorienamen werden ignoriert. Diese Option schließt sich mit categoryDenylist gegenseitig aus und verwendet führt beides zu einem Fehler. Alle Strings Nicht festgelegt
categoryDenylist Legt die optionale Liste der unzulässigen Kategorienamen fest. Wenn nicht leer ist, werden Klassifizierungsergebnisse gefiltert, deren Kategoriename in diesem Satz enthalten ist. aus. Doppelte oder unbekannte Kategorienamen werden ignoriert. Diese Option ausschließlich mit categoryAllowlist und die Verwendung beider führt zu einem Fehler. Alle Strings Nicht festgelegt
resultListener Legt den Ergebnis-Listener so fest, dass er die Klassifizierungsergebnisse empfängt asynchron, wenn sich der Bildklassifikator im Livestream befindet . Kann nur verwendet werden, wenn der Ausführungsmodus auf LIVE_STREAM festgelegt ist Nicht festgelegt

Livestreamkonfiguration

Wenn der Laufmodus auf Livestream festgelegt ist, benötigt der Bildklassifikator die Berechtigung zusätzliche imageClassifierLiveStreamDelegate-Konfigurationsoption, die ermöglicht es dem Klassifikator, Klassifizierungsergebnisse asynchron bereitzustellen. Die implementiert den Delegaten imageClassifier(_:didFinishClassification:timestampInMilliseconds:error:) -Methode, die der Image Classifier nach der Verarbeitung der Klassifizierung aufruft Ergebnisse für jeden Frame.

Optionsname Beschreibung Wertebereich Standardwert
imageClassifierLiveStreamDelegate Aktiviert den Bildklassifikator, um Klassifizierungsergebnisse asynchron zu empfangen im Livestream-Modus. Die Klasse, deren Instanz auf diese Eigenschaft gesetzt ist, muss Implementieren der imageClassifier(_:didFinishClassification:timestampInMilliseconds:error:) . Nicht zutreffend Nicht festgelegt

Daten vorbereiten

Konvertieren Sie das Eingabebild oder den Eingabe-Frame zuerst in ein MPImage-Objekt, an den Bildklassifikator übergeben. MPImage unterstützt verschiedene Arten von iOS-Bildern Formate und können sie in jedem ausgeführten Modus für die Inferenz verwenden. Weitere Informationen Informationen zu MPImage finden Sie in der MPImage-API

Wählen Sie je nach Anwendungsfall und Laufmodus ein iOS-Bildformat aus. Anwendung erforderlich.MPImage akzeptiert die UIImage, CVPixelBuffer und CMSampleBuffer iOS-Bildformate.

UIImage

Das Format UIImage eignet sich gut für die folgenden Laufmodi:

  • Bilder: Bilder aus einem App Bundle, einer Nutzergalerie oder einem Dateisystem, die wie folgt formatiert sind: UIImage-Bilder können in ein MPImage-Objekt konvertiert werden.

  • Videos: Verwenden Sie AVAssetImageGenerator. zum Extrahieren von Videoframes CGImage Format und konvertieren Sie sie in UIImage Bilder.

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];
    

In diesem Beispiel wird ein MPImage mit dem Standardwert UIImage.Orientation.Up Ausrichtung. Sie können MPImage mit einer der unterstützten UIImage.Orientation Werte. Der Bildklassifikator unterstützt keine gespiegelten Ausrichtungen wie .upMirrored, .downMirrored, .leftMirrored, .rightMirrored.

Weitere Informationen zu UIImage finden Sie unter UIImage Apple Developer Dokumentation.

CVPixelBuffer

Das Format CVPixelBuffer eignet sich gut für Anwendungen, die Frames generieren. und verwenden Sie das iOS-CoreImage Framework für die Verarbeitung.

Das Format CVPixelBuffer eignet sich gut für die folgenden Laufmodi:

  • Bilder: Apps, die nach einer Verarbeitung CVPixelBuffer Bilder generieren mit dem CoreImage-Framework von iOS an den Bildklassifikator im Bildlaufmodus.

  • Videos: Videoframes können für folgendes Format in das CVPixelBuffer-Format konvertiert werden: verarbeitet und dann im Videomodus an den Bildklassifikator gesendet.

  • Livestream: Apps, die mit einer iOS-Kamera Frames generieren, werden möglicherweise zur Verarbeitung in das CVPixelBuffer-Format konvertiert, bevor sie an den Bildklassifikator im Livestream-Modus.

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 finden Sie in der CVPixelBuffer Apple-Dokumentation Entwickler*in Dokumentation.

CMSampleBuffer

Das Format CMSampleBuffer speichert Medienbeispiele eines einheitlichen Medientyps und ist eignet sich gut für den Livestream-Laufmodus. Live-Frames von iOS-Kameras asynchron im CMSampleBuffer-Format von iOS bereitgestellt AVCaptureVideoDataOutput.

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 finden Sie im Artikel CMSampleBuffer Apple“. Entwickler*in Dokumentation.

Aufgabe ausführen

Verwenden Sie zum Ausführen des Bildklassifikators die Methode classify() für den zugewiesenen Laufmodus:

  • Standbild: classify(image:)
  • Video: classify(videoFrame:timestampInMilliseconds:)
  • Livestream: classifyAsync(image:timestampInMilliseconds:)

Der Bildklassifikator gibt die möglichen Kategorien für das Objekt im ein Bild oder einen Frame ein.

Die folgenden Codebeispiele zeigen grundlegende Beispiele für die Ausführung des Image Classifier in verschiedene Laufmodi zu testen:

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];
    

Das Codebeispiel für den Bildklassifikator zeigt die Implementierungen dieser Modi. classify(image:), classify(videoFrame:timestampInMilliseconds:) und classifyAsync(image:timestampInMilliseconds:) Der Beispielcode ermöglicht es, zwischen Verarbeitungsmodi wechseln, was für Sie möglicherweise nicht erforderlich ist Fall.

Wichtige Hinweise:

  • Im Video- oder Livestream-Modus müssen Sie außerdem die Zeitstempel des Eingabe-Frames für die Bildklassifikatoraufgabe.

  • Im Bild- oder Videomodus blockiert die Aufgabe des Bildklassifikators die aktuellen Thread zu schreiben, bis die Verarbeitung des Eingabebilds oder -frames abgeschlossen ist. Bis Blockieren des aktuellen Threads vermeiden, Verarbeitung im Hintergrund ausführen Threads unter iOS verwenden Versand oder NSOperation Frameworks.

  • Im Livestream-Modus wird die Aufgabe des Bildklassifikators sofort zurückgegeben. und blockiert den aktuellen Thread nicht. Es ruft die Methode imageClassifier(_:didFinishClassification:timestampInMilliseconds:error:) mit dem Klassifizierungsergebnis nach der Verarbeitung jedes Eingabeframes. Die Der Bildklassifikator ruft diese Methode asynchron auf einer dedizierten Weiterleitungswarteschlange. Erstellen Sie zum Anzeigen der Ergebnisse auf der Benutzeroberfläche den Befehl nach der Verarbeitung der Ergebnisse an die Hauptwarteschlange. Wenn die Die Funktion classifyAsync wird aufgerufen, wenn die Aufgabe „Bildklassifikator“ ausgelastet ist verarbeitet, ignoriert der Bildklassifikator den neuen Eingabeframe.

Ergebnisse verarbeiten und anzeigen

Beim Ausführen der Inferenz gibt die Bildklassifikatoraufgabe eine ImageClassifierResult-Objekt, das die Liste der möglichen Kategorien enthält für die Objekte im Eingabebild oder -frame.

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 erhalten Sie mit dem Vogelklassifikator. am:

Der Beispielcode für den Bildklassifikator veranschaulicht, wie die Klassifizierung angezeigt wird. der Aufgabe zurückgegebene Ergebnisse erhalten, siehe Code Beispiel .