Не смотри в камеру! Пишем свою систему распознавания лиц на Python

В Гонконге протестующие уничтожают уличные камеры, чтобы избежать распознавания лиц. Неужели эта технология уже настолько эффективна, что с ней нужно бороться? Я купил камеру с датчиком глубины, чтобы попробовать самостоятельно реализовать алгоритм сравнения лиц. Вот что у меня получилось.

Зачем нужна аутентификация по лицу

Существует несколько вариантов аутентификации с помощью биометрии, и каждый из них имеет свои недостатки.

  1. Идентификация по отпечатку пальца. Об этом способе я писал в статье «Волшебные «пальчики». Как работают механизмы биометрической авторизации по отпечатку пальца». Главный недостаток идентификации по отпечатку пальца — сравнительно небольшая точность. Отпечаток пальца легко подделать, особенно если сканер слабый.
  2. Отпечаток голоса. Наш голос можно разбить на множество уникальных характеристик. Подробнее об этом ты можешь узнать в статье «Машинный слух. Как работает идентификация человека по его голосу». Но и этот метод весьма неточен: из-за болезни или курения уникальные характеристики голоса могут измениться, и твой девайс тебя уже не узнает.
  3. Сканеры сетчатки и радужки глаза. Они используют сложные алгоритмы и дорогостоящие громоздкие приборы для сканирования. В среднем надежность таких аппаратов выше, чем у более простых в реализации устройств. Но и стоимость таких сканеров соответствующая: базовые модели продаются по цене от пятнадцати тысяч рублей.
  4. Идентификация по трехмерному изображению лица. Этот метод становится все популярнее из-за выгодного соотношения цены и качества. 3D-камеры работают в разном диапазоне дальности, поэтому системы распознавания и идентификации лица могут быть незаметными и не требовать никаких действий от человека. Точность анализа поверхности лица высока, так что все зависит только от разрешения камеры.

Камера

Я выбрал недорогую, но при этом функциональную камеру Intel RealSense SR305, которая может снимать и цветное изображение, и глубинное изображение в разрешении 640 на 480 пикселей с частотой до 60 кадров в секунду.

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

Так выглядит камера, установленная на треногу

Рабочее расстояние камеры небольшое: излучатель расположен так, что объекты, которые находятся ближе двадцати сантиметров, не будут освещены и, соответственно, не будут просканированы. Слишком далеко расположенные предметы — дальше двух метров — тоже окажутся не видны, поскольку мощность лазера не позволит спроецировать на них инфракрасную сетку.

В комплекте с камерой идет провод USB и инструкция со ссылкой на официальный SDK в репозитории на GitHub.

Установка SDK

В первую очередь нужно установить программное обеспечение, чтобы камера заработала. Пользователи Windows могут просто скачать и установить программу. Если же у тебя Linux, но не Ubuntu 16 или 18, то придется собирать проект самостоятельно.

Для начала скачаем исходный код и подготовим площадку для сборки.

$ git clone https://github.com/IntelRealSense/librealsense.git
$ cd librealsense
$ mkdir build && cd build

Теперь можно собрать проект, чтобы посмотреть, как работает камера.

$ cmake .. -DBUILD_EXAMPLES=true -DBUILD_WITH_OPENMP=false -DHWM_OVER_XU=false
$ make -j4
$ make install

Запуск в macOS

Если ты пользователь macOS, для запуска графических программ тебе придется использовать Xcode и соответствующий флаг при конфигурации. Так ты сможешь сгенерировать проект Xcode, чтобы запустить каждую утилиту по отдельности.

$ cmake .. -DBUILD_EXAMPLES=true -DBUILD_WITH_OPENMP=false -DHWM_OVER_XU=false -G Xcode
$ open librealsense2.xcodeproj

Откроется окно Xcode. Выбери необходимую программу, собери проект комбинацией клавиш Command + B и нажми кнопку Build and run.

Окно Xcode с файлами сборки для macOS

Для пробного запуска нам понадобится утилита RealSense Viewer, которая показывает на экране, что видит камера.

Таким будет окно RealSense Viewer, если подключить камеру
Примерно так выглядит трансляция глубины

WWW

На GitHub ты можешь найти подробную инструкцию по сборке для Linux и для macOS.

Подключаем Python

Мы попробуем написать свою программу для идентификации по трехмерному изображению лица. И для начала нам нужно подключить библиотеку RealSense, например к Python 3. Пользователям Windows и некоторых дистрибутивов Linux не придется напрягаться — можно взять официальный пакет pyrealsense2 в PyPI.

$ pip install pyrealsense2

Остальных же ждет еще одно приключение: необходимо пересобрать весь проект, добавив во флаги враппер для Python.

$ cmake .. -DBUILD_EXAMPLES=true -DBUILD_WITH_OPENMP=false -DHWM_OVER_XU=false -DPYTHON_EXECUTABLE=/usr/bin/python3 -DBUILD_PYTHON_BINDINGS:bool=true
$ make -j4

В папке wrappers/python/ появятся два файла и четыре символические ссылки. Чтобы использовать эти файлы как библиотеку для Python, их необходимо скопировать в папку, из которой ты будешь запускать скрипты.

Так выглядят файлы модуля для Python 3.7

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Комментарии (3)

  • "Мы попробуем написать свою программу"
    Отлично!
    Угу!
    А если хочется, но нету? Камеры нету. Или можно с любой камкой, у которой подсветка есть?

    • любая, "... которая может снимать ... и глубинное изображение ..."
      плюс, нужно SDK к камере

      • Полицейские распознаватели врядли используют глубинные эффекты, ибо на расстояниях > 10м они не проявляются.

Похожие материалы