Використання OpenCV і Face Recognition в системах розпізнавання облич на одноплатних комп’ютерах типу Raspberry Pi
#Нейронні мережі #Розпізнавання образів #Галузеві рішення #Розробка
#Нейронні мережі #Розпізнавання образів #Галузеві рішення #Розробка
OpenCV — opensource-бібліотека комп'ютерного зору, обробки зображень і чисельних алгоритмів з досить широким функціоналом. Ми активно використовували її в наших продуктах, наприклад, системі OCR Solutions — сервісі розпізнавання техпаспортів, закордонних паспортів та інших документів. Загалом, OpenCV — невід’ємна частина нашого стеку в частині розробки штучного інтелекту і систем комп'ютерного зору. Реалізована бібліотека на C/C++, є підтримка Python, Java, Ruby, Matlab, Lua та інших мов.
Коротко про можливості OpenCV
1. Кадрування .
Одна з базових можливостей, яку ми часто використовуємо. OpenCV — досить простий і зрозумілий API: якщо хочемо вирізати частину вихідної картинки — вказуємо координати, кадруємо і продовжуємо роботу.
2. Зміна розміру .
Зменшуємо картинки до оптимального розміру. Це потрібно для тих же згорткових нейронних мереж , щоб зменшити навантаження на систему, і в цілому для зручності під час роботи.
3. Поворот зображення.
Можливість повертати вихідне зображення в будь-якому положенні, віддзеркалювати і тому подібне.
4. Переведення кольорового зображення в чорно-біле/градації сірого .
Є декілька поширених алгоритмів, коли нам потрібно виділити якісь важливі деталі зображення, тонко налаштовуючи поріг спрацьовування. Такий підхід в роботі ми використовуємо досить часто .
5. Розмиття/ згладжування .
Очевидно, що ця функція потрібна для того, щоб заблюрити початково чітку картинку. Але з розмитої картинки зробити чітку дана функція не може — для цього існують інші алгоритми .
6. Малювання прямокутників і ліній .
Прямокутниками ми позначаємо межі об'єктів при розмітці датасета для систем розпізнавання, підписуємо лейбли, щоб наочно показати, які об'єкти знаходяться на зображенні, де саме і в якій кількості. До речі, на цю тему у нас є детальні статті тут і тут . Можна малювати найрізноманітніші геометричні фігури — не лише квадрати — а також зафарбовувати їх, змінювати товщину і колір ліній.
Визначення облич на фото
Для пошуку облич використовується принцип “ковзного вікна” (метод Віоли — Джонса). Для кожної області зображення, над якою проходить вікно, розраховується ознака Хаара. Наявність або відсутність об'єкта у вікні визначається різницею між значенням ознаки і порогом навчання. Вікно ніби ковзає по всьому зображенню. Після кожного проходження зображення воно збільшується, щоб знайти обличчя більшого масштабу.
Ознака Хаара складається з суміжних прямокутних областей. Вони позиціонуються на зображенні, далі сумуються інтенсивності пікселів в областях, після чого обчислюється різниця між сумами. Ця різниця і буде значенням певної ознаки (розміру), певним чином позиціонованого на зображенні.
Загальним для всіх зображень облич є те, що область в ділянці очей темніша, ніж область в ділянці щік. Отже, загальною ознакою Хаара для облич є 2 суміжні прямокутні регіони, що лежать на очах і щоках.
Саме розпізнавання обличчя в OpenCV працює дуже швидко — частки секунди. Ця модель досить складна і довга в навчанні, але з досвіду скажемо, що працює вона набагато швидше, ніж нейронні мережі з використанням TensorFlow. І тут для якісної роботи навіть не потрібен графічний процесор. Що ще ми будемо використовувати в системах розпізнавання ?
Face Recognition Library
Ще одна опенсорс-бібліотека, заснована на C++ бібліотеці dlib . Відрізняється високою точністю, дуже зручна у використанні, її легко розгорнути на сервері навіть без дорогого GPU і у неї досить прості вимоги. Що вміє робити Face Recognition Library ?
1. Пошук облич на фото .
На вхід ми подаємо зображення і визначаємо обличчя плюс-мінус як і в OpenCV, єдине, що в цій бібліотеці вище поріг - допускається поворот голови більше, ніж на 30 градусів .
2. Пошук рис обличчя на фотографіях .
Розпізнавання фото з отриманням контурів і важливих для ідентифікації рис обличчя (очі, ніс, рот, підборіддя) .
3. Карти координат специфічних лицьових точок .
Контур ока будується по 6 точках, всього карта обличчя містить 68 точок, які дозволяють з великою точністю порівнювати і ідентифікувати лиця .
4. Ідентифікація осіб на фотографіях .
Отримання даних про те, хто зображений на кожному фото. Можемо створити базу "своїх" людей (співробітників, клієнтів), впізнавати їх і визначати "чужих" за співвідношенням координат лицьових точок .
5. Застосування в realtime-рішеннях .
Можемо це розпізнавання застосовувати в роботі з потоковим відео, використовувати з іншими бібліотеками Python.
Що являє собою Raspberry Pi 4 ?
Це одноплатний комп'ютер, досить потужний як для свого мініатюрного розміру. У нашому кейсі ми використовували версію на 4GB оперативки. Що є: Ethernet-порт, USB 3, USB 2, Micro HDMI-порти з підтримкою двох 4К-дисплеїв, живлення через USB-C. Досить компактна штука з низьким енергоспоживанням і високою продуктивністю .
Для розпізнавання облич на 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 є багато інших нестандартних рішень. Надихнулися ідеєю проєкту і готові обговорити його з нами? Звертайтеся — подбаємо про його реалізацію.
× Відкрити демо