L'attività Riconoscimento gesti di MediaPipe ti consente di riconoscere i gesti delle mani in tempo reale e fornisce i risultati riconosciuti relativi ai gesti e i punti di riferimento delle mani dell' mani rilevate. Queste istruzioni mostrano come utilizzare il riconoscimento gesti con le app per Android. L'esempio di codice descritto in queste istruzioni è disponibile su GitHub.
Puoi vedere questa attività in azione visualizzando la demo web. Per ulteriori informazioni su funzionalità, modelli e opzioni di configurazione di questa attività, consulta la Panoramica.
Esempio di codice
Il codice di esempio relativo alle attività di MediaPipe è una semplice implementazione di un riconoscimento dei gesti per Android. L'esempio utilizza la fotocamera di un dispositivo Android fisico per rilevare continuamente i gesti delle mani e utilizzare anche immagini e video galleria di dispositivi per rilevare i gesti in modo statico.
Puoi utilizzare l'app come punto di partenza per la tua app per Android o fare riferimento all'app quando modifichi un'app esistente. Il codice di esempio del riconoscimento gesti è 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 l'istanza Git in modo da utilizzare il pagamento sparso,
in modo da avere solo i file dell'app di esempio di Riconoscimento gesti:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/gesture_recognizer/android
Dopo aver creato una versione locale del codice di esempio, puoi importare il progetto in Android Studio ed eseguire l'app. Per istruzioni, vedi Guida alla configurazione per Android.
Componenti chiave
I seguenti file contengono il codice fondamentale per questo gesto della mano applicazione di esempio per il riconoscimento:
- GestureRecognizerHelper.kt: Inizializza il riconoscimento dei gesti e gestisce il modello e delega selezione.
- MainActivity.kt:
Implementa l'applicazione, incluse le chiamate a
GestureRecognizerHelper
eGestureRecognizerResultsAdapter
. - GestureRecognizerResultsAdapter.kt: Gestisce e formatta i risultati.
Configurazione
Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e che usano in modo specifico il riconoscimento dei gesti. Per informazioni generali su configurare l'ambiente di sviluppo per l'utilizzo delle attività di MediaPipe, tra cui: i requisiti di versione della piattaforma, consulta Guida alla configurazione per Android.
Dipendenze
L'attività Riconoscimento gesti utilizza com.google.mediapipe:tasks-vision
libreria. Aggiungi questa dipendenza al file build.gradle
della tua app per Android:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Modello
L'attività Riconoscimento gesti di MediaPipe richiede un bundle di modelli addestrato compatibili con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per il riconoscimento gesti, consulta la sezione Modelli della panoramica delle attività.
Seleziona e scarica il modello e archivialo nella directory del progetto:
<dev-project-root>/src/main/assets
Specifica il percorso del modello all'interno del parametro ModelAssetPath
. Nella
esempio di codice,
Il modello è definito nel campo GestureRecognizerHelper.kt
file:
baseOptionBuilder.setModelAssetPath(MP_RECOGNIZER_TASK)
Crea l'attività
L'attività Riconoscimento gesti di MediaPipe utilizza la funzione createFromOptions()
per impostare
l'attività. La funzione createFromOptions()
accetta valori per
le opzioni di configurazione. Per ulteriori informazioni sulle opzioni di configurazione,
consulta Opzioni di configurazione.
Il riconoscimento gesti supporta tre tipi di dati di input: immagini fisse, file video e video in live streaming. Devi specificare la modalità di esecuzione corrispondente il tipo di dati di input durante la creazione dell'attività. Scegli la scheda corrispondente a il tipo di dati di input per vedere come creare l'attività ed eseguire l'inferenza.
Immagine
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setRunningMode(RunningMode.IMAGE) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
Video
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
Live streaming
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setResultListener(this::returnLivestreamResult) .setErrorListener(this::returnLivestreamError) .setRunningMode(RunningMode.LIVE_STREAM) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
L'implementazione del codice di esempio del riconoscimento gesti consente all'utente di passare da una modalità all'altra
di elaborazione. L'approccio rende il codice di creazione delle attività più complicato
potrebbero non essere appropriati per il tuo caso d'uso. Puoi trovare questo codice nel
nella funzione setupGestureRecognizer()
GestureRecognizerHelper.kt
.
Opzioni di configurazione
Questa attività include le seguenti opzioni di configurazione per le app per Android:
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. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
|
numHands |
Il numero massimo di mani che può essere rilevato
GestureRecognizer .
|
Any integer > 0 |
1 |
|
minHandDetectionConfidence |
Il punteggio di confidenza minimo per il rilevamento della mano considerata efficace nel modello di rilevamento della palma. | 0.0 - 1.0 |
0.5 |
|
minHandPresenceConfidence |
Il punteggio di confidenza minimo del punteggio di presenza della mano nella mano modello di rilevamento dei punti di riferimento. In modalità Video e live streaming del riconoscimento gesti: se il punteggio di sicurezza della presenza della mano del modello di punto di riferimento della mano è inferiore a questa soglia, attiva il modello di rilevamento della mano. Altrimenti, un algoritmo leggero di rilevamento della mano per determinare la posizione mani per il successivo rilevamento dei punti di riferimento. | 0.0 - 1.0 |
0.5 |
|
minTrackingConfidence |
Il punteggio di confidenza minimo per cui deve essere preso in considerazione il monitoraggio della mano riuscito. Questa è la soglia di IoU del riquadro di delimitazione tra le mani nella il frame corrente e l'ultimo. In modalità Video e Stream di Riconoscimento gesti: se il rilevamento non va a buon fine, il riconoscimento attiva la mano il rilevamento automatico. In caso contrario, il rilevamento della mano viene ignorato. | 0.0 - 1.0 |
0.5 |
|
cannedGesturesClassifierOptions |
Opzioni per configurare il comportamento del classificatore dei gesti predefiniti. I gesti predefiniti sono ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"] |
|
|
|
customGesturesClassifierOptions |
Opzioni per configurare il comportamento del classificatore dei gesti personalizzati. |
|
|
|
resultListener |
Imposta il listener dei risultati in modo che riceva i risultati della classificazione
in modo asincrono quando il riconoscimento dei gesti è in modalità live streaming.
Può essere utilizzato solo quando la modalità di corsa è impostata su LIVE_STREAM |
ResultListener |
N/D | N/D |
errorListener |
Imposta un listener di errori facoltativo. | ErrorListener |
N/D | N/D |
Preparazione dei dati
Il riconoscimento gesti funziona con immagini, file video e video in live streaming. L'attività gestisce la pre-elaborazione dell'input di dati, tra cui il ridimensionamento, la rotazione e il valore della normalizzazione.
Il seguente codice mostra come trasferire i dati per l'elaborazione. Tesi esempi includono dettagli su come gestire i dati di immagini, file video e stream video.
Immagine
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(image).build()
Video
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage val argb8888Frame = if (frame.config == Bitmap.Config.ARGB_8888) frame else frame.copy(Bitmap.Config.ARGB_8888, false) // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(argb8888Frame).build()
Live streaming
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(rotatedBitmap).build()
Nella
nel codice di esempio del riconoscimento gesti, la preparazione dei dati viene gestita nel
GestureRecognizerHelper.kt
.
Esegui l'attività
Il riconoscimento dei gesti utilizza recognize
, recognizeForVideo
e recognizeAsync
per attivare le inferenze. Per il riconoscimento dei gesti,
pre-elaborazione dei dati di input, rilevamento delle mani nell'immagine, rilevamento della mano
punti di riferimento e riconoscimento dei gesti della mano da questi punti di riferimento.
Il seguente codice mostra come eseguire l'elaborazione con il modello di attività. Questi esempi includono dettagli su come gestire i dati di immagini, file video e video stream in diretta.
Immagine
val result = gestureRecognizer?.recognize(mpImage)
Video
val timestampMs = i * inferenceIntervalMs gestureRecognizer?.recognizeForVideo(mpImage, timestampMs) ?.let { recognizerResult -> resultList.add(recognizerResult) }
Live streaming
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() gestureRecognizer?.recognizeAsync(mpImage, frameTime)
Tieni presente quanto segue:
- Quando è attiva la modalità video o live streaming, devi anche fornisci il timestamp del frame di input all'attività di riconoscimento dei gesti.
- Quando viene eseguita nell'immagine o in modalità video, l'attività Riconoscimento gesti bloccare il thread corrente finché non termina di elaborare l'immagine di input o frame. Per evitare di bloccare l'interfaccia utente, esegui l'elaborazione in una in background.
- Quando viene eseguita in modalità live streaming, l'attività Riconoscimento gesti non blocca il thread corrente, ma restituisce immediatamente. Richiamerà il suo risultato con il risultato del riconoscimento ogni volta che termina l'elaborazione un frame di input. Se la funzione di riconoscimento viene richiamata quando il riconoscimento dei gesti l'attività è impegnata a elaborare un altro frame, l'attività ignorerà il nuovo frame di input.
Nella
Codice di esempio del riconoscimento gesti, recognize
, recognizeForVideo
e
Le funzioni recognizeAsync
sono definite
GestureRecognizerHelper.kt
.
Gestire e visualizzare i risultati
Il riconoscimento gesti genera un oggetto risultato del rilevamento dei gesti per ogni durante l'esecuzione del riconoscimento. L'oggetto risultato contiene punti di riferimento a mano nelle coordinate dell'immagine, mano, punti di riferimento nelle coordinate del mondo, mano(mano sinistra/destra) e mano categorie di gesti delle mani rilevate.
Di seguito è riportato un esempio dei dati di output di questa attività:
L'elemento GestureRecognizerResult
risultante contiene quattro componenti, ognuno dei quali è un array, in cui ogni elemento contiene il risultato rilevato di una singola mano rilevata.
Mano dominante
La mano indica se le mani rilevate sono mani sinistra o destra.
Gesti
Le categorie di gesti riconosciute delle mani rilevate.
Punti di riferimento
Ci sono 21 punti di riferimento a mano, ognuno composto da coordinate
x
,y
ez
. La Le coordinate dix
ey
sono normalizzate a [0,0, 1,0] in base alla larghezza dell'immagine e rispettivamente per l'altezza e l'altezza. La coordinataz
rappresenta la profondità del punto di riferimento, con la profondità al polso rappresenta l'origine. Più basso è il valore, più vicino sarà è la fotocamera. La grandezza diz
utilizza più o meno la stessa scala dix
.Punti di riferimento mondiali
I punti di riferimento con 21 mani sono anche presentati in coordinate mondiali. Ogni punto di riferimento è composto da
x
,y
ez
, che rappresentano le coordinate 3D del mondo reale metri con l'origine al centro geometrico della mano.
GestureRecognizerResult:
Handedness:
Categories #0:
index : 0
score : 0.98396
categoryName : Left
Gestures:
Categories #0:
score : 0.76893
categoryName : Thumb_Up
Landmarks:
Landmark #0:
x : 0.638852
y : 0.671197
z : -3.41E-7
Landmark #1:
x : 0.634599
y : 0.536441
z : -0.06984
... (21 landmarks for a hand)
WorldLandmarks:
Landmark #0:
x : 0.067485
y : 0.031084
z : 0.055223
Landmark #1:
x : 0.063209
y : -0.00382
z : 0.020920
... (21 world landmarks for a hand)
Le seguenti immagini mostrano una visualizzazione dell'output dell'attività:
Nella
Codice di esempio del riconoscimento gesti, la classe GestureRecognizerResultsAdapter
nel
GestureRecognizerResultsAdapter.kt
gestisce i risultati.