Навчання каскаду хаара OpenCV Метод Віоли-Джонса

Пошук об'єкта на цифровому зображенні є одним із пріоритетних завдань у галузі розпізнавання зображень за допомогою бібліотеки OpenCV.

У цій статті розглядаються математичні основи Методу Віоли-Джонса та процес пошуку та розпізнавання букв автомобільного номера за допомогою OpenCV та детектора Хаара.

Про детектор Хаара та бібліотеку OpenCV

Принцип роботи

Класифікатор формується на примітивах Хаара шляхом розрахунку значень ознак. Для навчання на вхід класифікатора спочатку подається набір «правильних» зображень із попередньо виділеною областю на зображенні, далі відбувається перебір примітивів та розрахунок значення ознаки. Обчислені значення зберігаються у файлі у форматі xml.

Трохи математики

Принципи методу Віоли-Джонса

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

Інтегральне уявлення зображення – це матриця, однакова за розмірами вихідним зображенням. У кожному елементі матриці зберігається сума інтенсивностей всіх пікселів, що знаходяться ліворуч і вище даного елемента - нижнього правого кута прямокутної області (0,0) до (x,y). Елементи матриці L можна розрахувати за такою формулою:

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

Елементи матриці розраховуються за такою формулою:

L (x, y) = I (x, y) + L (x-1, y-1) + L (x, y-1) + L (x-1, y)

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

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

Ознака-відображення , де Df - безліч допустимих значень ознаки. Якщо задані ознаки f1,…, fn, вектор ознак x=(f1(x),…,fn(x)) називається ознаковим описом об'єкта x. Ознакові описи можна порівняти з самими об'єктами. У цьому безліч X=Df1*…*Dfn називають ознаковим простором [1].

Ознаки поділяються на такі типи залежно від множини Df:

  • бінарна ознака, Df=;
  • номінальна ознака: Df — кінцева множина;
  • порядкова ознака: Df - кінцева впорядкована множина;
  • кількісна ознака: Df - безліч дійсних чисел.

Ознака Хаара обчислюється по суміжних прямокутних областях. У стандартному методі Віоли-Джонса використовуються прямокутні примітиви, зображені малюнку 1.

Малюнок 1 – Примітиви Хаара

хаара
Малюнок 1

Обчислюваним значенням F ознаки Хаара буде

де X - сума значень яскравостей точок, що закриваються світлою частиною примітиву, Y - сума значень яскравостей точок, що закриваються темною частиною. Для обчислення використовується поняття інтегрального зображення,розглянуте вище і ознаки Хаара можуть обчислюватися швидко, за постійний час. Використання ознак Хаара дає точкове значення перепаду яскравості осі X і Y відповідно.

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

Класифікатор будується на основі алгоритму бустингу (від англ.boost -покращення, посилення) для вибору найбільш підходящих ознак для об'єкта, що шукається на даній частині зображення. У випадку бустинг — це комплекс методів, сприяють підвищенню точності аналітичних моделей. Ефективна модель, яка припускає мало помилок класифікації, називається "сильною". "Слабка" ж, навпаки, не дозволяє надійно розділяти класи або давати точні передбачення, робить велику кількість помилок. Тому бустинг означає "посилення" "слабких" моделей і є процедурою послідовної побудови композиції алгоритмів машинного навчання, коли кожен наступний алгоритм прагне компенсувати недоліки композиції всіх попередніх алгоритмів.

Через війну роботи алгоритму бустингу кожної ітерації формується простий класифікатор виду:

p_j - напрямок знака нерівності, θ_j - значення порога, f_j (z) - обчислене значення ознаки, z - вікно зображення розміром 24 × 24 пікселів.

Отриманий класифікатор має мінімальну помилку по відношенню до поточних значень ваг, задіяних у процедурі навчання визначення помилки.

Для пошуку об'єкта на цифровому зображенні використовується навченийкласифікатор представлений у форматі xml. Класифікатор формується на примітив Хаара.

деmaxWeakCount кількість слабких класифікаторів;

stageThereshold максимальний поріг яскравості;

weakClassifiers набір слабких класифікаторів, на основі яких виноситься рішення про те, знаходиться об'єкт на зображенні чи ні;

internalNodes таleafValues параметри конкретного слабкого класифікатора.

Перші два значення в internalNodes не використовуються, третє - номер ознаки в загальній таблиці ознак (вона розташовується в XML-файлі під тегом features), четверте - граничне значення слабкого класифікатора. Якщо значення ознаки Хаара менше порога слабкого класифікатора, вибирається перше значення leafValues, якщо більше друге.

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

Навчання каскаду Хаара

Для початку поставимо завдання. Наприклад, на зображенні автомобільного номера необхідно виділити символи.

opencv

Класифікатор формується на примітивах Хаара шляхом розрахунку значень ознак. Для навчання на вхід класифікатора спочатку подається набір «правильних» зображень із попередньо виділеною областю автомобільного номера, далі відбувається перебір примітивів та розрахунок значення ознаки. Обчислені значення зберігаються у файлі у форматі xml.

Утиліту для навчання каскаду Хаара вбудовано в пакет OpenCV.

Для навчання нам необхідно зібрати колекцію файлів, які нам надалі знадобляться.

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

Для детектора осіб, що стабільно працює, це 3000-4000 позитивних прикладів і стільки ж негативних. Із 500 позитивних та 1000 негативних мої колеги робили стабільний детектор номерів. Для детектора, який показаний у цій статті, я взяв 500 позитивних і 500 негативних фотографій. Чим більше та різноманітніше вибірка, тим стабільніше працює і тим довше навчається.

Для початку нам потрібно сформувати папку з позитивними та негативними фотографіями. Для цієї мети я використав програмуPicture Cropper завантажити. Робота з програмою: мишкою виділяється область, яка має бути збережена. По "s" відбувається збереження. За «r» – збереження та перехід до наступного зображення. За пробілом - просто перехід до наступного зображення.

Для навчання нам потрібно мати дві папки з прикладами. "Good" - папка з позитивними зображеннями, "Bad" - з негативними. Варто врахувати, що OpenCV відмовляється працювати з точками, пробілами та спец. символи. Не використовуйте ці символи в назвах прикладів. Ідеальні назви: "0.bmp", "1. bmp» і.т.д.

Для кожної папки з прикладами потрібно мати файлопис, в якому описані використовувані зображення. Стандартно їх називають "Good.dat" та "Bad.dat".

Файли мають лежати одному рівні з папками.

Файли опису негативних і позитивних об'єктів мають різну структуру. Для файлу негативних прикладів це список відносних шляхів до зображень:

Для файлів з позитивними прикладами запис трохи хитріший. Крім шляху має бути зазначено положення об'єкта, що розглядається, і його розмір. Варто пам'ятати, що один кадр – один об'єкт.

Приклад створення Good.dat та Bad.dat на прикладі роботи з Picture Cropper

  1. Створюємо папку, наприклад "Learn".
  2. Створюємо під папки:Good,Bad.
  3. РозпаковуємоPicture Cropper
  4. Перекидаємо до папки Good, зображення з об'єктом. (цілісні, не обрізані)

У результаті маємо вийти наступна структура:

Кладемо в папкуGood іBad необхідні файли.

навчання

ЗапускаємоPictureCropper.exe.

навчання

Вибираємо потрібну папку та обробляємо зображення.

Робота з програмою: мишкою виділяється область, яка має бути збережена. По "s" відбувається збереження. За «r» – збереження та перехід до наступного зображення. За пробілом - просто перехід до наступного зображення.

каскаду

Після завершення роботи ми маємо з'явитисяGood.dat. І в папціGood папкаCropper, у якій зберігаються обрізані зображення.

навчання

Чудово. Виконуємо теж саме з папкоюBad.

Після процедури обробки фотографій у папціBad, приведемо його файл описуBad.dat до «правильного вигляду».

Зараз файлBad.dat виглядає так:

Наводимо його допотрібного формату:

навчання

На цьому робота із файлами опису закінчена.

Переходимо до навчання.

Для початку відкриємо командний рядок і перейдемо до директорії з файлом описуGood.dat, тобто в папкуlearn :

Для створення пачки наведених позитивних зображень запустимо opencv_createsamples через консоль:

навчання

Якщо все пройшло успішно, має з'явитися файл samples.vec.

Створенням основного каскаду:

Для підрахунку підсумкового каскаду використовується програма opencv_traincascade.exe, що лежить в тій же папці, що і opencv_createsamples.exe. Працює довго. Навіть дуже довго. Навчання каскаду на 500-1000 об'єктів займе майже цілий день. Приклад навчався години 24. При виклику:

каскаду

Після того, як алгоритм закінчить роботу, у вас з'явиться папкаhaarcascade і файлcascade.xml у цій папці, це буде створений каскад.

Приклад виконання:

Напишемо просту програму на OpenCV для демонстрації роботи алгоритму: