Guida al rilevamento di oggetti per iOS

L'attività Rilevamento di oggetti consente di rilevare la presenza e la posizione di e classi di oggetti. Ad esempio, un rilevatore di oggetti può individuare i cani all'interno di un dell'immagine. Queste istruzioni mostrano come utilizzare l'attività Rilevamento di oggetti in iOS. La l'esempio di codice descritto in queste istruzioni è disponibile su GitHub.

Puoi vedere questa attività in azione visualizzando questo Web una demo. Per ulteriori informazioni su funzionalità, modelli e opzioni di configurazione questa attività, consulta le Panoramica.

Esempio di codice

Il codice di esempio delle attività di MediaPipe è un'implementazione di base di un oggetto App Detector per iOS. L'esempio utilizza la fotocamera di un dispositivo iOS fisico per rilevare oggetti in modo continuo e può anche utilizzare immagini e video del dispositivo per rilevare gli oggetti in modo statico.

Puoi utilizzare l'app come punto di partenza per la tua app per iOS o fare riferimento all'app quando modifichi un'app esistente. Il codice di esempio del rilevatore di oggetti è ospitato su GitHub.

Scarica il codice

Le seguenti istruzioni mostrano come creare una copia locale dell'esempio utilizzando lo strumento a riga di comando git.

Per scaricare il codice di esempio:

  1. Clona il repository git utilizzando il comando seguente:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Facoltativamente, configura la tua istanza Git per l'utilizzo di un pagamento sparso, in modo da avere solo i file per l'app di esempio Rilevamento di oggetti:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/object_detection/ios/
    

Dopo aver creato una versione locale del codice di esempio, puoi installare nella libreria di attività MediaPipe, apri il progetto con Xcode ed esegui l'app. Per istruzioni, vedi la Guida alla configurazione per iOS.

Componenti chiave

I file seguenti contengono il codice fondamentale per l'esempio di rilevamento di oggetti applicazione:

  • ObjectDetectorService.swift: Inizializza il rilevatore, gestisce la selezione del modello ed esegue l'inferenza sui dati di input.
  • CameraViewController.swift: Implementa l'UI per la modalità di immissione del feed della videocamera in diretta e visualizza risultati del rilevamento.
  • MediaLibraryViewController.swift: Implementa l'interfaccia utente per la modalità di immissione di file di immagini e video e per visualizzare i risultati del rilevamento.

Configurazione

Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e di codice per usare il rilevatore di oggetti. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'uso di attività MediaPipe, inclusa la versione della piattaforma consulta la Guida alla configurazione per iOS.

Dipendenze

Il rilevatore di oggetti utilizza la libreria MediaPipeTasksVision, che deve essere installata utilizzando CocoaPods. La raccolta è compatibile con le app Swift e Objective-C e non richiede alcuna configurazione aggiuntiva specifica per la lingua.

Per istruzioni su come installare CocoaPods su macOS, consulta l'articolo CocoaPods Guida all'installazione. Per istruzioni su come creare un elemento Podfile con i pod necessari per il tuo consulta la sezione Utilizzo CocoaPods.

Aggiungi il pod MediaPipeTasksVision in Podfile utilizzando il seguente codice:

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

Se la tua app include target dei test delle unità, consulta la Guida alla configurazione per iOS per ulteriori informazioni sulla configurazione il tuo Podfile.

Modello

L'attività di rilevamento di oggetti MediaPipe richiede un modello addestrato compatibile con questa attività. Per saperne di più sui modelli addestrati disponibili Rilevatore di oggetti; consulta la panoramica dell'attività Modelli .

Seleziona e scarica un modello, quindi aggiungilo alla directory del progetto utilizzando Xcode. Per istruzioni su come aggiungere file al progetto Xcode, consulta Gestione i file e le cartelle in Xcode progetto.

Utilizza la proprietà BaseOptions.modelAssetPath per specificare il percorso del modello nel tuo app bundle. Per un esempio di codice, consulta la sezione successiva.

Crea l'attività

Puoi creare l'attività Rilevamento di oggetti richiamando uno dei suoi inizializzatori. La L'inizializzatore di ObjectDetector(options:) imposta i valori per le opzioni di configurazione tra cui modalità di corsa, nomi visualizzati, impostazioni internazionali, numero massimo di risultati, confidenza soglia, lista consentita di categorie e lista bloccata.

Se non ti occorre un rilevatore di oggetti inizializzato con una configurazione personalizzata puoi usare l'inizializzatore ObjectDetector(modelPath:) per creare Rilevamento di oggetti con le opzioni predefinite. Per ulteriori informazioni sulla configurazione vedi Panoramica della configurazione.

L'attività Rilevamento di oggetti supporta tre tipi di dati di input: immagini fisse e file video e video stream in diretta. Per impostazione predefinita, ObjectDetector(modelPath:) inizializza una per le immagini statiche. Se vuoi che l'attività venga inizializzata per elaborare il video file o stream video in diretta, usa ObjectDetector(options:) per specificare il video modalità di corsa o live streaming. La modalità live streaming richiede anche di configurazione di objectDetectorLiveStreamDelegate, che attiva Rilevatore di oggetti per fornire risultati di rilevamento al delegato in modo asincrono.

Scegli la scheda corrispondente alla tua modalità di corsa per vedere come creare l'attività ed eseguire l'inferenza.

Swift

Immagine

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)
    

live streaming

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

Immagine

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

live streaming

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

Opzioni di configurazione

Questa attività include le seguenti opzioni di configurazione per le app per iOS:

Nome opzione Descrizione Intervallo di valori Valore predefinito
runningMode Imposta la modalità di esecuzione per l'attività. Esistono tre tipi di modalità:

IMAGE: la modalità per gli input di immagini singole.

VIDEO: la modalità per i fotogrammi decodificati di un video.

LIVE_STREAM: la modalità per un live streaming di input dati, ad esempio quelli di una videocamera. In questa modalità, resultListener deve essere per impostare un listener in modo che riceva risultati in modo asincrono.
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
displayNamesLocales Imposta la lingua delle etichette da utilizzare per i nomi visualizzati forniti nel metadati del modello dell'attività, se disponibili. Il valore predefinito è en per Inglese. Puoi aggiungere etichette localizzate ai metadati di un modello personalizzato Utilizzando l'API TensorFlow Metadata Writer Codice impostazioni internazionali it
maxResults Imposta il numero massimo facoltativo di risultati del rilevamento con il punteggio più alto su per tornare indietro. Qualsiasi numero positivo -1 (vengono restituiti tutti i risultati)
scoreThreshold Imposta la soglia del punteggio di previsione che sostituisce quella fornita in gli eventuali metadati del modello. I risultati al di sotto di questo valore vengono rifiutati. Qualsiasi numero in virgola mobile Non impostato
categoryAllowlist Consente di impostare l'elenco facoltativo di nomi di categorie consentiti. Se il campo non è vuoto, i risultati del rilevamento con nome categoria non incluso in questo set saranno esclusi. I nomi di categorie duplicati o sconosciuti vengono ignorati. Questa opzione si esclude a vicenda con categoryDenylist e utilizza entrambi generano un errore. Qualsiasi stringa Non impostato
categoryDenylist Consente di impostare un elenco facoltativo di nomi di categorie non consentiti. Se non è vuoto, i risultati del rilevamento con nome della categoria incluso in questo set verranno filtrati fuori. I nomi di categorie duplicati o sconosciuti vengono ignorati. Questa opzione è reciproca è esclusivo con categoryAllowlist e l'utilizzo di entrambi genera un errore. Qualsiasi stringa Non impostato

Configurazione del live streaming

Quando la modalità di corsa è impostata su live streaming, il rilevatore di oggetti richiede un'opzione di configurazione objectDetectorLiveStreamDelegate aggiuntiva, consente al rilevatore di fornire i risultati in modo asincrono. Il delegato implementa objectDetector(_objectDetector:didFinishDetection:timestampInMilliseconds:error:) che il rilevatore di oggetti chiama dopo aver elaborato il risultato del rilevamento ogni frame.

Nome opzione Descrizione Intervallo di valori Valore predefinito
objectDetectorLiveStreamDelegate Consente al rilevatore di oggetti di ricevere i risultati del rilevamento in modo asincrono modalità live streaming. La classe la cui istanza è impostata su questa proprietà deve di implementare objectDetector(_:didFinishDetection:timestampInMilliseconds:error:) . Non applicabile Non impostato

Preparazione dei dati

Devi convertire l'immagine o il frame di input in un oggetto MPImage prima e lo passa al rilevatore di oggetti. MPImage supporta diversi tipi di immagini iOS e possono utilizzarli in qualsiasi modalità di esecuzione per l'inferenza. Per ulteriori informazioni informazioni su MPImage, consulta le API MPImage

Scegli un formato dell'immagine iOS in base al tuo caso d'uso e alla modalità di corsa richiede l'applicazione.MPImage accetta UIImage, CVPixelBuffer e CMSampleBuffer formati dell'immagine per iOS.

UIImage

Il formato UIImage è adatto alle seguenti modalità di corsa:

  • Immagini: immagini da un app bundle, una galleria utente o un file system formattato come UIImage immagini possono essere convertite in un oggetto MPImage.

  • Video: utilizza AVAssetImageGenerator per estrarre i fotogrammi video CGImage , quindi convertili in UIImage immagini.

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

L'esempio inizializza un MPImage con il valore predefinito UIImage.Orientation.Up orientamento. Puoi inizializzare MPImage con uno qualsiasi dei UIImage.Orientation e i relativi valori. Il rilevatore di oggetti non supporta orientamenti speculari come .upMirrored, .downMirrored, .leftMirrored e .rightMirrored.

Per ulteriori informazioni su UIImage, fai riferimento a UIImage Apple Developer Documentazione.

CVPixelBuffer

Il formato CVPixelBuffer è adatto per le applicazioni che generano frame e utilizza la classe CoreImage per iOS per l'elaborazione dei dati.

Il formato CVPixelBuffer è adatto alle seguenti modalità di corsa:

  • Immagini: app che generano CVPixelBuffer immagini dopo un'elaborazione utilizzando il framework CoreImage di iOS possono essere inviate al rilevatore di oggetti modalità di esecuzione delle immagini.

  • Video: i fotogrammi possono essere convertiti nel formato CVPixelBuffer per e inviati al rilevatore di oggetti in modalità video.

  • live streaming: le app che utilizzano una fotocamera iOS per generare fotogrammi possono essere convertite nel formato CVPixelBuffer per l'elaborazione prima di essere inviati al Rilevamento di oggetti in modalità live streaming.

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

Per ulteriori informazioni su CVPixelBuffer, consulta CVPixelBuffer Apple Sviluppatore Documentazione.

CMSampleBuffer

Il formato CMSampleBuffer archivia campioni multimediali di un tipo di supporto uniforme e Si adatta alla modalità di corsa in live streaming. I fotogrammi in diretta delle fotocamere iOS sono pubblicato in modo asincrono nel formato CMSampleBuffer da iOS 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];
    

Per ulteriori informazioni su CMSampleBuffer, consulta l'articolo CMSampleBuffer Apple Sviluppatore Documentazione.

Esegui l'attività

Per eseguire il rilevatore di oggetti, utilizza il metodo detect() specifico per il modalità di corsa:

  • Immagine statica: detect(image:)
  • Video: detect(videoFrame:timestampInMilliseconds:)
  • live streaming: detectAsync(image:)

I seguenti esempi di codice mostrano esempi di base di come eseguire il rilevamento di oggetti in diverse modalità di corsa:

Swift

Immagine

let objectDetector.detect(image:image)
    

Video

let objectDetector.detect(videoFrame:image)
    

live streaming

let objectDetector.detectAsync(image:image)
    

Objective-C

Immagine

MPPObjectDetectorResult *result = [objectDetector detectInImage:image error:nil];
    

Video

MPPObjectDetectorResult *result = [objectDetector detectInVideoFrame:image          timestampInMilliseconds:timestamp error:nil];
    

live streaming

BOOL success = [objectDetector detectAsyncInImage:image
                          timestampInMilliseconds:timestamp
                                            error:nil];
    

L'esempio di codice del rilevatore di oggetti mostra le implementazioni di ciascuna di queste modalità in modo più dettagliato detect(image:), detect(videoFrame:) e detectAsync(image:). Il codice di esempio consente all'utente di passare di elaborazione che potrebbero non essere necessarie per il tuo caso d'uso.

Tieni presente quanto segue:

  • Quando l'esecuzione avviene in modalità video o live streaming, devi fornire anche del frame di input all'attività rilevatore di oggetti.

  • Quando è in esecuzione in modalità immagine o video, l'attività Rilevamento di oggetti blocca il thread corrente finché non termina l'elaborazione dell'immagine o del frame di input. A evitare di bloccare il thread corrente, esegui l'elaborazione in background thread utilizzando iOS Dispatch o NSOperation i modelli di machine learning.

  • Quando viene eseguita in modalità live streaming, l'attività Rilevamento di oggetti viene restituita immediatamente e non blocca il thread corrente. Richiamo objectDetector(_objectDetector:didFinishDetection:timestampInMilliseconds:error:) con il risultato del rilevamento dopo l'elaborazione di ogni frame di input. La Il rilevatore di oggetti richiama questo metodo in modo asincrono su un di tracciamento delle chiamate. Per visualizzare i risultati sull'interfaccia utente, invia i risultati alla coda principale dopo l'elaborazione dei risultati. Se detectAsync viene chiamata quando l'attività di rilevamento di oggetti è impegnata a elaborare un'altra , il rilevatore di oggetti ignora il nuovo frame di input.

Gestire e visualizzare i risultati

Dopo l'esecuzione dell'inferenza, l'attività Rilevamento di oggetti restituisce un ObjectDetectorResult che descrive gli oggetti trovati nell'immagine di input.

Di seguito è riportato un esempio dei dati di output di questa attività:

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

L'immagine seguente mostra una visualizzazione dell'output dell'attività:

Il codice di esempio del rilevatore di oggetti dimostra come visualizzare i risultati del rilevamento dall'attività, vedi l'esempio di codice per i dettagli.