L'attività di riconoscimento dei gesti MediaPipe ti consente di riconoscere i gesti delle mani in tempo reale e fornisce i risultati dei gesti riconosciuti e i punti di riferimento delle mani delle mani rilevate. Queste istruzioni mostrano come utilizzare il Rilevamento dei 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 sulle funzionalità, sui modelli e sulle opzioni di configurazione di questa attività, consulta la Panoramica.
Esempio di codice
Il codice di esempio di MediaPipe Tasks è una semplice implementazione di un'app di riconoscimento dei gesti per Android. L'esempio utilizza la fotocamera di un dispositivo Android fisico per rilevare continuamente i gesti delle mani e può anche utilizzare immagini e video dalla galleria del dispositivo per rilevare i gesti in modo statico.
Puoi utilizzare l'app come punto di partenza per la tua app per Android o farvi riferimento quando modifichi un'app esistente. Il codice di esempio di Gesture Recognizer è ospitato su GitHub.
Scarica il codice
Le istruzioni riportate di seguito mostrano come creare una copia locale del codice di esempio utilizzando lo strumento a riga di comando git.
Per scaricare il codice di esempio:
- Clona il repository git utilizzando il seguente comando:
git clone https://github.com/google-ai-edge/mediapipe-samples
- Se vuoi, configura l'istanza Git in modo da utilizzare il controllo sparse,
in modo da avere solo i file per l'app di esempio Gesture Recognizer:
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, consulta la Guida alla configurazione per Android.
Componenti chiave
I seguenti file contengono il codice fondamentale per questa applicazione di esempio di riconoscimento dei gesti delle mani:
- GestureRecognizerHelper.kt: inizializza il riconoscitore dei gesti e gestisce la selezione del modello e del delegato.
- MainActivity.kt: implementa l'applicazione, inclusa la chiamata di
GestureRecognizerHelper
eGestureRecognizerResultsAdapter
. - GestureRecognizerResultsAdapter.kt: gestisce e formatta i risultati.
Configurazione
Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e i progetti di codice specificamente per utilizzare il Rilevamento dei gesti. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'utilizzo delle attività MediaPipe, inclusi i requisiti della versione della piattaforma, consulta la guida alla configurazione per Android.
Dipendenze
L'attività di riconoscimento dei gesti utilizza la libreria com.google.mediapipe:tasks-vision
. Aggiungi questa dipendenza al file build.gradle
della tua app per Android:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Modello
L'attività Rilevamento dei gesti di MediaPipe richiede un bundle di modelli addestrati compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per il Rilevamento dei gesti, consulta la sezione Modelli della panoramica dell'attività.
Seleziona e scarica il modello e memorizzalo nella directory del progetto:
<dev-project-root>/src/main/assets
Specifica il percorso del modello all'interno del parametro ModelAssetPath
. Nel codice di esempio, il modello è definito nel file GestureRecognizerHelper.kt
:
baseOptionBuilder.setModelAssetPath(MP_RECOGNIZER_TASK)
Crea l'attività
L'attività di riconoscimento dei gesti MediaPipe utilizza la funzione createFromOptions()
per configurare l'attività. La funzione createFromOptions()
accetta valori per le opzioni di configurazione. Per ulteriori informazioni sulle opzioni di configurazione, consulta Opzioni di configurazione.
Il Rilevamento dei gesti supporta tre tipi di dati di input: immagini fisse, file video e streaming video dal vivo. Devi specificare la modalità di esecuzione corrispondente al tipo di dati di input quando crei l'attività. Scegli la scheda corrispondente al tipo di dati di input per scoprire 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 Rilevamento dei gesti consente all'utente di passare da una modalità di elaborazione all'altra. L'approccio rende il codice di creazione delle attività più complicato e potrebbe non essere appropriato per il tuo caso d'uso. Puoi vedere questo codice nella funzione setupGestureRecognizer()
del file GestureRecognizerHelper.kt
.
Opzioni di configurazione
Questa attività offre le seguenti opzioni di configurazione per le app per Android:
Nome opzione | Descrizione | Intervallo di valori | Valore predefinito | |
---|---|---|---|---|
runningMode |
Imposta la modalità di esecuzione dell'attività. Esistono tre
modalità: IMMAGINE: la modalità per l'inserimento di singole immagini. VIDEO: la modalità per i fotogrammi decodificati di un video. LIVE_STREAM: la modalità per un live streaming di dati di input, ad esempio da una videocamera. In questa modalità, resultListener deve essere chiamato per configurare un ascoltatore per ricevere i risultati in modo asincrono. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
|
numHands |
Il numero massimo di mani può essere rilevato dal
GestureRecognizer .
|
Any integer > 0 |
1 |
|
minHandDetectionConfidence |
Il punteggio di attendibilità minimo per il rilevamento della mano deve essere considerato positivo nel modello di rilevamento del palmo. | 0.0 - 1.0 |
0.5 |
|
minHandPresenceConfidence |
Il punteggio di attendibilità minimo del punteggio di presenza della mano nel modello di rilevamento dei punti di riferimento della mano. In modalità Video e Live streaming del Rilevamento dei gesti, se il punteggio di confidenza della presenza della mano del modello di landmark della mano è inferiore a questa soglia, viene attivato il modello di rilevamento del palmo. In caso contrario, viene utilizzato un algoritmo di monitoraggio delle mani snello per determinare la posizione delle mani per il successivo rilevamento dei punti di riferimento. | 0.0 - 1.0 |
0.5 |
|
minTrackingConfidence |
Il punteggio di attendibilità minimo per il rilevamento delle mani deve essere considerato positivo. Questa è la soglia IoU del riquadro di delimitazione tra le mani nel frame corrente e nell'ultimo frame. In modalità Video e in modalità Stream di Rilevamento dei gesti, se il rilevamento non riesce, Rilevamento dei gesti attiva il rilevamento della mano. In caso contrario, il rilevamento della mano viene ignorato. | 0.0 - 1.0 |
0.5 |
|
cannedGesturesClassifierOptions |
Opzioni per la configurazione del 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 la configurazione del comportamento del classificatore dei gesti personalizzati. |
|
|
|
resultListener |
Imposta l'ascoltatore dei risultati in modo da ricevere i risultati della classificazione
in modo asincrono quando il riconoscitore dei gesti è in modalità live streaming.
Può essere utilizzato solo quando la modalità di esecuzione è impostata su LIVE_STREAM |
ResultListener |
N/D | N/D |
errorListener |
Imposta un listener di errore facoltativo. | ErrorListener |
N/D | N/D |
Preparazione dei dati
Il Rilevamento dei gesti funziona con immagini, file video e video in live streaming. L'attività gestisce la preelaborazione dei dati di input, tra cui ridimensionamento, rotazione e normalizzazione dei valori.
Il seguente codice mostra come trasferire i dati per l'elaborazione. Questi esempi includono dettagli su come gestire i dati di immagini, file video e streaming di video live.
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()
Nel codice di esempio del Riconoscitore di gesti, la preparazione dei dati viene gestita nel file GestureRecognizerHelper.kt
.
Esegui l'attività
Il Rilevamento dei gesti utilizza le funzioni recognize
, recognizeForVideo
e recognizeAsync
per attivare le deduzioni. Per il riconoscimento dei gesti, questo comporta la preelaborazione dei dati di input, il rilevamento delle mani nell'immagine, il rilevamento dei punti di riferimento delle mani e il riconoscimento dei gesti delle mani dai 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 streaming video dal vivo.
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 esegui l'attività in modalità video o live streaming, devi anche fornire il timestamp del frame di input all'attività Gesture Recognizer.
- Quando viene eseguita in modalità immagine o video, l'attività Rilevamento gesti blocca il thread corrente fino al termine dell'elaborazione dell'immagine o del frame di input. Per evitare di bloccare l'interfaccia utente, esegui l'elaborazione in un THREAD in background.
- Quando viene eseguita in modalità live streaming, l'attività Gesture Recognizer non blocca il thread corrente, ma restituisce immediatamente. Evocherà il suo ascoltatore di risultati con il risultato del riconoscimento ogni volta che ha terminato l'elaborazione di un frame di input. Se la funzione di riconoscimento viene chiamata quando il compito del Rilevatore di gesti è impegnato a elaborare un altro frame, il compito ignorerà il nuovo frame di input.
Nel codice di esempio del Riconoscitore di gesti, le funzioni recognize
, recognizeForVideo
e
recognizeAsync
sono definite nel
file
GestureRecognizerHelper.kt
.
Gestire e visualizzare i risultati
Il Gesto Recognizer genera un oggetto di risultato del rilevamento dei gesti per ogni esecuzione del riconoscimento. L'oggetto risultato contiene i punti di riferimento delle mani nelle coordinate dell'immagine, i punti di riferimento delle mani nelle coordinate del mondo, l'uso della mano(mano sinistra/destra) e le categorie dei gesti delle mani delle mani rilevate.
Di seguito è riportato un esempio dei dati di output di questa attività:
Il risultato GestureRecognizerResult
contiene quattro componenti, ciascuno dei quali è un array in cui ogni elemento contiene il risultato rilevato di una singola mano rilevata.
Mano dominante
La dominanza indica se le mani rilevate sono la mano sinistra o la mano destra.
Gesti
Le categorie di gesti riconosciute delle mani rilevate.
Punti di riferimento
Esistono 21 punti di riferimento della mano, ciascuno composto da coordinate
x
,y
ez
. Le coordinatex
ey
sono normalizzate in [0,0, 1,0] in base alla larghezza e all'altezza dell'immagine, rispettivamente. La coordinataz
rappresenta la profondità del punto di riferimento, con la profondità al polso come origine. Più piccolo è il valore, più il punto di riferimento è vicino alla fotocamera. L'intensità diz
utilizza approssimativamente la stessa scala dix
.Monumenti del mondo
I 21 punti di riferimento della mano sono presentati anche in coordinate mondiali. Ogni punto di riferimento è composto da
x
,y
ez
, che rappresentano coordinate 3D reali in metri con l'origine nel 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à:
Nel codice di esempio di Gesture Recognizer, la classe GestureRecognizerResultsAdapter
nel file GestureRecognizerResultsAdapter.kt
gestisce i risultati.