Найти тему
Журнал «Код»

Находим лица в картинке с веб-камеры

Оглавление

Первый шаг на пути к крупным проектам

Сегодня сделаем модную штуку в Python — научимся находить лица в веб-камере. Потом научимся делать то же самое на картинах, а затем на основе этого сделаем много разного и интересного.

Вот что нужно для начала знать о распознавании лиц:

  • Для распознавания лица компьютер должен получить изображение — через камеру или готовый файл.
  • Компьютер использует особый алгоритм, который разбивает изображение на прямоугольники.
  • С помощью этих прямоугольников алгоритм пытается найти на картинке знакомые ему переходы между светлыми и тёмными областями.
  • Если в одном месте программа находит много таких совпадений, то, скорее всего, это лицо человека.
  • Чтобы программистам каждый раз не писать свой код распознавания с нуля, сделали специальную библиотеку компьютерного зрения — cv2. Если в неё загрузить заранее подготовленные параметры лиц, она сможет распознавать их намного точнее.
  • С помощью этой библиотеки можно находить на картинке не только лица, но и другие предметы — для этого нужно использовать дополнительные библиотеки либо обучать систему самому.

Сегодня мы научимся работать с этой библиотекой компьютерного зрения и определим лицо человека в кадре:

-2

Логика проекта

Будем делать так:

  1. Установим и подключим библиотеку cv2.
  2. Получим изображение с камеры и выведем его в отдельном окне.
  3. Обучим библиотеку находить лица.
  4. Напишем функцию выделения лиц на изображении.
  5. Объединим всё вместе и получим выделение лица с камеры в режиме реального времени.

Для проекта нам понадобится Python — это идеальный язык для работы с нейросетями и компьютерным зрением.

Если ещё не работали с Python, вот материал: как установить Python на компьютер и начать на нём писать.

Устанавливаем cv2

Для установки библиотеки запустим терминал или VS Code и выполним такую команду:

pip install opencv-python

Теперь убедимся, что это сработало: создаём новый Python-файл и пишем в нём команду:

-3

Если после запуска скрипта ошибок нет — всё установилось правильно и можно двигаться дальше.

Получаем изображение с камеры

По умолчанию библиотека работает с веб-камерой, которая в системе установлена первой (и часто — единственной). Так как нумерация в программировании почти всегда начинается с нуля, нам нужно обратиться к нулевому устройству видеозахвата.

В современных операционных системах в целях безопасности доступ к камере отключён для внешних скриптов, поэтому при первом запуске у нас могут спросить: разрешить доступ к камере или нет? Выбираем вариант «Да, разрешить»:

-4

После этого делаем так: пока не нажата любая клавиша — выводим окошко с изображением. Но может случиться так, что доступ к камере есть, а с самой камерой что-то не так — нет картинки, например. В этом случае нет смысла пытаться определить лица — лучше сразу прекратить работу. Для этого мы проверяем параметр hasFrame — он как раз отвечает за то, есть картинка или нет.

Добавляем этот код в файл, сохраняем и запускаем скрипт:

-5
Появилась картинка — значит, мы на верном пути
Появилась картинка — значит, мы на верном пути

Запускаем нейросеть для определения лиц

Чтобы библиотека компьютерного зрения могла уметь определять лица, её нужно этому научить. Для этого создадим внутреннюю нейросеть, которая уже натренирована на определение лиц, и используем её для наших задач.

Обученная нейросеть отличается тем, что в ней уже сформированы все слои виртуальных нейронов и правильно распределены веса каждого нейрона. Мы возьмём уже готовые веса и слои и положим их в ту же папку, что и скрипт. Эти файлы — результат работы программистов, которые уже обучили нейросеть на 25 тысячах фотографий.

Вот эти файлы нужно скачать и положить в ту же папку, что наш скрипт:

веса для нейросети

модель для определения лиц

Теперь всё готово для создания нейросети по определению лица на изображении:

-7

Пишем функцию определения лиц

Компьютеру неважно, сколько лиц определять — одно или несколько, — поэтому мы сделаем универсальную функцию. Она возьмёт картинку, найдёт на ней все лица и обведёт их зелёной рамкой.

У функции на входе будет три параметра:

  • модель определения лиц;
  • кадр, в котором нужно найти все лица;
  • порог срабатывания распознавания.

Кадр — это условный скриншот того, что видит камера. В секунду камера может обрабатывать от 15 до 60 кадров — это зависит от самой камеры и настроек операционной системы.

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

Модель определения — это алгоритм, по которому компьютер поймёт, что перед нами именно лицо. Его мы как раз сделали на предыдущем этапе

Выполним предварительную работу внутри функции:

  • получим размеры кадра;
  • превратим кадр в бинарный объект с помощью специального алгоритма;
  • прогоним объект через модель распознавания;
  • создадим массив для рамок — там будут храниться координаты рамок для всех найденных лиц.
-8

К этому моменту наша модель уже определила все лица в кадре, сохранила их у себя и готова работать дальше. Теперь мы можем проверить, насколько каждое определение превышает установленный порог — если значение выше порога, то это точно лицо.

Ещё мы сразу записываем координаты найденного блока с лицом в отдельный массив — он нам пригодится для отрисовки рамок вокруг лиц на картинке.

Результат работы функции — это сам кадр и массив с координатами рамок вокруг лиц.

-9

Собираем всё вместе и запускаем скрипт

Единственное, что осталось сделать, — добавить в основной цикл вызов функции для определения лица и сделать проверку, когда определённых лиц нет:

-10

Теперь скрипт можно запускать и проверять — на каком расстоянии перестанет работать компьютерное зрение и сколько человек одновременно система сможет распознать.

-11

Что дальше

В следующей части мы научим программу работать с файлами и познакомимся с параметрами запуска скрипта. Это нам пригодится и в других проектах.