Mit der Aufgabe „Objektdetektor“ können Sie die Anwesenheit und den Standort mehrerer Klassen von -Objekten. Ein Objektdetektor kann beispielsweise Hunde in einem Bild. In dieser Anleitung erfahren Sie, wie Sie die Aufgabe „Objekterkennung“ unter iOS verwenden. Die Das in dieser Anleitung beschriebene Codebeispiel ist auf GitHub verfügbar.
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 grundlegende Implementierung eines -Objekts. Detektor-App für iOS. In diesem Beispiel wird die Kamera eines physischen iOS-Geräts verwendet, um erkennt Objekte kontinuierlich und kann auch Bilder und Videos des Geräts verwenden. um Objekte statisch zu erkennen.
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 die Objekterkennung 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:
Klonen Sie das Git-Repository mit dem folgenden Befehl:
git clone https://github.com/google-ai-edge/mediapipe-samples
Konfigurieren Sie optional Ihre Git-Instanz für den Sparse-Checkout, damit Sie nur die Dateien für die Beispiel-App „Objektdetektor“:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/object_detection/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 Objektdetektor-Beispiel Anwendung:
- ObjectDetectorService.swift: Initialisiert den Detektor, ü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 der Erkennung.
- MediaLibraryViewController.swift: Implementiert die Benutzeroberfläche für den Eingabemodus für Standbilder und Videodateien und die Erkennungsergebnisse visualisiert.
Einrichtung
In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Codeprojekte zur Verwendung des Objektdetektors. 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
Der Objektdetektor 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 'MyObjectDetectorApp' 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 Object Detector“ ist ein trainiertes Modell erforderlich, bei dieser Aufgabe. Weitere Informationen zu den verfügbaren trainierten Modellen für Objektdetektor, 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 Objektdetektor-Aufgabe erstellen, indem Sie einen ihrer Initialisierer aufrufen. Die
ObjectDetector(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 Objektdetektor benötigen, der mit einer benutzerdefinierten Konfiguration initialisiert wurde
können Sie mit dem ObjectDetector(modelPath:)
-Initialisierer ein
Objektdetektor mit den Standardoptionen. Weitere Informationen zur Konfiguration
finden Sie unter Konfigurationsübersicht.
Die Aufgabe „Objekterkennung“ unterstützt drei Eingabedatentypen: Standbilder, Videodateien
und Live-Videostreams. Standardmäßig initialisiert ObjectDetector(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 das Video mit ObjectDetector(options:)
an
oder den Livestream-Laufmodus. Der Livestream-Modus erfordert außerdem die zusätzlichen
objectDetectorLiveStreamDelegate
, mit der die
Objektdetektor, um Erkennungsergebnisse asynchron an den Bevollmächtigten zu senden.
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 = ObjectDetectorOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .image options.maxResults = 5 let objectDetector = try ObjectDetector(options: options)
Video
import MediaPipeTasksVision let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite") let options = ObjectDetectorOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .video options.maxResults = 5 let objectDetector = try ObjectDetector(options: options)
Livestream
import MediaPipeTasksVision // Class that conforms to the `ObjectDetectorLiveStreamDelegate` protocol and // implements the method that the object detector calls once it // finishes performing detection on each input frame. class ObjectDetectorResultProcessor: NSObject, ObjectDetectorLiveStreamDelegate { func objectDetector( _ objectDetector: ObjectDetector, didFinishDetection objectDetectionResult: ObjectDetectorResult?, timestampInMilliseconds: Int, error: Error?) { // Process the detection result or errors here. } } let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite") let options = ObjectDetectorOptions() options.baseOptions.modelAssetPath = modelPath options.runningMode = .liveStream options.maxResults = 5 // Assign an object of the class to the `objectDetectorLiveStreamDelegate` // property. let processor = ObjectDetectorResultProcessor() options.objectDetectorLiveStreamDelegate = processor let objectDetector = try ObjectDetector(options: options)
Objective-C
Bild
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPObjectDetectorOptions *options = [[MPPObjectDetectorOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeImage; options.maxResults = 5; MPPObjectDetector *objectDetector = [[MPPObjectDetector alloc] initWithOptions:options error:nil];
Video
@import MediaPipeTasksVision; NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPObjectDetectorOptions *options = [[MPPObjectDetectorOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeVideo; options.maxResults = 5; MPPObjectDetector *objectDetector = [[MPPObjectDetector alloc] initWithOptions:options error:nil];
Livestream
@import MediaPipeTasksVision; // Class that conforms to the `ObjectDetectorLiveStreamDelegate` protocol and // implements the method that the object detector calls once it // finishes performing detection on each input frame. @interface APPObjectDetectorResultProcessor : NSObject@end @implementation MPPObjectDetectorResultProcessor - (void)objectDetector:(MPPObjectDetector *)objectDetector didFinishDetectionWithResult:(MPPObjectDetectorResult *)ObjectDetectorResult timestampInMilliseconds:(NSInteger)timestampInMilliseconds error:(NSError *)error { // Process the detection result or errors here. } @end NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model" ofType:@"tflite"]; MPPObjectDetectorOptions *options = [[MPPObjectDetectorOptions alloc] init]; options.baseOptions.modelAssetPath = modelPath; options.runningMode = MPPRunningModeLiveStream; options.maxResults = 5; // Assign an object of the class to the `objectDetectorLiveStreamDelegate` // property. APPObjectDetectorResultProcessor *processor = [APPObjectDetectorResultProcessor new]; options.objectDetectorLiveStreamDelegate = processor; MPPObjectDetector *objectDetector = [[MPPObjectDetector 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 |
displayNamesLocales |
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 Erkennungsergebnisse fest auf zurückgeben. | Beliebige positive Zahlen | -1 (alle Ergebnisse werden zurückgegeben) |
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,
Erkennungsergebnisse, deren Kategoriename nicht in dieser Liste 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 Erkennungsergebnisse gefiltert, deren Kategoriename in dieser Gruppe 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 |
Livestreamkonfiguration
Wenn der Ausführungsmodus auf „Livestream“ festgelegt ist, benötigt die Objekterkennung die Berechtigung
zusätzliche objectDetectorLiveStreamDelegate
-Konfigurationsoption, die
ermöglicht es dem Detektor, Erkennungsergebnisse asynchron zu liefern. Der Bevollmächtigte
implementiert die
objectDetector(_objectDetector:didFinishDetection:timestampInMilliseconds:error:)
-Methode, die der Objektdetektor nach der Verarbeitung des Erkennungsergebnisses aufruft.
für jeden Frame.
Optionsname | Beschreibung | Wertebereich | Standardwert |
---|---|---|---|
objectDetectorLiveStreamDelegate |
Ermöglicht es dem Objektdetektor, Erkennungsergebnisse asynchron in
im Livestream-Modus. Die Klasse, deren Instanz auf diese Eigenschaft gesetzt ist, muss
Implementieren der
objectDetector(_:didFinishDetection:timestampInMilliseconds:error:)
. |
Nicht zutreffend | Nicht festgelegt |
Daten vorbereiten
Konvertieren Sie das Eingabebild oder den Eingabe-Frame zuerst in ein MPImage
-Objekt,
und an den Objektdetektor ü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 einMPImage
-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. Die Objekterkennung 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 demCoreImage
-Framework von iOS an den Objektdetektor im Bildlaufmodus.Videos: Videoframes können für folgendes Format in das
CVPixelBuffer
-Format konvertiert werden: verarbeitet und dann im Videomodus an den Objektdetektor gesendet.Livestream: Apps, die mit einer iOS-Kamera Frames generieren, werden möglicherweise zur Verarbeitung in das
CVPixelBuffer
-Format konvertiert, bevor sie an den Objekterkennung 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 Objektdetektors die Methode detect()
für das zugewiesene
Laufmodus:
- Standbild:
detect(image:)
- Video:
detect(videoFrame:timestampInMilliseconds:)
- Livestream:
detectAsync(image:)
Die folgenden Codebeispiele zeigen grundlegende Beispiele für die Ausführung von Object Detector in verschiedene Laufmodi zu testen:
Swift
Bild
let objectDetector.detect(image:image)
Video
let objectDetector.detect(videoFrame:image)
Livestream
let objectDetector.detectAsync(image:image)
Objective-C
Bild
MPPObjectDetectorResult *result = [objectDetector detectInImage:image error:nil];
Video
MPPObjectDetectorResult *result = [objectDetector detectInVideoFrame:image timestampInMilliseconds:timestamp error:nil];
Livestream
BOOL success = [objectDetector detectAsyncInImage:image timestampInMilliseconds:timestamp error:nil];
Das Codebeispiel für die Objekterkennung zeigt die Implementierungen dieser Modi
detect(image:)
, detect(videoFrame:)
und
detectAsync(image:)
Mit dem Beispielcode können Nutzer zwischen
Verarbeitungsmodi, die für Ihren Anwendungsfall möglicherweise nicht erforderlich sind.
Wichtige Hinweise:
Im Video- oder Livestream-Modus müssen Sie außerdem die Zeitstempel des Eingabe-Frames für die Objekterkennungsaufgabe.
Im Bild- oder Videomodus blockiert die Aufgabe „Objekterkennung“ 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 Objekterkennungsaufgabe sofort zurückgegeben und blockiert den aktuellen Thread nicht. Es ruft die Methode
objectDetector(_objectDetector:didFinishDetection:timestampInMilliseconds:error:)
mit dem Erkennungsergebnis nach der Verarbeitung jedes Eingabeframes. Die Der Objektdetektor ruft diese Methode asynchron auf einem dedizierten seriellen Weiterleitungswarteschlange. Zur Anzeige der Ergebnisse auf der Benutzeroberfläche nach der Verarbeitung der Ergebnisse an die Hauptwarteschlange. Wenn diedetectAsync
wird aufgerufen, wenn die Objekterkennungsaufgabe damit beschäftigt ist, eine andere Frame enthält, ignoriert der Objektdetektor den neuen Eingabeframe.
Ergebnisse verarbeiten und anzeigen
Beim Ausführen der Inferenz gibt die Objekterkennungsaufgabe eine ObjectDetectorResult
zurück.
-Objekt, das die im Eingabebild gefundenen Objekte beschreibt.
Im Folgenden sehen Sie ein Beispiel für die Ausgabedaten dieser Aufgabe:
ObjectDetectorResult:
Detection #0:
Box: (x: 355, y: 133, w: 190, h: 206)
Categories:
index : 17
score : 0.73828
class name : dog
Detection #1:
Box: (x: 103, y: 15, w: 138, h: 369)
Categories:
index : 17
score : 0.73047
class name : dog
Die folgende Abbildung zeigt eine Visualisierung der Aufgabenausgabe:
Der Beispielcode für die Objekterkennung zeigt, wie die Erkennungsergebnisse angezeigt werden. Weitere Informationen