opencv

Распознавание лиц OpenCV

Распознавание лиц OpenCV

Распознавание лиц с OpenCV

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

Компьютеры стали настолько сложными, что их учат думать как люди.
да!

Мы собираемся сделать что-то подобное в этой статье. Как люди, узнавать лица других людей - простая задача, и, несмотря на возможности современных компьютеров, это не так просто для компьютера, поэтому мы должны тренировать его, чтобы он мог делать то же самое.

Многие статьи, которые вы увидите, останавливаются на простом обнаружении лиц, но в этой статье будет рассказано не только об обнаружении лиц, но и о распознавании лиц.

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

Для начала нам нужно сначала установить opencv на наши машины, что можно сделать, только если у вас установлен Python. Установка Python не является целью этой статьи, поэтому, если он еще не установлен на вашем компьютере, вы можете установить Python с веб-сайта Python.

Чтобы установить Open CV, мы можем сделать это с помощью команды pip.

pip установить opencv-python

В этой статье мы также будем использовать пакет numpy, который должен быть установлен вместе с OpenCV с помощью указанной выше команды.

Если numpy не установился, вы можете легко сделать это с помощью следующей команды:

pip install numpy

Чтобы убедиться, что ваш OpenCV установлен, при активации интерактивной среды Python попробуйте импортировать его, используя:

импорт cv2

Если вы не получили сообщение об ошибке, можете продолжить.

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

Нам понадобится Каскад Хаара, предоставленный Open CV. Этот файл можно получить из каталога opencv, который называется cv2 / data / haarcascade_frontalface_default.xml на моей машине он должен быть таким же и на вашем компьютере. Скопируйте файл в папку, в которой вы хотите сделать распознавание лиц.

А теперь давайте углубимся в самую гущу событий.
Мы бы попытались заставить нашу веб-камеру получать изображения, необходимые для набора данных.

импорт cv2
vid_cam = cv2.VideoCapture (0)
face_detector = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ')
face_id = 1
count = 0
пока (vid_cam.открыт()):
ret, image_frame = vid_cam.читать()
серый = cv2.cvtColor (кадр_картинки, cv2.COLOR_BGR2GRAY)
Faces = face_detector.detectMultiScale (серый, 1.3, 5)
для (x, y, w, h) в гранях:
cv2.прямоугольник (кадр_изображения, (x, y), (x + w, y + h), (255,0,0), 2)
count + = 1
cv2.imwrite ("набор данных / Пользователь."+ str (face_id) + '.'+ str (количество) + ".jpg ", серый [y: y + h, x: x + w])
cv2.imshow ('рамка', кадр_фрагмента)
если cv2.waitKey (100) & 0xFF == ord ('q'):
перерыв
количество elif> 100:
перерыв
vid_cam.релиз()
cv2.destroyAllWindows ()

Итак, чтобы объяснить, что делает каждая строка кода:

импорт cv2

Вот команда, которая сообщает python включить внешнюю библиотеку, которая будет использоваться в этом коде, в данном случае это Open CV.

vid_cam = cv2.VideoCapture (0)

Этот код вызывает импортированную библиотеку Open CV для начала захвата, и в этот момент запускается веб-камера. Если Open CV не поддерживает вашу веб-камеру, код здесь не сработает.

face_detector = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ')

Этот код необходим для того, чтобы мы могли выполнять обнаружение изображений. В Open CV используется 'haarcascade_frontalface_default.xml 'для каскадной классификации. Полученный объект затем сохраняется в переменной face_detector.

face_id = 1

Вот случай установки идентификатора лица, поэтому первое лицо получает идентификатор 1.

count = 0

Мы собираемся сделать пару изображений, поскольку Open CV необходимо обучить изображения, чтобы они могли распознавать лица, переменная count служит для подсчета изображений.

пока (vid_cam.открыт()):

Это позволяет продолжить выполнение следующих операций, если видеокамера открыта. Метод isOpened () возвращает True или False.

ret, image_frame = vid_cam.читать()

Здесь vid_cam.read () просматривает видеозахват, а затем захватывает кадр, который хранится в переменной image_frame, если операция прошла успешно, возвращается логическое значение True и сохраняется в переменной ret

серый = cv2.cvtColor (кадр_образа, cv2.COLOR_BGR2GRAY)

Метод cvtColor () используется для преобразования кадра изображения в желаемый цветовой тип. В данном случае мы преобразовали его в оттенки серого.

Faces = face_detector.detectMultiScale (серый, 1.3, 5)

Это проверяет фреймы разных размеров и пытается установить их для масштабирования, это применяется к переменной, к которой был применен каскад Хаара.

для (x, y, w, h) в гранях:

Здесь мы перебираем грани и их размеры, где x и y обозначают координаты, а w и h обозначают ширину и высоту соответственно.

cv2.прямоугольник (кадр_изображения, (x, y), (x + w, y + h), (255,0,0), 2)

Помните, что мы все еще работаем с видеокамерой, затем видеокамера обрезает нужную часть изображения в соответствии с указанными выше размерами.

count + = 1

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

cv2.imwrite ("набор данных / Пользователь."+ str (face_id) + '.'+ str (количество) + ".jpg ", серый [y: y + h, x: x + w])

Обрезанное изображение сохраняется под именем Пользователь (face_id).(считать).jpg и поместите в папку под названием набор данных.

cv2.imshow ('рамка', изображение_фрейма)

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

если cv2.waitKey (100) & 0xFF == ord ('q'):
перерыв

После каждого изображения пользователю разрешается запретить программе делать больше снимков, что можно сделать, нажав клавишу «q» на клавиатуре как минимум на 100 мс.

elif count> 100:
перерыв

Этот код останавливает работу видео в момент, когда было сделано 100 снимков, независимо от того, хочет ли пользователь сделать больше или нет.

vid_cam.релиз()

Здесь веб-камера закрыта и не просто перестает фотографировать.

cv2.destroyAllWindows ()

Затем все окна, открытые OpenCV, были уничтожены, и код работает до завершения.

Теперь, когда мы с этим закончили, мы можем приступить к обучению набора данных изображения:

импорт cv2, os
импортировать numpy как np
из PIL импорта изображения
распознаватель = cv2.лицо.createLBPHFaceRecognizer ()
детектор = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml ");
def getImagesAndLabels (путь):
imagePaths = [os.дорожка.join (путь, f) для f в os.listdir (путь)]
faceSamples = []
ids = []
для imagePath в imagePaths:
PIL_img = Изображение.открыть (imagePath).конвертировать ('L')
img_numpy = np.массив (PIL_img, 'uint8')
id = int (os.дорожка.split (imagePath) [- 1].расколоть(".") [1])
лица = детектор.detectMultiScale (img_numpy)
для (x, y, w, h) в гранях:
faceSamples.добавить (img_numpy [y: y + h, x: x + w])
идентификаторы.добавить (идентификатор)
вернуть faceSamples, ids
лица, ids = getImagesAndLabels ('набор данных')
распознаватель.поезд (лица, нп.массив (идентификаторы))
распознаватель.save ('тренер / тренер.yml ')

Давайте объясним и этот код:

импорт cv2, os

Как и другой код, здесь мы импортируем OpenCV и os, которые нам понадобятся для пути к файлу.

импортировать numpy как np

Мы также импортируем библиотеку numpy, которая будет использоваться для вычисления матрицы (матрица - это просто набор массивов).

из PIL импорта изображения

Мы импортируем библиотеку изображений Python, а затем из нее получаем библиотеку изображений из этого пакета.

распознаватель = cv2.лицо.createLBPHFaceRecognizer ()

Что это значит, так это применить метод createLBPHFaceRecognizer () к cv2.лицо, это поможет упростить распознавание лиц, поскольку нам не нужно придумывать собственный набор алгоритмов.

детектор = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml ");

Если вы следовали руководству, вы бы столкнулись с этим раньше. Он помогает распознавать лица с помощью «haarcascade_frontalface_default».xml »для Каскадной классификации.

def getImagesAndLabels (путь):

Теперь мы собираемся начать собственно обучение изображения, поэтому мы создаем функцию.

imagePaths = [os.дорожка.join (путь, f) для f в os.listdir (путь)]

Этот код проверяет текущий каталог файла и проверяет файлы изображений, а затем добавляет их в этот список.

faceSamples = []

Это инициализирует список образцов, на данный момент он пуст, но лица будут добавляться по мере выполнения кода.

ids = []

Инициализировать список идентификаторов, который изначально пуст.

для imagePath в imagePaths:

Помните код, который проверял файлы изображений в каталоге? да? Теперь мы перебираем каждый из этих файлов и выполняем над ними операции.

PIL_img = Изображение.открыть (imagePath).конвертировать ('L')

Теперь первое, что мы делаем с изображением, это преобразовываем его в оттенки серого, и этот код делает это.

img_numpy = np.массив (PIL_img, 'uint8')

Изображение в оттенках серого - это просто набор чисел в одном месте, поэтому мы создаем из них массив и присваиваем его переменной.

id = int (os.дорожка.split (imagePath) [- 1].расколоть(".") [1])

Если вы вспомните файл, который получает изображения, вы вспомните, что мы назвали файлы User (face_id).считать.jpg. Итак, здесь мы разделяем имена с помощью символа «."А затем мы извлекаем face_id и присваиваем переменной здесь. Нам понадобится идентификатор для распознавания.

лица = детектор.detectMultiScale (img_numpy)

Из массива numpy метод detectMultiScale () попытается обнаружить лица по шаблону, который он находит в массиве numpy. Затем он присваивает значения переменной лиц.

для (x, y, w, h) в гранях:

Здесь мы перебираем значения, присвоенные переменной. Значения здесь - это координаты x и y, которые мы могли бы принять за начало координат, а затем w и h, обозначающие ширину и высоту соответственно.

faceSamples.добавить (img_numpy [y: y + h, x: x + w])

Ранее мы создали список образцов лиц, но он был пустым. Здесь мы можем добавить лица в этот список, и мы добавляем y к h, чтобы получить два значения координат y, и то же самое делается с x.

идентификаторы.добавить (идентификатор)

Теперь у нас есть лицо в списке образцов лиц, поэтому мы получаем его идентификатор и также добавляем его в список идентификаторов.

вернуть faceSamples, ids

Затем после всего этого мы возвращаем список образцов лиц и список идентификаторов.

лица, ids = getImagesAndLabels ('набор данных')

Помните, что getImagesAndLabels () - это просто функция. Итак, мы можем вызвать функцию здесь, и возвращаемые значения сохраняются в переменных лиц и идентификаторов.

распознаватель.поезд (лица, нп.массив (идентификаторы))

Вот где происходит настоящая тренировка. Ранее мы применили метод createLBPHFaceRecognizer () и присвоили ему переменную распознавателя. Время тренировки!

распознаватель.save ('тренер / тренер.yml ')

После тренировки получаем сохранение результатов тренировки.
После запуска кода создается файл с именем трейнер.yml, который затем будет использоваться кодом распознавания лиц.

Вот код распознавания лиц:

импорт cv2
импортировать numpy как np
распознаватель = cv2.лицо.createLBPHFaceRecognizer ()
распознаватель.load ('тренер / тренер.yml ')
cascadePath = "haarcascade_frontalface_default.xml "
faceCascade = cv2.CascadeClassifier (cascadePath)
font = cv2.FONT_HERSHEY_SIMPLEX
cam = cv2.VideoCapture (0)
в то время как True:
ret, im = cam.читать()
серый = cv2.cvtColor (im, cv2.COLOR_BGR2GRAY)
Faces = faceCascade.detectMultiScale (серый, 1.2,5)
для (x, y, w, h) в гранях:
cv2.прямоугольник (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)
Id = распознаватель.предсказать (серый [y: y + h, x: x + w])
если (Id == 1):
Id = "Назми"
еще:
Id = "Неизвестно"
cv2.прямоугольник (im, (x-22, y-90), (x + w + 22, y-22), (0,255,0), -1)
cv2.putText (im, str (Id), (x, y-40), font, 2, (255,255,255), 3)
cv2.imshow ('им', им)
если cv2.waitKey (10) & 0xFF == ord ('q'):
перерыв
кулачок.релиз()
cv2.destroyAllWindows ()

Если вы следили за статьей с самого начала, мы делали это раньше. Если вы не любезно сделаете.

распознаватель.load ('тренер / тренер.yml ')

Помните, мы обучили распознаватель и сохранили файл? да? Мы загружаем этот файл сейчас.

cascadePath = "haarcascade_frontalface_default.xml "

Мы бы работали с файлом haarcascade, и здесь мы присвоили имя файла переменной.

# Создать классификатор из готовой модели
faceCascade = cv2.CascadeClassifier (cascadePath)

Здесь мы можем выполнить каскадную классификацию в файле haarcascade.

font = cv2.FONT_HERSHEY_SIMPLEX

Мы устанавливаем тип шрифта, который будет использоваться, когда код распознает лицо на изображении и отображает имя.

cam = cv2.VideoCapture (0)

Мы были здесь раньше, но на этот раз пора узнать лица. Если вы не знаете, что делает этот код, он запускает веб-камеру.

в то время как True:
ret, im = cam.читать()
серый = cv2.cvtColor (im, cv2.COLOR_BGR2GRAY)
Faces = faceCascade.detectMultiScale (серый, 1.2,5)
для (x, y, w, h) в гранях:

Все это было сделано раньше, пожалуйста, проверьте код, который использовался для сохранения изображений, если вы не знаете, что делает код.

cv2.прямоугольник (im, (x-20, y-20), (x + w + 20, y + h + 20), (0,255,0), 4)

Таким образом, это помогает веб-камере определять, где находятся лица, и помещает прямоугольник для обозначения лица.

Id = распознаватель.предсказать (серый [y: y + h, x: x + w])

Мы уже загрузили файл поезда в распознаватель, поэтому теперь он может распознать лицо.

если (Id == 1):
Id = "Я"
еще:
Id = "Неизвестно"

После попытки распознать, что это за лицо, он проверяет идентификатор и видит, существует ли он. Здесь значением Id будет имя того, кто владел, столкнувшись с таким идентификатором при создании набора данных изображения.

cv2.прямоугольник (im, (x-22, y-90), (x + w + 22, y-22), (0,255,0), -1)
cv2.putText (im, str (Id), (x, y-40), font, 2, (255,255,255), 3)

Код после нахождения владельца идентификатора рисует прямоугольник вокруг лица и помещает имя владельца лица. Лицо распознано!

cv2.imshow ('им', им)

Здесь видеокадр отображается в виде ограниченного прямоугольника.

если cv2.waitKey (10) & 0xFF == ord ('q'):
перерыв
кулачок.релиз()
cv2.destroyAllWindows ()

Поэтому, когда закончите, вы можете остановить программу, нажав клавишу 'q', и она остановит веб-камеру и закроет ее.

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

Вы можете найти исходный код, используемый в его репозитории на github. Также напишите нам в Твиттере, если у вас есть комментарии или вы хотите обсудить @linuxhint

Как установить Doom и играть в него в Linux
Введение в Doom Серия Doom возникла в 90-х годах после выхода оригинальной Doom. Это мгновенно стал хитом, и с тех пор серия игр получила множество на...
Vulkan для пользователей Linux
С каждым новым поколением видеокарт мы видим, как разработчики игр расширяют границы графической точности и приближаются на шаг ближе к фотореализму. ...
OpenTTD против Simutrans
Создание собственного транспортного симулятора может быть увлекательным, расслабляющим и чрезвычайно увлекательным занятием. Вот почему вам нужно попр...