Едноплатен компютър

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

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

Raspberry Pi е евтин мини-компютър, който е направил изчисленията и програмирането много по-лесни за повечето хора, включително студенти и любители. Този мини-компютър може да направи всичко, което може да направи настолен компютър, от сърфиране в интернет до създаване на вълнуващи проекти и програми. И един от тези невероятни проекти е създаването на разпознаване на лица на Raspberry Pi. Въпреки че този проект може да бъде много интересен, не е много лесно да се направи. Така че, бих ви препоръчал да следвате статията стъпка по стъпка.

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


Създаването на програма за разпознаване на лица някога може да е било много трудно и напреднало нещо. Но с Raspberry Pi нищо не е твърде трудно! В тази статия използвах библиотеката за компютърно зрение с отворен код (OpenCV), за да направя проекта.

Това хранилище е проектирано да работи с изчислителна ефективност и приложения в реално време. Следователно, той е идеален за нашата програма за разпознаване на лица в реално време. Тази статия ще ви води стъпка по стъпка през целия проект. Така че, придържайте се до края, за да имате свое собствено разпознаване на лица Raspberry Pi!

Изисквания


За да създадете система за разпознаване на лица Raspberry Pi, ще ви трябват следните неща:

  1. Raspberry Pi V4
  2. Камера Noir
  3. OpenCV

Raspberry Pi Connections


Уверете се, че сте създали следните връзки, преди да започнете да кодирате:

  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 @ малина: ~ $

За да влезете във вашия Python Interpreter:

питон

Ще видите “>>>” в интерпретатора. За да импортирате библиотеката OpenCV:

импортиране на cv2

Ако няма съобщения за грешка, можете да сте сигурни, че OpenCV е инсталиран правилно.

Стъпка 3: Изтеглете OpenCV


Сега изтеглете инсталирания OpenCV. Ще трябва да изтеглите принос OpenCV и OpenCV. Приносът се предлага с модули и функции, от които ще се нуждаете в този експеримент.

$ cd ~ $ wget -O opencv.zip https: // github.com / opencv / opencv / archive / 4.0.0.zip $ wget -O opencv_contrib.zip https: // github.com / opencv / opencv_contrib / archive / 4.0.0.цип

Сега разархивирайте архивите:

$ разархивирайте opencv.zip $ разархивирайте 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-sudo apt gfortran вземете инсталиране на python2.7-dev python3-dev $ sudo apt-get инсталирайте python3-pil.imagetk

Стъпка 5: Инсталирайте pip


В тази стъпка ще трябва да инсталирате мениджър на пакети за python, наречен „pip“.

$ wget https: // bootstrap.pypa.io / get-pip.py $ sudo python3 get-pip.py

Стъпка 6: Инсталирайте Numpy


След това инсталирайте библиотека на python, наречена “Numpy”.

$ Pip3 инсталиране на numpy

Стъпка 7: Тествайте камерата


След като сте инсталирали всички необходими неща, включително OpenCV, е време да проверите дали камерата ви функционира правилно. Вече трябва да имате инсталиран Picam на вашия Raspberry Pi. Въведете следния код във вашата Python IDE:

внос numpy като np внос cv2 cap = cv2.Капачка на VideoCapture (0).set (3,640) # set Ширина капачка.set (4,480) # set Height while (True): ret, frame = cap.read () frame = cv2.обръщане (рамка, -1) # Обръщане на камерата вертикално сиво = cv2.cvtColor (рамка, cv2.COLOR_BGR2GREY) cv2.imshow ('кадър', кадър) cv2.imshow ('сиво', сиво) k = cv2.waitKey (30) & 0xff, ако k == 27: # натиснете 'ESC', за да излезете от прекъсването.освобождаване () cv2.Унищожи всичкиWindows ()

Този код работи, като улавя видео потока, генериран от вашия PiCam, който показва както сив режим, така и цветен режим BGR. След това изпълнете кода със следната команда:

python simpleCamTest.py

Сега натиснете клавиша [ESC], за да завършите програмата. Не забравяйте да кликнете върху видео прозореца, преди да го завършите. Сега трябва да видите камерата си да работи правилно и да показва резултати. Ако фотоапаратът ви показва съобщения за грешка „Assertion failed“, използвайте следната команда, за да поправите това:

sudo modprobe bcm2835-v4l2

Стъпка 8: Разпознаване на лица


Трябва да знаете, че първата стъпка към завършването на нашия проект за разпознаване на лица е да накараме PiCam да заснеме лице. Със сигурност първо трябва да открие лице, за да го разпознае в бъдеще.

Алгоритъмът за разпознаване на лица изисква изображения с лицето, както и без лицето, за да се обучи класификаторът и да се запазят структури от тях. За щастие, OpenCV, който сте изтеглили предварително, се предлага с детектор и тренажор. Освен това вече има някои предварително обучени класификатори като лице, очи, ръце и т.н. За да създадете детектор на лице с OpenCV, използвайте следните кодове:

импортиране на numpy като np импортиране на cv2 faceCascade = cv2.CascadeClassifier ('Cascades / haarcascade_frontalface_default.xml ') cap = cv2.Капачка на VideoCapture (0).set (3,640) # set Ширина капачка.set (4,480) # set Height while True: ret, img = cap.read () img = cv2.обръщане (img, -1) сиво = cv2.cvtColor (img, cv2.COLOR_BGR2GREY) лица = faceCascade.deteMultiScale (сиво, scaleFactor = 1.2, min Съседи = 5, minSize = (20, 20)) за (x, y, w, h) в лица: cv2.правоъгълник (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 ('видео', img) k = cv2.waitKey (30) & 0xff, ако k == 27: # натиснете 'ESC', за да излезете от прекъсването.освобождаване () cv2.Унищожи всичкиWindows ()

Сега ще трябва да извикате функцията за класификация с някои коефициенти на мащаба, параметри и минимален размер на лицето, който тя ще открие.

лица = faceCascade.deteMultiScale (сиво, scaleFactor = 1.2, мин. Съседи = 5, мин. Размер = (20, 20))

Този код работи чрез откриване на лица на изображение. Сега може да искате да маркирате лицата, като използвате форма като правоъгълник. Използвайте следния код, за да направите това:

за (x, y, w, h) в лица: cv2.правоъгълник (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]

И така, това работи:

Ако класификаторът намери някакви лица на картината, той показва позициите на лицето като правоъгълник, както е заповядано, където използва „h“ като своя височина и „w“ като ширина и левите ъгли нагоре (x, y). Това почти обобщава нашия правоъгълник (x, y, w, h).

След като приключите с местоположенията, създайте „ROI“ за лице и покажете резултата с функцията imshow (). Стартирайте го в средата на python, използвайки терминала Raspberry Pi:

python faceDetection.py

И резултатът:

Стъпка 9: Запазване на данни


В тази част трябва да създадете набор от данни, където вашата програма ще съхранява събраните данни за идентификатори на лицето, които е открила. За да направите това, създайте директория (използвам FacialRecognition):

mkdir Разпознаване на лицето

Сега създайте поддиректория с името „набор от данни“.

mkdir набор от данни

След това използвайте следния код:

import cv2 import os cam = cv2.VideoCapture (0) камера.set (3, 640) # set video width cam.set (4, 480) # set video height face_detector = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ') # За всеки човек въведете един цифров идентификатор на лицето face_id = input (' \ n въведете потребителски идентификатор край натиснете  ==> ') print ("\ n [INFO] Инициализиране на заснемането на лица. Погледнете камерата и изчакайте ... ") # Инициализирайте броя на отделните лица за вземане на проби = 0, докато (Вярно): ret, img = cam.read () img = cv2.flip (img, -1) # флип видео изображение вертикално сиво = cv2.cvtColor (img, cv2.COLOR_BGR2GREY) лица = детектор на лице.deteMultiScale (сиво, 1.3, 5) за (x, y, w, h) в лица: cv2.правоъгълник (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: почивка elif count> = 10: # Вземете 10 проби за лице и спрете видео пауза # Направете малко отпечатване за почистване ("\ n [ИНФО] Излизане от програма и почистване на неща ") cam.освобождаване () cv2.Унищожи всичкиWindows ()

Имайте предвид, че ще запазим всеки от заснетите кадри като файл в поддиректория „набор от данни“:

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

След това трябва да импортирате библиотеката “os”, за да запишете горния файл. Името на файловете ще следва структура като тази:

Потребител.face_id.броя.jpg, / pre>

Кодът, споменат по-горе, ще заснеме само 10 изображения за всеки идентификатор. Със сигурност можете да промените това, ако искате.
Сега опитайте да стартирате програмата и заснемете някои идентификатори. Не забравяйте да стартирате кода всеки път, когато промените потребителя или съществуващата снимка.

Стъпка 10: Треньор


В тази стъпка ще трябва да използвате функция OpenCV, за да обучите разпознавателя на OpenCV с данните от вашия набор от данни. Започнете, като направите поддиректория за съхраняване на обучените данни.

mkdir треньор

След това изпълнете следния код:

импортиране на cv2 импортиране на numpy като np от PIL импортиране на изображението импортиране на os # Път за лицево изображение на базата данни път = 'набор от данни' разпознавател = cv2.лице.LBPHFaceRecognizer_create () детектор = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml "); # функция за получаване на изображенията и данните на етикета def getImagesAndLabels (път): imagePaths = [os.път.join (path, f) for f in os.listdir (път)] faceSamples = [] ids = [] за imagePath в imagePaths: PIL_img = Image.отворен (imagePath).convert ('L') # конвертирайте го в сива скала img_numpy = np.масив (PIL_img, 'uint8') id = int (os.път.разделяне (imagePath) [- 1].разделен (".") [1]) лица = детектор.deteMultiScale (img_numpy) за (x, y, w, h) в лица: faceSamples.append (img_numpy [y: y + h, x: x + w]) идентификатори.append (id) return faceSamples, ids print ("\ n [INFO] Обучаващи лица. Това ще отнеме няколко секунди. Изчакайте ... ") лица, идентификатори = разпознавател getImagesAndLabels (път).влак (лица, np.array (ids)) # Запазете модела в треньор / треньор.yml разпознавател.write ('обучител / обучител.yml ') # разпознавател.save () работи на Mac, но не и на Pi # Отпечатайте броя обучени лица и отпечатайте крайната програма ("\ n [INFO] 0 обучени лица. Излизане от програма ".формат (len (np.уникални (идентификатори))))

Уверете се, че сте инсталирали библиотеката PIL на вашия Raspberry Pi. Ако нямате това, изпълнете следната команда:

pip инсталирайте възглавница

Тук използвам разпознавателя на лица LBPH, който е включен в пакета OpenCV. Сега следвайте този ред:

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

Всички ваши снимки ще бъдат заведени в директорията „набор от данни“ чрез функцията „getImagesAndLabels“. Ще върне 2 масива с имена „Идентификатори“ и „лица“. Сега е време да обучим разпознаващия.

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

Сега ще видите „треньорът.yml ”именен файл, записан в директорията на инструктора.

Стъпка 11: Разпознаване на лица


Време е за последното действие. След тази стъпка разпознаващото устройство може да познае връщащ се идентификатор, ако лицето е било заснето преди. И така, нека напишем нашия окончателен код:

внос cv2 внос numpy като np внос ос разпознавател = cv2.лице.Разпознавател на LBPHFaceRecognizer_create ().read ('обучител / обучител.yml ') cascadePath = "haarcascade_frontalface_default.xml "faceCascade = cv2.CascadeClassifier (cascadePath); шрифт = cv2.FONT_HERSHEY_SIMPLEX #iniciate id counter id = 0 # имена, свързани с идентификатори: example ==> Marcelo: id = 1 и т.н. names = ['None', 'Markian', 'Bell', 'Grace', 'A', 'Z '] # Инициализирайте и стартирайте камерата за заснемане на видео в реално време cam = cv2.VideoCapture (0) камера.set (3, 640) # set video widht cam.set (4, 480) # задайте височина на видео # Определете минималния размер на прозореца, който да бъде разпознат като лице minW = 0.1 * камера.Вземете (3) minH = 0.1 * камера.get (4), докато True: ret, img = cam.read () img = cv2.flip (img, -1) # Обръщане вертикално сиво = cv2.cvtColor (img, cv2.COLOR_BGR2GREY) лица = faceCascade.deteMultiScale (сиво, scaleFactor = 1.2, minСъседите = 5, minSize = (int (minW), int (minH)),) за (x, y, w, h) в лица: cv2.правоъгълник (img, (x, y), (x + w, y + h), (0,255,0), 2) id, доверие = разпознаващ.предсказване (сиво [y: y + h, x: x + w]) # Проверете дали доверието е по-малко от тях 100 ==> "0" е идеално съвпадение, ако (увереност < 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()

Програмата работи като разпознавател. Функцията predict () приема различни части от заснетото лице като различни параметри и се връща към запазения собственик, докато показва идентификатора.
Ако не разпознае лицето, на снимката ще се покаже „неизвестно“.

Така, Voila!

И накрая, Insights


И така, по този начин правите разпознаване на лица на Raspberry Pi. Не забравяйте да следвате тази статия стъпка по стъпка, за да получите най-добрия резултат! Сега, освен този класификатор за разпознаване на лица, можете да направите разпознаване на очите или разпознаване на усмивка, като използвате различни класификатори и функции. Проучих всички свързани статии в интернет и измислих тази. Така че, наистина се надявам това ръководство да ви е помогнало с проектите. И се надявам, че това е успешно за вас. Не забравяйте да споменете вашите мисли в раздела за коментари!

Пристанища с отворен код на търговски игрални машини
Безплатни разширения на играта с отворен код и междуплатформени игри могат да се използват за възпроизвеждане на стари, както и някои от доста скорошн...
Най-добрите игри за команден ред за Linux
Командният ред не е само най-големият ви съюзник при използване на Linux - той може да бъде и източник на забавление, защото можете да го използвате, ...
Най-добрите приложения за картографиране на геймпад за Linux
Ако искате да играете игри на Linux с геймпад вместо типична система за въвеждане на клавиатура и мишка, има някои полезни приложения за вас. Много ко...