Детекція облич є вхідними воротами більшості конвеєрів комп'ютерного зору. Кожен відеодзвінок, фотогалерея та відеопотік з камер спостереження залежать від розпізнавання людських облич перед тим, як щось інше зможе відбутися. Проте вибір моделі зазвичай змушує йти на небажаний компроміс. Важкі мережі забезпечують точність, але потребують дорогих GPU та стійкового охолодження. Менші моделі працюють на скромному обладнанні, проте часто пасують перед маленькими обличчями або потоками високої роздільної здатності. Модель YuNet з OpenCV Zoo ламає цей стереотип. Я витратив час на тестування її продуктивності на різних масштабах, щоб побачити, чи заслуговує вона на місце в реальних проєктах, чи просто добре виглядає на папері.

Чому YuNet заслуговує на пильну увагу

YuNet — це не просто дослідницька цікавинка. Вона є частиною OpenCV Zoo, колекції попередньо навчених моделей, оптимізованих для модуля OpenCV DNN. Конкретний варіант, який я тестував, використовує квантування INT8, що означає, що його ваги та активації стискаються до 8-бітних цілих чисел замість звичних 32-бітних чисел з плаваючою комою. Це не просто технічне зауваження. INT8 різко скорочує пропускну здатність пам'яті, зменшує навантаження на кеш і дозволяє сучасним CPU виконувати інференс без зайвих зусиль. Для тих, хто розробляє рішення на ноутбуці, edge-пристрої або сервері без виділеної відеокарти, така ефективність є межею між плавним робочим процесом і слайд-шоу.

Сама архітектура за своєю природою є легковесною. Вона позбулася зайвого вантажу величезних бекбонів і зосереджена на єдиному завданні — локалізації облич. Така дисципліна окупається, коли вам потрібно інтегрувати детекцію у більший застосунок, де ресурси CPU та акумулятора поділяються з трекінгом, розпізнаванням або кодуванням відео.

Налаштування

Усі тести проводилися на Mac Studio з чипом Apple M4 Max. Файл моделі був YuNet INT8 quantized ONNX з репозиторію OpenCV Zoo. Спочатку я виміряв швидкість інференсу на зображенні 1280x720, а потім порівняв кількість виявлених облич при чотирьох різних роздільних здатностях вхідних даних, щоб зрозуміти, як масштаб впливає на результати.

Якщо ви хочете перевірити ці цифри на своєму комп'ютері, процес є повністю відтворюваним. Виконайте наступні команди, щоб завантажити репозиторій та запустити бенчмарк:

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

Sparse checkout дозволяє тримати розмір завантаження невеликим, а task runner mise бере на себе керування залежностями. Вам не потрібно боротися з середовищами Python або вручну встановлювати пакети.

Швидкість, що залишається стабільною

На зображенні 1280x720 модель INT8 YuNet показувала середній час інференсу 9,21 мс. Найшвидший прохід склав 8,03 мс, тоді як найповільніший — 10,47 мс. Це надзвичайно вузький діапазон. Між найкращим і найгіршим показниками — менше двох з половиною мілісекунд.

На практиці така стабільність важливіша за самовпевненість. Прикладам реального часу потрібна не просто низька середня затримка, а передбачувана затримка. Модель, яка іноді потребує 50 мс, створює помітні заїкання у відеопотоці веб-камери. YuNet працює стабільно. Ви можете розраховувати на те, що вона обробить кадр до того, як надійде наступний, що значно спрощує планування решти вашого конвеєра.

Варіативність масштабу розкриває справжню картину

Чиста швидкість мало що означає, якщо модель пропускає половину облич у сцені. Щоб перевірити це, я пропустив одні й ті самі вихідні зображення через YuNet у чотирьох різних роздільних здатностях. Результати говорять самі за себе:

  • 320 x 180: виявлено 6 облич
  • 640 x 360: виявлено 26 облич
  • 1280 x 720: виявлено 38 облич
  • 2560 x 1440: виявлено 52 облич

Різниця вражає. При 320 x 180 реєструються лише найбільші, найближчі обличчя. Збільште роздільну здатність до 640 x 360, і кількість облич зросте вчетверо. При повному 1440p YuNet знаходить у вісім разів більше облич, ніж при найнижчій роздільній здатності.

Це стається тому, що даунсемплінг руйнує деталі швидше, ніж можна було б подумати. Обличчя, яке займає помітну ділянку у кадрі 1440p, може стиснутися до плями розміром п'ять на п'ять пікселів при 360p. Як тільки риси обличчя стають меншими за рецептивне поле моделі, вони перетворюються на невидимий шум. Очі зливаються з бровами. Носи зникають. YuNet просто ні за що зачепитися.

Практичний висновок варто запам'ятати. Якщо ваша камера знімає широкий кут у класі, конференц-залі або на перехресті вулиць, віддалені обличчя не з'являться, якщо ви не надасте моделі достатньо пікселів. Роздільна здатність тут — це не лише про якість зображення. Це прямий важіль впливу на повноту виявлення.

Стратегія зміни розміру, яка вам насправді потрібна

YuNet is fast enough that you do not need to hammer your input down to 320 x 240 out of habit. On the M4 Max, even 2560 x 1440 runs without a dedicated GPU. That changes how you should architect a pipeline.

Instead of forcing every frame through a tiny fixed size, choose your input resolution based on what you are trying to find. If you only care about the person directly in front of the camera, 720p or even 640p is plenty. If you need to catalog every attendee in a large hall, feed the model a higher-resolution crop or the full native frame. Because YuNet is lightweight, you have headroom to make that choice. You are not locked into a single preset to avoid a 200 ms lag.

One caveat does remain. The model still depends on face size relative to the input tensor. There is no magic scale invariance here. Small faces stay invisible unless they occupy enough pixels. The fix is mechanical: resize your source image upward before inference when hunting for distant subjects, then map the resulting bounding boxes back to original coordinates. YuNet gives you the speed budget to afford that step.

Where This Fits in Your Stack

YuNet is not a solution for every conceivable face task. Heavy occlusion, extreme profile angles, or 3D mesh extraction are outside its scope. But for the bread-and-butter work of locating faces in photos and video streams, it occupies a sweet spot. Real-time webcam apps, automated photo culling tools, and modest embedded systems all benefit from a detector that runs fast on standard CPUs.

The INT8 ONNX format also makes deployment painless. You do not need to install PyTorch or TensorFlow on the target device. OpenCV's DNN module loads the model directly, which keeps your binary small and your dependency tree shallow.

The Bottom Line

YuNet proves that face detection does not require industrial hardware or bloated frameworks. The numbers speak plainly: under ten milliseconds for a 720p frame, and a direct, predictable boost in detection count as resolution rises. You get to choose whether you want maximum speed at moderate resolution or broader coverage at higher scale, and the model will not punish you for that choice.

If you are building anything that touches real-world imagery, run the reproduction steps above on your own hardware. Test it against your footage. Then tune your resize logic to match the faces you actually need to find. Speed is useful only when you can aim it. YuNet gives you both the velocity and the control.