Mastering OpenCV with Practical Computer Vision Projects / Опановуюємо OpenCV через практичні проекти комп'ютерного зору: Розділ 8. Розпізнавання обличчя за методами Eigenfaces та Fisherfaces
| Английский оригинал | Перевод на украинский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Ми входимо в режим збирання даних, коли користувач натискає кнопку "Додати особу", щоб просигналізувати бажання почати збирання облич для нової людини. Як зазначено раніше, ми обмежили кількість знімків до одного в секунду, причому їхній вигляд має суттєво відрізнятися від попереднього. І пам'ятайте, ми бажаємо збирати не лише попередньо оброблені обличчя, а також їх віддзеркалення. Atronax 22.03.21 в 15:38 |
|
|
У режимі збирання даних ми також бажаємо показати останнє обличчя кожної відомої особи та дозволити користувачу натискати на одну з наявних осіб чи доєднати більше примірників облич або взагалі натиснути кнопку "Додати людину" і розширити колекцію зображенням нової особи. Користувач має здійснити клік в межах вікна, щоб перейти в наступний режим, тренування. Atronax 22.03.21 в 15:38 |
||
|
Спершу маємо зберегти посилання на останнє зібране обличчя для кожної особи. Це здійснюємо шляхом оновлення масиву цілих чисел m_latestFaces, який зберігає лише індекси для людини, з великого масиву preprocessedFaces (тобто колекції всіх облич всіх людей). Оскільки ми також зберігаємо віддзеркалене зображення, маємо посилатися на другий з кінця елемент, а не на останній. Тому потрібно додати відповідний код до фрагменту, що додає нове обличчя (та його віддзеркалений варіант) до масиву preprocessedFaces таким чином: Atronax 22.03.21 в 15:39 |
||
|
Збережемо посилання на останнє обличчя кожної людини. Atronax 22.03.21 в 15:39 |
||
|
m_gui_faces_left = displayedFrame.cols - BORDER - faceWidth; Atronax 22.03.21 в 15:39 |
||
|
Ми також бажаємо виділити поточну особу, для якої збираємо фотографії, за допомгою товстої червоної границі навколо обличчя. Atronax 22.03.21 в 15:40 |
||
|
Наступний частковий скріншот показує типовий результат виводу, коли зібрані обличчя для декількох людей. Користувач може натиснути на будь-яку з осіб у верхній правій частині, щоб зібрати більше даних для неї. Atronax 22.03.21 в 15:40 |
||
|
Режим тренування Atronax 22.03.21 в 15:40 |
||
|
Коли користувач нарешті натискає кнопку миші у вікні, алгоритм розпізнавання здійснить процедуру тренування на основі зібраних облич. При цьому варто впевнитися, що зібрано достатню кількість даних, інакше програма матиме збій у роботі. В загальному випадку, потрібне як мінімум одне обличчя в тренувальному наборі (наяна принаймні одна особа). Але алгоритм Fisherfaces, наприклад, порівнює між собою декількох людей, без відповідних даних збоєм завершиться й він. Тому ми мусимо перевірити, чи обрано цей метод для розпізнавання облич. Якщо це так, потрібні зображення як мінімум двох людей з обличчями, інакше лише однієї. За недостатності даних програма повернеться у режим збирання, щоб користувач міг додати більше облич для тренування. Atronax 22.03.21 в 15:40 |
||
|
Щоб перевірити наявність як мінімум двох людей із зібраними обличчями, коли користувач натискає на кнопку "Додати особу", новий об'єкт додається лише тоді, коли немає іншого незаповненого (тобто особу додано, але зібраних облич для неї немає). Ми також можемо впевнитися, що якщо наявні лише дві людини і ми використовуємо алгоритм Fisherfaces, потрібно встановити посилання m_latestFaces на останню людину в режимі збирання даних. m_latestFaces[i] отримує значення -1, якщо зображень облич для неї ще не маємо, та 0 чи вище, якщо обличчя для цієї людини додано. Це робиться таким чином: Atronax 22.03.21 в 15:40 |
||
|
// Перевіряємо, чи достатньо даних для тренування. Atronax 22.03.21 в 15:41 |
||
|
Тренування може зайняти долі секунди, декілька секунд чи навіть хвилин, залежно від кількості зібраних даних. Коли процедура завершиться, система автоматично увійде в режим розпізнавання. Atronax 22.03.21 в 15:41 |
||
|
Режим розпізнавання Atronax 22.03.21 в 15:41 |
||
|
У цьому режимі поряд з попередьно обробленим обличчя показана метрика впевненості, аби користувач міг упевнитися, наскільки надійним є розпізнавання. Якщо значення більше за певний поріг, навколо людини намалюється зелений прямокутник. Користувач може доєднати нові обличчя для подальшого тренування, натиснувши кнопку "Додати особу" або обравши одну з наявних, що змусить програму повернутися на етап збирання даних. Atronax 22.03.21 в 15:42 |
||
|
Ми вже здобули розпізнані показники ідентичності та схожості з відновленим обличчям як зазначено раніше. Щоб вивести метрику впевненості на екрані, значення схожості вкажемо в межах від 0 до 0.5 для високого рівня та від 0.5 до 1.0 - для низького, у такому разі зможемо відняти її від одиниці, щоб отримати відповідне значення впевненості від 0.0 до 1.0. Потім просто намалюємо заповнений прямокутник на основі отриманого відношення: Atronax 22.03.21 в 15:42 |
||
|
int cx = (displayedFrame.cols - faceWidth) / 2; Atronax 22.03.21 в 15:43 |
||
|
// Зобразимо яскраво-блакитний прямокутник впевненості. Atronax 22.03.21 в 15:43 |
||
|
Далі проілюстровано типові результати виводу у режимі розпізнавання, що показують значення впевненості поряд з попередньо обробленим обличчям у верхній центральній частині та виділяє розпізнану людину у верхньому правому куті. Atronax 22.03.21 в 15:43 |
||
|
Перевірка та обробка натискання кнопок миші Atronax 22.03.21 в 15:44 |
||
|
Маючи всі потрібні елементи графічного інтерфейсу, перейдемо до обробки подій миші. Налаштувавши вікно, ми повідомили бібліотеці OpenCV про функцію зворотнього виклику onMouse(). Нас не хвилює рух миші, лише кліки, тому пропустимо події, які не стосуються лівої кнопки миші: Atronax 22.03.21 в 15:44 |
||
|
void onMouse(int event, int x, int y, int, void*) Atronax 22.03.21 в 15:44 |
||
|
Оскільки ми вже маємо прямокутні межі кнопок, потрібно лише перевірити, чи знаходиться позиція курсора у будь-якому відповідному регіоні за допомогою функції inside() бібліотеки OpenCV. Процедуру можна здійснити для усіх створених кнопок. Atronax 22.03.21 в 15:44 |
||
|
Коли користувач натискає кнопку "Додати особу", ми додаємо одиницю до змінної m_numPersons, виділяємо простір у змінній m_latestFaces, обираємо нову людину для процедури та переходимо в режим збирання даних (не важливо, у якому були раніше). Atronax 22.03.21 в 15:44 |
||
|
Але існує одна складність; щоб впевнитися, що ми маємо як мінімум одне обличчя для кожної особи на етапі тренування, виділимо простір для нової лише тоді, коли немає інших осіб без зображень. У такому разі ми матимемо можливість перевірити значення змінної m_latestFaces [m_numPersons-1] та побачити, чи додані обличчя для кожної особи. Здійснимо це так: Atronax 22.03.21 в 15:44 |
||
|
if (pt.inside(m_btnAddPerson)) { Atronax 22.03.21 в 15:44 |
||
|
Цей метод можна використати для тестування інших кнопок, наприклад за допомогою флагу налаштування: Atronax 22.03.21 в 15:45 |
||
|
Щоб виконати обробку кнопки "Видалити все", потрібно звільнити різні структури даних, розміщені локально у головному циклі (недоступному функції зворотнього виклику для подій миші), тому перейдемо в режим видалення, щоб мати таку можливість. Ми також маємо обробити події натискання мишею в межах вікна (не кнопок). Якщо користувач вибере одне з облич праворуч, маємо обрати особу та перейти в режим збирання даних. А якщо він натисне у вікні у цьому режимі, потрібно перейти у стан тренування. Це можна зробити так: Atronax 22.03.21 в 15:45 |
||
|
else { Atronax 22.03.21 в 15:45 |
||
|
Висновки Atronax 22.03.21 в 15:45 |
||
|
У цьому розділі показано всі кроки, потрібні для створення застосунків розпізнавання облич, що діють у режимі реального часу, з достатньою попередньою обробкою, що дозволяє певні відмінності між умовами тренувального та тестувального наборів, за допомогою простих алгоритмів. Для знаходження позиції обличчя на кадрі камери ми скористалися процедурою пошуку, декількома видами попередньої обробки для зменшення ефектів різних умов освітлення, орієнтації камери та обличчя, виразів. Потім натренували системи машинного навчання алгоритмів Eigenfaces та Fisherfaces на основі зібраних даних та здійснили розпізнавання обличчя, аби вказати, ким є особа, на основі процедури верифікації, яка надає метрику впевненості у випадках, якщо та невідома. Atronax 22.03.21 в 15:46 |
||
|
Замість створення інструменту командної стрічки, який обробляє файли зображень в режимі офлайн, ми об'єднали попередні кроки у цілісний графічний інтерфейс, який дозволяє негайно використовувати систему розпізнавання обличчя. Ви повинні мати можливість модифікувати поведінку системи заради власних цілей, наприклад дозволити автоматичний вхід до комп'ютера, або підвищити надійність розпізнавання на основі нещодавніх досліджень, щоб потенційно покращити кожен крок програми, поки вона не підходитиме специфічним потребам. Наприклад, можна вдосконалити попередню обробку облич, або застосувати кращий алгоритм машинного навчання чи верифікації обличчя за методами, що описані на ресурсах http://www.face-rec.org/algorithms/ та http://www.cvpapers.com Atronax 22.03.21 в 15:46 |
||
|
Посилання Atronax 22.03.21 в 15:46 |
||
|
Rapid Object Detection using a Boosted Cascade of Simple Features, P. Viola and M.J. Jones, Atronax 22.03.21 в 15:46 |
||
|
Eigenfaces for recognition, M. Turk and A. Pentland, Journal of Cognitive Neuroscience 3, pp. Atronax 22.03.21 в 15:46 |
