середа, 14 квітня 2021 р.

Виявлення облич алгоритмом Віоли-Джонса

Mathedemo Алгоритм Віоли-Джонса є ефективним алгоритмом розпізнавання облич в режимі реального часу. Алгоритм на вхід отримує зображення, а на виході дані для побудови прямокутників всередині яких знаходяться виявлені обличя.

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

d:\opencv4\opencv\sources\data\

Приблизний перелік файлів папки з класифікаторами ( залежить від встановленої версії OpenCV):

haarcascade_eye.xml,

haarcascade_eye_tree_eyeglasses.xml,

haarcascade_frontalcatface.xml,

haarcascade_frontalcatface_extended.xml,

haarcascade_frontalface_alt.xml,

haarcascade_frontalface_alt2.xml,

haarcascade_frontalface_alt_tree.xml,

haarcascade_frontalface_default.xml,

haarcascade_fullbody.xml,

haarcascade_lefteye_2splits.xml,

haarcascade_licence_plate_rus_16stages.xml,

haarcascade_lowerbody.xml,

haarcascade_profileface.xml,

haarcascade_righteye_2splits.xml,

haarcascade_russian_plate_number.xml,

haarcascade_smile.xml,

haarcascade_upperbody.xml,

Для роботи з класифікаторами використовується клас CascadeClassifier. Для початку роботи потрібно завантажити xml-файл з відповідним класифікатором

 
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
 
Для роботи з завантаженими каскадними файлами використовується функція

класифікатор.detectMultiScale(image,scaleFactor,minNeighbors,flags,minSize,maxSize)

з наступними параметрами

  • image: файл зображення
  • scaleFactor: Параметр, що визначає, наскільки змінюється розмір зображення на кожному масштабі зображення.
  • minNeighbors: Параметр, що вказує, скільки сусідів повинен мати прямокутник. Більш високе значення призводить до меншого виявлення, але з більш високою якістю.
  • flags: не використовується
  • minSize: Мінімальний розмір об'єкта. Об'єкти меншого розміру ігноруються.
  • maxSize: Максимальний розмір об'єкта. Об'єкти більшого розміру ігноруються.
Функція detectMultiScale повертає кортеж із чотирьох чисел $(x,y,w,h)$ де $(x,y)$ -- координати верхньої лівої вершини прямокутника, $w,h$ -- його ширина і висота в пікселях.

Щоб виділити фронтально розташоване обличчя

використовується файл haarcascade_frontalface_alt.xml з відповідним класифікатором фронтально розміщених облич. Приклад використання
 
#завантажуємо відповідний класифікатор облич
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml') 
scaling_factor = 0.5 
frame = cv2.imread('ім'я файлу')
frame = cv2.resize(frame, None, fx=scaling_factor,fy=scaling_factor, interpolation=cv2.INTER_AREA)
face_rects = face_cascade.detectMultiScale(frame, scaleFactor=1.3, minNeighbors=3)
for (x,y,w,h) in face_rects: 
        cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 3)
В результаті отримаємо
Якщо обличчя розташоване не фронтально, а у профіль, то даний класифікатор може не виявити його. Приклад файлу, у якому із великої групи людей виявлено лише одне обличчя.
Для виявлення облич які можуть бути розташовані і у профіль, потрібно використовувати каскадний файл haarcascade_profileface.xml. Якщо застосувати каскадні файли haarcascade_frontalface_alt.xml i haarcascade_profileface.xml послідовно, то кількість виявлених облич може бути більшою
Підбираючи параметри можна збільшити кількість виявлених облич.

Немає коментарів:

Дописати коментар