Mastering OpenCV with Practical Computer Vision Projects / Опановуюємо OpenCV через практичні проекти комп'ютерного зору: Розділ 6. Нецілісне відслідковування обличчя
| Английский оригинал | Перевод на украинский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Кожна фаза складається з п'ятидесяти змін значень. Потім траєкторія використовується для анімації моделі обличчя та малювання результатів на вікні: Atronax 11.03.21 в 14:49 |
|
|
Mat img(300,300,CV_8UC3); namedWindow("модель форми"); Atronax 11.03.21 в 14:50 |
||
|
Примітка Atronax 11.03.21 в 14:53 |
||
|
Детектори особливих точок обличчя Atronax 11.03.21 в 14:53 |
||
|
Розпізнавання обличчя не надто відрізняється від розпізнавання будь-яких інших об'єктів. Бібліотека OpenCV пропонує набір загальних функцій для побудови детекторів довільних особливих точок, серед яких найвідоміші каскадні алгоритми Хаара. До реалізацій останніх і відносять добре відомий детектор облич Віоли-Джонса. Разом з тим, існують певні фактори, які роблять процедуру розпізнавання обличчя унікальною. Серед них важливі такі: Atronax 12.03.21 в 07:43 |
||
|
Точність проти ефективності. Алгоритми розпізнавання загальних об'єктів призначені для пошуку грубого положення об'єкта на зображенні; детектори особливих точок обличчя потребують більш точної оцінки положення. Похибка в декілька пікселів вважається не вартою уваги при розпізнаванні об'єкта, але може вказувати на різницю між усмішкою і сумним виразом обличчя, які відслідковує детектор. Atronax 12.03.21 в 07:55 |
||
|
Невизначеність в результаті обмеженої просторової підтримки. Прийнято вважати, що зоні інтересу на зображенні відповідає така структура, яку легко виокремити від інших фрагментів, що не містять потрібного об'єкта. Для особливих точок обличчя не завжди виконується, у подібних випадках зазвичай маємо обмежену просторову підтримку. Фрагменти без потрібних особливих точок часто мають структуру, схожу на елементи обличчя. Наприклад елемент з боку обличчя, що знаходиться в середині відповідного обмежувального куба, можна легко переплутати з іншою частиною зображення, через центр якої проходить чітка межа. Atronax 12.03.21 в 08:50 |
||
|
Обчислювальна складність. Метою загального розпізнавання об'єктів є пошук усіх його екземплярів на зображенні. З іншого боку, алгоритму відслідковування обличчя необхідні позиції особливих точок обличчя, яких може бути від 20 до 100. Тому підвищення ефективності детектора є найважливішою задачею у побудові відслідковувача, що діє в режимі реального часу. Atronax 12.03.21 в 08:56 |
||
|
Через подібні відмінності детектори особливих точок обличчя, що використовуються для відслідковання, мають специфічні особливості і враховують мету застосунку. Звісно, багато технік загального розпізнавання об'єктів використовуються й для детекторів обличчя. Але в спільноті досі немає єдиної думки про те, який підхід краще вирішує проблему. Atronax 12.03.21 в 09:00 |
||
|
У цій частині детектори особливих точок обличчя будуватимемо на основі найпростішої моделі - лінійного фрагмента зображення. Не зважаючи на простоту, детальна розробка процедури навчання дозволить створити модель, здатну формувати прийнятні значення положення особливих точок для використання алгоритму відслідковування обличчя. Більше того, простота процедури забезпечує дуже швидкі обчислення, завдяки чому її можна виконати в режимі реального часу. Через представлення облич у вигляді фрагментів детектори відповідних особливих точок називають моделями фрагментів. Така модель реалізована у класі patch_model, що зберігається у файлах patch_model.hpp та patch_model.cpp. Далі показано код заголовоку класу patch_model, що описує його головну функціональність. Atronax 12.03.21 в 09:15 |
||
|
class patch_model{ Atronax 12.03.21 в 09:20 |
||
|
Модель фрагмента, що використовується для пошуку характеристик обличчя, зберігається у матриці P. Нас цікавлять дві функції класу: calc_responce та train. Функція calc_responce обчислює результат зміщення числових значень моделі фрагменту у регіоні пошуку im. Функція learn навчає модель фрагменту P розмірності psize, яка надає карти результатів для тренувальних наборів, розміщені якомога ближче до ідеальної карти. Параметри var, lambda, mu_init та nsamples - це параметри процедури, які можна налаштувати для оптимізації обробки даних. Функціональність класу пояснимо далі в цій частині. Atronax 22.03.21 в 12:15 |
||
|
Почнемо з обговорення кореляції фрагмента та його тренувальної процедури, яка використовується для навчання моделі. Далі опишемо класс patch_models, у якому зберігаються моделі для кожної характеристики обличчя та функції для глобальних перетворень. Програми train_patch_model.cpp та visualize_patch_mode.cpp відповідно тренують та візуалізують моделі фрагментів, а їх використання пояснимо детальніше в кінці розділу. Atronax 22.03.21 в 12:15 |
||
|
Засновані на кореляції моделі фрагментів Atronax 22.03.21 в 12:16 |
||
|
В детекторах, що навчаються, існують дві головні конкуруючі парадигми: генеративна та дискримінативна. Генеративні методи навчають представлення фрагментів зображень і здатні генерувати найкращий вигляд об'єкта у всіх його проявах. Дискримінативні, з іншого боку, формують представлення, що найефективніше відокремлюють його екземпляри від інших об'єктів, які можуть трапитися в процесі обробки. Генеративні методи кодують специфічні для об'єкта властивості, що надає змогу візуально перевірити наявні екземпляри. До популярних підходів, заснованих на цій парадигмі, відносять також відомий метод власних векторів Eigenfaces. Atronax 22.03.21 в 12:16 |
||
|
Дискримінативні методи використовують усі дані моделі для вирішення проблеми, дозволяючи відрізняти екземпляри одних об'єктів від інших. Найбільш відомим з них є метод опорних векторів. Хоча обидві парадигми діють добре в різних ситуаціях, якщо моделювати характеристики обличчя у вигляді фрагмента зображення, дискримінативна формують набагато кращі результати. Atronax 22.03.21 в 12:16 |
||
|
Примітка Atronax 22.03.21 в 12:16 |
||
|
Методи власних та опорних векторів розроблені для класифікації, а не розпізнавання чи вирівнювання зображень. Але їх математичні концепції можна використати й для відслідковування облич. Atronax 22.03.21 в 12:16 |
||
|
Навчаємо дискримінативні моделі фрагментів Atronax 22.03.21 в 12:17 |
||
|
Модель фрагмента, що є рішенням цього рівняння, генерує карти відповідей, які в середньому наближаються до ідеальної на основі методу найменших квадратів. Очевидним вибором ідеальної карти R є матриця, усі елементи якої, крім середнього, дорівнюють нулю (якщо припустити, що в центрі фрагментів тренувальних зображень розміщені характеристики). На практиці, оскільки зображення анотовані вручну, завжди існуватимуть похибки. Щоб їх врахувати, краще описати R як функцію гниття, що залежить від відстані до центра. Непоганим вибором є двовимірний розподіл Гауса, у такому разі припускаємо, що похибки анотування відповідно розподілені. Візуалізація цих налаштувань показана далі, на зовнішньому куті лівого ока: Atronax 22.03.21 в 12:17 |
||
|
Як зазначено раніше, мета навчання вказана у формі, яку зазвичай називають методом найменших лінійних квадратів. Це дає змогу знайти рішення в закритій формі. Але варто зауважити, що ступінь свободи проблеми, тобто кількість варіантів змінних, які застосовуються для вирішення проблеми, дорівнює кількості пікселів відповідного фрагмента. Тому вартість обрахунків та вимоги до пам'яті для пошуку оптимальної моделі фрагмента можуть бути значними навіть для невеликих примірників. Наприклад, модель фрагмента з розмірами 40х40 має 1600 ступенів свободи. Atronax 22.03.21 в 12:17 |
||
|
Ефективною альтернативною вирішенню проблеми навчання є лінійна система рівнянь, яку ще називають методом стохастичного градієнтного спуску. Візуалізуючи мету навчання у вигляді похибки в залежності від ступенів свободи моделі фрагмента, цей процес поступово апроксимує градієнтний напрям та здійснює невеликий крок у протилежному до нього. У випадку нашої проблеми наближання градієнта можна вирахувати на основі одного, випадково обраного зображення з тренувального набору: Atronax 22.03.21 в 12:18 |
||
|
У класі patch_model процес навчання реалізований функцією train: Atronax 22.03.21 в 12:18 |
||
|
void Atronax 22.03.21 в 12:20 |
||
|
normalize(F,F,0,1,NORM_MINMAX); // нормуємо в діапазон [0:1] Atronax 22.03.21 в 12:23 |
||
|
Перший виділений фрагмент коду у лістингу описує процес обчислення ідеальної карти відповідей. Оскільки зображення містять у центрі характеристики обличчя, карта не змінюється для всіх примірників. Другий фрагмент визначає такі значення швидкості гниття та кроку, для яких після nsamples ітерацій значення розміра кроку зменшиться до рівня, близького до нуля. Третій блок коду вказує на обчислення стохастичного градієнтного напрямку та оновлення моделі фрагмента. Тут маємо пояснити дві речі. По-перше, використані зображення передаються функції patch_model::convert_image, яка конвертує їх в одноканальні екземпляри (якщо вони кольорові) та застосовує натуральний логарифм до інтенсивності пікселів: Atronax 22.03.21 в 12:23 |
||
|
Значення зсуву, рівне одиниці, додається до кожного пікселя до виклику функції логарифма, оскільки для нуля він невизначений. Виконання попередньої обробки тренувальних зображень необхідне тому, що масштабовані більш стійкі до змін контрасту та умов освітлення. Наступний малюнок зображає два обличчя з різними ступенями контрасту. Різниця між зображеннями, масштабованими з використанням логарифма, менш помітна, ніж для необроблених примірників. Atronax 22.03.21 в 12:24 |
||
|
Рівняння оновлення має ще одну цікаву особливість - віднімання значення lambda*P від напряму. Ця процедура, яка часто застосовується в алгоритмах машинного навчання для забезпечення одноманітності нових даних, дозволяє обмежити рішення. Множник масштабування lambda визначений користувачем і залежить від проблеми. Але невеликі значення типово працюють краще для навчання моделей фрагментів, що використовуються для розпізнавання характеристик обличчя. Atronax 22.03.21 в 12:24 |
||
|
Генеративні та дискримінативні моделі фрагментів Atronax 22.03.21 в 12:24 |
||
|
Не зважаючи на простоту навчання дискримінативних моделей фрагментів, описаних раніше, спочатку варто перевірити, чи не легше отримати ті ж значення за допомогою генеративної парадигми та відповідного тренування. Генеративною противагою моделі кореляції виступає середній фрагмент. Метою навчання у такому разі є побудова єдиного фрагмента зображення, розміщеного максимально близько до всіх можливих примірників характеристик обличчя згідно критерію найменших квадратів: Atronax 22.03.21 в 12:24 |
||
|
Наступна ілюстрація порівнює карти відповідей, що отримані крос-кореляцією середнього та кореляційними моделями фрагмента на основі тренувального зображення. Також показані відповідні середнє та моделі фрагментів, діапазон значень пікселів на яких нормовано для цілей візуалізації. Хоча обидва типи моделей дещо схожі, генеровані ними карти відповідей суттєво відрізняються. Коли їх генерують кореляційні моделі фрагментів, відповіді займають пікові положення навколо характеристики. Карта відповідей, згенерована середньою моделлю, занадто гладка й не здатна чітко відрізнити положення особливої точки від тих, що розміщені поряд. Atronax 22.03.21 в 12:24 |
||
|
Дослідивши вигляд моделей фрагментів, здобудемо цікаві особливості. Кореляційна практично повністю сіра, що відповідає нулю в ненормованому діапазоні пікселів, з високими додатніми та від'ємними значеннями, що стратегічно розміщені навколо важливих зон характеристики обличчя. Тобто зберігаються лише компоненти тренувальних фрагментів, корисні для відмежування від невирівнених конфігурацій, що призводить до пікових значень відповідей. На противагу, середня модель не кодує відомості про невирівнені дані. У результаті вона не підходить для задачі локалізації характеристики обличчя, яка має відрізняти вирівнений фрагмент зображення від його локально зміщених варіантів. Atronax 22.03.21 в 12:24 |
||
|
Враховуємо глобальні геометричні перетворення Atronax 22.03.21 в 12:25 |
||
|
Досі ми припускали, що тренувальні зображення нормовані та відцентровані на характеристиці обличчя з врахуванням глобальних значень масштабування та повороту. На практиці в процесі відслідковування зображення обличчя ці параметри можуть набувати будь-яких значень. Тому механізм має врахувати відмінності між тренувальними та тестовими умовами. Один з підходів вимагає штучної зміни масштабів та повороту тренувальних примірників у межах, які вимагаються від готової програми. Але така спрощена форма детектора часто не дозволяє кореляційній моделі фрагмента сформувати корисні карти відповідей для подібних даних. Atronax 22.03.21 в 12:25 |
||
|
З іншого боку, кореляційна модель не дуже стійка до малих коливань масштабу та повороту. Оскільки рух між послідовними кадрами відеоряду порівняно невеликий, можна скористатися знайденими глобальними перетвореннями для попереднього кадра, щоб нормувати поточне зображення відповідно до масштабу та повороту. Все, що вимагається для процедури, - обрати кадр з навченими кореляційними моделями. Atronax 22.03.21 в 12:25 |
||
|
Клас patch_models зберігає кореляційні моделі фрагментів для кожної характеристики обличчя, а також кадр, використаний для тренування. Саме до класу patch_models, а не patch_model, напряму звертається код відслідковування для того, аби знайти характеристики. Наступний фрагмент коду - це оголошення класу та його основна функціональність: Atronax 22.03.21 в 12:25 |
||
|
class patch_models{ Atronax 22.03.21 в 12:28 |
||
|
Форма примірника зберігається у *interleaved* наборі координат (x,y), які використовуються для нормування значень масштабу та повороту тренувальних зображень та пізніше, у процесі обробки тестових зображень. Функція patch_models::train спершу знаходить перетворення подібності між примірником та анотованою формою заданого фрагмента за допомогою patch_models::calc_simil, яке шукає рішення тієї ж проблеми, що й shape_model::procructes, але лише для однієї пари вхідних даних. Оскільки поворот та масштабування не змінюється для усіх характеристик обличчя, процедура нормування зображення має лише відрегулювати перетворення подібності з урахуванням центрів кожної особливої точки на зображенні та центру нормованого фрагмента. У функції patch_models::train це реалізовано таким чином: Atronax 22.03.21 в 12:29 |
||
|
Mat S = this->calc_simil(pt),A(2,3,CV_32F); Atronax 22.03.21 в 12:29 |
||
|
Змінна wsize - це загальний розмір нормованих тренувальних зображень, тобто сума розмірів фрагмента та зони пошуку. Раніше ми вже зазначали, що ліва верхня частина (2х2) перетворень подібності між формами примірника та анотованою pt, яка позначає компоненти масштабу та повороту, зберігається в афінній матриці, яка передається функції warpAffine бібліотеки OpenCV. Остання колонка афінних перетворень A - це налаштування, яке дозволить відобразити положення i-тої характеристики обличчя в центрі нормованого зображення після викривлення (тобто нормоване переміщення). Atronax 22.03.21 в 12:29 |
||
|
Нарешті, функція cv::warpAffine має налаштування викривлення між зображенням та примірником за замовчуванням. Оскільки перетворення подібності обраховані для перетворення форми примірника у простір анотацій pt, маємо встановити відмітку WARP_INVERSE_MAP для того, щоб функція виконала викривлення у бажаному напрямі. Така ж процедура здійснюється у функції patch_models::calc_peaks, але у цьому разі існує й додатковий крок - знайдене перетворення подібності між примірником та поточною формою на кадрі використовується для рознормування знайдених характеристик обличчя з метою їх коректного розміщення на зображенні: Atronax 22.03.21 в 12:29 |
||
|
vector<Point2f> Atronax 22.03.21 в 12:30 |
||
|
У першій виділеній частині коду обчислюються прямі та зворотні перетворення подібності. Зворотні потрібні для того, аби мати можливість відрегулювати пікові значення карти відповідей для кожної характеристики, врахувавши нормовані положення поточної форми. Це треба зробити до повторного застосування перетворень подібності для переміщення нових положень характеристик на зображення за допомогою функції patch_models::apply_simil. Atronax 22.03.21 в 12:30 |
||
|
Тренування та візуалізація Atronax 22.03.21 в 12:30 |
||
|
Приклад програми для тренування моделей фрагмента на основі анотованих даних знаходиться у файлі train_patch_model.cpp. Якщо в аргументі командної стрічки argv[1] вкажемо шлях до анотованих даних, тренування почнеться із завантаження даних у пам'ять та видалення неповних примірників: Atronax 22.03.21 в 12:30 |
||
|
Найпростішим варіантом форми примірника для класі patch_models є середня, масштабована до бажаних розмірів. Припустимо, що модель заздалегідь натреновано для цього набору даних, у такому разі на першому кроці обчислення форми примірника завантажимо дані, що зберігаються в аргументі argv[2]: Atronax 22.03.21 в 12:30 |
||
|
Функція calc_scale знаходить множник масштабування для перетворення середньої форми (тобто першої колонки shape_model::V) у квадратну з розмірами width x width. Як тільки визначимо форму примірника r, тренування набору моделей фрагментів можна здійснити єдиним викликом функції: Atronax 22.03.21 в 12:30 |
||
|
Оптимальний вибір параметрів width, psize та ssize залежить від застосунку; але відповідні значення за замовчуванням (100, 11 та 11) у загальних випадках дають прийнятні результати. Atronax 22.03.21 в 12:30 |
||
|
Хоча процес тренування доволі простий, йому може знадобитися певний час. Залежно від кількості характеристик обличчя, розміру фрагментів та кількості стохастичних примірників в алгоритмі оптимізації, процес тренування може зайняти від декількох хвилин до понад години. Але оскільки тренування кожного фрагмента можна здійснити незалежно від інших, процес можна значно прискорити за рахунок багатопотокового рішення, що виконується на декількох процесорних ядрах чи навіть машинах. Atronax 22.03.21 в 12:31 |
||
|
Коли завершиться тренування, застосунок visualize_patch_model.cpp можна використати для візуалізації отриманих моделей форм. Як і в випадку застосунку visualize_shape_model.cpp, ціллю у цьому разі є візуальна перевірка результатів на коректність. Програма генерує складене зображення усіх моделей форм, patch_model::P, кожне розміщене в центрі відповідного положення характеристики на формі примірника, patch_models::reference, та зображає обмежувальний прямокутник фрагмента з активним індексом. Atronax 22.03.21 в 12:31 |
