Python - проект обнаружения моргания глаз

Опубликовано: 20 Июля, 2021

В этом руководстве вы узнаете об обнаружении моргания человеческого глаза с помощью карт функций, известных как каскады хаара. Здесь, в проекте, мы будем использовать язык Python вместе с библиотекой OpenCV для выполнения алгоритма и обработки изображений соответственно. Каскады haar, которые мы собираемся использовать в проекте, предварительно обучены и хранятся вместе с библиотекой OpenCV в виде файлов haarcascade_frontalface_default.xml и haarcascade_eye_tree_eyeglasses.xml. Проект развивает базовое понимание систем, таких как обнаружение сонливости водителя, блокировка моргания глаз, обнаружение глаз, обнаружение лиц, а также использование каскадов хаара с библиотекой OpenCV.

Информация о Хаарских каскадах:
Каскадные классификаторы Хаара на основе функций - это эффективный метод обнаружения объектов, предложенный Полом Виолой и Майклом Джонсом в их статье «Быстрое обнаружение объектов с использованием усиленного каскада простых функций» в 2001 году. Это подход, основанный на машинном обучении, где каскадная функция обучается на множестве положительных и отрицательных образов. Здесь положительные изображения - это образцы, которые содержат целевой объект, а отрицательные - те, которые не содержат. Для обучения классификатора требуется много положительных и отрицательных образцов.

Возможности Haar, исходный код - OpenCV docs

Теперь мы извлекаем черты из данного входного изображения с помощью характерных черт, показанных на изображении выше. Они похожи на сверточные ядра. Каждая функция представляет собой отдельное значение, полученное путем вычитания суммы пикселей под белым прямоугольником из суммы пикселей под черным прямоугольником.

Применение haarcascades, исходный код - OpenCV Docs

Чрезмерный расчет:
При всех возможных размерах классификаторов вычисляются признаки, но объем вычислений, необходимых для вычисления признаков, в окне 24 × 24 дает более 160000 объектов. Также для каждого вычисления функции также необходима сумма пикселей. Чтобы сделать его менее затратным в вычислительном отношении, создатели каскадов хаара ввели интегральное изображение, что означает, что каким бы большим ни было ваше изображение, оно сокращает вычисления для данного пикселя до операции, включающей всего четыре пикселя.

Ложные черты
Теперь среди вычисляемых характеристик большинство характеристик ложны и неактуальны. Теперь окно, которое применяется к области изображения, может видеть другую область, которая кажется окну с теми же характеристиками, но на самом деле это не так. Таким образом, необходимо удалить ложные функции, которые были реализованы с помощью AdaBoost, что помогло выбрать лучшие функции из 160000+ функций. Краткая форма Adaboost Adaptive Boosting - это алгоритм машинного обучения, который использовался для этой единственной задачи.

Алгоритм:

  1. Кадр фиксируется и преобразуется в оттенки серого.
  2. Двусторонняя фильтрация применяется для удаления примесей.
  3. Лицо распознается с помощью haarcascade.
  4. ROI (область изображения) лица передается в часть алгоритма обнаружения глаз.
  5. Глаза обнаруживаются, и результирующий список передается конструкции if-else.
  6. Если длина списка больше двух, значит, глаза есть.
  7. В противном случае программа помечается, чтобы на нее моргнули и она была перезапущена.

Код:
Haarcascade_frontalface_default.xml и haarcascade_eye_tree_eyeglasses.xml - это файлы xml, которые хранятся в том же каталоге, что и скрипт python.




#All the imports go here
import numpy as np
import cv2
#Initializing the face and eye cascade classifiers from xml files
face_cascade = cv2.CascadeClassifier( 'haarcascade_frontalface_default.xml' )
eye_cascade = cv2.CascadeClassifier( 'haarcascade_eye_tree_eyeglasses.xml' )
#Variable store execution state
first_read = True
#Starting the video capture
cap = cv2.VideoCapture( 0 )
ret,img = cap.read()
while (ret):
ret,img = cap.read()
#Coverting the recorded image to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Applying filter to remove impurities
gray = cv2.bilateralFilter(gray, 5 , 1 , 1 )
#Detecting the face for region of image to be fed to eye classifier
faces = face_cascade.detectMultiScale(gray, 1.3 , 5 ,minSize = ( 200 , 200 ))
if ( len (faces)> 0 ):
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x + w,y + h),( 0 , 255 , 0 ), 2 )
#roi_face is face which is input to eye classifier
roi_face = gray[y:y + h,x:x + w]
roi_face_clr = img[y:y + h,x:x + w]
eyes = eye_cascade.detectMultiScale(roi_face, 1.3 , 5 ,minSize = ( 50 , 50 ))
#Examining the length of eyes object for eyes
if ( len (eyes)> = 2 ):
#Check if program is running for detection
if (first_read):
cv2.putText(img,
"Eye detected press s to begin" ,
( 70 , 70 ),
cv2.FONT_HERSHEY_PLAIN, 3 ,
( 0 , 255 , 0 ), 2 )
else :
cv2.putText(img,
"Eyes open!" , ( 70 , 70 ),
cv2.FONT_HERSHEY_PLAIN, 2 ,
( 255 , 255 , 255 ), 2 )
else :
if (first_read):
#To ensure if the eyes are present before starting
cv2.putText(img,
"No eyes detected" , ( 70 , 70 ),
cv2.FONT_HERSHEY_PLAIN, 3 ,
( 0 , 0 , 255 ), 2 )
else :
#This will print on console and restart the algorithm
print ( "Blink detected--------------" )
cv2.waitKey( 3000 )
first_read = True
else :
cv2.putText(img,
"No face detected" ,( 100 , 100 ),
cv2.FONT_HERSHEY_PLAIN, 3 ,
( 0 , 255 , 0 ), 2 )
#Controlling the algorithm with keys
cv2.imshow( 'img' ,img)
a = cv2.waitKey( 1 )
if (a = = ord ( 'q' )):
break
elif (a = = ord ( 's' ) and first_read):
#This will start the detection
first_read = False
cap.release()
cv2.destroyAllWindows()

Пример вывода:

Пример выполнения приведенного выше кода

Исходный код и каскадные классификаторы можно найти здесь.

Следующий
Python | Распознавание лиц с использованием графического интерфейса
Рекомендуемые статьи
Страница :
Статья предоставлена:
инфоарян
@infoaryan
Голосуйте за трудности
Текущая сложность: сложная
Теги статьи:
  • Python-проекты
  • Машинное обучение
  • Проект
  • Python
Теги практики:
  • Машинное обучение
Сообщить о проблеме
Python Машинное обучение Проект

РЕКОМЕНДУЕМЫЕ СТАТЬИ