La detección facial es la puerta de entrada de la mayoría de los pipelines de visión artificial. Cada videollamada, galería de fotos y señal de seguridad depende de detectar rostros humanos antes de que pueda ocurrir cualquier otra cosa. Sin embargo, la elección del modelo suele obligar a un compromiso insatisfactorio. Las redes pesadas ofrecen precisión pero exigen GPUs costosas y refrigeración montada en rack. Los modelos más pequeños funcionan en hardware modesto, pero a menudo fallan con rostros pequeños o transmisiones de alta resolución. El modelo YuNet del OpenCV Zoo rompe ese patrón. Pasé tiempo evaluando su rendimiento en diferentes escalas para ver si merece un lugar en proyectos reales o si solo se ve bien en el papel.
Por qué YuNet merece una mirada más cercana
YuNet no es una curiosidad de investigación. Vive dentro del OpenCV Zoo, una colección de modelos preentrenados optimizados para el módulo OpenCV DNN. La variante específica que probé utiliza cuantización INT8, lo que significa que sus pesos y activaciones se comprimen a enteros de 8 bits en lugar de los habituales números de punto flotante de 32 bits. Esto no es una nota técnica menor. El INT8 reduce drásticamente el ancho de banda de la memoria, disminuye la presión sobre la caché y permite que las CPU modernas procesen la inferencia sin despeinarse. Para cualquiera que trabaje en un portátil, un dispositivo edge o un servidor sin una tarjeta gráfica dedicada, esta eficiencia es la diferencia entre un pipeline fluido y una presentación de diapositivas.
La arquitectura en sí es ligera por diseño. Se salta el lastre de los backbones enormes y se centra en la tarea única de localizar rostros. Esa disciplina rinde frutos cuando necesitas integrar la detección en una aplicación más grande donde el presupuesto de CPU y batería se comparte con el seguimiento, el reconocimiento o la codificación de vídeo.
La configuración
Todas las pruebas se realizaron en un Mac Studio con un chip Apple M4 Max. El archivo del modelo era la versión ONNX cuantizada en INT8 de YuNet del repositorio OpenCV Zoo. Medí la velocidad de inferencia primero en una imagen de 1280x720 y luego comparé el recuento de detecciones en cuatro resoluciones de entrada diferentes para entender cómo la escala afecta los resultados.
Si quieres verificar estos números en tu propia máquina, el proceso es totalmente reproducible. Ejecuta los siguientes comandos para realizar un sparse checkout del repositorio y ejecutar el benchmark:
git clone --depth 1 --filter=blob:none --sparse https://github.com/kiarina/labs.git
cd labs
git sparse-checkout set .gitignore .mise/tasks Makefile mise.toml 2026/07/08/yunet-face-detection
mise -C 2026/07/08/yunet-face-detection run
El sparse checkout mantiene la descarga pequeña, y el ejecutor de tareas mise gestiona las dependencias internamente. No necesitas pelearte con entornos de Python o instalaciones manuales de paquetes.
Velocidad que se mantiene constante
En una imagen de 1280x720, el modelo YuNet INT8 promedió 9,21 milisegundos por inferencia. La pasada más rápida registró 8,03 ms, mientras que la más lenta llegó a los 10,47 ms. Es un rango notablemente estrecho. Menos de dos milisegundos y medio separan los mejores y peores tiempos.
En la práctica, esta consistencia importa más que los alardes. Las aplicaciones en tiempo real no solo necesitan una baja latencia promedio; necesitan una latencia predecible. Un modelo que a veces tarda 50 ms crea tirones visibles en la señal de una webcam. YuNet se mantiene estable. Puedes confiar en que terminará un fotograma antes de que llegue el siguiente, lo que hace que la programación del resto de tu pipeline sea mucho más sencilla.
La varianza de escala revela la verdadera historia
La velocidad bruta significa poco si el modelo pierde la mitad de los rostros en una escena. Para probar esto, alimenté a YuNet con las mismas imágenes de origen en cuatro resoluciones diferentes. Los recuentos cuentan una historia clara:
- 320 x 180: 6 rostros detectados
- 640 x 360: 26 rostros detectados
- 1280 x 720: 38 rostros detectados
- 2560 x 1440: 52 rostros detectados
El salto es dramático. A 320 x 180, solo se registran los rostros más grandes y cercanos. Sube a 640 x 360 y el recuento se cuadruplica. A la resolución completa de 1440p, YuNet encuentra más de ocho veces más rostros que en la resolución más baja.
Esto sucede porque el submuestreo (downsampling) destruye el detalle más rápido de lo que la intuición sugiere. Un rostro que cubre un área modesta en un fotograma de 1440p puede encogerse hasta convertirse en una mancha de cinco por cinco píxeles a 360p. Una vez que las características faciales colapsan por debajo del campo receptivo del modelo, se convierten en ruido invisible. Los ojos se fusionan con las cejas. Las narices desaparecen. YuNet no tiene de dónde agarrarse.
La conclusión práctica merece ser recordada. Si tu cámara captura una vista gran angular de un aula, una sala de conferencias o una esquina de la calle, los rostros distantes no aparecerán a menos que le des al modelo suficientes píxeles. Aquí, la resolución no se trata solo de la calidad de la imagen. Es una palanca directa sobre la capacidad de recuperación (recall).
La estrategia de redimensionamiento que realmente necesitas
YuNet es lo suficientemente rápido como para que no necesites reducir tu entrada a 320 x 240 por pura costumbre. En el M4 Max, incluso 2560 x 1440 funciona sin una GPU dedicada. Eso cambia la forma en que deberías diseñar la arquitectura de un pipeline.
En lugar de forzar cada fotograma a través de un tamaño fijo diminuto, elige la resolución de entrada basándote en lo que intentas encontrar. Si solo te interesa la persona que está directamente frente a la cámara, 720p o incluso 640p es más que suficiente. Si necesitas catalogar a cada asistente en un gran salón, alimenta al modelo con un recorte de mayor resolución o con el fotograma nativo completo. Debido a que YuNet es ligero, tienes margen de maniobra para tomar esa decisión. No estás limitado a un único ajuste preestablecido para evitar un retraso de 200 ms.
Sin embargo, queda una advertencia. El modelo sigue dependiendo del tamaño de la cara en relación con el tensor de entrada. Aquí no existe una invarianza de escala mágica. Las caras pequeñas seguirán siendo invisibles a menos que ocupen suficientes píxeles. La solución es mecánica: aumenta el tamaño de la imagen de origen antes de la inferencia cuando busques sujetos distantes, y luego mapea las cajas delimitadoras resultantes a las coordenadas originales. YuNet te otorga el margen de velocidad necesario para permitir ese paso.
Dónde encaja esto en tu stack
YuNet no es una solución para cada tarea de detección facial imaginable. La oclusión pesada, los ángulos de perfil extremos o la extracción de mallas 3D están fuera de su alcance. Pero para el trabajo fundamental de localizar rostros en fotos y transmisiones de video, ocupa un lugar ideal. Las aplicaciones de webcam en tiempo real, las herramientas automatizadas de selección de fotos y los sistemas embebidos modestos se benefician de un detector que se ejecuta rápido en CPUs estándar.
El formato INT8 ONNX también hace que el despliegue sea sencillo. No necesitas instalar PyTorch o TensorFlow en el dispositivo de destino. El módulo DNN de OpenCV carga el modelo directamente, lo que mantiene tu binario pequeño y tu árbol de dependencias reducido.
Conclusión
YuNet demuestra que la detección facial no requiere hardware industrial ni frameworks pesados. Los números hablan por sí solos: menos de diez milisegundos para un fotograma de 720p, y un aumento directo y predecible en el recuento de detecciones a medida que aumenta la resolución. Puedes elegir si quieres la máxima velocidad con una resolución moderada o una cobertura más amplia a una escala mayor, y el modelo no te penalizará por esa elección.
Si estás construyendo algo que interactúe con imágenes del mundo real, ejecuta los pasos de reproducción anteriores en tu propio hardware. Pruébalo con tus grabaciones. Luego, ajusta tu lógica de redimensionamiento para que coincida con las caras que realmente necesitas encontrar. La velocidad es útil solo cuando puedes dirigirla. YuNet te ofrece tanto la velocidad como el control.
