L'attività MediaPipe Pose Landmarker consente di rilevare i punti di riferimento dei corpi umani in un'immagine o un video. Puoi utilizzare questa attività per identificare le posizioni chiave del corpo, analizzare la postura e classificare i movimenti. Questa attività utilizza modelli di machine learning (ML) che lavorano con singole immagini o video. L'attività genera i punti di riferimento della posa del corpo nelle coordinate dell'immagine e nelle coordinate del mondo tridimensionale.
L'esempio di codice descritto in queste istruzioni è disponibile su GitHub. 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 rilevamento di punti di riferimento per Android. L'esempio utilizza la fotocamera di un dispositivo Android fisico per rilevare le pose in uno stream video continuo. L'app può anche rilevare le pose nelle immagini e nei video della galleria del dispositivo.
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 Pose Landmarker è 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
- Facoltativamente, configura l'istanza Git in modo da utilizzare il controllo sparse, in modo da avere solo i file per l'app di esempio di rilevamento di punti di riferimento di pose:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/pose_landmarker/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 rilevamento di punti di riferimento per le pose:
- PoseLandmarkerHelper.kt: inizializza il rilevamento di landmark di pose e gestisce la selezione del modello e del delegato.
- CameraFragment.kt: gestisce la fotocamera del dispositivo ed elabora i dati di input di immagini e video.
- GalleryFragment.kt: interagisce con
OverlayView
per visualizzare l'immagine o il video di output. - OverlayView.kt: implementa la visualizzazione delle pose rilevate.
Configurazione
Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e i progetti di codice specificamente per utilizzare Pose Landmarker. 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 rilevamento di punti di riferimento della posa 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à MediaPipe Pose Landmarker richiede un bundle di modelli addestrati compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per Pose Landmarker, 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 PoseLandmarkerHelper.kt
:
val modelName = "pose_landmarker_lite.task"
baseOptionsBuilder.setModelAssetPath(modelName)
Crea l'attività
L'attività MediaPipe Pose Landmarker 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 di punti di riferimento della posa supporta i seguenti tipi di dati di input: immagini fisse, file video e stream video dal vivo. Quando crei l'attività, devi specificare la modalità di esecuzione corrispondente al tipo di dati di input. Scegli la scheda corrispondente al tipo di dati di input per scoprire come creare l'attività.
Immagine
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = poseLandmarker.poseLandmarkerOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinPoseDetectionConfidence(minPoseDetectionConfidence) .setMinTrackingConfidence(minPoseTrackingConfidence) .setMinPosePresenceConfidence(minposePresenceConfidence) .setNumPoses(maxNumPoses) .setRunningMode(RunningMode.IMAGE) val options = optionsBuilder.build() poseLandmarker = poseLandmarker.createFromOptions(context, options)
Video
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = poseLandmarker.poseLandmarkerOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinPoseDetectionConfidence(minPoseDetectionConfidence) .setMinTrackingConfidence(minPoseTrackingConfidence) .setMinPosePresenceConfidence(minposePresenceConfidence) .setNumPoses(maxNumPoses) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() poseLandmarker = poseLandmarker.createFromOptions(context, options)
Live streaming
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = poseLandmarker.poseLandmarkerOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinPoseDetectionConfidence(minPoseDetectionConfidence) .setMinTrackingConfidence(minPoseTrackingConfidence) .setMinPosePresenceConfidence(minposePresenceConfidence) .setNumPoses(maxNumPoses) .setResultListener(this::returnLivestreamResult) .setErrorListener(this::returnLivestreamError) .setRunningMode(RunningMode.LIVE_STREAM) val options = optionsBuilder.build() poseLandmarker = poseLandmarker.createFromOptions(context, options)
L'implementazione del codice di esempio di Pose Landmarker 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 setupPoseLandmarker()
del file PoseLandmarkerHelper.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 |
numposes |
Il numero massimo di pose che possono essere rilevate da Pose Landmarker. | Integer > 0 |
1 |
minPoseDetectionConfidence |
Il punteggio di attendibilità minimo per il rilevamento della posa da considerare positivo. | Float [0.0,1.0] |
0.5 |
minPosePresenceConfidence |
Il punteggio di attendibilità minimo del punteggio di presenza della posa nel rilevamento dei punti di riferimento della posa. | Float [0.0,1.0] |
0.5 |
minTrackingConfidence |
Il punteggio di attendibilità minimo per il monitoraggio della posa da considerare riuscito. | Float [0.0,1.0] |
0.5 |
outputSegmentationMasks |
Indica se l'indicatore di posizione della posa restituisce una maschera di segmentazione per la posa rilevata. | Boolean |
False |
resultListener |
Imposta l'ascoltatore dei risultati in modo da ricevere i risultati del rilevamento di punti di riferimento
in modo asincrono quando la funzionalità è in modalità live streaming.
Può essere utilizzato solo quando la modalità di esecuzione è impostata su LIVE_STREAM |
ResultListener |
N/A |
errorListener |
Imposta un listener di errore facoltativo. | ErrorListener |
N/A |
Preparazione dei dati
La funzionalità Segnaposto pose funziona con immagini, file video e live streaming video. 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 di Pose Landmarker, la preparazione dei dati viene gestita nel
file PoseLandmarkerHelper.kt
.
Esegui l'attività
A seconda del tipo di dati con cui stai lavorando, utilizza il metodo
poseLandmarker.detect...()
specifico per quel tipo di dati. Utilizza
detect()
per le singole immagini, detectForVideo()
per i fotogrammi nei file video
e detectAsync()
per gli stream video. Quando esegui i rilevamenti su un
stream video, assicurati di eseguirli in un thread separato per evitare
di bloccare il thread di interposizione dell'utente.
I seguenti esempi di codice mostrano esempi semplici di come eseguire il rilevamento di punti di riferimento in queste diverse modalità di dati:
Immagine
val result = poseLandmarker.detect(mpImage)
Video
val timestampMs = i * inferenceIntervalMs poseLandmarker.detectForVideo(mpImage, timestampMs) .let { detectionResult -> resultList.add(detectionResult) }
Live streaming
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() poseLandmarker.detectAsync(mpImage, frameTime)
Tieni presente quanto segue:
- Quando esegui l'operazione in modalità video o in modalità live streaming, devi fornire il timestamp del frame di input all'attività di rilevamento di punti di riferimento di pose.
- Quando viene eseguita in modalità immagine o video, l'attività di rilevamento di punti di riferimento della posa blocca il thread corrente fino al termine dell'elaborazione dell'immagine o del frame di input. Per evitare di bloccare l'utente, esegui l'elaborazione in un thread in background.
- Quando viene eseguita in modalità live streaming, l'attività di rilevamento di punti di riferimento della posa ritorna immediatamente e non blocca il thread corrente. Evocherà l'ascoltatore dei risultati con il risultato del rilevamento ogni volta che termina l'elaborazione di un frame di input.
Nel codice di esempio di Pose Landmarker, le funzioni detect
, detectForVideo
e
detectAsync
sono definite nel
PoseLandmarkerHelper.kt
file.
Gestire e visualizzare i risultati
Il rilevamento di punti di riferimento della posa restituisce un oggetto poseLandmarkerResult
per ogni esecuzione del rilevamento. L'oggetto risultato contiene le coordinate di ogni punto di riferimento della posa.
Di seguito è riportato un esempio dei dati di output di questa attività:
PoseLandmarkerResult:
Landmarks:
Landmark #0:
x : 0.638852
y : 0.671197
z : 0.129959
visibility : 0.9999997615814209
presence : 0.9999984502792358
Landmark #1:
x : 0.634599
y : 0.536441
z : -0.06984
visibility : 0.999909
presence : 0.999958
... (33 landmarks per pose)
WorldLandmarks:
Landmark #0:
x : 0.067485
y : 0.031084
z : 0.055223
visibility : 0.9999997615814209
presence : 0.9999984502792358
Landmark #1:
x : 0.063209
y : -0.00382
z : 0.020920
visibility : 0.999976
presence : 0.999998
... (33 world landmarks per pose)
SegmentationMasks:
... (pictured below)
L'output contiene sia le coordinate normalizzate (Landmarks
) sia le coordinate mondiali (WorldLandmarks
) per ogni punto di riferimento.
L'output contiene le seguenti coordinate normalizzate (Landmarks
):
x
ey
: coordinate di punti di riferimento normalizzate tra 0,0 e 1,0 in base alla larghezza (x
) e all'altezza (y
) dell'immagine.z
: la profondità del punto di riferimento, con la profondità al centro dei fianchi come origine. Più basso è il valore, più il punto di riferimento è vicino alla fotocamera. La magnitudine di z utilizza approssimativamente la stessa scala dix
.visibility
: la probabilità che il punto di riferimento sia visibile all'interno dell'immagine.
L'output contiene le seguenti coordinate mondiali (WorldLandmarks
):
x
,y
ez
: coordinate tridimensionali reali in metri, con il punto mediano dei fianchi come origine.visibility
: la probabilità che il punto di riferimento sia visibile all'interno dell'immagine.
L'immagine seguente mostra una visualizzazione dell'output dell'attività:
La maschera di segmentazione facoltativa rappresenta la probabilità che ogni pixel appartenga a una persona rilevata. L'immagine seguente è una maschera di segmentazione dell'output della task:
Il codice di esempio di Pose Landmarker mostra come visualizzare i risultati restituiti dall'attività. Per ulteriori dettagli, consulta la classe OverlayView
.