Автор: Сергей Рыбалко, TechLead

Материалы статьи подготовлены в рамках внутренней программы менторства и обучения специалистов команды Evergreen.

OpenCV — opensource-библиотека для компьютерного зрения, обработки изображений и численных алгоритмов с довольно широким функционалом. Мы активно использовали ее в наших продуктах, например, системе OCR Solutions — сервисе распознавания техпаспортов, загранпаспортов и других документов. В целом, OpenCV — неотъемлемая часть нашего стека в части разработки искусственного интеллекта и систем компьютерного зрения. Реализована библиотека на C/C++, есть поддержка Python, Java, Ruby, Matlab, Lua и других языков.

Коротко о возможностях OpenCV

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 смежных прямоугольных региона, лежащих на глазах и щеках. 

распознавание лица OpenCV

Источник: Adam Harvey/ vimeo.com

Само распознавание лица в OpenCV работает очень быстро — доли секунды. Эта модель довольно сложная и долгая в обучении, но с опыта скажем, что работает она гораздо быстрее, чем нейронные сети с использованием TensorFlow. И тут для качественной работы даже не нужен графический процессор. Что еще мы будем использовать в системах распознавания?

Face Recognition Library

Еще одна опенсорсная библиотека, построена на 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

Что из себя представляет Raspberry Pi 4?

Это одноплатный компьютер, достаточно мощный как для своего миниатюрного размера. В нашем кейсе мы использовали версию на 4GB оперативки. Что есть: Ethernet-порт, USB 3, USB 2, Micro HDMI-порты с поддержкой двух 4К-дисплеев, питание через USB-C. Достаточно компактная вещь с низким энергопотреблением и высокой производительностью.

 Raspberry Pi 4

Источник: 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 есть много других нестандартных решений. Вдохновились идеей проекта и готовы обсудить его с нами? Обращайтесь — позаботимся о его реализации.

25.01.2021
Используемые в статье картинки взяты из открытых источников и используются как иллюстрации.