Автор: Сергій Рибалко, 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
Зображення, використані в статті, були взяті з відкритих джерел і використовуються як ілюстрації.