Python - проект обнаружения моргания глаз
В этом руководстве вы узнаете об обнаружении моргания человеческого глаза с помощью карт функций, известных как каскады хаара. Здесь, в проекте, мы будем использовать язык Python вместе с библиотекой OpenCV для выполнения алгоритма и обработки изображений соответственно. Каскады haar, которые мы собираемся использовать в проекте, предварительно обучены и хранятся вместе с библиотекой OpenCV в виде файлов haarcascade_frontalface_default.xml и haarcascade_eye_tree_eyeglasses.xml. Проект развивает базовое понимание систем, таких как обнаружение сонливости водителя, блокировка моргания глаз, обнаружение глаз, обнаружение лиц, а также использование каскадов хаара с библиотекой OpenCV.
Информация о Хаарских каскадах:
Каскадные классификаторы Хаара на основе функций - это эффективный метод обнаружения объектов, предложенный Полом Виолой и Майклом Джонсом в их статье «Быстрое обнаружение объектов с использованием усиленного каскада простых функций» в 2001 году. Это подход, основанный на машинном обучении, где каскадная функция обучается на множестве положительных и отрицательных образов. Здесь положительные изображения - это образцы, которые содержат целевой объект, а отрицательные - те, которые не содержат. Для обучения классификатора требуется много положительных и отрицательных образцов.
Теперь мы извлекаем черты из данного входного изображения с помощью характерных черт, показанных на изображении выше. Они похожи на сверточные ядра. Каждая функция представляет собой отдельное значение, полученное путем вычитания суммы пикселей под белым прямоугольником из суммы пикселей под черным прямоугольником.
Чрезмерный расчет:
При всех возможных размерах классификаторов вычисляются признаки, но объем вычислений, необходимых для вычисления признаков, в окне 24 × 24 дает более 160000 объектов. Также для каждого вычисления функции также необходима сумма пикселей. Чтобы сделать его менее затратным в вычислительном отношении, создатели каскадов хаара ввели интегральное изображение, что означает, что каким бы большим ни было ваше изображение, оно сокращает вычисления для данного пикселя до операции, включающей всего четыре пикселя.
Ложные черты
Теперь среди вычисляемых характеристик большинство характеристик ложны и неактуальны. Теперь окно, которое применяется к области изображения, может видеть другую область, которая кажется окну с теми же характеристиками, но на самом деле это не так. Таким образом, необходимо удалить ложные функции, которые были реализованы с помощью AdaBoost, что помогло выбрать лучшие функции из 160000+ функций. Краткая форма Adaboost Adaptive Boosting - это алгоритм машинного обучения, который использовался для этой единственной задачи.
Алгоритм:
- Кадр фиксируется и преобразуется в оттенки серого.
- Двусторонняя фильтрация применяется для удаления примесей.
- Лицо распознается с помощью haarcascade.
- ROI (область изображения) лица передается в часть алгоритма обнаружения глаз.
- Глаза обнаруживаются, и результирующий список передается конструкции if-else.
- Если длина списка больше двух, значит, глаза есть.
- В противном случае программа помечается, чтобы на нее моргнули и она была перезапущена.
Код:
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() |
Пример вывода:
Исходный код и каскадные классификаторы можно найти здесь.