Pose Detection: cos'è, modelli e principio di funzionamento

Autore: IT Sectr Pubblicato: 2026-07-19 Tempo di lettura: 9 min

Pose Detection è una tecnologia di visione artificiale che determina la posizione del corpo umano mediante punti chiave (landmarks): testa, spalle, gomiti, polsi, fianchi, ginocchia, caviglie. Ogni punto ha coordinate (x, y) nello spazio 2D, e i modelli avanzati (MediaPipe BlazePose 3D) aggiungono la coordinata z per la profondità. Nelle applicazioni mobili, Pose Detection viene utilizzato in tracker fitness, app di yoga, filtri AR, programmi di riabilitazione e sistemi di analisi sportiva. Secondo Google ML Kit, 2025, Pose Detection su dispositivo elabora fino a 30 fotogrammi al secondo con una precisione del 94% PCK.

Punti chiave

  • Pose Detection — identificazione dei punti chiave del corpo (landmarks) da un'immagine
  • ML Kit Pose Detection — 33 landmarks, 30 FPS, precisione 94% PCK
  • MediaPipe BlazePose — 33 landmarks + 3D, fino a 60 FPS su GPU
  • MoveNet Lightning — 17 keypoints (COCO), 30+ FPS, 8 MB, INT8
  • Su dispositivo — privacy, tempo reale, senza inviare video al server

Cos'è Pose Detection: basi e metriche

Pose Detection (anche Pose Estimation) si riferisce al compito di determinare i punti chiave semantici del corpo umano da un'immagine o video. L'approccio Top-down prima rileva la persona (Object Detection), poi determina la sua posa. L'approccio Bottom-up trova tutti i landmarks nell'immagine, poi li raggruppa per persona (OpenPose). Per i dispositivi mobili si usa bottom-up — è più veloce con più persone nell'inquadratura. ML Kit e BlazePose usano un approccio a stadio singolo — rilevamento + posa in un unico passaggio.

COCO Keypoints — un set standard di 17 punti: naso, occhi (2), orecchie (2), spalle (2), gomiti (2), polsi (2), fianchi (2), ginocchia (2), caviglie (2). MediaPipe BlazePose utilizza 33 punti, aggiungendo: dita dei piedi, talloni, centro del torso, punti del viso. Più punti ci sono, più accurata è l'analisi della posa, ma maggiore è il carico computazionale. Per le app fitness, 17–20 punti sono sufficienti. Per l'analisi completa (yoga, danza) — 33 punti. Per i filtri AR — 33 punti + 468 punti del viso (MediaPipe Face Mesh).

PCK (Percentage of Correct Keypoints) — metrica di precisione di Pose Detection. Calcola la proporzione di punti previsti entro una distanza dal ground truth (di solito 0.05–0.15 della dimensione del bounding box della persona). ML Kit Pose Detection: 94% PCK@0.1. BlazePose Full: 96% PCK@0.1. MoveNet Lightning: 91% PCK@0.1. OKS (Object Keypoint Similarity) — metrica utilizzata in COCO che considera la scala della persona e la difficoltà del punto. mAP@OKS — metrica standard per i benchmark.

ModelloLandmarksPCK@0.1Latenza (GPU)Dimensione
ML Kit Pose Acc3394%15–30 ms14 MB
BlazePose Full33 + 3D96%10–20 ms12 MB
BlazePose Lite3391%5–10 ms5 MB
MoveNet Lightning1791%8–15 ms8 MB
MoveNet Thunder1795%25–40 ms13 MB

Visibilità dei Keypoint: ogni landmark ha un punteggio (0..1) che indica quanto il modello è sicuro del punto e se è visibile. I punti con punteggio < 0.5 sono considerati invisibili (occlusi, fuori dall'inquadratura). Per l'analisi della posa, utilizzare solo punti visibili. Per la valutazione dell'allineamento — calcolare le distanze ponderate per la confidenza, dove i punti con punteggio basso hanno meno peso nella metrica.

ML Kit Pose Detection su Android e iOS

ML Kit Pose Detection — una libreria di Google per il rilevamento della posa sul dispositivo. Supporta 33 landmarks, inclusi punti del viso, dita dei piedi e talloni. Modalità: Accurate Mode (modello da 14 MB, 15–30 ms, alta precisione) e Streaming Mode (5 MB, 5–10 ms, per il tempo reale). Streaming Mode utilizza un modello leggero con tracciamento — dopo il primo fotogramma, traccia il movimento senza rilevare nuovamente le posizioni esatte, raggiungendo fino a 60 FPS.

API di ML Kit Pose Detection: PoseDetector (opzioni: setDetectorMode, setPerformanceMode) → InputImage → Pose (List<PoseLandmark>). Ogni PoseLandmark ha: landmarkType (38 tipi), position (PointF3D), inFrameLikelihood (0..1). Pose fornisce anche: boundingBox della persona, elenco di landmarks, metodo getLandmark(type). Per la classificazione delle pose, utilizzare gli angoli tra le ossa: shoulderAngle, elbowAngle, hipAngle — calcolati tramite Vector3D tra landmarks adiacenti.

kotlin
val options = PoseDetectorOptions.Builder()
    .setDetectorMode(PoseDetectorOptions.STREAM_MODE)
    .setPerformanceMode(PoseDetectorOptions.PERFORMANCE_MODE_FAST)
    .build()

val detector = PoseDetection.getClient(options)

detector.process(inputImage)
    .addOnSuccessListener { pose ->
        val leftElbow = pose.getLandmark(PoseLandmark.LEFT_ELBOW)
        val leftShoulder = pose.getLandmark(PoseLandmark.LEFT_SHOULDER)
        val leftWrist = pose.getLandmark(PoseLandmark.LEFT_WRIST)
        val elbowAngle = calculateAngle(
            leftShoulder.position, leftElbow.position, leftWrist.position
        )
    }

ML Kit su iOS: Pose Detection è disponibile tramite ML Kit CocoaPods. L'API è identica ad Android: PoseDetector → UIImage → Pose → PoseLandmark. Su iOS, ML Kit utilizza Core ML e ANE (A12+), raggiungendo una latenza di 10–20 ms in Accurate Mode su iPhone 15 Pro. Streaming Mode — 3–8 ms, fino a 120 FPS. Su iOS, ML Kit Pose Detection è più veloce di MediaPipe BlazePose (accelerazione Core ML), ma resta indietro rispetto a BlazePose in FPS sui dispositivi più vecchi (iPhone X–11).

MediaPipe BlazePose: architettura e 3D

MediaPipe BlazePose — un modello ad alte prestazioni per Pose Detection di Google Research. Utilizza un'architettura ibrida: pipeline detector-decoder basata su MobileNetV2 + Feature Pyramid Network. BlazePose Full: 33 landmarks + coordinate 3D (profondità z). BlazePose Lite: 33 landmarks (2D) senza profondità. Entrambi i modelli sono disponibili in MediaPipe Tasks Vision su Android, iOS, Python e Web. BlazePose Full elabora 30–60 FPS su GPU, Lite — 60+ FPS.

Stima della posa 3D con BlazePose: il modello prevede la coordinata z per ogni landmark, consentendo la stima della profondità (avvicinamento/allontanamento degli arti) senza fotocamera stereo. La coordinata z viene calcolata nello spazio metrico (metri) rispetto alla fotocamera. Precisione di BlazePose 3D: 37 mm MPJPE (Mean Per Joint Position Error) sui benchmark pubblici — sufficiente per fitness e AR, insufficiente per la diagnostica medica. Per ARKit/ARFoundation, BlazePose 3D fornisce profondità naturale.

kotlin
// Attività di Visione MediaPipe Pose Detection
val options = PoseLandmarkerOptions.Builder()
    .setBaseOptions(BaseOptions.builder()
        .setModelAssetPath("pose_landmarker_full.task")
        .build())
    .setDelegate(Delegate.GPU)
    .build()

val landmaker = PoseLandmarker.createFromOptions(context, options)

val result = landmaker.detect(MPImage.fromBitmap(bitmap))
result.landmarks.forEach { pose ->
    pose.forEach { landmark ->
        drawLandmark(landmark.x, landmark.y, landmark.z)
    }
}

BlazePose vs ML Kit Pose Detection: BlazePose è più veloce (60+ FPS vs 30 FPS), supporta coordinate 3D, funziona multipiattaforma tramite MediaPipe. ML Kit è più facile da integrare (nessun SDK MediaPipe richiesto), include modelli pre-addestrati con alta precisione. Per progetti iOS nativi — ML Kit Pose Detection (migliore ottimizzazione ANE). Per progetti multipiattaforma (Flutter, React Native) — MediaPipe BlazePose (modello unificato per tutte le piattaforme). Per precisione in scene esigenti — entrambi i modelli sono comparabili.

MoveNet: Lightning e Thunder di TensorFlow

MoveNet — una famiglia di modelli per Pose Detection di TensorFlow, ottimizzata per TFLite. Lightning (8 MB, INT8 — 4 MB): 17 keypoints COCO, 91% PCK, latenza 8–15 ms, 30+ FPS. Thunder (13 MB, INT8 — 6 MB): 17 keypoints, 95% PCK, latenza 25–40 ms, 20+ FPS. MoveNet utilizza l'architettura CenterNet + interpolazione bilineare per mappe di calore ad alta risoluzione. MoveNet supporta il rilevamento multi-pose (fino a 6 persone). I modelli sono disponibili su TensorFlow Hub.

MoveNet Lightning vs Thunder: Lightning — per applicazioni in tempo reale con FPS elevato (fitness, filtri AR). Thunder — per analisi precisa della posa (riabilitazione, analisi sportiva) su dispositivi con GPU. Entrambi i modelli si convertono in Core ML tramite tf-coreml per iOS. MoveNet è disponibile anche tramite l'API TFLite Task Vision PoseLandmarker. Raccomandazione: iniziare con Lightning, se la precisione è insufficiente — passare a Thunder (solo +15 ms di overhead di latenza).

java
// Inferenza MoveNet con TFLite
Interpreter interpreter = new Interpreter(loadModel(context));
TensorImage image = TensorImage.fromBitmap(bitmap);
image.load(Bitmap.createScaledBitmap(bitmap, 192, 192, true));

float[][] output = new float[1][51];
interpreter.run(image.getTensorBuffer(), output);

float[] keypoints = output[0];
for (int i = 0; i < 17; i++) {
    float y = keypoints[i * 3];
    float x = keypoints[i * 3 + 1];
    float score = keypoints[i * 3 + 2];
    drawKeypoint(x, y, score);
}

MoveNet Multi-Pose: rilevamento di fino a 6 persone nell'inquadratura. Invece dell'approccio standard della mappa di calore, MoveNet utilizza rilevamento persone + perfezionamento della posa: prima rileva le persone (basato su centroide), poi stima ogni posa. La modalità multi-pose è 2–3x più lenta della single-pose: Lightning — 25–50 ms (6 persone). Per le app fitness con un singolo utente, utilizzare single-pose. Per attività di gruppo (yoga, crossfit) — multi-pose con limitazione del frame rate per risparmiare batteria.

Classificazione delle pose: dai punti alle azioni

Pose Classification — la fase successiva al rilevamento: convertire i landmarks in azioni semantiche (in piedi, seduto, braccio alzato, accovacciato). Approcci: Rule-based (regole manuali — angoli tra le ossa), ML-based (regressione logistica o Random Forest sul vettore di landmarks), DL-based (classificatore LSTM della sequenza di pose tra i fotogrammi). Rule-based — 50–80% di precisione, semplice e veloce. ML-based — 85–95% di precisione con 200+ esempi etichettati. LSTM — 90–98% di precisione su serie temporali (video).

Angoli tra le ossa: per ogni punto, vengono calcolati gli angoli con i punti vicini. Esempi: angolo del gomito destro (spalla → gomito → polso), angolo del ginocchio destro (anca → ginocchio → caviglia), angolo del torso (punto medio spalle → punto medio fianchi). Gli angoli sono invarianti rispetto alla scala e alla posizione della persona sullo schermo. Normalizzare gli angoli all'intervallo [0, 1] consente di classificare la posa con una semplice regola di soglia: se elbowAngle < 30° — braccio piegato, se > 150° — esteso.

kotlin
// Classificatore di squat basato su regole
fun classifySquat(pose: Pose): SquatPhase {
    val kneeAngle = angle(
        pose.getLandmark(PoseLandmark.LEFT_HIP),
        pose.getLandmark(PoseLandmark.LEFT_KNEE),
        pose.getLandmark(PoseLandmark.LEFT_ANKLE)
    )
    return when {
        kneeAngle > 140f -> SquatPhase.STANDING
        kneeAngle < 90f  -> SquatPhase.SQUAT
        else           -> SquatPhase.TRANSITION
    }
}

MediaPipe Pose Classification — classificatori pre-addestrati inclusi in MediaPipe Tasks: squat, flessioni, plank, sollevamento gambe. Il classificatore prende una lista di landmarks e restituisce l'azione + la confidenza. Include smoothing temporale (filtro temporale): HED (Holt Exponential Double Smoothing) per transizioni fluide tra le pose. Per azioni personalizzate — addestrare un classificatore su 100–500 esempi tramite MediaPipe Model Maker (TensorFlow Lite + metadati).

Applicazioni di Pose Detection nel fitness e nella riabilitazione

Tracker fitness con correzione della tecnica — l'app analizza la posa dell'utente durante l'esercizio e fornisce suggerimenti vocali: “abbassa i fianchi”, “non inclinare il busto”. ML Kit Pose Detection + classificatore basato su regole conta le ripetizioni e valuta la qualità. Squat: angolo del ginocchio < 90° — squat corretto, angolo della schiena < 45° — inclinazione pericolosa del busto. Flessione: angolo del gomito < 90° nel punto inferiore — flessione completa. Trazione: mento sopra il livello della sbarra.

Riabilitazione e fisioterapia — Pose Detection viene utilizzato per il monitoraggio remoto degli esercizi di fisioterapia. Un medico imposta una posa di riferimento (ad esempio, abduzione della spalla a 45°), l'app misura l'angolo attuale e le deviazioni. BlazePose 3D fornisce una precisione angolare di ±3° — sufficiente per la valutazione clinica. Frequenza: 1 fotogramma ogni 3–5 secondi (risparmio batteria). Su dispositivo — privacy dei dati medici del paziente. Riabilitazione post-ictus: tracciamento mano-spalla, estensione del gomito, flessione dell'anca.

Filtri AR ed effetti — Pose Detection è alla base dei filtri AR nei social network (TikTok, Instagram, Snapchat). I landmarks di testa, spalle e mani vengono utilizzati per sovrapporre maschere, animazioni, elementi decorativi. MediaPipe BlazePose Full + Face Mesh (468 punti) offre 120+ FPS sui dispositivi di punta. ARKit/ARCore Face Tracking + Pose Detection — una combinazione per AR a corpo intero. Requisiti: FPS > 30, latenza motion-to-photon < 20 ms.

swift
// Filtro AR con landmarks di posa
let request = VNDetectHumanBodyPoseRequest { req, _ in
    guard let observation = req.results?.first as? VNHumanBodyPoseObservation else { return }
    let keypoints = try observation.recognizedPoints(.all)
    let rightShoulder = keypoints[VNHumanBodyPoseObservation.JointName.rightShoulder]
    DispatchQueue.main.async {
        arView.placeFilter(at: rightShoulder?.location ?? .zero)
    }
}

Analisi sportiva — valutazione professionale della tecnica: analisi biomeccanica della corsa (cadenza, lunghezza del passo, simmetria del movimento delle braccia), nuoto (rollio del corpo, angolo del gomito durante la bracciata), tennis (rotazione della spalla, scatto del polso). MoveNet Thunder con post-elaborazione fornisce una precisione sufficiente per l'analisi non professionale. Lo sport professionistico richiede motion capture 3D (Vicon, OptiTrack), ma Pose Detection sul telefono è un'alternativa accessibile per il mercato di massa. La sincronizzazione degli angoli tra i fotogrammi è un componente chiave.

Domande frequenti

Come stabilizzare Pose Detection con vibrazione della fotocamera?

Utilizzare lo smoothing temporale: One Euro Filter (filtro 1€) — frequenza di taglio configurabile per ogni landmark separatamente, sopprime il rumore ad alta frequenza (vibrazione) preservando il movimento reale (bassa latenza). MediaPipe BlazePose include HED integrato (Holt Exponential Double Smoothing) — smoothing adattivo con previsione del movimento. Per ML Kit, implementare il filtro 1€ da soli: il filtro ha due parametri — beta (velocità) e minCutoff (soglia di frequenza). Raccomandati: beta = 0.04, minCutoff = 0.5 (Android).

Quante persone può rilevare Pose Detection in un'inquadratura?

ML Kit Pose Detection — una persona (single-pose). MoveNet Lightning — fino a 6 persone (multi-pose). MediaPipe BlazePose — fino a 2–3 persone tramite MediaPipe Tasks (multi-pose). Per le app di attività di gruppo, utilizzare MoveNet Lightning o BlazePose. Per le app fitness con un utente — ML Kit (integrazione più semplice, maggiore precisione single-pose). Per le videochiamate con filtri AR — BlazePose Lite con multi-pose (FPS elevato) è sufficiente.

Come calcolare l'angolo tra le ossa per la classificazione della posa?

Angolo tra due ossa: prendere tre landmarks — articolazione A, articolazione B (vertice dell'angolo), articolazione C. Calcolare i vettori BA = (A - B) e BC = (C - B). Angolo = atan2(cross(BA, BC), dot(BA, BC)). Math.toDegrees(acos(dot(BA, BC) / (len(BA) * len(BC)))). Angolo nell'intervallo 0–180°. Per coordinate tridimensionali (BlazePose 3D) utilizzare Vector3D. Normalizzare gli angoli all'intervallo [0,1] per il classificatore ML.

È possibile tracciare entrambe le mani contemporaneamente?

Sì, tutti i principali modelli (ML Kit, BlazePose, MoveNet) rilevano i landmarks di entrambe le mani contemporaneamente: LEFT_SHOULDER, LEFT_ELBOW, LEFT_WRIST, RIGHT_SHOULDER, RIGHT_ELBOW, RIGHT_WRIST. Per il rilevamento aggiuntivo delle mani, combinare Pose Detection + Hand Landmarker (21 punti per mano). MediaPipe Hands + BlazePose è la combinazione standard per corpo intero + mani. Su iOS — VNDetectHumanHandPoseRequest + VNDetectHumanBodyPoseRequest.

Qual è la dimensione minima della persona nell'inquadratura per Pose Detection?

ML Kit Pose Detection: bounding box minimo della persona — 100x100 pixel (rapporto d'aspetto ~1:1). MoveNet Lightning: 120x120 pixel. BlazePose: 80x160 pixel (bounding box verticale). Per una persona in piedi a 3 metri dalla fotocamera (1920x1080) — circa 250x600 px, sufficiente. A distanze > 5 metri, la precisione diminuisce — utilizzare Multi-Pose + input ad alta risoluzione. Per oggetti distanti, Object Detection + Pose Estimation (due fasi) è migliore.

Riepilogo

  • Pose Detection — identificazione di 17–33 punti chiave del corpo con precisione 91–96% PCK
  • ML Kit Pose Detection — 33 landmarks, fino a 30 FPS, API semplice, su GPU/ANE
  • BlazePose (MediaPipe) — 33 landmarks + 3D, fino a 60 FPS, multipiattaforma
  • MoveNet Lightning/Thunder — 17 keypoints COCO, 30+ FPS, TFLite, multi-pose
  • Pose Classification — dai landmarks alle azioni tramite regole o ML
  • Su dispositivo — privacy, tempo reale, latenza 3 ms–30 ms
  • Applicazioni — fitness, riabilitazione, filtri AR, analisi sportiva

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche