Mastering OpenCV with Practical Computer Vision Projects / Опановуюємо OpenCV через практичні проекти комп'ютерного зору: Розділ 7. Оцінка 3D пози голови за допомогою AAM та POSIT
| Английский оригинал | Перевод на украинский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Відтепер маємо можливість ітерувати по трикутникам сітки, тому можна знайти перетворення між трикутником з анотованого та викривленого зображень. Це корисно для відображення текстури оригінальної форми на змінену. Наступний фрагмент коду присвячений цьому процесу: Atronax 22.03.21 в 13:30 |
|
|
void warpTextureFromTriangle(Point2f srcTri[3], Mat originalImage, Atronax 22.03.21 в 13:30 |
||
|
У попередньому коді ми припускаємо, що вершини трикутника запаковані в масиві srcTri, а результат - у dstTri. Матриця warp_mat розмірності 2x3 використовується для отримання афінних перетворень з вихідних трикутників в отримані. Більше інформації задокументовано в описі функції cvGetAffineTransform бібліотеки OpenCV: Atronax 22.03.21 в 13:30 |
||
|
Функція cvGetAffineTransform обраховує матрицю афінних перетворень таким чином: Atronax 22.03.21 в 13:30 |
||
|
Обчисливши матрицю афінних перетворень, застосуємо їх до оригінального зображення. Це можна зробити за допомогою функції warpAffine. Оскільки ми не потребуємо змін усього кадру (лише нашого трикутника), можна скористатися маскою. Таким чином, остання стрічка копіює лише трикутники з оригінального зображення, що відповідають масці, створеній за допомогою функції cvFillConvexPoly. Atronax 22.03.21 в 13:31 |
||
|
Наступний малюнок ілюструє результат застосування процедури до кожного трикутника анотованого зображення. Врахуйте, трикутники повторно відображені на вирівнений кадр, розвернутий до спостерігача. Ця процедура використовується для створення статистичної текстури AAM. Atronax 22.03.21 в 13:31 |
||
|
Попередній малюнок показує результат викривлення усіх відображених трикутників з лівого зображення на усереднений кадр примірника. Atronax 22.03.21 в 13:31 |
||
|
Інстанціювання моделі - граємо з моделями активного вигляду Atronax 22.03.21 в 13:31 |
||
|
Цікава особливість AAM - це їхня можливість легко інтерполювати натреновану модель. Якщо відрегулювати декілька параметрів, можна пристосуватися до її потужних можливостей представлення об'єктів. Регулювання значень форми дає змогу отримати інші результати викривлення залежно від натренованих даних. З іншого боку, зі зміною параметрів вигляду змінюється й текстура базової форми. Викривлення перетворять кожен трикутник початкової форми у відповідний трикутник модифікованої, аби ми мали змогу синтезувати закритий рот над відкритим, як показано на наступному зображенні: Atronax 22.03.21 в 13:31 |
||
|
Попередній скріншот зображає синтезований закритий рот, отриманий за допомогою моделі активного вигляду, розміщений на поверхні іншого зображення. Таким чином можемо скомбінувати посмішку із задоволеним виразом обличчя, екстраполюючи натреновані зображення. Atronax 22.03.21 в 13:31 |
||
|
Знімок отримано шляхом регулювання трьох параметрів форми та трьох текстури. Саме це і є метою моделей активного вигляду. Приклад програми розроблений та доступний на ресурсі http://www.packtpub.com/ , читач може власноруч випробувати AAM. Створити нову модель дуже просто, достатньо лише змінити деякі параметри рівняння, визначені у цій частині. Atronax 22.03.21 в 13:31 |
||
|
Знайомство з алгоритмом PCA Atronax 22.03.21 в 13:31 |
||
|
Ви мали помітити, що дія AAM та вміщення точок покладаються на гнучкість пошуку найкращих співпадінь для заданого кадру моделі в позиція, відмінних він натренованої. Розглянемо це питання у наступній частині. Atronax 22.03.21 в 13:31 |
||
|
Пошук AAM та вміщення точок Atronax 22.03.21 в 13:32 |
||
|
Нова комбінована форми та модель текстури дозволяє описати зміну не тільки форми, а й вигляду обличчя. Тепер ми бажаємо знайти такі набір форм p та параметри вигляду λ, які розмістять модель якомога ближче до вхідного зображення I(x). Можемо обчислити похибку між інстанційованою моделлю та координатами заданого зображення на кадрі I(x) чи повторно відобразити точки на початковий вигляд та вирахувати відповідну різницю. Застосуємо другий підхід. У цьому разі потрібно мінімізувати таку функцію: Atronax 22.03.21 в 13:33 |
||
|
За роки вивчення проблеми для процедури мінімізації запропоновано декілька підходів. Першим з них є адитивний, за якого ∆p та ∆λ вирахувані як лінійні функції похибок зображення, а параметр форми p та вигляд λ оновлені як p i ← p i + ∆p i та λ i ← λ i + Atronax 22.03.21 в 13:37 |
||
|
Ще один підхід, заснований на алгоритмах градієнтного спуску, виявився занадто повільним, тому ми розглянули інший підхід пошуку збіжності. У такому разі оновлюємо не параметри, а цілі матриці викривлення. Цей спосіб, що називають підходом композиції, запропонований Аєном Метьюсом та Симоном Бейкером у відомій праці "Active Appearance Models Revisited". Деталі можна знайти на її сторінках, але найважливішим вкладом, який вона дала для вміщення, - перенесення найбільш складних обчислень на крок попередньої обробки, як показано на такому малюнку: Atronax 22.03.21 в 13:38 |
||
|
Оновлення відбувається у вигляді композиції кроків, як показано на етапі 9 попереднього малюнку. Рівняння (40) та (41) праці зображені далі: Atronax 22.03.21 в 13:38 |
||
|
Хоча вказаний алгоритм у загальних випадках зводиться досить якісно з позиції, близької до кінцевої, це може виявитися не так для значної різниці повороту, перенесення чи масштабування. Більше даних про збіжність можна надати за рахунок параметризації глобальних двовимірних перетворень подібності. Це рівняння 42, яке має такий вигляд: Atronax 22.03.21 в 13:38 |
||
|
У цьому рівнянні чотири параметри q = (a, b, t x, t y)T мають такі інтерпретації. Перша пара значень (a,b) пов'язана з масштабом k та поворотом θ: a дорівнює k cos θ - 1, а b = k sin θ. Друга пара (t x, t y) - це перенесення координат x та y, як запропоновано в праці "Active Appearance Models Revisited". Atronax 22.03.21 в 13:43 |
||
|
Використавши ще декілька математичних перетворень, можна застосувати описаний алгоритм для пошуку найкращого вміщеного зображення за допомогою глобальних 2D перетворень. Atronax 22.03.21 в 13:43 |
||
|
Композитні алгоритми викривлення мають декілька переваг, що підвищують їх продуктивність. У нашому випадку скористаємось тим, що описаний у праці "AAM Revisited",- алгоритмом зворотнього композитного проєктування. У цьому разі зміну вигляду в ході вміщення можна заздалегідь обрахувати чи спроєктувати, тим самим підвищивши продуктивність процедури AAM. Atronax 22.03.21 в 13:43 |
||
|
Наступний скріншот показує співпадіння між різними зображеннями набору даних MUCT за допомогою алгоритму зворотнього композиційного проєктування та вміщення AAM. Atronax 22.03.21 в 13:43 |
||
|
Далі показано успішні співпадіння - серед облич за межами тренувального набору AAM - за допомогою алгоритму вміщення шляхом композиційного проєктування назовні. Atronax 22.03.21 в 13:46 |
||
|
POSIT Atronax 22.03.21 в 13:43 |
||
|
Примітка Atronax 22.03.21 в 13:48 |
||
|
Більшість матеріалу цієї частини базується на навчальних матеріалах POSIT від Джейвіера Берендіерена. З назви зрозуміло, що POSIT застосовує декілька ітерацій (IT) алгоритму оцінки пози з ортографічної проєкції та масштабу (POS). Гіпотеза, яка лежить в основі її роботи, вказує на можливість розпізнавання та порівняння на співпадіння чотирьох чи більше не-плоских особливих точок об'єкта на зображенні та їх відносне розміщення. Atronax 22.03.21 в 13:48 |
||
|
Головна ідея алгоритму полягає в тому, що ми можемо знайти непогане наближення до пози об'єкта, припустивши, що всі точки моделі лежать у тій же площині, оскільки їх значення глибини не надто змінюється між ними, якщо порівнювати з відстанню від камери до обличчя. Після обчислення початкової пози, матрицю повороту та вектор перенесення знайдемо з лінійної системи рівнянь. Потім застосуємо ітеративну процедуру апроксимації пози, щоб знайти більш точні масштабовані ортографічні проєкції ключових точок, які використаємо в ролі вхідних даних для алгоритму POSIT. Щоб отримати більше інформації, зверніться до праці ДеМентона "Model-Based Object Pose in 25 Lines of Code". Atronax 22.03.21 в 13:48 |
||
|
Занурюємось в POSIT Atronax 22.03.21 в 13:48 |
||
|
Для того, щоб змусити POSIT працювати як слід, потрібні щонайменше чотири точки тривимірної моделі, що не лежать на одній площині, та відповідні їм точки на зображенні. До цього додаємо критерій завершення (оскільки POSIT - це ітеративний алгоритм), тобто кількість ітерацій чи параметр відстані. Потім викликаємо функцію cvPOSIT, що формує матрицю повороту та вектор перенесення. Atronax 22.03.21 в 13:48 |
||
|
Для прикладу слідуватимемо навчальним матеріалам Джейвіера Берендіерена, який використовує POSIT для формування пози куба. Модель створена на основі чотирьох точок. Ми ініціалізуємо її таким кодом: Atronax 22.03.21 в 13:48 |
||
|
Власне модель створена за допомогою методу cvCreatePOSITObject, який повертає об'єкт CvPOSITObject, який потім використаємо у функції cvPOSIT. Будьте обережні, позу обрахуємо відносно першої точки моделі, тому її варто розмістити у початку координат. Далі маємо зберегти точки двовимірного зображення в іншому векторі. Пам'ятайте, вони мають знаходитися у масиві тієї ж розмірності, що й точки моделі; таким чином, i-та точка 2D зображення збігається з i-тою точкою 3D моделі. Нюанс полягає в тому, що початок системи координат, у якій розміщено точки двовимірного зображення, лежить у центрі, а тому його потрібно перенести. Може додати такі точки (звісно, вони змінюватимуться залежно від вибору користувача): Atronax 22.03.21 в 13:48 |
||
|
std::vector<CvPoint2D32f> srcImagePoints; Atronax 22.03.21 в 13:48 |
||
|
Тепер досить лише виділити пам'ять для матриць та сформувати критерій завершення, викликати функцію cvPOSIT, як показано в наступному фрагменті коду: Atronax 22.03.21 в 13:50 |
||
|
Після завершення ітеративного процесу cvPOSIT збереже результати у змінних rotation_matrix та translation_vector. Наступний малюнок зображає додані точки у вигляді білих кіл, а також система координат з результатами повороту та перенесення: Atronax 22.03.21 в 13:51 |
||
|
Посилаючись на попередній скріншот, оглянемо вхідні точки та результати алгоритму POSIT: Atronax 22.03.21 в 13:51 |
||
|
Білі кола вказують на вхідні точки, а осі координат - отриману позу моделі. Впевніться, що ви використовуєте фокусну відстань, обраховану на етапі калібрування камери. Детальна інформація щодо процедури калібрування доступна в розділі 2 "Заснована на маркерах доповнена реальність на iPhone та iPad". Поточна реалізація POSIT дозволить працювати лише з квадратними пікселями, у такому випадку про фокусну довжину на осях x та y не може бути й мови. Atronax 22.03.21 в 13:51 |
||
|
Матриця повороту очікується у такому форматі: Atronax 22.03.21 в 13:51 |
||
|
Вектор перенесення повинен мати такий вигляд: Atronax 22.03.21 в 13:51 |
||
|
POSIT та модель голови Atronax 22.03.21 в 13:51 |
||
|
Для використання POSIT як інструменту для пози голови знадобиться 3D модель. Можливий варіант пропонує Інститут Систем та Робототехніки Університету Коймбра за адресою http://aifi.isr.uc.pt/Downloads/OpenGL/glAnthropometric3DModel.cpp . Власне опис моделі у файлі починається стрічкою: Atronax 22.03.21 в 13:52 |
||
|
float Model3D[58][3]= {{-7.308957,0.913869,0.000000}, ... Atronax 22.03.21 в 13:52 |
||
|
Модель можна побачити далі: Atronax 22.03.21 в 13:52 |
||
|
Попередній скріншот зображає підготовлену для POSIT тривимірну модель голови з 58 точок. Щоб алгоритм POSIT спрацював, маємо знайти співпадіння точок з проєкціями. Пам'ятайте, для POSIT потрібні як мінімум чотири тривимірні точки, що не лежать на одній площині, та відповідні їм двовимірні проєкції, їх маємо передати у вигляді параметрів, як вказано у частині "Занурюємось в POSIT". Алгоритм лінійний, якщо враховувати кількість співпадінь точок. Atronax 22.03.21 в 13:52 |
||
|
Далі зображено, як саме має бути здійснена перевірка на співпадіння. Atronax 22.03.21 в 13:52 |
||
|
Відслідковування з використанням вебкамери чи відеофайлу Atronax 22.03.21 в 13:52 |
||
|
Маючи інструменти з шістьма ступенями свободи для відслідковування обличчя, застосуємо їх до потоку відеокадрів чи файлу. Бібліотека OpenCV надає клас VideoCapture, яким можна скористатися таким чином (деталі знаходяться в частині "Отримуємо доступ до вебкамери" у розділі 1 "Ефект мультиплікації та зміна кольору шкіри для Android"): Atronax 22.03.21 в 13:52 |
||
|
#include "cv.h" Atronax 22.03.21 в 13:53 |
||
|
Алгоритм працює таким чином. Об'єкт для захоплення відеопотоку налаштовується за допомогою оголошення VideoCapture cap(0), у такому разі використовується вебкамера за замовчуванням. Для роботи алгоритму, крім захоплення відеокадрів, потрібна натренована модель активного вигляду, яку завантажимо викликом функції loadPreviouslyTrainedAAM. Також зчитаємо модель тривимірної голови у змінну headModel та відображення орієнтирів на тривимірні точки - у mapping. Atronax 22.03.21 в 13:54 |
||
|
Завантаживши все, що потрібно для процедури, налаштуємо алгоритм на основі відомої пози, тобто відомої тривимірної позиції, повороту та набору параметрів AAM. Це можна зробити автоматично за допомогою добре задокументованого детектора обличчя на основі класифікатора особливих точок Хаара (більше деталей знаходиться в частині "Розпізнавання обличчя" у розділі 6 "Нецілісне відслідковування обличчя" або в документації каскадного класифікатора бібліотеки OpenCV), або можна вручну налаштувати позу з раніше анотованого кадру. Можна також скористатися підходом повного перебору, який виконає вміщення AAM для кожного прямокутника, оскільки він повільний лише для першого кадру. Під налаштуванням ми маємо на увазі пошук двовимірних орієнтирів на моделі активного вигляду шляхом регулювання їхніх параметрів. Atronax 22.03.21 в 13:54 |
