Pipeline de visión por computadora para corrección de exámenes
Backend / Visión por computadora
Problema
Procesar grandes volúmenes de hojas de respuestas con precisión, sin saturar la CPU del servidor ni requerir calibración manual por hoja.
Impacto
Throughput estable y eliminación de los picos de CPU, con una detección que se autoajusta sin configuración por documento.
- Python
- FastAPI
- OpenCV
- Docker
El problema
El servicio corregía hojas de respuestas mediante reconocimiento óptico de marcas (OMR). Al escalar aparecieron dos problemas serios: el procesamiento saturaba la CPU al 96%, y la detección dependía de calibrar cada hoja a mano, lo que no escalaba.
La arquitectura
- API en FastAPI con versionado explícito de endpoints, para evolucionar el contrato sin romper a los consumidores.
- Pipeline de OpenCV con thresholding adaptativo por zona: la detección se ajusta sola a cada región de la hoja, sin configuración manual.
- Pool de workers para procesar PDFs en paralelo.
- Contenedores Docker endurecidos (usuario no-root) para correr de forma segura en producción.
Decisiones clave
- La causa raíz del 96% de CPU era oversubscription: un pool de procesos combinado con las librerías numéricas de OpenCV (BLAS/TBB/OpenMP) multiplicaba los hilos. La solución fue acotar explícitamente los thread pools de esas librerías. N procesos × M hilos dejaron de pelear por los mismos cores.
- Detección adaptativa en vez de calibración manual: eliminó el trabajo repetitivo por hoja y volvió el sistema robusto ante variaciones.
- Hardening del contenedor a usuario no-root: requirió alinear permisos de volúmenes y UID fijo, pero cerró una superficie de ataque real.
Impacto
El uso de CPU dejó de dispararse, el throughput se volvió predecible y la corrección dejó de depender de ajustes manuales por documento.