Оглавление:

Распознавание лиц в реальном времени: комплексный проект: 8 шагов (с изображениями)
Распознавание лиц в реальном времени: комплексный проект: 8 шагов (с изображениями)

Видео: Распознавание лиц в реальном времени: комплексный проект: 8 шагов (с изображениями)

Видео: Распознавание лиц в реальном времени: комплексный проект: 8 шагов (с изображениями)
Видео: РАСПОЗНАВАНИЕ ЛИЦ В РЕАЛЬНОМ ВРЕМЕНИ 5 МИНУТ PYTHON & OPENCV & FACE RECOGNITION Ч.1 2024, Июль
Anonim
Распознавание лиц в реальном времени: комплексный проект
Распознавание лиц в реальном времени: комплексный проект

В моем последнем руководстве по OpenCV мы изучили АВТОМАТИЧЕСКОЕ ОТСЛЕЖИВАНИЕ ОБЪЕКТОВ ВИДЕНИЯ. Теперь мы будем использовать нашу PiCam для распознавания лиц в реальном времени, как вы можете видеть ниже:

Изображение
Изображение

Этот проект был выполнен с помощью этой фантастической «Библиотеки компьютерного зрения с открытым исходным кодом» OpenCV. В этом руководстве мы сосредоточимся на Raspberry Pi (то есть Raspbian как ОС) и Python, но я также протестировал код на своем Mac, и он также отлично работает. OpenCV был разработан для вычислительной эффективности и с упором на приложения реального времени. Таким образом, он идеально подходит для распознавания лиц в реальном времени с помощью камеры.

Чтобы создать законченный проект по распознаванию лиц, мы должны работать над 3 очень разными фазами:

  1. Обнаружение лиц и сбор данных
  2. Обучите распознаватель
  3. Распознавание лица

На приведенной ниже блок-схеме возобновляются эти этапы:

Изображение
Изображение

Шаг 1: BoM - Спецификация материалов

Основные части:

  1. Raspberry Pi V3 - 32 доллара США.
  2. 5-мегапиксельный сенсор 1080p OV5647 Mini Camera Video Module - US $ 13.00

Шаг 2: Установка пакета OpenCV 3

Установка пакета OpenCV 3
Установка пакета OpenCV 3

Я использую Raspberry Pi V3, обновленный до последней версии Raspbian (Stretch), поэтому лучший способ установить OpenCV - это следовать отличному руководству, разработанному Адрианом Роузброком: Raspbian Stretch: установить OpenCV 3 + Python на Raspberry Pi.

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

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

Зайдем в нашу виртуальную среду и убедимся, что OpenCV 3 правильно установлен.

Адриан рекомендует запускать команду «source» каждый раз, когда вы открываете новый терминал, чтобы убедиться, что системные переменные настроены правильно.

источник ~ /.profile

Затем войдем в нашу виртуальную среду:

workon cv

Если перед приглашением вы видите текст (cv), значит, вы находитесь в виртуальной среде cv:

(cv) pi @ raspberry: ~ $Адриан обращает внимание на то, что виртуальная среда cv Python полностью независима и отделена от версии Python по умолчанию, включенной в загрузку Raspbian Stretch. Таким образом, любые пакеты Python в глобальном каталоге site-packages не будут доступны для виртуальной среды cv. Точно так же любые пакеты Python, установленные в пакетах сайтов cv, не будут доступны для глобальной установки Python.

Теперь введите в свой интерпретатор Python:

питон

и подтвердите, что вы используете версию 3.5 (или выше)

Внутри интерпретатора (появится ">>>") импортируйте библиотеку OpenCV:

импорт cv2

Если сообщения об ошибках не появляются, OpenCV правильно установлен НА ВАШЕЙ ВИРТУАЛЬНОЙ СРЕДЕ PYTHON.

Вы также можете проверить установленную версию OpenCV:

cv2._ version_

Должна появиться 3.3.0 (или более высокая версия, которая может быть выпущена в будущем). Вышеупомянутый терминал PrintScreen показывает предыдущие шаги.

Шаг 3. Тестирование камеры

Тестирование камеры
Тестирование камеры

После того, как вы установили OpenCV в свой RPi, давайте проверим, чтобы убедиться, что ваша камера работает правильно.

Я предполагаю, что у вас уже установлена PiCam на Raspberry Pi.

Введите приведенный ниже код Python в свою среду IDE:

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

import cv2 cap = cv2. VideoCapture (0) cap.set (3, 640) # установить ширину cap.set (4, 480) # установить высоту while (True): ret, frame = cap.read () frame = cv2. flip (frame, -1) # Повернуть камеру по вертикали gray = cv2.cvtColor (frame, cv2. COLOR_BGR2GRAY) cv2.imshow ('frame', frame) cv2.imshow ('gray', gray) k = cv2.waitKey (30) & 0xff if k == 27: # нажмите 'ESC', чтобы выйти из break cap.release () cv2.destroyAllWindows ()

Приведенный выше код будет захватывать видеопоток, который будет сгенерирован вашей камерой PiCam, отображая оба цвета в цвете BGR и в сером режиме.

Обратите внимание, что я повернул камеру вертикально из-за того, как она собрана. Если это не ваш случай, прокомментируйте или удалите командную строку «перевернуть».

Вы также можете загрузить код с моего GitHub: simpleCamTest.py

Для выполнения введите команду:

python simpleCamTest.py

Чтобы завершить программу, вы должны нажать клавишу [ESC] на клавиатуре.

Щелкните мышью в окне видео перед нажатием [ESC]

На картинке выше показан результат.

Некоторые производители обнаружили проблемы при попытке открыть камеру (сообщения об ошибке «Assertion failed»). Это могло произойти, если камера не была включена во время установки OpenCv, и поэтому драйверы камеры установились некорректно. Для исправления используйте команду:

sudo modprobe bcm2835-v4l2

Вы также можете добавить bcm2835-v4l2 в последнюю строку файла / etc / modules, чтобы драйвер загружался при загрузке.

Чтобы узнать больше об OpenCV, вы можете следовать руководству: loading -video-python-opencv-tutorial

Шаг 4: Распознавание лиц

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

Самая основная задача распознавания лиц - это, конечно же, «Распознавание лиц». Прежде всего, вы должны «захватить» лицо (Фаза 1), чтобы распознать его, по сравнению с новым лицом, захваченным в будущем (Фаза 3).

Наиболее распространенный способ обнаружения лица (или любых объектов) - использование «классификатора каскада Хаара».

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

Здесь мы будем работать с распознаванием лиц. Изначально алгоритму требуется много положительных изображений (изображений лиц) и негативных изображений (изображений без лиц) для обучения классификатора. Затем нам нужно извлечь из него функции. Хорошей новостью является то, что OpenCV поставляется с детектором и тренером. Если вы хотите обучить свой собственный классификатор для любого объекта, такого как автомобиль, самолет и т. Д., Вы можете использовать OpenCV для его создания. Его полная информация представлена здесь: Обучение каскадному классификатору.

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

Хватит теории, давайте создадим детектор лиц с OpenCV!

Загрузите файл faceDetection.py с моего GitHub.

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

import cv2 faceCascade = cv2. CascadeClassifier ('Cascades / haarcascade_frontalface_default.xml') cap = cv2. VideoCapture (0) cap.set (3, 640) # установить ширину cap.set (4, 480) # установить высоту, пока True: ret, img = cap.read () img = cv2.flip (img, -1) серый = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale (gray, scaleFactor = 1.2, minNeighbors = 5, minSize = (20, 20)) для (x, y, w, h) в гранях: cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2) roi_gray = серый [y: y + h, x: x + w] roi_color = img [y: y + h, x: x + w] cv2.imshow ('video', img) k = cv2.waitKey (30) & 0xff if k == 27: # нажмите 'ESC', чтобы выйти из break cap.release () cv2.destroyAllWindows ()

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

Когда вы сравните с последним кодом, использованным для тестирования камеры, вы поймете, что к нему было добавлено несколько деталей. Обратите внимание на строку ниже:

faceCascade = cv2. CascadeClassifier ('Каскады / haarcascade_frontalface_default.xml')

Это строка, которая загружает «классификатор» (который должен находиться в каталоге с именем «Cascades /» в каталоге вашего проекта).

Затем мы настроим нашу камеру и внутри цикла загрузим наше входное видео в режиме оттенков серого (то же, что мы видели раньше).

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

Faces = faceCascade.detectMultiScale (серый, scaleFactor = 1,2, minNeighbors = 5, minSize = (20, 20))

Где,

  • серый - это входное изображение в градациях серого.
  • scaleFactor - это параметр, определяющий, насколько уменьшается размер изображения при каждом масштабе изображения. Он используется для создания масштабной пирамиды.
  • minNeighbors - это параметр, определяющий, сколько соседей должен иметь каждый прямоугольник-кандидат, чтобы сохранить его. Чем больше число, тем меньше ложных срабатываний.
  • minSize - это минимальный размер прямоугольника, который считается лицом.

Функция обнаружит лица на изображении. Далее мы должны «отметить» лица на изображении, используя, например, синий прямоугольник. Это делается с помощью этой части кода:

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

cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2) roi_gray = серый [y: y + h, x: x + w] roi_color = img [y: y + h, x: x + w]

Если лица найдены, он возвращает положения обнаруженных лиц в виде прямоугольника с левым верхним углом (x, y) и с шириной «w» и высотой «h» ==> (x, y, w, час). См. Изображение выше.

Как только мы получим эти местоположения, мы можем создать «ROI» (нарисованный прямоугольник) для лица и представить результат с помощью функции imshow ().

Запустите указанный выше скрипт python в своей среде python, используя терминал Rpi:

python faceDetection.py

Результат:

Изображение
Изображение

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

Обратите внимание, что на Pi наличие нескольких классификаторов в одном коде замедлит обработку, если этот метод обнаружения (HaarCascades) использует большую вычислительную мощность. На настольном компьютере запустить его проще.

На моем GitHub вы найдете и другие примеры:

faceEyeDetection.py

faceSmileDetection.py

faceSmileEyeDetection.py

И на картинке выше вы можете увидеть результат.

Вы также можете следовать приведенному ниже руководству, чтобы лучше понять функцию распознавания лиц:

Каскадное обнаружение объектов Haar Face & Eye OpenCV Python Учебное пособие

Шаг 5: Сбор данных

Сбор данных
Сбор данных
Сбор данных
Сбор данных

Прежде всего, я должен поблагодарить Рамиза Раджа за его отличную работу над распознаванием лиц на фотографиях:

РАСПОЗНАВАНИЕ ЛИЦ С ПОМОЩЬЮ OPENCV И PYTHON: РУКОВОДСТВО ДЛЯ НАЧИНАЮЩИХ

а также Анирбан Кар, который разработал очень подробное руководство с использованием видео:

РАСПОЗНАВАНИЕ ЛИЦА - 3 части

Я действительно рекомендую вам взглянуть на оба руководства.

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

Сначала создайте каталог, в котором вы разрабатываете свой проект, например, FacialRecognitionProject:

mkdir FacialRecognitionProject

В этом каталоге, помимо трех сценариев Python, которые мы создадим для нашего проекта, мы должны сохранить в нем классификатор лиц. Вы можете скачать его с моего GitHub: haarcascade_frontalface_default.xml

Затем создайте подкаталог, в котором мы будем хранить образцы наших лиц, и назовите его «набор данных»:

набор данных mkdir

И скачайте код с моего GitHub: 01_face_dataset.py

импорт cv2

import os cam = cv2. VideoCapture (0) cam.set (3, 640) # установить ширину видео cam.set (4, 480) # установить высоту видео face_detector = cv2. CascadeClassifier ('haarcascade_frontalface_default.xml') # Для каждого человека введите один числовой идентификатор лица face_id = input ('\ n введите идентификатор пользователя end press ==>') print ("\ n [INFO] Инициализация захвата лица. Посмотрите в камеру и подождите…") # Инициализируйте индивидуальный счетчик числа лиц выборки = 0 while (True): ret, img = cam.read () img = cv2.flip (img, -1) # перевернуть видеоизображение по вертикали серым = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) faces = face_detector.detectMultiScale (серый, 1.3, 5) для (x, y, w, h) в гранях: cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2) count + = 1 # Сохранить захваченное изображение в папку наборов данных cv2.imwrite ("dataset / User." + str (face_id) + '.' + str (count) + ".jpg", серый [y: y + h, x: x + w]) cv2.imshow ('image', img) k = cv2.waitKey (100) & 0xff # Нажмите 'ESC' для выхода из видео, если k == 27: break elif count> = 30: # Возьмите 30 образцов лица и остановите видео паузу # Сделайте ab это очистки print ("\ n [INFO] Выход из программы и очистка") cam.release () cv2.destroyAllWindows ()

Код очень похож на код, который мы видели для распознавания лиц. Мы добавили «команду ввода» для захвата идентификатора пользователя, который должен быть целым числом (1, 2, 3 и т. Д.).

face_id = input ('\ n введите идентификатор пользователя end press ==>')

И для каждого из захваченных кадров мы должны сохранить его как файл в каталоге «набора данных»:

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

Обратите внимание, что для сохранения указанного выше файла вы должны импортировать библиотеку «os». Имя каждого файла будет соответствовать структуре:

User.face_id.count.jpg

Например, для пользователя с face_id = 1 четвертый образец файла в каталоге dataset / будет выглядеть примерно так:

User.1.4.jpg

как показано на фото выше с моего Pi. В моем коде я беру 30 образцов с каждого идентификатора. Вы можете поменять его на последнем "элифе". Количество образцов используется для разрыва цикла, в котором снимаются образцы лиц.

Запустите скрипт Python и запишите несколько идентификаторов. Вы должны запускать сценарий каждый раз, когда хотите объединить нового пользователя (или изменить фотографии для уже существующего).

Шаг 6: тренер

Тренер
Тренер

На этом втором этапе мы должны взять все пользовательские данные из нашего набора данных и «обучить» OpenCV Recognizer. Это делается напрямую с помощью конкретной функции OpenCV. Результатом будет файл.yml, который будет сохранен в каталоге "trainer /".

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

mkdir трейнер

Загрузите с моего GitHub второй скрипт Python: 02_face_training.py

импорт cv2

импортировать numpy как np из PIL import Image import os # Путь к базе данных изображений лиц path = 'dataset' распознаватель = cv2.face. LBPHFaceRecognizer_create () Detector = cv2. CascadeClassifier ("haarcascade_frontalface_default.xml"); # функция для получения изображений и данных меток def getImagesAndLabels (path): imagePaths = [os.path.join (path, f) для f в os.listdir (path)] faceSamples = ids = для imagePath в imagePaths: PIL_img = Image.open (imagePath).convert ('L') # преобразовать его в оттенки серого img_numpy = np.array (PIL_img, 'uint8') id = int (os.path.split (imagePath) [- 1]. split (".") [1]) Faces = DetectMultiScale (img_numpy) для (x, y, w, h) в лицах: faceSamples.append (img_numpy [y: y + h, x: x + w]) ids.append (id) return faceSamples, ids print ("\ n [INFO] Тренировка лиц. Это займет несколько секунд. Подождите…") faces, ids = getImagesAndLabels (path) распознаватель.train (faces, np.array (ids)) # Сохраните модель в trainer / trainer.yml распознаватель.write ('trainer / trainer.yml') # распознаватель.save () работала на Mac, но не на Pi # Распечатайте количество обученных лиц и завершите программу печати ("\ n [INFO] {0} лица обучены. Выход из программы».format (len (np.unique (ids))))

Убедитесь, что на вашем Rpi установлена библиотека PIL. Если нет, запустите следующую команду в Терминале:

pip install подушка

В качестве распознавателя мы будем использовать распознаватель лиц LBPH (LOCAL BINARY PATTERNS HISTOGRAMS), включенный в пакет OpenCV. Делаем это в следующей строке:

распознаватель = cv2.face. LBPHFaceRecognizer_create ()

Функция getImagesAndLabels (path) возьмет все фотографии в каталоге: «dataset /», вернув 2 массива: «Ids» и «faces». Используя эти массивы в качестве входных данных, мы «обучим наш распознаватель»:

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

В результате файл с именем «trainer.yml» будет сохранен в ранее созданном нами каталоге трейнера.

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

Каждый раз, когда вы выполняете Фазу 1, Фаза 2 также должна выполняться

Шаг 7: распознаватель

Распознаватель
Распознаватель
Распознаватель
Распознаватель

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

Давайте загрузим скрипт Python 3-й фазы с моего GitHub: 03_face_recognition.py.

импорт cv2

импортировать numpy как np import os распознаватель = cv2.face. LBPHFaceRecognizer_create () распознаватель.read ('trainer / trainer.yml') cascadePath = "haarcascade_frontalface_default.xml" faceCascade = cv2. CascadeClassifier (cascadePath); font = cv2. FONT_HERSHEY_SIMPLEX #iniciate id counter id = 0 # имена, связанные с идентификаторами: example ==> Marcelo: id = 1, etc names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z ',' W '] # Инициализировать и запустить видеозахват в реальном времени cam = cv2. VideoCapture (0) cam.set (3, 640) # установить ширину видео cam.set (4, 480) # установить высоту видео # Определить минимальный размер окна для распознавания лица minW = 0.1 * cam.get (3) minH = 0.1 * cam.get (4) while True: ret, img = cam.read () img = cv2.flip (img, -1) # Отразить по вертикали серый = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale (gray, scaleFactor = 1.2, minNeighbors = 5, minSize = (int (minW), int (minH)),) для (x, y, w, h) в лицах: cv2.rectangle (img, (x, y), (x + w, y + h), (0, 255, 0), 2) id, уверенность = распознаватель.predict (серый [y: y + h, x: x + w]) # Проверяем, меньше ли достоверность их 100 ==> "0" - идеальное совпадение if (достоверность <100): id = names [id] уверенность = "{0}% ".format (round (100 - достоверность)) else: id =" unknown "уверенность =" {0}% ". format (round (100 - conf idence)) cv2.putText (img, str (id), (x + 5, y-5), font, 1, (255, 255, 255), 2) cv2.putText (img, str (уверенность), (x + 5, y + h-5), font, 1, (255, 255, 0), 1) cv2.imshow ('camera', img) k = cv2.waitKey (10) & 0xff # Нажмите 'ESC' для выхода из видео, если k == 27: break # Выполните небольшую очистку print ("\ n [INFO] Выход из программы и очистка материала") cam.release () cv2.destroyAllWindows ()

Мы включаем сюда новый массив, поэтому мы будем отображать «имена» вместо пронумерованных идентификаторов:

names = ['Нет', 'Марсело', 'Паула', 'Ильза', 'Z', 'W']

Так, например: Марсело будет пользователем с id = 1; Паула: id = 2 и т. Д.

Затем мы обнаружим лицо, как мы делали это раньше с классификатором haasCascade. Обнаружив лицо, мы можем вызвать самую важную функцию в приведенном выше коде:

id, уверенность = распознаватель.predict (серая часть лица)

Распознаватель.predict () примет в качестве параметра захваченную часть лица для анализа и вернет его вероятного владельца, указав его идентификатор и степень уверенности распознавателя в отношении этого совпадения.

Обратите внимание, что индекс достоверности вернет «ноль», если он будет сочтен идеальным совпадением.

И, наконец, если распознаватель может предсказать лицо, мы помещаем текст поверх изображения с вероятным идентификатором и степенью «вероятности» в% того, что совпадение будет правильным («вероятность» = 100 - индекс достоверности). В противном случае на лицо ставится метка «неизвестно».

Ниже гифка с результатом:

Изображение
Изображение

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

Шаг 8: Заключение

Заключение
Заключение

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

Для получения подробной информации и окончательного кода посетите мой депозитарий GitHub: OpenCV-Face-Recognition

Чтобы узнать больше о проектах, посетите мой блог: MJRoBot.org

Ниже представлен краткий обзор будущего руководства, в котором мы рассмотрим «автоматическое отслеживание лиц и другие методы обнаружения лиц»:

Изображение
Изображение

Салудо с юга мира!

Увидимся в моем следующем инструктаже!

Спасибо, Марсело

Рекомендуемые: