Одноплатный компьютер

Как создать проект распознавания лиц Raspberry Pi

Как создать проект распознавания лиц Raspberry Pi

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

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


Когда-то создание программы распознавания лиц могло быть очень сложной и сложной задачей. Но с Raspberry Pi нет ничего сложного! В этой статье я использовал библиотеку компьютерного зрения с открытым исходным кодом (OpenCV) для выполнения проекта.

Этот репозиторий был разработан для работы с вычислительной эффективностью и приложениями реального времени. Следовательно, он идеально подходит для нашей программы распознавания лиц в реальном времени. Эта статья проведет вас шаг за шагом через весь проект. Итак, держитесь до конца, чтобы иметь собственное распознавание лиц Raspberry Pi!

Требования


Для создания системы распознавания лиц на Raspberry Pi вам понадобятся следующие вещи:

  1. Малина Pi V4
  2. Нуар Камера
  3. OpenCV

Подключения Raspberry Pi


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

  1. Подключите Raspberry Pi к ленточному кабелю от дисплея
  2. Присоедините SDA к контакту SDA вашего Pi
  3. Поместите SCL с дисплея на контакт SCL
  4. Подключите ленточный кабель камеры к Raspberry Pi
  5. Поместите GND с дисплея в Pi GND
  6. Подключите Raspberry Pi 5V и дисплей 5V

Шаг 1. Установите OpenCV на Raspberry Pi


Первый шаг - установить OpenCV на ваше устройство Pi. Для этого запустите Raspberry Pi и откройте SSH-соединение. Чтобы включить все доступное пространство на карте micro-SD, расширьте файловую систему.

$ sudo raspi-config

Затем выберите «Дополнительные параметры» в меню и затем «Развернуть файловую систему»:

После этого нажмите « кнопку и перезагрузите Raspberry Pi.

$ sudo перезагрузка

Шаг 2: Подтвердите установку OpenCV


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

источник ~ /.профиль

Теперь войдите в свою виртуальную среду:

workon cv

Текст (cv) означает, что вы находитесь в виртуальной среде cv.

(cv) pi @ raspberry: ~ $

Чтобы войти в ваш интерпретатор Python:

питон

Вы увидите, что в интерпретаторе появится «>>>». Чтобы импортировать библиотеку OpenCV:

импорт cv2

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

Шаг 3: Загрузите OpenCV


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

$ cd ~ $ wget -O opencv.zip https: // github.com / opencv / opencv / архив / 4.0.0.zip $ wget -O opencv_contrib.zip https: // github.com / opencv / opencv_contrib / архив / 4.0.0.застегивать

Теперь распакуйте архивы:

$ распаковать opencv.zip $ unzip opencv_contrib.застегивать

Шаг 4. Установите зависимости


Теперь установите необходимые зависимости OpenCV на свой Raspberry Pi, чтобы он работал правильно:

$ sudo apt-get update && sudo apt-get upgrade $ sudo apt-get install build-essential cmake pkg-config $ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng-dev $ sudo apt-get install libavcodec -dev libavformat-dev libswscale-dev libv4l-dev $ sudo apt-get install libxvidcore-dev libx264-dev $ sudo apt-get install libgtk2.0-dev libgtk-3-dev $ sudo apt-get install libfontconfig1-dev libcairo2-dev $ sudo apt-get install libgdk-pixbuf2.0-dev libpango1.0-dev $ sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-103 $ sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5 $ sudo apt-get install libatlas-base-dev gfortran $ sudo apt- получить установить python2.7-dev python3-dev $ sudo apt-get install python3-pil.Imagetk

Шаг 5: Установите pip


На этом этапе вам нужно будет установить диспетчер пакетов для Python под названием «pip».

$ wget https: // начальная загрузка.Pypa.io / get-pip.py $ sudo python3 get-пип.ру

Шаг 6: установите Numpy


После этого установите библиотеку Python под названием «Numpy».

$ Pip3 установить numpy

Шаг 7: проверьте камеру


Теперь, когда вы установили все необходимое, включая OpenCV, пора проверить, правильно ли работает ваша камера. У вас уже должен быть установлен Picam на Raspberry Pi. Введите следующий код в свою среду разработки Python:

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

Этот код работает путем захвата видеопотока, сгенерированного вашей PiCam, который отображает как серый режим, так и цветной режим BGR. Затем выполните код с помощью следующей команды:

python simpleCamTest.ру

Теперь нажмите клавишу [ESC], чтобы завершить программу. Обязательно нажмите на видеоокно перед его завершением. Теперь вы должны увидеть, что ваша камера работает правильно и показывает результаты. Если ваша камера показывает сообщение об ошибке «Assertion failed», используйте следующую команду, чтобы исправить это:

sudo modprobe bcm2835-v4l2

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


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

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

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

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

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

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

for (x, y, w, h) в гранях: cv2.прямоугольник (img, (x, y), (x + w, y + h), (255,0,0), 2) roi_gray = grey [y: y + h, x: x + w] roi_color = img [ y: y + h, x: x + w]

Итак, вот как это работает:

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

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

лицо Python.ру

И результат:

Шаг 9: Сохранение данных


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

mkdir FacialRecognition

Теперь создайте подкаталог с именем «набор данных».

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

Затем используйте следующий код:

импорт cv2 импорт os cam = cv2.VideoCapture (0) камера.set (3, 640) # установить ширину видео камеры.set (4, 480) # установить высоту видео face_detector = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ') # Для каждого человека введите один числовой идентификатор лица face_id = input (' \ n введите идентификатор пользователя и нажмите  ==> ') print ("\ n [INFO] Инициализация захвата лица. Посмотри в камеру и подожди… ") # Инициализируем индивидуальную выборку количества лиц count count = 0 while (True): ret, img = cam.читать () 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 ("набор данных / Пользователь."+ str (face_id) + '.'+ str (количество) + ".jpg ", серый [y: y + h, x: x + w]) cv2.imshow ('изображение', img) k = cv2.waitKey (100) & 0xff # Нажмите 'ESC' для выхода из видео, если k == 27: break elif count> = 10: # Возьмите 10 образцов лиц и остановите паузу видео # Сделайте небольшую очистку print ("\ n [INFO] Выход из программы и очистка ") cam.release () cv2.destroyAllWindows ()

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

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

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

Пользователь.face_id.считать.jpg, / pre>

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

Шаг 10: тренер


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

mkdir трейнер

Затем запустите следующий код:

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

Убедитесь, что вы установили библиотеку PIL на свой Raspberry Pi. Если у вас его нет, выполните следующую команду:

pip install подушка

Здесь я использую распознаватель лиц LBPH, который входит в пакет OpenCV. Теперь следуйте этой строке:

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

Все ваши фотографии будут перенесены в каталог «набор данных» функцией «getImagesAndLabels». Он вернет 2 массива с именами «идентификаторы» и «лица». Теперь пора обучить распознаватель.

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

Теперь вы увидите «трейнер.yml »именованный файл, сохраненный в директории трейнера.

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


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

import cv2 import numpy as np import os распознаватель = cv2.лицо.Распознаватель LBPHFaceRecognizer_create ().читать ('тренер / тренер.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', 'Markian', 'Bell', 'Grace', 'A', 'Z '] # Инициализировать и запустить видеозахват в реальном времени cam = cv2.VideoCapture (0) камера.set (3, 640) # установить ширину видео камеры.set (4, 480) # установить высоту видео # Определить минимальный размер окна, которое будет распознано как лицо minW = 0.1 * кулачок.получить (3) minH = 0.1 * кулачок.get (4) while True: ret, img = cam.читать () img = cv2.flip (img, -1) # Отразить по вертикали серый = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale (серый, scaleFactor = 1.2, minNeighbors = 5, minSize = (int (minW), int (minH)),) для (x, y, w, h) в лицах: cv2.прямоугольник (img, (x, y), (x + w, y + h), (0,255,0), 2) id, уверенность = распознаватель.pred (gray [y: y + h, x: x + w]) # Проверяем, меньше ли достоверность их 100 ==> "0" - идеальное совпадение if (достоверность < 100): id = names[id] confidence = " 0%".format(round(100 - confidence)) else: id = "unknown" confidence = " 0%".format(round(100 - confidence)) cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2) cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1) cv2.imshow('camera',img) k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video if k == 27: break # Do a bit of cleanup print("\n [INFO] Exiting Program and cleanup stuff") cam.release() cv2.destroyAllWindows()

Программа работает как распознаватель. Функция predic () принимает разные части захваченного лица в качестве разных параметров и возвращает сохраненному владельцу, показывая идентификатор.
Если он не распознает лицо, на картинке будет отображаться «неизвестно».

Так, Вуаля!

Наконец, Insights


Итак, вот как вы делаете распознавание лиц Raspberry Pi. Обязательно следуйте этой статье шаг за шагом, чтобы получить наилучший результат! Теперь, помимо этого классификатора распознавания лиц, вы также можете выполнять распознавание глаз или улыбки, используя различные классификаторы и функции. Я просмотрел все соответствующие статьи в Интернете и нашел эту. Итак, я очень надеюсь, что это руководство помогло вам с проектами. И я надеюсь, что у тебя получится. Не забудьте упомянуть свои мысли в разделе комментариев!

Учебник OpenTTD
OpenTTD - одна из самых популярных бизнес-симуляторов. В этой игре вам нужно создать замечательный транспортный бизнес. Тем не менее, вы начнете в нач...
SuperTuxKart для Linux
SuperTuxKart - отличная игра, созданная для того, чтобы бесплатно познакомить вас с Mario Kart в вашей системе Linux. Играть в нее довольно сложно и в...
Учебник Battle for Wesnoth
Битва за Веснот - одна из самых популярных стратегических игр с открытым исходным кодом, в которую вы можете играть сейчас. Эта игра не только очень д...