Детекция лиц является входными воротами большинства конвейеров компьютерного зрения. Каждый видеозвонок, фотогалерея и поток с камер видеонаблюдения зависят от обнаружения человеческих лиц прежде всего остального. Однако выбор модели обычно вынуждает идти на неприятный компромисс. Тяжелые сети обеспечивают точность, но требуют дорогих GPU и стоечного охлаждения. Маленькие модели работают на скромном оборудовании, но часто пасуют перед мелкими лицами или потоками высокого разрешения. Модель YuNet из OpenCV Zoo ломает этот паттерн. Я потратил время на бенчмаркинг этой модели на разных масштабах, чтобы понять, заслуживает ли она места в реальных проектах или просто хорошо выглядит на бумаге.

Почему YuNet заслуживает пристального внимания

YuNet — это не просто исследовательский курьез. Она входит в состав OpenCV Zoo — коллекции предобученных моделей, оптимизированных для модуля OpenCV DNN. Конкретный вариант, который я тестировал, использует квантование INT8, что означает, что его веса и активации сжимаются до 8-битных целых чисел вместо обычных 32-битных чисел с плавающей запятой. Это не просто незначительное техническое примечание. INT8 резко снижает пропускную способность памяти, уменьшает нагрузку на кэш и позволяет современным процессорам выполнять инференс без особых усилий. Для тех, кто разрабатывает решения для ноутбуков, edge-устройств или серверов без выделенной видеокарты, такая эффективность — это разница между плавным конвейером и слайд-шоу.

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

Настройка

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

Если вы хотите проверить эти цифры на своем устройстве, процесс полностью воспроизводим. Выполните следующие команды, чтобы загрузить sparse-репозиторий и запустить бенчмарк:

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 среднее время инференса модели YuNet INT8 составило 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, может превратиться в пятно размером 5x5 пикселей при 360p. Как только черты лица становятся меньше рецептивного поля модели, они превращаются в невидимый шум. Глаза сливаются с бровями. Носы исчезают. YuNet просто не за что зацепиться.

Стоит запомнить практический вывод. Если ваша камера снимает широкий угол учебного класса, конференц-зала или угла улицы, далекие лица не появятся, если не предоставить модели достаточное количество пикселей. В данном случае разрешение — это не только вопрос качества изображения. Это прямой рычаг управления полнотой обнаружения (recall).

Стратегия изменения размера, которая вам действительно нужна

YuNet достаточно быстр, чтобы вам не приходилось по привычке принудительно сжимать входные данные до 320 x 240. На M4 Max даже разрешение 2560 x 1440 работает без выделенного GPU. Это меняет подход к архитектуре конвейера.

Вместо того чтобы принудительно приводить каждый кадр к крошечному фиксированному размеру, выбирайте входное разрешение в зависимости от того, что именно вы пытаетесь найти. Если вас интересует только человек прямо перед камерой, 720p или даже 640p будет вполне достаточно. Если же вам нужно каталогизировать каждого участника в большом зале, подавайте модели кроп в более высоком разрешении или полный кадр в нативном разрешении. Поскольку YuNet — легковесная модель, у вас есть запас прочности для такого выбора. Вы не ограничены одним пресетом ради того, чтобы избежать задержки в 200 мс.

Тем не менее, остается одно предостережение. Модель по-прежнему зависит от размера лица относительно входного тензора. Здесь нет магической инвариантности к масштабу. Маленькие лица останутся невидимыми, если они не занимают достаточное количество пикселей. Решение чисто механическое: при поиске удаленных объектов увеличивайте исходное изображение перед инференсом, а затем проецируйте полученные ограничивающие рамки обратно на исходные координаты. YuNet дает вам достаточный «бюджет скорости», чтобы позволить себе этот шаг.

Место в вашем стеке технологий

YuNet — это не решение для любой мыслимой задачи по распознаванию лиц. Сильное перекрытие, экстремальные ракурсы профиля или извлечение 3D-сетки выходят за рамки его возможностей. Но для базовых задач по поиску лиц на фото и в видеопотоках она занимает золотую середину. Приложения для веб-камер в реальном времени, инструменты автоматического отбора фотографий и скромные встраиваемые системы — все они выигрывают от использования детектора, который быстро работает на стандартных CPU.

Формат INT8 ONNX также упрощает развертывание. Вам не нужно устанавливать PyTorch или TensorFlow на целевое устройство. Модуль DNN в OpenCV загружает модель напрямую, что позволяет сохранить размер бинарного файла небольшим, а дерево зависимостей — минимальным.

Итог

YuNet доказывает, что для обнаружения лиц не требуется промышленное оборудование или перегруженные фреймворки. Цифры говорят сами за себя: менее десяти миллисекунд на кадр 720p и прямой, предсказуемый рост количества обнаружений при увеличении разрешения. Вы сами выбираете: максимальная скорость при умеренном разрешении или более широкий охват при более высоком масштабе, и модель не «накажет» вас за этот выбор.

Если вы разрабатываете что-то, работающее с реальными изображениями, выполните описанные выше шаги воспроизведения на собственном оборудовании. Протестируйте модель на своих видеоматериалах. Затем настройте логику изменения размера так, чтобы она соответствовала лицам, которые вам действительно нужно находить. Скорость полезна только тогда, когда вы можете ею управлять. YuNet дает вам и скорость, и контроль.