EN
Detección de Ansiedad en Aulas — banner
← Volver a proyectos

Detección de Ansiedad en Aulas

· 6 min de lectura

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

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, validando la originalidad del enfoque.


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), priorizando la región anatómica relevante (brazos, manos y cabeza) sobre detalles del rostro.

KeypointDescripción
0Cabeza
1Cuello
2Hombro izquierdo
3Codo izquierdo
4Mano izquierda
5Hombro derecho
6Codo derecho
7Mano derecha
8Torso central
9Base torso
10Cadera izquierda
11Rodilla izquierda
12Pie izquierdo
13Cadera derecha
14Rodilla derecha
15Pie 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ónImágenesInstanciasAporte
v1511 344Línea base
v2512 838+ aumentación (mosaic, mixup, erasing)
v3704 344+ ángulos inéditos, iluminación variable

Se aplicó monitoreo incremental (51 → 61 → 70) con punto de corte al detectar 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), la cual es un proceso iterativo que permite retroalimentar hallazgos entre fases. Aislándose en cada una una variable crítica: arquitectura (F1), resolución (F2), datos (F3) y hardware (F4).

FaseSetupHallazgo principal
F1Nano/Small/Medium/Large a 640 px, dataset v1, 200 épocas, Tesla T4Box 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.
F2YOLO11s 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.
F3YOLO11s 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.
F4YOLO11l 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 se extraen los 16 keypoints y se aplica la lógica geométrica: se calcula la longitud del torso (distancia cuello → base-torso) como referencia de escala y se 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, manteniendo la equivalencia del criterio en toda la escena y evitando 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

FaseModeloRes.Pose mAP50-95 (global)Full-bodyHalf-body
1YOLO11l6400.4190.5260.312
2YOLO11s9600.4780.5810.375
3YOLO11s9600.5210.6260.416
4YOLO11l9600.5790.7040.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ó exitosamente el ruido postural (<1 s), reteniendo solo eventos compatibles con estado ansioso. El modelo procesa video a velocidad funcional en la RTX 3060.


Librerías

LibreríaVersión
Ultralytics8.3.223
torch2.9.0
OpenCV4.12.0
Pandas2.3.3
Numpy2.2.6
Roboflow1.2.11
Matplotlib3.10.7

Conclusiones

  • Viabilidad: se demostró que es factible detectar estados ansiosos mediante HPE en aulas reales, cubriendo el 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 permitió manejar la oclusión y fue el motor del 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, eliminando 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 suma 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