Baseline Pipeline: MediaPipe Pose sobre fotos EPPA¶
Estado¶
FUNCIONAL: Pipeline ejecutado con exito sobre imagen sintetica. MediaPipe PoseLandmarker (Tasks API v0.10.35) detecta 33 keypoints y computa angulos EPPA-equivalentes automaticamente.
Pendiente: ejecutar sobre fotos EPPA reales cuando esten autorizadas.
Requisitos¶
python3 -m venv .venv
source .venv/bin/activate
pip install mediapipe opencv-python-headless
No requiere GPU (MediaPipe corre en CPU). OpenPose requiere GPU con CUDA.
Pipeline¶
1. Preparar manifest de entrada¶
Crear TSV con columnas: image_path, view, subject_id
Paths relativos al directorio del manifest:
image_path view subject_id
foto_anterior.jpg anterior MIA001
foto_lateral.jpg lateral-der MIA001
2. Ejecutar baseline¶
cd fronts/openpose
source .venv/bin/activate
python scripts/run_mediapipe_baseline.py \
--input tests/fixtures/test-manifest.tsv \
--outdir results/baseline-synth/
El modelo PoseLandmarker Heavy (~26 MB) se descarga automaticamente al primer uso.
3. Outputs¶
Por imagen: {outdir}/{subject_id}_{view}.json
{
"error": null,
"image_w": 600,
"image_h": 1000,
"keypoints": [
{"id": 0, "name": "NOSE", "x": 299.7, "y": 96.3, "z": -0.5, "visibility": 0.9999},
...
],
"eppa_angles": {
"head_inclination_deg": {
"value": 2.05,
"unit": "degrees",
"keypoints_used": "LEFT_EAR, RIGHT_EAR",
"confidence_min": 0.9999,
"eppa_equivalent": "Angulo Inclinacion Cabeza"
},
...
}
}
Resumen: baseline-summary.tsv — n_keypoints, avg_visibility, error por imagen.
Angulos: baseline-angles.tsv — variable, value, unit, eppa_equivalent, confidence_min.
4. Angulos EPPA-equivalentes computados¶
El pipeline calcula automaticamente segun la vista:
| Vista | Variable | Formula | Keypoints |
|---|---|---|---|
| anterior | head_inclination_deg | atan(|dy|/|dx|) | L_EAR, R_EAR |
| anterior | shoulder_inclination_deg | atan(|dy|/|dx|) | L_SHOULDER, R_SHOULDER |
| anterior | pelvis_inclination_deg | atan(|dy|/|dx|) | L_HIP, R_HIP |
| lateral | elbow_angle_deg | angle(S,E,W) | SHOULDER, ELBOW, WRIST |
| lateral | knee_angle_deg | angle(H,K,A) | HIP, KNEE, ANKLE |
| lateral | hip_angle_deg | angle(S,H,K) | SHOULDER, HIP, KNEE |
| lateral | trunk_flexion_deg | atan2 from vertical | SHOULDER, HIP |
Keypoints con visibility < 0.5 se excluyen automaticamente.
Resultados del baseline sintetico¶
Ejecutado sobre imagen sintetica (stick figure con torso/limbs):
SYNTH001/anterior: 33 keypoints, avg_visibility=0.9091
head_inclination_deg = 2.05 deg
shoulder_inclination_deg = 1.00 deg
pelvis_inclination_deg = 2.18 deg
SYNTH001/lateral-der: No pose detected (imagen demasiado esquematica)
Limitaciones conocidas¶
- MediaPipe tiene 33 keypoints genericos — no detecta landmarks oseos (EIAS, C7, etc.)
- Sin fotos EPPA reales, solo se puede validar el pipeline, no los errores reales
- Las fotos deben tener consentimiento y estar manifestadas (ver source-manifest.tsv)
- Vista lateral sobre figuras sinteticas falla — necesita imagenes realistas
Proximos pasos¶
- Obtener autorizacion para usar fotos EPPA del dataset Mia
- Ejecutar pipeline sobre fotos reales (anterior + lateral)
- Comparar angulos MediaPipe vs marcadores EPPA ground truth
- Calcular MAE, RMSE por variable para validar claims C04-C08