Использование OpenCV и Face Recognition в системах распознавания лиц на одноплатных компьютерах типа Raspberry Pi
#Нейронные сети #Распознавание образов #Отраслевые решения #Разработка
#Нейронные сети #Распознавание образов #Отраслевые решения #Разработка
Автор: Сергей Рыбалко, TechLead
Материалы статьи подготовлены в рамках внутренней программы менторства и обучения специалистов команды Evergreen.
OpenCV — opensource-библиотека для компьютерного зрения, обработки изображений и численных алгоритмов с довольно широким функционалом. Мы активно использовали ее в наших продуктах, например, системе OCR Solutions — сервисе распознавания техпаспортов, загранпаспортов и других документов. В целом, OpenCV — неотъемлемая часть нашего стека в части разработки искусственного интеллекта и систем компьютерного зрения. Реализована библиотека на C/C++, есть поддержка Python, Java, Ruby, Matlab, Lua и других языков.
1. Кадрирование.
Одна из базовых возможностей, которую мы часто используем. OpenCV — достаточно простой и понятный API: если хотим вырезать часть исходной картинки — указываем координаты, кадрируем и продолжаем работу.
Источник: opencv.org
2. Изменение размера.
Уменьшаем картинки до оптимального размера. Это требуется для тех же сверточных нейронных сетей, чтобы уменьшить нагрузку на систему, и в целом для удобства в работе.
Источник: opencv.org
3. Поворот изображения.
Возможность поворачивать исходное изображение в любом положении, отражать и тому подобное.
Источник: opencv.org
4. Перевод цветного изображения в черно-белое/ градации серого.
Есть несколько распространенных алгоритмов, когда нам нужно выделить какие-то важные детали изображения, тонко настраивая порог срабатывания. Такой подход в работе мы используем довольно часто.
Источник: opencv.org
5. Размытие/ сглаживание.
Очевидно, что эта опция нужна, чтобы заблюрить изначально четкое изображение. Но из размытой картинки сделать четкую данная функция не может — для этого существуют другие алгоритмы.
Источник: opencv.org
6. Рисование прямоугольников и линий.
Прямоугольниками мы обозначаем границы объектов при разметке датасетов для систем распознавания, подписываем лейблы, чтобы наглядно показать, какие объекты находятся на картинке, где именно и в каком количестве. Кстати, на эту тему у нас есть подробные статьи тут и тут. Можно рисовать самые разнообразные геометрические фигуры — не только квадраты — а также закрашивать их, менять толщину и цвет линий.
Источник: opencv.org
7. Надписи (текст на изображении).
Используем эту функцию и при работе с видео, когда нужно динамически показать определенные параметры, или что у нас в данный момент происходит на экране: частота кадров видеопотока, количество каких-то отслеживаемых объектов в реальном времени в системах подсчета, дополнительная отладочная информация.
Источник: opencv.org
8. Распознавание лица.
У OpenCV есть достаточно мощный функционал по детекту (определению) объектов на изображении. Реализовано это благодаря предварительно обученным моделям, основанным на нейросетях. В примере, который мы рассмотрим ниже, использовалась обученная модель определения фронтального изображения лица на фото (допускается поворот головы до примерно 30 градусов). OpenCV позволяет очень быстро находить лица. При этом мы не идентифицируем личность человека, но с определенной долей уверенности можем предположить, что лицо находится именно в данной части кадра. Как это происходит?
Источник: opencv.org
Для поиска лиц используется принцип “скользящего окна” (метод Виолы — Джонса). Для каждой области изображения, над которой проходит окно, рассчитывается признак Хаара. Наличие или отсутствие объекта в окне определяется разницей между значением признака и обучаемым порогом. Окно как бы скользит по всему изображению. После каждого прохождения изображения оно увеличивается, чтобы найти лица большего масштаба.
Признак Хаара состоит из смежных прямоугольных областей. Они позиционируются на изображении, далее суммируются интенсивности пикселей в областях, после чего вычисляется разница между суммами. Эта разница и будет значением определенного признака (размера), определенным образом позиционированного на изображении.
Общим для всех изображений лиц является то, что область в районе глаз темнее, чем область в районе щек. Следовательно, общим признаком Хаара для лиц является 2 смежных прямоугольных региона, лежащих на глазах и щеках.
Источник: Adam Harvey/ vimeo.com
Само распознавание лица в OpenCV работает очень быстро — доли секунды. Эта модель довольно сложная и долгая в обучении, но с опыта скажем, что работает она гораздо быстрее, чем нейронные сети с использованием TensorFlow. И тут для качественной работы даже не нужен графический процессор. Что еще мы будем использовать в системах распознавания?
Еще одна опенсорсная библиотека, построена на C++ библиотеке dlib. Отличается высокой точностью, очень удобна в использовании, ее легко развернуть на сервере даже без дорогостоящего GPU и у нее довольно простые требования. Что умеет делать Face Recognition Library?
1. Поиск лиц на фото.
На вход мы подаем изображение и определяем лица плюс-минус как и в OpenCV, единственное, что в этой библиотеке выше порог — допускается поворот головы больше, чем на 30 градусов.
Источник: pypi.org
2. Поиск черт лица на фотографиях.
Распознавание фото с получением контуров и важных для идентификации черт лица (глаза, нос, рот, подбородок).
Источник: pypi.org
3. Карты координат специфических лицевых точек.
Контур глаза составляется по 6 точкам, всего карта лица содержит 68 точек, которые позволяют с большой точностью сравнивать и идентифицировать лица.
Источник: researchgate.net
4. Идентификация лиц на фотографиях.
Получение данных о том, кто изображен на каждом фото. Можем создать базу “своих” лиц (сотрудников, клиентов), узнавать их и определять “чужих” по соотношению координат лицевых точек.
Источник: pypi.org
5. Применение в realtime-решениях.
Можем это распознавание применять в работе с потоковым видео, использовать с другими библиотеками Python.
Источник: pypi.org
Это одноплатный компьютер, достаточно мощный как для своего миниатюрного размера. В нашем кейсе мы использовали версию на 4GB оперативки. Что есть: Ethernet-порт, USB 3, USB 2, Micro HDMI-порты с поддержкой двух 4К-дисплеев, питание через USB-C. Достаточно компактная вещь с низким энергопотреблением и высокой производительностью.
Источник: raspberrypi.org
Для распознавания лиц на Raspberry Pi устанавливаем пакеты OpenCV, face_recognition и imutils, чтобы обучать платформу на основе изображений, используемых в качестве датасета. Также мы можем подключить камеру и работать с потоковым видео в реальном времени.
Для начала необходимо подготовить датасет — базу изображений, с которой мы будем работать. Под каждого человека в базе создается отдельная папка с фото. После того как подготовили картинки, запускаем скрипт, который позволяет пробежаться по всем изображениям и сформировать базу распознанных лиц. На выходе мы получаем карты координат лицевых точек по каждому изображению (для одного человека карт может быть несколько — по одной на каждое фото). Чем больше будет фото одного и того человека в разных ракурсах, тем точнее система научится его распознавать под разными углами, например, на видео.
Что происходит дальше? На вход поступает изображение с веб-камеры. В первую очередь срабатывает OpenCV, который определяет, есть ли на картинке лицо (лица). Если лица найдены, мы получаем их координаты и условно вырезаем из общего кадра только эту часть, передаем ее на распознавание и сравниваем с базой — ищем совпадение. В итоге в кадре появляется прямоугольник с именем персоны, либо надпись “unknown person” и так далее.
Где это можно применить на практике? Например, для учета рабочего времени сотрудников офиса (кто во сколько пришел и ушел), контроля посетителей (свои или чужие) — вариантов может быть множество.
В такой конфигурации скорость обработки видео составляет примерно 2 кадра в секунду. Чем больше лиц будет найдено на изображении, тем больше вычислений будет по каждому кадру (напомним, лицевая карта содержит 68 точек), и ниже производительность системы.
Ответ — да. Проблему скорости вычислений на Raspberry Pi 4 можно решить с помощью дополнительного устройства, например, USB-акселератора Google Coral. Это, по сути, TPU-процессор, и “бегает” он даже гораздо быстрее, чем отдельное GPU-решение. На официальном сайте к нему есть ряд обученных моделей, заточенных под использование Coral-оборудования. Можно использовать также обычные модели TensorFlow, переведенные в TensorFlow Lite, при том TensorFlow Lite мы можем компилировать под Coral.
У нас есть решения на базе Raspberry Pi и Coral Accelerator, которые позволяют добавить производительности одноплатнику Raspberry Pi 4. С помощью такого акселератора вполне реально обрабатывать в реальном времени не 2 кадры в секунду, а тех же 25 fps. Можно экспериментировать с наборами библиотек для распознавания лиц и других объектов, и даже на таком, казалось бы, непритязательном железе строить реально работающие системы для учета сотрудников, подсчета посетителей в торговых центрах, отслеживания движущихся объектов, собирать аналитику.
Надеемся, что нам удалось вас заинтересовать, и будьте уверены: в копилке команды Evergreen есть много других нестандартных решений. Вдохновились идеей проекта и готовы обсудить его с нами? Обращайтесь — позаботимся о его реализации.