Face detection sits at the entry gate of most computer vision pipelines. Every video call, photo gallery, and security feed depends on spotting human faces before anything else can happen. Yet the choice of model usually forces an unhappy trade-off. Heavy networks offer accuracy but demand expensive GPUs and rack-mounted cooling. Smaller models run on modest hardware yet often choke on small faces or high-resolution feeds. The YuNet model from the OpenCV Zoo breaks that pattern. I spent time benchmarking it across different scales to see whether it earns a place in real projects or merely looks good on paper.
Why YuNet Deserves a Closer Look
YuNet is not a research curiosity. It lives inside the OpenCV Zoo, a collection of pre-trained models optimized for the OpenCV DNN module. The specific variant I tested uses INT8 quantization, which means its weights and activations compress down to 8-bit integers instead of the usual 32-bit floating-point numbers. That is not a minor technical footnote. INT8 slashes memory bandwidth, reduces cache pressure, and allows modern CPUs to chew through inference without breaking a sweat. For anyone building on a laptop, an edge device, or a server without a dedicated graphics card, this efficiency is the difference between a smooth pipeline and a slideshow.
The architecture itself is lightweight by design. It skips the baggage of enormous backbones and focuses on the single task of locating faces. That discipline pays off when you need to integrate detection into a larger application where CPU and battery budget are shared with tracking, recognition, or video encoding.
The Setup
All tests ran on a Mac Studio with an Apple M4 Max chip. The model file was the YuNet INT8 quantized ONNX build from the OpenCV Zoo repository. I measured inference speed on a 1280x720 image first, then compared detection counts across four different input resolutions to understand how scale affects results.
If you want to verify these numbers on your own machine, the process is fully reproducible. Run the following commands to pull the sparse repository and execute the 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
The sparse checkout keeps the download small, and the mise task runner handles dependencies behind the scenes. You do not need to wrestle with Python environments or manual package installations.
Speed That Stays Consistent
On a 1280x720 image, the INT8 YuNet model averaged 9.21 milliseconds per inference. The quickest pass clocked in at 8.03 ms, while the slowest touched 10.47 ms. That is a remarkably tight band. Less than two and a half milliseconds separate the best and worst times.
In practice, this consistency matters more than bragging rights. Real-time applications do not just need low average latency; they need predictable latency. A model that sometimes takes 50 ms creates visible stutter in a webcam feed. YuNet stays flat. You can rely on it to finish a frame before the next one arrives, which makes scheduling the rest of your pipeline far simpler.
Scale Variance Reveals the Real Story
Raw speed means little if the model misses half the faces in a scene. To test this, I fed the same source imagery through YuNet at four different resolutions. The counts tell a clear story:
- 320 x 180: 6 faces detected
- 640 x 360: 26 faces detected
- 1280 x 720: 38 faces detected
- 2560 x 1440: 52 faces detected
The jump is dramatic. At 320 x 180, only the largest, closest faces register. Bump up to 640 x 360, and the count quadruples. At full 1440p, YuNet finds more than eight times as many faces as it did at the lowest resolution.
This happens because downsampling destroys detail faster than intuition suggests. A face that covers a modest patch in a 1440p frame can shrink to a smudge of five by five pixels at 360p. Once facial features collapse below the model's receptive field, they become invisible noise. Eyes merge into eyebrows. Noses disappear. YuNet has nothing to grab onto.
The practical upshot is worth remembering. If your camera captures a wide-angle view of a classroom, a conference room, or a street corner, distant faces will not appear unless you give the model enough pixels. Resolution is not just about image quality here. It is a direct lever on recall.
The Resize Strategy You Actually Need
YuNet est suffisamment rapide pour que vous n'ayez pas besoin de réduire systématiquement votre entrée à 320 x 240 par habitude. Sur le M4 Max, même du 2560 x 1440 s'exécute sans GPU dédié. Cela change la manière dont vous devriez concevoir votre pipeline.
Au lieu de forcer chaque image à passer par une petite taille fixe, choisissez votre résolution d'entrée en fonction de ce que vous essayez de trouver. Si vous ne vous intéressez qu'à la personne située directement devant la caméra, du 720p ou même du 640p suffit largement. Si vous devez répertorier chaque participant dans une grande salle, fournissez au modèle un recadrage de plus haute résolution ou l'image native complète. Comme YuNet est léger, vous avez une marge de manœuvre pour faire ce choix. Vous n'êtes pas prisonnier d'un préréglage unique pour éviter un décalage de 200 ms.
Une mise en garde subsiste toutefois. Le modèle dépend toujours de la taille du visage par rapport au tenseur d'entrée. Il n'y a pas d'invariance d'échelle magique ici. Les petits visages restent invisibles à moins qu'ils n'occupent suffisamment de pixels. La solution est mécanique : redimensionnez votre image source vers le haut avant l'inférence lorsque vous recherchez des sujets éloignés, puis projetez les boîtes englobantes résultantes sur les coordonnées d'origine. YuNet vous offre le budget de vitesse nécessaire pour permettre cette étape.
Où cela se situe dans votre stack
YuNet n'est pas une solution pour toutes les tâches de détection de visage imaginables. L'occlusion importante, les angles de profil extrêmes ou l'extraction de maillage 3D sortent de son champ d'application. Mais pour le travail de base consistant à localiser des visages dans des photos et des flux vidéo, il occupe une position idéale. Les applications webcam en temps réel, les outils de tri automatique de photos et les systèmes embarqués modestes bénéficient tous d'un détecteur qui s'exécute rapidement sur des CPU standards.
Le format INT8 ONNX rend également le déploiement sans tracas. Vous n'avez pas besoin d'installer PyTorch ou TensorFlow sur l'appareil cible. Le module DNN d'OpenCV charge le modèle directement, ce qui permet de garder votre binaire léger et votre arbre de dépendances peu profond.
L'essentiel
YuNet prouve que la détection de visage ne nécessite pas de matériel industriel ou de frameworks lourds. Les chiffres parlent d'eux-mêmes : moins de dix millisecondes pour une image 720p, et une augmentation directe et prévisible du nombre de détections à mesure que la résolution augmente. Vous avez le choix entre une vitesse maximale à une résolution modérée ou une couverture plus large à une échelle plus élevée, et le modèle ne vous pénalisera pas pour ce choix.
Si vous développez quoi que ce soit qui utilise l'imagerie du monde réel, exécutez les étapes de reproduction ci-dessus sur votre propre matériel. Testez-le avec vos propres séquences. Ensuite, ajustez votre logique de redimensionnement pour correspondre aux visages que vous devez réellement trouver. La vitesse n'est utile que si vous pouvez la diriger. YuNet vous offre à la fois la vélocité et le contrôle.
