Mastering OpenCV with Practical Computer Vision Projects / Опановуюємо OpenCV через практичні проекти комп'ютерного зору: Розділ 6. Нецілісне відслідковування обличчя

← →
Английский оригинал Перевод на украинский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Нецілісне відслідковування обличчя, тобто пошук квазі-щільного набору відповідних особливих точок на кожному кадрі відеоматеріалу, - це складне питання, для вирішення якого сучасні підходи запозичують ідеї у багатьох пов'язаних сферах, включно з комп'ютерним зором, обчислювальною геометрією, машинним навчанням та обробкою зображення. Нецілісність вказує на те, що відносні відстані між особливими точками змінюються в залежності від виразу обличчя та для різних людей, а власне алгоритм відрізняється від розпізнавання та відслідковування, які націлені лише на пошук обличчя на кожному кадрі, а не конфігурації особливих точок. Нецілісне відслідковування обличчя - це популярна тема досліджень, яка значно зросла за останні два десятиліття, але лише нещодавно підходи стали достатньо надійними, а процесори - достатню швидкість для того, щоб мати змогу створювати комерційні застосунки.

Atronax 08.03.21 в 14:25

0

Хоча відслідковування обличчя комерційного рівня може становити занадто складну проблему та виклик навіть для досвідчених фахівців комп'ютерного зору, у цьому розділі ми побачимо, що інструмент, який надає якісні результати за певних обмежень, можна створити за допомогою звичайних математичних методів та основної функціональності бібліотеки OpenCV у сферах лінійної алгебри, обробки зображень та візуалізації. Це особливо стосується випадку, коли особа відома заздалегідь, і наявні тренувальні дані - у формі зображень та приміток. Таким чином, описані техніки відігратимуть роль корисного джерела інформації, необхідної для подальшого вдосконалення системи відслідковування облич.

Atronax 08.03.21 в 15:04

0

Розділ присвячений наступним темам:
Огляд: короткі відомості з історії відслідковування облич.
Інструменти: огляд уживаних структур та домовленостей; сюди відносимо об'єктно-орієнтований дизайн, зберігання та представлення даних та інструменти для збору даних та роботи з відмітками.

Atronax 08.03.21 в 15:12

0

Геометричні обмеження: аналіз інформації про різновиди геометрії обличчя на основі тренувальних даних та їх використання спрощення пошуку рішення; у цій частині також розповідається, як представити обличчя у вигляді певної лінійної форми та інтегрувати відповідні глобальні перетворення.

Atronax 09.03.21 в 10:59

0

Детектори особливих точок обличчя: розпізнавання особливих точок для їх подальшого пошуку на зображенні, на якому маємо відслідкувати особу.
Пошук обличчя та налаштування відслідковування: як саме використати детектори з цією метою.

Atronax 09.03.21 в 11:22

0

Відслідковування обличчя: поєднання попередньо описаних компонентів у систему через процес вирівнювання зображень; розглянемо також налаштування параметрів, за яких процес працюватиме найкраще.
Наступна блочна діаграма ілюструє взаємозв'язки між різними компонентами системи:

Atronax 09.03.21 в 11:24

0

Примітка
Зауважте, всі описані в розділі методи відповідають парадигмі, за якої всі моделі сформовано на основі використаних даних, а не штучних налаштувань. Таким чином, кожен компонент системи включає два етапи: тренування та тестування. На першому кроці будуємо моделі з використанням наявних даних, а на другому пристосовуємо їх до нових зображень.

Atronax 09.03.21 в 11:28

0

Огляд

Atronax 08.03.21 в 14:37

0

Проблема нецілісного відслідковування обличчя вперше набула розголосу на початку 90-х років ХХ століття з винаходом активних моделей форм (Active Shape Models, ASM) Кута та Тейлора. Відтоді здійснено величезну кількість досліджень, які мали вирішити проблему відслідковування будь-якого обличчя з кращими результатами в порівнянні з початковим алгоритмом. Важливим кроком виявилось розширення ASM до активних моделей зовнішнього вигляду (Active Appearance Models, AAM) у 2001. Дещо пізніше, в середині 2000-х років, Бейкер та його колеги формалізували цей підхід у вигляді чіткого трактування викривлень зображень.

Atronax 09.03.21 в 11:44

0

До важливих витків розвитку відносять також працю Бланза та Веттера, присвячену змінним 3D-моделям (3D Morphable Model, 3DMM), які, подібно до AAM, не лише враховували текстури зображень замість профілів вздовж границь об'єкта, як при ASM, а й здійснили додатковий крок, отримавши моделі з високою щільністю 3D-даних за допомогою методу лазерного сканування. Із середини до кінця 2000-х років фокус досліджень змістився від характеристик обличчя до представлення та оптимізації задачі алгоритму відслідковування. З різною ступінню успіху використано різноманітні створені спільнотою техніки машинного навчання. Нова декада знову принесла зміни, цього разу у напрямі питання поєднаності точок та стратегій постановки задач, що гарантують глобальні рішення.

Atronax 09.03.21 в 12:09

0

Не зважаючи на інтенсивні дослідження проблеми відслідковування обличчя, досить мало комерційних застосунків використовували їх результати. Ентузіасти спочатку також не переймалися цією темою, хоча у вільному доступі й існували пакети коду для деяких поширених підходів. Але за останні два роки інтерес до потенціального застосування відслідковування обличчя та побудови продуктів комерційного рівня почав відновлюватися.

Atronax 09.03.21 в 12:16

0

Інструменти

Atronax 09.03.21 в 12:16

0

Перш ніж проблема поглине нас цілковито, розглянемо теоретичні задачі та домовленості поширених методів відслідковування обличчя. Подальший матеріал розділу, звісно, матиме справу з цими питаннями. Хоча зацікавлений читач може пропустити частину та продовжити знайомство з геометричних обмежень.

Atronax 09.03.21 в 12:26

0

Об'єктно-орієнтований дизайн

Atronax 09.03.21 в 12:27

0

Як і процеси пошуку та розпізнавання облич, відслідковування складається з двох компонентів: даних та алгоритмів. Алгоритми здійснюють типові операції над вхідними (онлайн) даними шляхом пошуку відповідностей серед попередньо збережених (офлайн). Тобто, об'єктно-орієнтований дизайн, який поєднує алгоритми з необхідними даними, є досить зручним рішенням.

Atronax 09.03.21 в 12:31

0

В бібліотеці OpenCV v2.x з'явився зручний клас для зберігання файлів у форматі XML/YAML, які значно спрощують задачу організації офлайн даних для використання в алгоритмамх. Щоб врахувати цю можливість, всі класи розділу матимуть функції для серіалізації даних. Що це значитиме, покажемо на прикладі уявного класу foo:

Atronax 09.03.21 в 12:34

0

#include <opencv2/opencv.hpp>
using namespace cv;
class foo{
public:
Mat a;
type_b b;
void write(FileStorage &fs) const{
assert(fs.isOpened());
fs << "{" << "a" << a << "b" << b << "}";
}
void read(const FileNode& node){
assert(node.type() == FileNode::MAP);
node["a"] >> a; node["b"] >> b;
}
};

Atronax 09.03.21 в 12:34

0

У вище наведеному фрагменті коду Mat - це клас матриці OpenCV, а type_b - це уявний клас з можливістю серіалізації даних, яку надають реалізовані функції зчитування та запису. FileStorage підтримує два типи структур, які можна зберегти та відновити. Для простоти викладок у цьому розділі всі класи оперуватимуть відображеннями, тобто кожне збережене значення створює об'єкт FileNode типу FileNode::MAP. Для цього маємо встановити унікальний ключ для кожного елемента. Хоча його вибір є довільним, для зручності в якості відмітки використаємо назву змінної. Як показано вище, функції зчитування та запису мають досить простий вигляд, використані лише оператори потоку ("<<" та ">>") для вставки та видалення даних з об'єкта FileStorage. Варто зауважити, більшість класів OpenCV мають реалізацію цих функцій, тому можна легко зберегти їх для подальшого використання.

Atronax 09.03.21 в 13:07

0

Крім визначення функції для серіалізації, мусимо також створити дві додаткові функції у класі FileStorage з таким кодом:
void write(FileStorage& fs, const string&, const foo& x){
x.write(fs);
}
void read(const FileNode& node, foo& x,const foo& default){
if(node.empty())x = d; else x.read(node);
}

Atronax 09.03.21 в 13:10

0

Оскільки можливості двох функцій не змінюються для усіх класів частини, запрограмуємо відповідні шаблонні версії та подамо їх визначення у частині файла заголовків ft.hpp, що відповідає цьому розділу. Нарешті, щоб мати можливість легко зберігати та відновлювати класи користувачів, які користуються серіалізацією даних, відповідні шаблонні функції також реалізовані у файлі заголовків:
template <class T>
T load_ft(const char* fname){
T x; FileStorage f(fname,FileStorage::READ);
f["ft object"] >> x; f.release(); return x;
}
template<class T>
void save_ft(const char* fname,const T& x){
FileStorage f(fname,FileStorage::WRITE);
f << "ft object" << x; f.release();
}

Atronax 09.03.21 в 13:19

0

Пов'язана з об'єктом відмітка завжди залишається незмінною. За допомогою визначених вище функцій можна без жодних зусиль зберігати та завантажувати дані класу. Це легко бачити в наступному фрагменті коду:
#include "opencv_hotshots/ft/ft.hpp"
#include "foo.hpp"
int main(){
...
foo A; save_ft<foo>("foo.xml",A);
...
foo B = load_ft<foo>("foo.xml");
...
}

Atronax 10.03.21 в 07:05

0

Зауважте, що розширення.xml вказує на файл даних, форматований за правилами XML. Будь-яке інше значення встановлює більш зрозумілий для людини тип YAML.

Atronax 09.03.21 в 12:43

0

Колекція даних: відмітки зображень та відеокадрів

Atronax 09.03.21 в 12:35

0

Сучасні техніки відслідковування обличчя практично повністю засновані на даних, тобто алгоритми, що використовуються для розпізнавання положення особливих точок на зображеннях, діють на основі моделей зовнішнього вигляду та геометричних залежностей між їх відносними позиціями в наборі прикладів. Чим більший об'єм набору, тим ефективніше діють алгоритми, адже вони знатимуть про різноманіття варіантів облич. Тому на першому кроці побудови алгоритму відслідковування обличчя створимо інструмент для позначень, за допомогою якого користувач зможе вказати положення бажаних особливих точок на кожному зображенні прикладу.

Atronax 10.03.21 в 07:19

0

Тренування типів даних

Atronax 09.03.21 в 12:36

0

Дані для тренування алгоритмів відслідковування обличчя звичайно складаються з чотирьох компонентів:
Зображення. Це колекція звичайних зображень або кадрів відео, на яких можна побачити обличчя цілком. Щоб отримати кращі результати, її можна розділити на категорії залежно від певних характеристик (наприклад особи, освітлення, відстані до камери, використаного пристрою для зйомки), для яких надалі налаштуємо відслідковувач. Дуже важливо, аби колекція враховувала також можливі пози голови та вирази обличчя, необхідні для застосунку.

Atronax 10.03.21 в 07:54

0

Анотації. Цей компонент стосується ручних позначень на зображеннях, які відповідають кожній особливій точці обличчя, що має бути відслідковане. Чим більша кількість особливих точок обличчя, тим надійніші результати відслідковування, адже алгоритм зможе використати додаткові дані для уточнення. Час обчислення поширених алгоритмів відслідковування зазвичай зростає лінійно, залежно від числа особливих точок.

Atronax 10.03.21 в 08:04

0

Індекси симетрії. Тут зберігаються індекси для кожної особливої точки обличчя, що відповідає симетричному фрагменту. Ці дані можна використати для віддзеркалення тренувальних зображень, подвоївши розмір набору та розмістивши дані симетрично відносно осі y.

Atronax 10.03.21 в 08:13

0

Індекси спорідненості. Елемент включає набір пар індексів анотацій, що визначають семантичну інтерпретацію особливих точок обличчя. Ці зв'язки корисні для візуалізації результатів відслідковування.
Вказані чотири компоненти зображені далі, на якому зліва направо можна побачити необроблене зображення, позначення особливих фрагментів, закодовані кольором точки подвійної симетрії, віддзеркалений кадр, спорідненість особливих точок.

Atronax 10.03.21 в 08:21

0

Щоб зручно взаємодіяти з ними, реалізовано можливості зберігання та зчитування. Клас CvMLData модуля ml бібліотеки OpenCV має функціональність для обробки звичайних даних, які часто використовується для вирішення питань машинного навчання. Але йому не вистачає функцій для роботи з інформацією відслідковування. Тому у цьому розділі скористаємось класом ft_data, що оголошений у файлі заголовку ft_data.hpp, розробленим з урахуванням особливостей даних відслідковування обличчя. Майте на увазі, всі елементи класу визначені як публічні змінні:

Atronax 10.03.21 в 09:03

0

class ft_data{
public:
vector<int> symmetry;
vector<Vec2i> connections;
vector<string> imnames;
vector<vector<Point2f> > points;
…
}

Atronax 09.03.21 в 13:08

0

Типи Vec2i та Point2f - це класи OpenCV, що позначають вектори двох цілих чисел та двовимірні координати точки відповідно. Вектор симетрії має стільки ж компонентів, скільки існує особливих точок на обличчі (визначених користувачем). Кожен зі зв'язків визначає пару індексів для поєднаних елементів. Оскільки тренувальний набір потенційно може були досить великим, замість зображень клас зберігає назви файлів у змінній imnames (для правильної роботи програми вони мають знаходитися за відносним шляхом, що відповідає значенням). Нарешті, для кожного тренувального кадру колекція позицій відповідних точок зберігається у вигляді векторів координат, у змінній класу points.

Atronax 10.03.21 в 09:17

0

Клас ft_data реалізує декілька зручних методів доступу до даних. Щоб отримати зображення з набору, можна скористатися функцією get_image, яка завантажить визначений індекс idx та за вибором користувача віддзеркалить результат вздовж осі y:

Atronax 10.03.21 в 09:19

0


Mat ft_data::get_image(
const int idx, // індекс зображення для завантаження файлу
const int flag){ //0 = сір.,1 = сір. + віддз. ,2 = кольор. ,3 = кольор. + віддз.
if((idx < 0) || (idx >= (int)imnames.size()))return Mat();
Mat img,im;
if(flag < 2)img = imread(imnames[idx],0);
else img = imread(imnames[idx],1);
if(flag % 2 != 0)flip(img,im,1); else im = img;
return im;
}

Atronax 10.03.21 в 09:21

0

Значення параметра flag (0,1), що передається функції imread бібліотеки OpenCV, визначає, чи приклад завантажений як 3-канальне кольорове зображення чи одноканальне у відтінках сірого. Відмітка, що передається у функцію flip, позначає віддзеркалення відносно осі y.

Atronax 10.03.21 в 09:24

0

Отримати доступ до набору точок, що відповідає зображенню з певним індексом, можна за допомогою функції get_points, що повертає вектор координат з можливістю віддзеркалити індекси:
vector<Point2f> ft_data::get_points(
const int idx, // індекс зображення, що відповідає точкам
const bool flipped){ // чи віддзеркалене зображення відносно осі y?
if((idx < 0) || (idx >= (int)imnames.size()))
return vector<Point2f>();
vector<Point2f> p = points[idx];
if(flipped){
Mat im = this->get_image(idx,0); int n = p.size();
vector<Point2f> q(n);
for(int i = 0; i < n; i++){
q[i].x = im.cols-1-p[symmetry[i]].x;
q[i].y = p[symmetry[i]].y;
}return q;
}else return p;
}

Atronax 10.03.21 в 09:30

0

Якщо відмітка віддзеркалення визначена, вище зазначена функція викликає get_image для знаходження ширини зображення, аби мати можливість коректно відобразити координати особливих точок обличчя. Можна діяти й інакше - просто передати відповідне значення в якості параметра. Функція також ілюструє інструмент для симетричного відображення змінних. Віддзеркалене положення особливої точки з певним індексом - це позиція, визначена у симетричній змінній, до координати x якої застосовано переворот та зміщення.

Atronax 10.03.21 в 09:48

0

Обидві функції get_image та get_points повертають пусті структури, якщо визначений індекс знаходиться за межами набору даних. Також можлива ситуація, за якої не всі зображення колекції матимуть відповідні позначення. Алгоритми відслідковування обличчя можуть врахувати обробку неіснуючих даних, такі реалізації доволі часто використовуються й знаходяться за межами матеріалу цього розділу. У нашому ж випадку клас ft_data реалізує функцію для видалення з колекції примірників без позначень таким чином:

Atronax 10.03.21 в 11:29

0

void ft_data::rm_incomplete_samples(){
int n = points[0].size(),N = points.size();
for(int i = 1; i < N; i++)n = max(n,int(points[i].size()));
for(int i = 0; i < int(points.size()); i++){
if(int(points[i].size()) != n){
points.erase(points.begin()+i);
imnames.erase(imnames.begin()+i); i--;
}else{
int j = 0;
for(; j < n; j++){
if((points[i][j].x <= 0) ||
(points[i][j].y <= 0))break;
}
if(j < n){
points.erase(points.begin()+i);
imnames.erase(imnames.begin()+i); i--;
}
}
}
}

Atronax 10.03.21 в 11:29

0

Об'єкт з найбільшою кількістю відміток вважається канонічним. Усі екземпляри, які мають набір точок з меншою кількістю, видаляються з колекції за допомогою методу вектора erase. Також майте на увазі, що точки з координатами (x, y), менші за одиницю, вважаються відсутніми на відповідному зображенні (через перекриття, погану видимість чи невизначеність).

Atronax 10.03.21 в 11:35

0

Клас ft_data реалізує функції серіалізації, тому його дані можна легко зберегти або відновити. Наприклад, збереження набору можна здійснити настільки просто:
ft_data D; // інстанціюємо структуру даних
… // заповнюємо
save_ft<ft_data>("mydata.xml",D); // зберігаємо

Atronax 10.03.21 в 11:39

0

Для візуалізації набору даних клас ft_data пропонує декілька функцій. Їх застосування ілюструє файл visualize_annotations.cpp. Проста програма завантажує дані позначень, що зберігаються у файлі, визначеному командною стрічкою, видаляє неповні примірники та виводить на екран тренувальні зображення з відповідними відмітками, симетрією та встановленими зв'язками особливих точок. Також використано декілька важливих особливостей модуля highgui бібліотеки OpenCV. Доволі рудиментарні та недостатні для складних інтерфейсів користувача, можливості модуля досить корисні для завантаження та візуалізації даних, а також для алгоритмічного виводу в застосунках комп'ютерного зору. Це, можливо, одна з найважливіших відмінностей OpenCV від інших бібліотек комп'ютерного зору.

Atronax 10.03.21 в 11:48

0

Інструменти для анотації

Atronax 10.03.21 в 11:49

0

Щоб полегшити застосування анотацій у подальшому матеріалі розділу, скористаємось найпростішим інструментом з файлу annotate.cpp. Його вхідним параметром є відеопотік з файлу або камери. Процедура використання складається з чотирьох кроків:
1. Захоплення зображень. На цьому етапі потік зображень виводиться на екран, а користувач, натискаючи клавішу S, обирає ті з них, які потрібно позначити. Для збільшення ефективності краще зупинитися на особливих точках, що сприяють максимальному зростанню варіативності поведінки обличчя, яку матиме відслідкувати система.
2. Анотація першого зображення. На другому кроці користувач розглядає приклад, обраний на попередньому етапі. Потім він відмічає на ньому певний набір фрагментів, які мають бути знайдені.

Atronax 10.03.21 в 12:14

0

3. Анотація спорідненості. На третьому етапі потрібно визначити структуру споріднених точок для кращої візуалізації форми. У цьому випадку користувачу показано те ж зображення, що й на попередньому етапі, але нинішнє завдання стосується вибору набору пар точок, однієї за одною, щоб побудувати на моделі обличчя структуру спорідненості.
4. Анотація симетрії. На цьому кроці, все ще на тому ж зображенні, користувач відмічає пари точок, що характеризують подвійну симетрію.
5. Анотація решти зображень. Це останній етап, процедура схожа на другий, за винятком того, що користувач може перемикатися між зображеннями набору та анотувати кожне окремо.

Atronax 10.03.21 в 12:19

0

Зацікавлений читач може вдосконалити інструмент, зробивши його зручнішим для використання або навіть інтегрувати процедуру навчання, за якою модель відслідковування оновлюємо після кожного нового анотованого зображення, а потім використовуємо результати для налаштування точок, щоб зменшити кількість зайвих позначень.
Хоча деякі публічно доступні набори даних можна використати у коді цього розділу (перегляньте опис прикладу у попередній частині), інструмент допоможе в побудові моделей для відслідковування облич певних осіб, які зазвичай ефективніші, ніж загальні алгоритми, незалежні від людини.

Atronax 10.03.21 в 12:24

0

Заздалегідь анотовані дані (набір даних MUCT)
Одним з ключових факторів розробки систем відслідковування обличчя є тривалий і нудний процес ручного позначення значної кількості точок на кожному зображенні з чималої колекції. Щоб полегшити процес для цілей цього розділу, можна завантажити доступний набір даних MUCT з ресурсу http://www/milbo.org/muct.

Atronax 10.03.21 в 14:49

0

Набір даних складається з 3755 зображень облич, що анотовані 76 відмітками. Суб'єкти набору відрізняються за віком та етносом, фотографії зняті у різних умовах освітлення та з різними позами голови.

Atronax 10.03.21 в 14:54

0

Щоб мати змогу користуватися даними MUCT у розділі, виконаємо такі кроки:
1. Завантажимо набір зображень. Для цього завантажимо файли muct-a-jpg-v1.tar.gz to muct-e-jpg-v1.tar.gz та розпакуємо їх. Це згенерує нову теку, у якій зображення будуть збережені.
2. Отримаємо анотації. На цьому кроці маємо здобути файл з анотаціями muct-landmarks-v1.tar.gz. Завантажимо та розпакуємо його у ту ж теку, що й зображення з попереднього етапу.
3. Визначимо зв'язки та симетрію за допомогою інструмента анотації. Для цього виконаємо команду ./annotate -m $mdir -d $odir, де $mdir вказує на теку, де має бути збережений набір даних MUCT, а $odir - на теку, де знаходитиметься файл анотації у форматі yaml, у якому зберігаються дані об'єкта ft_data.

Atronax 10.03.21 в 15:00

0

Підказка

Atronax 10.03.21 в 15:02

0
Минутку...

Следующая страница →