Monitoraggio della posa umana con MediaPipe in 2D e 3D: replica Showcase |  di Andreas Naoum |  Marzo 2024

 | Intelligenza-Artificiale

Come visualizzare facilmente il tracciamento della posa umana di MediaPipe con Rerun

Monitoraggio della posa umana | Immagine dell'autore

Esploriamo un caso d'uso che sfrutta la potenza di MediaPipe per tracciare le pose umane sia in 2D che in 3D. Ciò che rende questa esplorazione ancora più affascinante è l'aspetto della visualizzazione alimentato dallo strumento di visualizzazione open source Rieseguireche fornisce una visione olistica delle pose umane in azione.

In questo post del blog verrai guidato a utilizzare MediaPipe per monitorare le pose umane in 2D e 3D ed esplorare le funzionalità di visualizzazione di Rerun.

Il monitoraggio della posa umana è un compito della visione artificiale che si concentra sull'identificazione delle posizioni chiave del corpo, sull'analisi della postura e sulla categorizzazione dei movimenti. Al centro di questa tecnologia c’è un modello di apprendimento automatico pre-addestrato per valutare l’input visivo e riconoscere i punti di riferimento sul corpo sia nelle coordinate dell’immagine che nelle coordinate del mondo 3D. I casi d'uso e le applicazioni di questa tecnologia includono, ma non sono limitati a, interazione uomo-computer, analisi sportiva, giochi, realtà virtuale, realtà aumentata, salute, ecc.

Sarebbe bello avere un modello perfetto, ma purtroppo i modelli attuali sono ancora imperfetti. Sebbene i set di dati possano avere diversi tipi di corporatura, il corpo umano differisce da individuo a individuo. L'unicità del corpo di ogni individuo rappresenta una sfida, in particolare per quelli con dimensioni di braccia e gambe non standard, che possono comportare una minore precisione quando si utilizza questa tecnologia. Quando si considera l’integrazione di questa tecnologia nei sistemi, è fondamentale riconoscere la possibilità di imprecisioni. Si spera che gli sforzi in corso all’interno della comunità scientifica apriranno la strada allo sviluppo di modelli più robusti.

Al di là della mancanza di accuratezza, dall’utilizzo di questa tecnologia emergono considerazioni etiche e legali. Ad esempio, catturare le pose del corpo umano negli spazi pubblici potrebbe potenzialmente violare i diritti alla privacy se le persone non hanno dato il proprio consenso. È fondamentale tenere conto di eventuali preoccupazioni etiche e legali prima di implementare questa tecnologia in scenari reali.

Inizia installando le librerie richieste:

# Install the required Python packages 
pip install mediapipe
pip install numpy
pip install opencv-python<4.6
pip install requests>=2.31,<3
pip install rerun-sdk

# or just use the requirements file
pip install -r examples/python/human_pose_tracking/requirements.txt

Immagine tramite Posa Guida al rilevamento dei punti di riferimento di Google (1)

MediaPipe Python è uno strumento utile per gli sviluppatori che desiderano integrare soluzioni ML sul dispositivo per la visione artificiale e l'apprendimento automatico.

Nel codice seguente, MediaPipe pone il rilevamento dei punti di riferimento è stato utilizzato per rilevare punti di riferimento di corpi umani in un'immagine. Questo modello è in grado di rilevare i punti di riferimento della posa del corpo sia come coordinate dell'immagine che come coordinate del mondo 3D. Dopo aver eseguito correttamente il modello ML, puoi utilizzare le coordinate dell'immagine e le coordinate del mondo 3D per visualizzare l'output.

import mediapipe as mp
import numpy as np
from typing import Any
import numpy.typing as npt
import cv2

"""
Read 2D landmark positions from Mediapipe Pose results.

Args:
results (Any): Mediapipe Pose results.
image_width (int): Width of the input image.
image_height (int): Height of the input image.

Returns:
np.array | None: Array of 2D landmark positions or None if no landmarks are detected.
"""
def read_landmark_positions_2d(
results: Any,
image_width: int,
image_height: int,
) -> npt.NDArray(np.float32) | None:
if results.pose_landmarks is None:
return None
else:
# Extract normalized landmark positions and scale them to image dimensions
normalized_landmarks = (results.pose_landmarks.landmark(lm) for lm in mp.solutions.pose.PoseLandmark)
return np.array(((image_width * lm.x, image_height * lm.y) for lm in normalized_landmarks))

"""
Read 3D landmark positions from Mediapipe Pose results.

Args:
results (Any): Mediapipe Pose results.

Returns:
np.array | None: Array of 3D landmark positions or None if no landmarks are detected.
"""
def read_landmark_positions_3d(
results: Any,
) -> npt.NDArray(np.float32) | None:
if results.pose_landmarks is None:
return None
else:
# Extract 3D landmark positions
landmarks = (results.pose_world_landmarks.landmark(lm) for lm in mp.solutions.pose.PoseLandmark)
return np.array(((lm.x, lm.y, lm.z) for lm in landmarks))

"""
Track and analyze pose from an input image.

Args:
image_path (str): Path to the input image.
"""
def track_pose(image_path: str) -> None:
# Read the image, convert color to RGB
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# Create a Pose model instance
pose_detector = mp.solutions.pose.Pose(static_image_mode=True)

# Process the image to obtain pose landmarks
results = pose_detector.process(image)
h, w, _ = image.shape

# Read 2D and 3D landmark positions
landmark_positions_2d = read_landmark_positions_2d(results, w, h)
landmark_positions_3d = read_landmark_positions_3d(results)

Riesegui Visualizzatore | Immagine tramite Riesegui i documenti (2)

Rieseguire funge da strumento di visualizzazione per dati multimodali. Tramite la Rieseguire il visualizzatorepuoi creare layout, personalizzare le visualizzazioni e interagire con i tuoi dati. La parte restante di questa sezione descrive in dettaglio come registrare e presentare i dati utilizzando Rerun SDK per visualizzarli nel Rerun Viewer

Modello di posa di riferimento | Immagine tramite Posa Guida al rilevamento dei punti di riferimento di Google (1)

Sia nei punti 2D che in quelli 3D, è essenziale specificare le connessioni tra i punti. La definizione di queste connessioni rende automaticamente le linee tra di loro. Utilizzando le informazioni fornite da MediaPipe, puoi ottenere le connessioni dei punti di posa da POSE_CONNECTIONS impostarli e quindi impostarli come connessioni keypoint utilizzando Contesto dell'annotazione.

rr.log(
"/",
rr.AnnotationContext(
rr.ClassDescription(
info=rr.AnnotationInfo(id=0, label="Person"),
keypoint_annotations=(rr.AnnotationInfo(id=lm.value, label=lm.name) for lm in mp_pose.PoseLandmark),
keypoint_connections=mp_pose.POSE_CONNECTIONS,
)
),
timeless=True,
)

Coordinate dell'immagine: posizioni 2D

Visualizzazione della posa umana come punti 2D | Immagine dell'autore

Visualizzare i punti di riferimento della posa del corpo nel video sembra essere una buona scelta. Per raggiungere questo obiettivo, è necessario seguire la documentazione di riesecuzione per Entità e Componenti. La gerarchia del percorso delle entità pagina descrive come accedere a più componenti sulla stessa entità. Ad esempio, puoi creare l'entità “video” e includere i componenti “video/rgb” per il video e “video/pose” per la posa del corpo. Se intendi utilizzarlo per un video, ti serve il concetto di Linea del tempo. Ad ogni frame è possibile associare i dati appropriati.

Ecco una funzione in grado di visualizzare i punti 2D sul video:

def track_pose_2d(video_path: str) -> None:
mp_pose = mp.solutions.pose

with closing(VideoSource(video_path)) as video_source, mp_pose.Pose() as pose:
for idx, bgr_frame in enumerate(video_source.stream_bgr()):
if max_frame_count is not None and idx >= max_frame_count:
break

rgb = cv2.cvtColor(bgr_frame.data, cv2.COLOR_BGR2RGB)

# Associate frame with the data
rr.set_time_seconds("time", bgr_frame.time)
rr.set_time_sequence("frame_idx", bgr_frame.idx)

# Present the video
rr.log("video/rgb", rr.Image(rgb).compress(jpeg_quality=75))

# Get the prediction results
results = pose.process(rgb)
h, w, _ = rgb.shape

# Log 2d points to 'video' entity
landmark_positions_2d = read_landmark_positions_2d(results, w, h)
if landmark_positions_2d is not None:
rr.log(
"video/pose/points",
rr.Points2D(landmark_positions_2d, class_ids=0, keypoint_ids=mp_pose.PoseLandmark),
)

Coordinate del mondo 3D: punti 3D

Visualizzare la posa umana come punti 3D | Immagine dell'autore

Perché accontentarsi di punti 2D quando hai punti 3D? Crea una nuova entità, chiamala “Persona” e registra i punti 3D. E 'fatto! Hai appena creato una presentazione 3D della posa del corpo umano.

Ecco come farlo:

def track_pose_3d(video_path: str, *, segment: bool, max_frame_count: int | None) -> None:
mp_pose = mp.solutions.pose

rr.log("person", rr.ViewCoordinates.RIGHT_HAND_Y_DOWN, timeless=True)

with closing(VideoSource(video_path)) as video_source, mp_pose.Pose() as pose:
for idx, bgr_frame in enumerate(video_source.stream_bgr()):
if max_frame_count is not None and idx >= max_frame_count:
break

rgb = cv2.cvtColor(bgr_frame.data, cv2.COLOR_BGR2RGB)

# Associate frame with the data
rr.set_time_seconds("time", bgr_frame.time)
rr.set_time_sequence("frame_idx", bgr_frame.idx)

# Present the video
rr.log("video/rgb", rr.Image(rgb).compress(jpeg_quality=75))

# Get the prediction results
results = pose.process(rgb)
h, w, _ = rgb.shape

# New entity "Person" for the 3D presentation
landmark_positions_3d = read_landmark_positions_3d(results)
if landmark_positions_3d is not None:
rr.log(
"person/pose/points",
rr.Points3D(landmark_positions_3d, class_ids=0, keypoint_ids=mp_pose.PoseLandmark),
)

Il tutorial si concentra sulle parti principali dell'esempio di Human Pose Tracking. Per coloro che preferiscono un approccio pratico, il codice sorgente completo di questo esempio è disponibile su GitHub. Sentiti libero di esplorare, modificare e comprendere il funzionamento interno dell'implementazione.

1. Comprimi l'immagine per efficienza

È possibile aumentare la velocità complessiva della procedura comprimendo le immagini registrate:

rr.log(
"video",
rr.Image(img).compress(jpeg_quality=75)
)

2. Limitare l'utilizzo della memoria

Se stai registrando più dati di quelli che possono essere inseriti nella RAM, inizierà a eliminare i vecchi dati. Il limite predefinito è il 75% della RAM del sistema. Se vuoi aumentarlo puoi usare l'argomento della riga di comando: limite di memoria. Maggiori informazioni sui limiti di memoria possono essere trovate su Rerun's Come limitare l'uso della memoria pagina.

3. Personalizza le visualizzazioni in base alle tue esigenze

Personalizza il visualizzatore di repliche | Immagine dell'autore

Se hai trovato questo articolo utile e approfondito, c'è di più!

Articoli simili:

Condivido regolarmente tutorial sulla visualizzazione per la visione artificiale e la robotica. Seguitemi per futuri aggiornamenti!

Inoltre, puoi trovarmi su LinkedIn.

(1) Posa Guida al rilevamento dei punti di riferimento di GoogleParti di questa pagina sono riprodotte dal lavoro creato e condiviso da Google e utilizzato secondo i termini descritti nel Licenza di attribuzione Creative Commons 4.0.

(2) Riesegui i documenti di Rieseguire Sotto LA MIA patente

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *