Mastering OpenCV with Practical Computer Vision Projects / Опановуюємо OpenCV через практичні проекти комп'ютерного зору: Розділ 6. Нецілісне відслідковування обличчя
| Английский оригинал | Перевод на украинский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Функція cv::waitKey потрібна для вибору індекса активного фрагмента та завершення роботи програми. Наступний малюнок ілюструє три приклади складених зображень, отриманих шляхом навчання моделі фрагментів з різною просторовою підтримкою. Не зважаючи на використання тих же тренувальних даних, зміна просторової підтримки моделі фрагмента суттєво впливає на її структуру. Візуальна перевірка результатів допомагає регулювати параметри тренувального процесу, щоб оптимізувати процедуру для конкретного застосунку. Atronax 22.03.21 в 12:31 |
|
|
Розпізнавання обличчя та налаштування процесу Atronax 22.03.21 в 12:32 |
||
|
Вищезазначений метод відслідковування обличчя припускає, що характеристики розміщені достатньо близько до поточної оцінки. Хоча цей вибір прийнятний для відслідковування, адже рух обличчя між кадрами досить незначний, ми все ще маємо коректно налаштувати модель для першого зображення послідовності. Очевидним вибором є застосування вбудованого в OpenCV каскадного детектора для розпізнавання обличчя. Однак, розміщення моделі у межах визначеного обмежувальної коробки залежатиме від вибору характеристики для відслідковування. Згідно з парадигмою даних, якої ми дотримувались у даному розділі, простим рішенням є вивчення геометричної залежності між обмежувальною формою розпізнавання та характеристиками обличчя. Atronax 22.03.21 в 12:32 |
||
|
Клас face_detector реалізує саме це рішення. Виділений фрагмент оголошення має такий вигляд: Atronax 22.03.21 в 12:33 |
||
|
const int minNeighbours = 2, // мінімальна кількість сусідів Atronax 22.03.21 в 12:35 |
||
|
Клас має чотири публічні змінні: шлях до об'єкта типу cv::CascadeClassifier з назвою detector_fname, зміщення від обмежувальної коробки розпізнавання до дійсного положення обличчя detector_offset, форма примірника для розміщення та власне детектор обличчя. Головною функцією системи відслідковування є face_detector::detect, вхідними параметрами якого є зображення та налаштування класу cv::CascadeClassifier, а результатом - приблизна оцінка положення характеристик. Його реалізовано наступним чином: Atronax 22.03.21 в 12:35 |
||
|
Mat gray; // конвертуємо зображення у відтінки сірого та вирівнюємо гістограму Atronax 22.03.21 в 12:35 |
||
|
Обличчя розпізнаємо як і раніше, за винятком використаної відмітки CV_HAAR_FIND_BIGGEST_OBJECT, потрібної для пошуку найбільшого обличчя серед вхідних даних. Виділений код вказує на розміщення форми примірника відповідно до знайденої обмежувальної коробки обличчя. Змінна detector_offset складається з трьох компонентів: зміщення (x,y) центру обличчя від центру форми розпізнавання, а також множник масштабування, який змінює розміри форми примірника, щоб найкраще розмістити обличчя на зображенні. Усі три компоненти лінійно залежні від ширини обмежувальної коробки. Atronax 22.03.21 в 12:36 |
||
|
Лінійна залежність між шириною обмежувальної коробки та змінною detector_offset отримується шляхом навчання анотованих даних у функції face_detector::train. Процес навчання починається із завантаження зображень у пам'ять та призначення форми примірника: Atronax 22.03.21 в 12:36 |
||
|
Як і раніше в класі patch_models, формою примірника краще обрати нормоване середнє обличчя набору даних. Потім до кожного зображення (а також до його дзеркального відображення за необхідності) застосовується каскадний класифікатор cv::CascadeClassifier, а результат розпізнавання перевіряється, щоб достатня кількість анотованих точок лежала в межах знайденої обмежувальної коробки (дивіться малюнок в кінці частини), аби процедура навчання не здіснювала хибні розпізнавання: Atronax 22.03.21 в 12:36 |
||
|
Якщо більше ніж frac відсотків анотованих точок лежить в обмежувальній коробці, лінійна залежність між його шириною та параметрами зміщення додається як новий запис в об'єкт вектора STL. Функція face_detector::center_of_mass визначає центр мас набору анотованих точок для зображення, а функція face_detector::calc_scale - обчислює множник масштабування для перетворення примірника у відцентровану анотовану форму. Коли будуть оброблені всі зображення, змінна detector_offset вказуватиме на медіану всіх окремих зміщень. Atronax 22.03.21 в 12:36 |
||
|
Mat X = Mat(xoffset),Xsort,Y = Mat(yoffset),Ysort,Z = Atronax 22.03.21 в 12:36 |
||
|
Як і для моделей форми та фрагмента, проста програма train_face_detector.cpp пояснює приклад побудови та збереження об'єкта face_detector, щоб існувала можливість його подальшого використання. Спочатку вона завантажує анотовані дані та модель форми, а також присвоює формі примірника відцентроване середнє тренувальних даних (тобто форму ідентичності у класі shape_model): Atronax 22.03.21 в 12:37 |
||
|
Щоб протестувати продуктивність отриманої процедури розміщення форм, застосунок visualize_face_detector.cpp викликає функцію face_detector::detect для кожного зображення вхідного потоку відео чи камери та зображає отримані результати на екрані. Приклад цього підходу показаний на наступному малюнку. Хоча розміщена форма не співпадає з окремою на зображенні, її позиція досить близька, аби відслідковувач обличчя отримав результати за допомогою описаного далі підходу: Atronax 22.03.21 в 12:37 |
||
|
Відсліковування обличчя Atronax 22.03.21 в 12:37 |
||
|
Задачею відслідковування обличчя є пошук ефективного та надійного способу об'єднати незалежні розпізнавання різних характеристик обличчя разом з їх геометричними залежностями для того, щоб отримати точну оцінку позицій на кожному зображенні послідовності. Враховуючи це, варто подумати на тим, чи потрібні взагалі геометричні залежності. Далі показані результати розпізнавання характеристик обличчя з відповідними обмеженнями та без них. Atronax 22.03.21 в 12:37 |
||
|
Ці результати досить чітко вказують на користь застосування просторових залежностей між характеристиками обличчя. Відносна продуктивність обох підходів типова, але покладатися винятково на розпізнавання не можна, це призводить до занадто зашумлених рішень. Карти відповідей для кожної характеристики не завжди мають пікові значення в коректних позиціях. Через зашумленість зображення, зміни умов освітлення чи виразу обличчя єдиним способом перебороти обмеження детекторів характеристик є застосування геометричних відношень між собою. Atronax 22.03.21 в 12:37 |
||
|
Особливо простий і водночас дивовижно ефективний спосіб доєднати геометрію обличчя до процедури відслідковування є проєкція результатів розпізнавання характеристик на лінійний підпростір моделі форм. Це включає мінімізацію відстані між початковими точками та найближчою прийнятною формою, що лежить у підпросторі. Таким чином, якщо просторовий шум розпізнавання має розподіл, близький до Гауса, проєкція надасть найвірогідніше рішення. На практиці розподіл похибок розпізнавання не має такого вигляду, тому потрібні додаткові механізми. Atronax 22.03.21 в 12:38 |
||
|
Реалізація відслідковування обличчя Atronax 22.03.21 в 12:38 |
||
|
Реалізація алгоритму відслідковування обличчя знаходиться у класі face_tracker (файли face_tracker.cpp та face_tracker.hpp). Далі покажемо фрагмент коду, у якому пояснюється його головна функціональність: Atronax 22.03.21 в 12:38 |
||
|
class face_tracker{ Atronax 22.03.21 в 12:45 |
||
|
Клас має публічні об'єкти класів shape_model, patch_models та face_detector і використовує їх функціональність для ефективного відслідковування. Таймер - це екземпляр класу fps_timer, який відслідковує швидкість виконання функції face_tracker::track в кадрах в секунду. Він корисний для аналізу впливу фрагмента та конфігурації моделі форми на обчислювальну складність алгоритму. Atronax 22.03.21 в 12:45 |
||
|
Змінна tracking - це відмітка, яка взаує на поточний стан процедури відслідковування. Якщо її встановлено в значення false, як у конструкторі та функції face_tracker::reset, об'єкт переходить у режим розпізнавання, за якого функція face_detector::detect застосовується до наступного вхідного зображення для налаштування моделі. У режимі відслідковування початкова оцінка, що використовується для позначень позицій характеристик обличчя, - це просто їх положення на попередньому кадрі. Повний алгоритм відслідковування реалізовано таким чином: Atronax 22.03.21 в 12:45 |
||
|
int face_tracker:: Atronax 22.03.21 в 12:45 |
||
|
Крім загальних операцій, як-от вибору коректного стану та інкрементації часу відслідковування, алгоритм є багаторівненою процедурою вміщення, це виділено на попередньому фрагменті коду. Алгоритм, реалізований у функції face_tracker::fit, застосовується декілька разів з різними розмірами вікон пошуку, шляхом виклику face_tracker_params::ssize, причому результат попередьного етапу використовується як вхідні дані для наступного. У найпростішому варіанті функція face_tracker_params::ssize виконує розпізнавання характеристик обличчя навколо поточної оцінки форми на зображенні: Atronax 22.03.21 в 12:46 |
||
|
smodel.calc_params(init); Atronax 22.03.21 в 12:46 |
||
|
Щоб врахувати зайві елементи серед знайдених позицій характеристик обличчя, замість простої проєкцій можна скористатися процедурою порівняння з точною моделлю, встановивши відповідне значення у положення true. Але на практиці, зі змінним розміром вікна пошуку (встановленим у face_tracker_params::ssize), це часто не має значення, адже зайві елементи типово розміщені далеко від відповідних точок проєктованої форми і, вочевидь, лежатимуть за межами зони пошуку наступного рівня процедури порівняння. Тобто зі зменшенням розмірів вікна пошуку зайві елементи поступово видаляються. Atronax 22.03.21 в 12:46 |
||
|
Тренування та візуалізація Atronax 22.03.21 в 12:46 |
||
|
На відміну від інших класів, що описані в цьому розділі, тренування об'єкта face_tracker не включає процесу навчання. Це реалізується в файлі train_face_tracker.cpp таким чином: Atronax 22.03.21 в 12:46 |
||
|
Аргументи від argv[1] до argv[4] містять шляхи до об'єктів shape_model, patch_model, face_detector та face_tracker відповідно. Візуалізація відслідковувача обличчя у файлі visualize_face_tracker.cpp доволі проста. Отримавши вхідне значення зображення з камери чи відеофайлу за допомогою класу cv::VideoCapture, програма просто здійснює процедуру відслідковування в циклі до кінця потоку або моменту, коли користувач натисне клавішу Q. Також існує можливість перезавантажити відслідковувач у будь-який час, натиснувши клавішу D. Atronax 22.03.21 в 12:47 |
||
|
Загальні та специфічні моделі Atronax 22.03.21 в 12:47 |
||
|
Деякі параметри процедур тренування та відслідковування можна налаштувати для оптимізації продуктивності певного застосунку. Разом з тим, одним з головних визначників якості відслідковування є діапазон форм та варіативність виглядів, які відслідковувач має змоделювати. Для конкретності розглянемо загальні моделі та визначені для певної особи. Загальну модель тренують анотованими зображеннями багатьох осіб, виразів, знятих за різних умов освітлення та інших параметрів. З іншого боку, специфічні моделі формуються для однієї особи. Тому потрібно врахувати набато меншу варіативність даних. У результаті алгоритм відслідковування однієї особи більш точний за загальний. Atronax 22.03.21 в 12:47 |
||
|
Це проілюстровано на наступному малюнку. Загальна модель натренована на основі набору даних MUCT. Специфічна модель натренована даними, що згенеровані з використанням описаного раніше інструменту для анотування зображень. Ілюстрація чітко показує кращі результати відслідковування для такої моделі, адже вона може знаходити складні вирази обличчя та зміни пози голови, у той час як загальні моделі ледве справляються з деякими простими їх варіантами Atronax 22.03.21 в 12:47 |
||
|
Варто зазначити, що розглянутий метод - це базовий підхід, який лише пояснює різні компоненти, що використовуються в більшості алгоритмів нецілісного відслідковування обличчя. Численні способи покращити різні елементи методу лежать за межами огляду цієї книги і потребують особливих математичних інструментів, які все ще не підтримуються бібліотекою OpenCV. Невелика кількість доступних програмних пакетів відслідковування обличчя комерційного рівня - це показник складності проблеми. Тим не менше, простий підхід, описаний в цьому розділі, може діяти достатньо добре в обмежених умовах. Atronax 22.03.21 в 12:47 |
||
|
Висновки Atronax 22.03.21 в 12:47 |
||
|
У цьому розділі ми побудували простий відслідковувач обличчя, який може працювати добре в обмежених умовах з використанням скромного математичного апарату та базової функціональності бібліотеки OpenCV для простої обробки зображень та лінійних алгебраїчних операцій. Покращити цей простий відслідковувач можна за рахунок використання більш складних технік для кожного з трьох компонентів: моделі форми, детекторів характеристик та алгоритму порівняння. Модульний дизайн відслідковувача, описаний у частині, має дозволити змінювати їх без суттєвого порушення роботи інших компонентів. Atronax 22.03.21 в 12:47 |
||
|
Посилання Atronax 22.03.21 в 12:47 |
||
|
Procrustes Problems, Gower, John C. and Dijksterhuis, Garmt B, Oxford University Press, 2004. Atronax 22.03.21 в 12:47 |
