L'attività Classificatore di immagini consente di eseguire la classificazione sulle immagini. Puoi utilizzare questa attività per identificare cosa rappresenta un'immagine in un insieme di categorie definite durante l'addestramento. Queste istruzioni mostrano come utilizzare il classificatore di immagini in app per iOS 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 relativo alle attività di MediaPipe è un'implementazione di base di un classificatore di immagini per iOS. L'esempio utilizza la fotocamera di un dispositivo iOS fisico per classifica continuamente oggetti e può anche utilizzare immagini e video galleria di dispositivi per classificare 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 classificatore di immagini è 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:
Clona il repository git utilizzando il comando seguente:
git clone https://github.com/google-ai-edge/mediapipe-samples
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 Classificatore di immagini:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/image_classification/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 classificatore di immagini applicazione:
- ImageClassifierService.swift: Inizializza il classificatore di immagini, 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 i risultati.
- MediaLibraryViewController.swift Implementa l'interfaccia utente per la modalità di input di file di immagini e video e visualizza i risultati.
Configurazione
Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e progetti di codice per usare Classificatore di immagini. 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 classificatore di immagini usa 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 'MyImageClassifierApp' 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 classificazione delle immagini MediaPipe richiede un modello addestrato compatibile con questa attività. Per saperne di più sui modelli addestrati disponibili Classificatore di immagini, 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à Classificatore di immagini chiamando uno dei suoi inizializzatori. La
L'inizializzatore di ImageClassifier(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 hai bisogno di un classificatore di immagini inizializzato con una configurazione personalizzata
puoi usare l'inizializzatore ImageClassifier(modelPath:)
per creare
Classificatore di immagini con le opzioni predefinite. Per ulteriori informazioni sulla configurazione
vedi Panoramica della configurazione.
L'attività Classificatore di immagini supporta tre tipi di dati di input: immagini fisse e file video.
e video stream in diretta. Per impostazione predefinita, ImageClassifier(modelPath:)
inizializza una
per le immagini statiche. Se vuoi che l'attività venga inizializzata per elaborare il video
o stream video in diretta, usa ImageClassifier(options:)
per specificare
modalità di corsa video o live streaming. La modalità live streaming richiede anche
un'opzione di configurazione imageClassifierLiveStreamDelegate
aggiuntiva,
consente a Image Classifier di fornire risultati di classificazione delle immagini al
delegano 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 = 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)
Live streaming
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
Immagine
@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];
Live streaming
@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];
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 |
displayNamesLocale |
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 della classificazione con il punteggio più alto su per tornare indietro. Se < 0, verranno restituiti tutti i risultati disponibili. | Qualsiasi numero positivo | -1 |
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 della classificazione i cui nome 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 vuoti, i risultati di classificazione 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 |
resultListener |
Imposta il listener dei risultati in modo che riceva i risultati della classificazione
in modo asincrono quando il classificatore di immagini è nel live streaming
. Può essere utilizzato solo quando la modalità di corsa è impostata su LIVE_STREAM |
N/D | Non impostato |
Configurazione del live streaming
Quando la modalità corsa è impostata su live streaming, il classificatore di immagini richiede
un'opzione di configurazione imageClassifierLiveStreamDelegate
aggiuntiva,
consente al classificatore di fornire i risultati della classificazione in modo asincrono. La
il delegato implementa
imageClassifier(_:didFinishClassification:timestampInMilliseconds:error:)
, che il classificatore di immagini chiama dopo l'elaborazione della classificazione
per ogni frame.
Nome opzione | Descrizione | Intervallo di valori | Valore predefinito |
---|---|---|---|
imageClassifierLiveStreamDelegate |
Consente al classificatore di immagini di ricevere i risultati della classificazione in modo asincrono
in modalità live streaming. La classe la cui istanza è impostata su questa proprietà deve
di implementare
imageClassifier(_:didFinishClassification:timestampInMilliseconds:error:)
. |
Non applicabile | Non impostato |
Preparazione dei dati
Devi convertire l'immagine o il frame di input in un oggetto MPImage
prima
e la passa al classificatore di immagini. 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 oggettoMPImage
.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 classificatore di immagini 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 frameworkCoreImage
di iOS possono essere inviate al classificatore di immagini modalità di esecuzione delle immagini.Video: i fotogrammi possono essere convertiti nel formato
CVPixelBuffer
per durante l'elaborazione e poi inviate al classificatore di immagini 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 Categoria di classificazione di immagini 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 classificatore di immagini, usa il metodo classify()
specifico per
modalità di corsa:
- Immagine statica:
classify(image:)
- Video:
classify(videoFrame:timestampInMilliseconds:)
- live streaming:
classifyAsync(image:timestampInMilliseconds:)
Il classificatore di immagini restituisce le possibili categorie per l'oggetto all'interno della classe l'immagine o il frame di input.
I seguenti esempi di codice mostrano esempi di base di come eseguire il classificatore di immagini in diverse modalità di corsa:
Swift
Immagine
let result = try imageClassifier.classify(image: image)
Video
let result = try imageClassifier.classify( videoFrame: image, timestampInMilliseconds: timestamp)
Live streaming
try imageClassifier.classifyAsync( image: image, timestampInMilliseconds: timestamp)
Objective-C
Immagine
MPPImageClassifierResult *result = [imageClassifier classifyImage:image error:nil];
Video
MPPImageClassifierResult *result = [imageClassifier classifyVideoFrame:image timestampInMilliseconds:timestamp error:nil];
Live streaming
BOOL success = [imageClassifier classifyAsyncImage:image timestampInMilliseconds:timestamp error:nil];
L'esempio di codice del classificatore di immagini mostra le implementazioni di ciascuna di queste modalità
in modo più dettagliato classify(image:)
,
classify(videoFrame:timestampInMilliseconds:)
e
classifyAsync(image:timestampInMilliseconds:)
. Il codice di esempio consente
all'utente di passare da una modalità di elaborazione all'altra che potrebbe non essere necessaria per il tuo utilizzo
per verificare se è così.
Tieni presente quanto segue:
Quando l'esecuzione avviene in modalità video o live streaming, devi fornire anche del frame di input all'attività Classificatore di immagini.
Quando è in esecuzione in modalità immagine o video, l'attività Classificatore di immagini 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 l'attività viene eseguita in modalità live streaming, l'attività Classificatore di immagini viene restituita immediatamente. e non blocca il thread corrente. Richiamo
imageClassifier(_:didFinishClassification:timestampInMilliseconds:error:)
con il risultato della classificazione dopo l'elaborazione di ogni frame di input. La Il classificatore di immagini richiama questo metodo in modo asincrono su un di tracciamento delle chiamate. Per visualizzare i risultati sull'interfaccia utente, invia il metodo i risultati alla coda principale dopo l'elaborazione dei risultati. Se La funzioneclassifyAsync
viene chiamata quando l'attività Classificatore di immagini è occupata durante l'elaborazione di un altro frame, il classificatore di immagini ignora il nuovo frame di input.
Gestire e visualizzare i risultati
Quando si esegue l'inferenza, l'attività Classificatore di immagini restituisce
Oggetto ImageClassifierResult
che contiene l'elenco delle possibili categorie
per gli oggetti all'interno dell'immagine o del frame di input.
Di seguito è riportato un esempio dei dati di output di questa attività:
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
Questo risultato è stato ottenuto eseguendo la classe Bird Classifier su:
Il codice di esempio Classificatore di immagini mostra come visualizzare la classificazione i risultati restituiti dall'attività, consulta il codice esempio per maggiori dettagli.