Використання 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 є багато інших нестандартних рішень. Надихнулися ідеєю проєкту і готові обговорити його з нами? Звертайтеся — подбаємо про його реалізацію.