Mastering OpenCV with Practical Computer Vision Projects / Опановуюємо OpenCV через практичні проекти комп'ютерного зору: Розділ 6. Нецілісне відслідковування обличчя
| Английский оригинал | Перевод на украинский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Використання набору даних MUCT дозволяє швидше перейти до розгляду функціональності коду відслідковування обличчя, що описане далі у цьому розділі. Atronax 10.03.21 в 15:04 |
|
|
Геометричні обмеження Atronax 10.03.21 в 15:04 |
||
|
У відслідковуванні обличчя геометрія вказує на просторову конфігурацію попередньо визначеного набору точок, що відповідають фізично стабільному положенню людського обличчя (наприклад кути ока, кінчик носа та дуги брів). Особливості їх вибору цілком залежать від застосунку, деякі потребують щільний набір з понад 100 точок, а інші - дещо рідші варіанти. Варто зауважити, ефективність алгоритмів відслідковування обличчя зазвичай покращується з підвищенням кількості точок, оскільки окремі виміри можуть допомогти відшукати інші шляхом відносної просторової залежності. Наприклад, знаючи положення кута ока, ми з вищою вірогідністю можемо спрогнозувати, де знаходиться ніс. Atronax 10.03.21 в 15:14 |
||
|
Разом з тим, для кількості точок існують певні межі, після якої їх зростання не підвищує ефективність, зазвичай продуктивність перестає змінюватися приблизно біля ста обраних фрагментів. Більше того, зростання розміру набору для опису обличчя тягне за собою лінійне підвищення складності обчислень. Тому для застосунків із суворими обмеженнями ресурсів краще використати менше точок. До того ж, швидше відслідковування часто призводить до точніших результатів у випадку онлайн налаштувань. Atronax 10.03.21 в 15:22 |
||
|
Чому це відбувається? Коли відкидаються кадри, отриманий рух між кадрами пришвидшується, при цьому алгоритм оптимізації, що має знайти конфігурацію обличчя на кожному зображенні, має відшукати більшу кількість можливих конфігурацій особливих точок; процес може сформувати невірні результати, якщо зміщення між кадрами надто велике. Тому, хоча й існують загальні поради щодо правильного вибору особливих точок обличчя для оптимізації продуктивність, ця процедура залежить від конкретних цілей застосунку. Atronax 10.03.21 в 15:32 |
||
|
Геометрія обличчя часто параметризується композицією двох елементів: глобальної (цілісної) трансформації та локальної (нецілісної) деформації. Перший компонент враховує загальне розміщення обличчя на зображенні, яке може змінюватися без обмежень (тобто, обличчя може з'явитися будь-де на кадрі). До глобальної транформації відносять положення (x, y), поворот та розмір обличчя. Другий, з іншого боку, вказує на різницю між формами облич різних осіб та з різними виразами. На відміну від глобальних змін, локальні часто більш обмежені через структуровану конфігурацію особливих точок обличчя. Глобальні трансформації - це звичайні функції з двовимірними координатами, які можна застосувати до будь-якого типу об'єкта, а дані про локальні деформації залежать від конкретного об'єкта та мають отримуватися на основі тренувального набору даних. Atronax 10.03.21 в 15:42 |
||
|
У цьому розділі опишемо побудову геометричної структури обличчя, тобто моделі форми. Залежно від застосунку, вона може зберігати вирази обличчя однієї особи, різноманітні його форми серед населення чи комбінацію двох елементів. Така модель реалізована у класі shape_model, що визначений у файлі shape_model.hpp та реалізований у shape_model.cpp. Наступний фрагмент коду - це частина заголовку класу shape_model, що описує його базову функціональність: Atronax 10.03.21 в 15:52 |
||
|
class shape_model{ // двовимірна лінійна модель форми Atronax 10.03.21 в 15:55 |
||
|
Модель, що описує варіанти форм обличчя, закодована матрицею підпростору V та вектором дисперсії e. Вектор параметрів p зберігає спосіб кодування форми відповідно до моделі. Матриця спорідненості C також зберігається в цьому класі, оскільки його метою є лише візуалізація екземплярів. Найцікавіші три методи - це calc_params, calc_shape та train. Функція calc_params проєктує набір точок на простір вірогідних форм обличчя. За вибором користувача вона може також вирахувати окремі значення ваги впевненості для кожної точки, що має бути спроєктованою. Друга функція, calc_shape, генерує набір точок шляхом декодування вектору параметрів p на основі моделі обличчя, закодованої в структурах даних V та e. Функція тренування призначена для навчання моделі на основі колекції зображень різних форм обличчя, кожне з яких складається з однакової кількості точок. Параметри frac та kmax - це змінні процедури тренування, які можна визначати залежно від даних. Atronax 10.03.21 в 16:39 |
||
|
З функціональністю даного класу познайомимось далі, почнемо з аналізу Прокруста, методу для глобального реєстрування набору точок та лінійної моделі для представлення локальних деформацій. Код файлів train_shape_model.cpp та visualize_shape_model.cpp призначений для тренування та візуалізації моделей форм відповідно. Як їх використати, дізнаємось в кінці цієї частини. Atronax 10.03.21 в 16:08 |
||
|
Аналіз Прокруста Atronax 10.03.21 в 16:02 |
||
|
Щоб побудувати модель деформації форм обличчя, спершу маємо обробити анотовані дані, щоб видалити компоненти, що відносяться до глобального руху. У випадку моделювання геометрії в двовимірному просторі цей рух часто представлений як перетворення подібності, яке включає масштаб, поворот на площині та перенесення. На наступному малюнку можна побачити можливі типи руху для перетворень подібності. Процес видалення глобальних рухів для колекції точок називають аналізом Прокруста. Atronax 10.03.21 в 16:50 |
||
|
З точки зору математики мета аналізу Прокруста - одночасно знайти канонічну форму та перетворення подібності для кожного екземпляра даних, яке вирівнює його з канонічною. У цьому разі, вирівнювання вимірюється найменшим квадратом відстані між кожною зміненою та канонічною формами. Поступова процедура виконання цієї задачі реалізоване у класі shape_model таким чином: Atronax 10.03.21 в 16:54 |
||
|
#define fl at<float> Atronax 10.03.21 в 16:56 |
||
|
for(int iter = 0; iter < itol; iter++){ Atronax 10.03.21 в 17:02 |
||
|
Спочатку алгоритм видаляє центри мас з кожного екземпляра даних, а потім активує ітеративну процедуру, що змінюється для кожної канонічної форми таким чином, щоб нормоване середнє значення, повороти та масштабування відповідали їй з максимальною точністю. Нормування необхідне, щоб відрегулювати масштаб проблеми та запобігти можливому видаленню усіх форм. Вибір значення масштабу довільний, у даному разі довжина вектора канонічної форми встановлюється на рівні 1.0. Це поведінка функції нормування OpenCV за замовчуванням. Обчислення повороту на площині та масштабування, які вирівнюють кожен екземпляр форми з поточною оцінкою канонічної з найвищою точністю здійснюється за рахунок функції rot_scale_align: Atronax 11.03.21 в 08:49 |
||
|
Mat shape_model::rot_scale_align( Atronax 11.03.21 в 09:01 |
||
|
Функція шукає мінімальне значення серед квадратів різниць між перевернутою та канонічною формами. Математично це можна описати так: Atronax 11.03.21 в 09:03 |
||
|
У цьому випадку для вирішення проблеми найменших квадратів застосовано закриту форму, зображену на наступному малюнку, праворуч від рівняння. Замість пошуку масштабу та повороту на площині, які розміщено нелінійно в масштабованій двовимірній матриці повороту, ми шукаємо розв'язок відносно змінних (a, b). Ці параметри пов'язані з масштабом та матрицею поворотів таким чином: Atronax 11.03.21 в 09:16 |
||
|
Візуалізація ефектів аналізу Прокруста для необроблених анотованих даних ілюстрована далі. Особливі фрагменти обличчя позначені унікальними кольорами. Після нормування компоненти перенесення структура обличчя стає очевидною, точки скупчуються поряд з їх середніми положеннями. Ітеративна процедура масштабування та нормування повороту сприяє більш компактному скупченню, а розподіл особливих точок краще описуватиме зміни, спричинені деформацією обличчя. Саме їх ми намагатимемось змоделювати у наступній частині. Таким чином, аналіз Прокруста має лише обробити дані так, щоб мати змогу знайти кращі моделі локальної деформації для обличчя, яке вивчає алгоритм. Atronax 11.03.21 в 09:37 |
||
|
Лінійні моделі форм Atronax 10.03.21 в 17:02 |
||
|
Моделювання деформацій обличчя призначене для пошуку компактного параметричного представлення залежності форми обличчя від особи та виразу. Існує багато способів різної складності досягти цієї мети. Найпростіший серед них - скористатися лінійнім представленням геометрії обличчя. Не зважаючи на простоту, процес досить точно охоплює простір деформацій, особливо якщо зображення обличчя зняті переважно з фронтальним видом. До позитивних сторін також відносять те, що зміна параметрів представлення у цьому разі - винятково легка та дешева операція, на відміну від інших, нелінійних способів. Це відіграє досить важливу роль в подальшому, для обмеження процедури пошуку в процесі відслідковування обличчя. Atronax 11.03.21 в 09:47 |
||
|
Головну ідею лінійного моделювання проілюстровано на наступному малюнку. Форма обличчя, що складається з N особливих точок, моделюється у вигляді єдиної в 2N-вимірному просторі. Мета вище зазначеного процесу полягає в пошуку гіперплощини низької розмірності, на якій лежать усі точки форми обличчя (позначені зеленим кольором на зображенні). Оскільки вона є лише частиною 2N-вимірного простору, досить часто її називають підпростором. Чим менша розмірність, тим компактніше представлення обличчя та тим більші обмеження накладаються на процедуру відслідковування. Atronax 11.03.21 в 10:39 |
||
|
Завдяки цьому підвищується ефективність алгоритму. Atronax 11.03.21 в 10:44 |
||
|
Процедура пошуку найкращого підпростору низької розмірності, що включає набір даних, називається методом головних компонент (Principal Component Analysis, PCA). Бібліотека OpenCV реалізує клас для пошуку PCA, але він потребує визначення кількості збережених розмірностей підпростору. Оскільки це важко зробити апріорі, поширеною евристикою є вибір на основі частини від загальної кількості обраних варіацій. У функції shape_model::train метод головних компонент реалізований таким чином: Atronax 11.03.21 в 10:57 |
||
|
SVD svd(dY*dY.t()); Atronax 11.03.21 в 11:03 |
||
|
Кожна колонка змінної dY позначає вирівнені за методом Прокруста форми з видаленим середнім значенням. До матриці розбіжності даних форми, тобто dY.t()*dY), ефективно застосовано декомпозицію єдиного значення (Singular Value Decomposition, SVD). Змінна w екземпляра класу SVD бібліотеки OpenCV у цьому випадку зберігає дисперсію в головних напрямках варіативності, від найбільшого до найменшого. Загальновживаний спосіб визначити розмірність підпростору - обрати найменший набір тих із них, що збереже частину frac загальної енергії даних, представлену елементами svd.w. Atronax 11.03.21 в 11:51 |
||
|
Оскільки вхідні значення упорядковані від найбільшого до найменшого, достатньо обрати підпростори, просто оцінивши енергію у перших k напрямках варіативності. При цьому напрямки зберігаються у змінній u екземпляра класу SVD. Компоненти svd.w та svd.u зазвичай називають власним спектром та власними векторами відповідно. Їх візуалізацію зображено далі: Atronax 11.03.21 в 11:55 |
||
|
Примітка Atronax 11.03.21 в 12:13 |
||
|
Комбіноване локально-глобальне представлення Atronax 10.03.21 в 17:03 |
||
|
Форма обличчя на зображенні створюється шляхом композиції локальної деформації та глобального перетворення. З точки зору математики таку параметризацію доволі складно здійснити, адже композиція формує нелінійну функцію з розв'язками, які не можна представити в закритій формі. Щоб обійти цю проблему, глобальні перетворення часто моделюють у вигляді лінійного підпростору та додають результат у підпростір деформацій. Що ж до фіксованих форм, можна застосувати перетворення подібності з таким підпростором: Atronax 11.03.21 в 12:21 |
||
|
Функція calc_rigid_basis класу shape_model генерує цей підпростір на основі усередненої канонічної форми згідно аналізу Прокруста. Крім власне конструювання підпростору з вище зазначених даних, кожна колонка матриці нормується до одиничної довжини. У функції shape_model::train зазначене раніше змінна dY обчислюється за допомогою проєкції компонентів даних, що зберігають глобальний рух, таким чином: Atronax 11.03.21 в 13:02 |
||
|
Варто зауважити, що проєкція реалізована звичайним добутком матриць. Це можливо завдяки тому, що колонки підпростору глобального руху мають нормовану довжину. У такому випадку не змінюється навіть зайняте моделлю місце, а це значить, що R.t()*R дорівнює одиничній матриці. Atronax 11.03.21 в 13:08 |
||
|
Оскільки напрямки варіативності, що походять від глобальних перетворень, видалені з даних до початку навчання моделі деформації, підпростір результату є ортогональним до підпростору трансформацій. Тобто, об'єднавши їх, отримаємо комбіноване локально-глобальне лінійне представлення форм обличчя, яке на додаток є ортонормованим. Об'єднання здійснюється шляхом присвоєння двох матриць підпросторів відповідним підматрицям комбінованої матриці підпростору за допомогою механізму пошуку ROI, що реалізований у класі Mat бібліотеки OpenCV таким чином: Atronax 11.03.21 в 13:19 |
||
|
V.create(2*n,4+k,CV_32F); // комбінований підпростір Atronax 11.03.21 в 13:22 |
||
|
У цьому випадку s - це вектор форми обличчя, а p - координати у підпросторі, що її визначають. Насамкінець, у лінійному моделюванні існує ще одна досить важлива проблема, - як обмежити координати підпростору таким чином, щоб згенеровані форми залишалися дійсними. Наступний малюнок ілюструє форми обличчя в межах підпростору для зростаючого значення координат в одному з напрямів варіативності, шляхом поступового підвищення чотирьох основних відхилень. Для малих значень форма залишається схожою на обличчя, і результат погіршується, якщо вони стають надто великими. Atronax 11.03.21 в 13:31 |
||
|
Легкий спосіб запобігти подібній деформації - вмістити значення координат підпростору в певні межі, визначені набором даних. Поширеною практикою є обмеження з ±3 основними відхиленнями даних, які врахують 99.7 відсотків варіацій. Стиснені значення обраховуються функцією shape_model::train після знаходження підпростору, так: Atronax 11.03.21 в 13:37 |
||
|
Mat Q = V.t()*X; // проєтуємо дані на підпростір Atronax 11.03.21 в 13:39 |
||
|
Дисперсія обчислюється на основі значення Q підпростору після його нормування з урахуванням координати першої розмірності (тобто масштабу). Це не дозволяє примірникам даних з відносно великим масштабом домінувати у визначенні результату. Зверніть увагу, дисперсії координат глобального підпростору (тобто перших 4 колонкам V) присвоюються негативні значення. Функція стискання shape_model::clamp перевіряє, чи є дисперсія у певному напрямі негативною, і виконує подальші дії, якщо це не так: Atronax 11.03.21 в 13:42 |
||
|
void shape_model::clamp( Atronax 11.03.21 в 14:02 |
||
|
Причиною цьому є те, що тренувальні дані часто зняті за штучних налаштувань, наприклад обличчя зняте з фронтального вигляду, відцентроване на зображенні визначеного масштабу. Стискання компонентів глобального руху моделі форми у подібних умовах, встановлених для тренувального набору, має забагато обмежень. До того ж, оскільки дисперсія кожної деформованої координати обраховується на однові кадру з нормованим значенням масштабу, його можна застосувати до координат у процесі стискання: Atronax 11.03.21 в 14:08 |
||
|
Тренування та візуалізація Atronax 10.03.21 в 17:03 |
||
|
Приклад тренування моделі форми на основі анотованих даних можна знайти у файлі train_shape_model.cpp. Якщо вказати шлях до даних як значення аргументу argv[1] командної стрічки, алгоритм тренування завантажить їх у пам'ять та видалить неповні примірники таким чином: Atronax 11.03.21 в 14:13 |
||
|
ft_data data = load_ft<ft_data>(argv[1]); Atronax 11.03.21 в 14:15 |
||
|
Потім активується процес навчання моделі форми шляхом виклику функції shape_model::train: Atronax 11.03.21 в 14:17 |
||
|
Простота цього етапу є результатом визначення функції серіалізації даних у класі shape_model. Atronax 11.03.21 в 14:35 |
||
|
Параметри глобальних перетворень, які розміщують модель в центрі вікна, можна знайти так: Atronax 11.03.21 в 14:36 |
||
|
У цьому разі функція calc_scale обчислює коефіцієнт масштабування, який генерує форми обличчя з шириною 200 пікселів. Компоненти перенесення знаходяться на основі тих значень, що здійснюють переміщення на 150 одиниць (тобто модель відцентрована на вікні з розмірами 300x300 пікселів). Atronax 11.03.21 в 14:41 |
||
|
Примітка Atronax 11.03.21 в 14:43 |
||
|
Далі генерується траєкторія значень параметрів, яка починається з нуля, рухається до додатнього, а потім до від'ємного екстремуму, і знову до нуля: Atronax 11.03.21 в 14:47 |
