Todos los proyectos

5 min de lectura

Detección de Ansiedad en Aulas

Sistema de visión por computadora basado en YOLO11-pose para identificar estados ansiosos a través de patrones de movimientos de estudiantes en salas de clases de la Universidad del Bío-Bío.

  • Python
  • YOLO11
  • PyTorch
  • OpenCV
  • Roboflow

Galería 1

Problema y Motivación

A pesar del amplio catálogo de apoyo de la DDE (atención clínica, talleres, actividades recreativas), todo opera de forma reactiva. La ansiedad tiene manifestaciones físicas observables: los gestos de auto-contacto (frotarse el cuello, tocarse la cara) aumentan en frecuencia y duración bajo tensión interna. El proyecto acuña el término “estado ansioso” para delimitar el alcance: no se diagnostica ansiedad clínica, se detectan patrones corporales transitorios.

Una revisión sistemática en Web of Science, Scopus e IEEE Xplore (1 428 artículos iniciales, 5 pertinentes tras filtros) reveló que ningún trabajo previo aborda la detección de ansiedad en aulas mediante posturas corporales.


Construcción del Dataset

Captura

5 sesiones de grabación en asignaturas reales de la UBB (~3 h de material), con consentimientos informados, anonimización de rostros y etiquetado en Roboflow.

Topología de 16 keypoints personalizada

A diferencia de la topología estándar de COCO (17 keypoints), se unificaron los 5 puntos faciales en un único keypoint (cabeza) para priorizar la región anatómica relevante (brazos, manos y cabeza) sobre detalles del rostro.

Keypoint Descripción
0 Cabeza
1 Cuello
2 Hombro izquierdo
3 Codo izquierdo
4 Mano izquierda
5 Hombro derecho
6 Codo derecho
7 Mano derecha
8 Torso central
9 Base torso
10 Cadera izquierda
11 Rodilla izquierda
12 Pie izquierdo
13 Cadera derecha
14 Rodilla derecha
15 Pie derecho

Dos clases para manejar oclusión: person-full-body (16 kp visibles) y person-half-body (solo kp 0–9, torso hacia arriba). Criterios de etiquetado: bounding box ajustada, keypoint ocluido si se intuye su posición, eliminado si no se intuye.

Evolución del dataset:

Versión Imágenes Instancias Aporte
v1 51 1 344 Línea base
v2 51 2 838 + aumentación (mosaic, mixup, erasing)
v3 70 4 344 + ángulos inéditos, iluminación variable

El dataset creció incrementalmente (51 → 61 → 70) y el entrenamiento se detuvo al alcanzar la saturación de convergencia. La alta densidad (~36 estudiantes/imagen) compensa el volumen reducido: 4 300+ esqueletos anotados.


Entrenamiento: Metodología KDD en 4 Fases

Se siguió la metodología KDD (Fayyad et al., 1996), un proceso iterativo que retroalimenta hallazgos entre fases. Cada fase aísla una variable crítica: arquitectura (F1), resolución (F2), datos (F3) y hardware (F4).

Fase Setup Hallazgo principal
F1 Nano/Small/Medium/Large a 640 px, dataset v1, 200 épocas, Tesla T4 Box OK (~0.73) pero Pose mAP50-95 ≤0.42. Error de cuantización espacial: a 640 px los estudiantes lejanos ocupan muy pocos píxeles. El bottleneck es la resolución, no la profundidad de red.
F2 YOLO11s a 960 px + aumentación agresiva (mosaic, mixup, erasing, rotación, escalado, flip) Pose mAP50-95 sube de 0.419 a 0.478 (+14%). Small (9.9M) supera a Large (26.1M) con 62% menos parámetros. Half-body: +20%. La resolución espacial es más determinante que la profundidad.
F3 YOLO11s a 960 px, dataset v3 (70 img, 4 344 instancias) Pose mAP50-95 alcanza 0.521 (+9%). Half-body: 0.416 (+11%). Curvas estables sin divergencia. Convergencia asintótica: se alcanzó el límite de aprendizaje para este volumen de datos.
F4 YOLO11l a 960 px, dataset v3, Google Colab Pro + NVIDIA A100 (40 GB VRAM) Benchmark comparativo en GPU local (RTX 3060). Calibración F1-Confidence → umbral óptimo = 0.393 (prioriza sensibilidad, delega reducción de FP al filtro temporal). Selección del modelo final.

Sistema de Inferencia

Pipeline modular en dos etapas, desacoplando GPU (extracción) de CPU (análisis):

Video → [Extracción: YOLO + ByteTrack + lógica geométrica] → CSV → [Análisis: filtro temporal] → Reporte

Etapa 1: Tracking y detección de contacto

ByteTrack asigna IDs persistentes a cada estudiante incluso bajo oclusiones (buffer de 600 frames). Por cada persona el pipeline extrae los 16 keypoints y aplica la lógica geométrica: calcula la longitud del torso (distancia cuello → base-torso) como referencia de escala y define un umbral dinámico radio = torso × 0.5. Si la distancia de cualquiera de las manos a la cabeza es menor que ese radio, se registra touching_head = True. Este mecanismo escala automáticamente con la profundidad del estudiante: un torso grande en píxeles (primera fila) genera un radio proporcionalmente grande; uno pequeño (fondo) genera uno pequeño. El criterio se mantiene equivalente en toda la escena y se evitan falsos positivos/negativos por perspectiva.

Los resultados se almacenan en CSV (frame, timestamp, person_id, touching_head, torso_len, distancias, 48 coordenadas crudas). El renderizado visual se suprime para priorizar velocidad de procesamiento.

Etapa 2: Filtro temporal y reporte

Al finalizar, el módulo de análisis segmenta los datos por persona y detecta bloques de fotogramas consecutivos con contacto. Solo se consideran eventos ≥ 2.0 segundos, umbral basado en Shreve et al.: los gestos de auto-pacificación son sostenidos, no toques instantáneos. El resultado es un reporte tabular con ID de estudiante, número de eventos ansiosos y duración total acumulada.

Hardware de inferencia: GPU NVIDIA RTX 3060 (8 GB VRAM), CPU AMD Ryzen 5 9600X, 32 GB RAM. Hardware de consumo local, sin dependencia de nube.


Resultados

Fase Modelo Res. Pose mAP50-95 (global) Full-body Half-body
1 YOLO11l 640 0.419 0.526 0.312
2 YOLO11s 960 0.478 0.581 0.375
3 YOLO11s 960 0.521 0.626 0.416
4 YOLO11l 960 0.579 0.704 0.454
  • Progresión global: +38.19%.
  • Full-body: +33.84%.
  • Half-body: +45.51%.

El histograma de longitudes de torso (~15 a ~95 px) validó la adaptabilidad del umbral dinámico. El filtro de 2 s eliminó el ruido postural (<1 s) y retuvo solo eventos compatibles con el estado ansioso. El modelo procesa video a velocidad funcional en la RTX 3060.


Librerías

Librería Versión
Ultralytics 8.3.223
torch 2.9.0
OpenCV 4.12.0
Pandas 2.3.3
Numpy 2.2.6
Roboflow 1.2.11
Matplotlib 3.10.7

Conclusiones

  • Viabilidad: se demostró que es factible detectar estados ansiosos mediante HPE en aulas reales a lo largo del ciclo completo: datos éticos → entrenamiento iterativo → inferencia en hardware de consumo.
  • Diseño de clases: la separación full-body/half-body fue una decisión acertada que manejó la oclusión e impulsó el progreso en métricas.
  • Umbral dinámico: el radio proporcional a la longitud del torso normaliza correctamente la detección a través de distintas profundidades en la escena.
  • Filtro temporal: los 2 segundos de contacto continuo conectan la geometría con la interpretación psicológica y eliminan el ruido postural.
  • Limitaciones: a pesar de contar con más de 4 300 instancias etiquetadas, estas provenían de pocas imágenes (70), capturadas en solo dos aulas y desde únicamente dos ángulos de cámara. Esta baja variabilidad visual limita la capacidad del modelo para generalizar la estimación de postura ante nuevos escenarios, disposiciones de mobiliario o perspectivas no vistas durante el entrenamiento. A esto se suman la resolución monocular y la ausencia de validación clínica concurrente.
  • Trabajo futuro: despliegue en streaming con alertas en tiempo real, estimación 3D multicámara, incorporación de señales multimodales e integración con los sistemas de la DDE para consulta por profesionales de salud mental.

Referencias

  • Shreve, E. G. et al. (1988). Nonverbal expressions of anxiety in physician-patient interactions. Psychiatry, 51(4).
  • Cao, Z. et al. (2017). Realtime multi-person 2D pose estimation using part affinity fields. CVPR.
  • Fayyad, U. et al. (1996). From data mining to knowledge discovery in databases. AI Magazine, 17(3).
  • Ultralytics. (2025). YOLO11 Documentation. https://docs.ultralytics.com