Računalnik z eno ploščo

Kako narediti projekt za prepoznavanje obrazov Raspberry Pi

Kako narediti projekt za prepoznavanje obrazov Raspberry Pi

Raspberry Pi je poceni mini računalnik, ki je računalništvo in programiranje veliko olajšal večini ljudi, vključno s študenti in ljubitelji. Ta mini računalnik zmore vse, kar zmore namizni računalnik, od brskanja po internetu do ustvarjanja zanimivih projektov in programov. In eden teh neverjetnih projektov je prepoznavanje obraza Raspberry Pi. Čeprav je ta projekt lahko zelo zanimiv, ga ni zelo enostavno narediti. Zato vam priporočam, da članek spremljate korak za korakom.

Prepoznavanje obraza Raspberry Pi


Izdelava programa za prepoznavanje obrazov je bila morda nekoč zelo težka in napredna stvar. Toda z Raspberry Pi ni nič pretrd! V tem članku sem za projekt uporabil Open Source Library Vision Library (OpenCV).

To skladišče je bilo zasnovano za delo z računsko učinkovitostjo in aplikacijami v realnem času. Zato je idealen za naš program za prepoznavanje obrazov v realnem času. Ta članek vas bo vodil korak za korakom skozi celoten projekt. Torej, držite se do konca, da boste imeli svoje prepoznavanje obraza Raspberry Pi!

Zahteve


Za izdelavo sistema za prepoznavanje obrazov Raspberry Pi boste potrebovali naslednje stvari:

  1. Raspberry Pi V4
  2. Noir kamera
  3. OpenCV

Povezave Raspberry Pi


Preden začnete s kodiranjem, ustvarite naslednje povezave:

  1. Vzpostavite povezavo med Raspberry Pi in trakovnim kablom z zaslona
  2. SDA pritrdite na zatič SDA vašega Pi
  3. SCL postavite iz zaslona na zatič SCL
  4. Tračni kabel kamere pritrdite na Raspberry Pi
  5. Vstavite GND z zaslona v Pi GND
  6. Priključite Raspberry Pi 5V in 5V zaslona

1. korak: Namestite OpenCV na Raspberry Pi


Prvi korak je namestitev OpenCV v napravo Pi. Če želite to narediti, zaženite Raspberry Pi in odprite SSH povezavo. Če želite vključiti ves razpoložljiv prostor na kartici micro-SD, razširite svoj datotečni sistem.

$ sudo raspi-config

Nato v meniju izberite »Napredne možnosti« in nato »Razširi datotečni sistem«:

Po tem pritisnite " gumb in znova zaženite Raspberry Pi.

$ sudo znova zaženite

2. korak: Potrdite namestitev OpenCV


Ko končate z ponovnim zagonom, mora biti na vašem Pi pripravljeno navidezno okolje OpenCV. Zdaj morate potrditi, ali je OpenCV pravilno nameščen v vašem Pi. Zaženite ukaz “source” vsakič, ko odprete nov terminal, da so sistemske spremenljivke pravilno nastavljene.

vir ~ /.profil

Zdaj vnesite svoje navidezno okolje:

workon cv

Besedilo (cv) pomeni, da ste v virtualnem okolju cv.

(cv) pi @ malina: ~ $

Za vstop v razlagalnik Python:

python

V tolmaču se bo prikazal znak >> >>>. Če želite uvoziti knjižnico OpenCV:

uvoz cv2

Če ni sporočil o napakah, ste lahko prepričani, da je OpenCV pravilno nameščen.

3. korak: Prenesite OpenCV


Zdaj prenesite nameščeni OpenCV. Naložiti boste morali OpenCV in OpenCV prispevek. Prispevek vsebuje module in funkcije, ki jih boste potrebovali v tem poskusu.

$ 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.zadrgo

Zdaj razpakirajte arhiv:

$ unzip opencv.stisnite $ unzip opencv_contrib.zadrgo

4. korak: Namestite odvisnosti


Zdaj namestite potrebne odvisnosti OpenCV na vaš Raspberry Pi, da bo pravilno deloval:

$ 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- dobite namestitev python2.7-dev python3-dev $ sudo apt-get namestite python3-pil.imagetk

5. korak: Namestite pip


V tem koraku boste morali namestiti upravitelja paketov za python, imenovan "pip".

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

6. korak: namestite Numpy


Po tem namestite python knjižnico z imenom "Numpy".

$ Pip3 namestite numpy

7. korak: preizkusite kamero


Zdaj, ko ste namestili vse potrebne stvari, vključno z OpenCV, je čas, da preverite, ali kamera pravilno deluje. Na svojem Raspberry Pi bi že morali imeti nameščen Picam. V vašo IDE Python vnesite naslednjo kodo:

uvozi numpy kot np uvozi cv2 cap = cv2.Omejitev VideoCapture (0).set (3,640) # set Omejitev širine.set (4,480) # set Height while (True): ret, frame = cap.read () frame = cv2.flip (frame, -1) # Preklopi kamero navpično sivo = cv2.cvtColor (okvir, cv2.COLOR_BGR2GREY) cv2.imshow ('frame', frame) cv2.imshow ('siva', siva) k = cv2.waitKey (30) & 0xff, če je k == 27: # pritisnite 'ESC', da zaprete prekinitev.javnost () cv2.uniči vse Windows ()

Ta koda deluje tako, da zajame video tok, ki ga ustvari vaš PiCam, ki prikazuje tako sivi način kot barvni način BGR. Nato izvedite kodo z naslednjim ukazom:

python simpleCamTest.py

Zdaj pritisnite tipko [ESC], da zaključite program. Preden končate, kliknite okno z videoposnetkom. Zdaj bi morali videti, da kamera pravilno deluje in prikazuje rezultate. Če vaša kamera prikaže sporočila o napaki »Trditev ni uspela«, jo popravite z naslednjim ukazom:

sudo modprobe bcm2835-v4l2

8. korak: zaznavanje obrazov


Vedeti morate, da je prvi korak do zaključka našega projekta prepoznavanja obrazov, da PiCam zajame obraz. Zagotovo mora najprej zaznati obraz, da ga prepozna v prihodnosti.

Algoritem za zaznavanje obrazov zahteva slike z obrazom in brez obraza, da usposobi klasifikator in shrani strukture pred njimi. Na srečo je OpenCV, ki ste ga predhodno prenesli, opremljen z detektorjem in trenažerjem. Prav tako že ima nekaj predhodno usposobljenih klasifikatorjev, kot so obraz, oči, roke itd. Če želite ustvariti detektor obrazov z OpenCV, uporabite naslednje kode:

uvozi numpy kot np uvozi cv2 faceCascade = cv2.CascadeClassifier ('Cascades / haarcascade_frontalface_default.xml ') cap = cv2.Omejitev VideoCapture (0).set (3,640) # set Omejitev širine.set (4,480) # set Height while True: ret, img = cap.read () img = cv2.flip (img, -1) siva = cv2.cvtColor (img, cv2.COLOR_BGR2GREY) obrazov = faceCascade.zaznaMultiScale (siva, scaleFactor = 1.2, minSesedje = 5, minSize = (20, 20)) za (x, y, w, h) v obrazih: cv2.pravokotnik (img, (x, y), (x + w, y + h), (255,0,0), 2) roi_gray = siva [y: y + h, x: x + w] roi_color = img [ y: y + h, x: x + w] cv2.imshow ('video', img) k = cv2.waitKey (30) & 0xff, če je k == 27: # pritisnite 'ESC', da zaprete prekinitev.javnost () cv2.uniči vse Windows ()

Zdaj boste morali poklicati funkcijo klasifikatorja z nekaj faktorji merila, parametri in minimalno velikostjo obraza, ki jo bo zaznal.

obrazi = faceCascade.zaznaMultiScale (siva, scaleFactor = 1.2, minSesedje = 5, minVelikost = (20, 20))

Ta koda deluje tako, da zazna obraze na sliki. Zdaj boste morda želeli obraze označiti z obliko kot pravokotnik. Za to uporabite naslednjo kodo:

za (x, y, w, h) v obrazih: cv2.pravokotnik (img, (x, y), (x + w, y + h), (255,0,0), 2) roi_gray = siva [y: y + h, x: x + w] roi_color = img [ y: y + h, x: x + w]

Torej, kako to deluje:

Če klasifikator najde kakršne koli obraze na sliki, prikaže položaje obrazov kot pravokotnik, kot je ukazano, pri čemer za svojo višino uporablja "h", kot širino in leve vogale navzgor pa "w". To precej povzema naš pravokotnik (x, y, w, h).

Zdaj, ko ste končali z lokacijami, ustvarite "ROI" za obraz in rezultat prikažite s funkcijo imshow (). Zaženite ga v okolju python s pomočjo terminala Raspberry Pi:

python faceDetection.py

In rezultat:

9. korak: Shranjevanje podatkov


V tem delu morate ustvariti nabor podatkov, kamor bo program shranil zbrane podatke o ID-jih obraza, ki ga je zaznal. Če želite to narediti, ustvarite imenik (uporabljam FacialRecognition):

mkdir Prepoznavanje obraza

Zdaj ustvarite podimenik z imenom »nabor podatkov«.

nabor podatkov mkdir

Nato uporabite naslednjo kodo:

uvoz cv2 uvoz os cam = cv2.VideoCapture (0) kamera.set (3, 640) # set video width cam.set (4, 480) # set video height face_detector = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ') # Za vsako osebo vnesite en številčni ID obraza face_id = input (' \ n vnesite ID uporabnika in pritisnite  ==> ') print ("\ n [INFO] Inicializacija zajema obrazov. Poglejte fotoaparat in počakajte ... ") # Inicializirajte število vzorčenja posameznih vzorcev števila = 0, medtem ko (True): ret, img = cam.read () img = cv2.flip (img, -1) # obrni video sliko navpično sivo = cv2.cvtColor (img, cv2.COLOR_BGR2GREY) obrazov = detektor obraza.zaznaMultiScale (siva, 1.3, 5) za (x, y, w, h) v obrazih: cv2.pravokotnik (img, (x, y), (x + w, y + h), (255,0,0), 2) count + = 1 # Ujeto sliko shranite v mapo naborov podatkov cv2.imwrite ("nabor podatkov / uporabnik."+ str (obraz_id) + '.'+ str (štetje) + ".jpg ", siva [y: y + h, x: x + w]) cv2.imshow ('slika', img) k = cv2.waitKey (100) & 0xff # Pritisnite 'ESC' za izhod iz videoposnetka, če je k == 27: break elif count> = 10: # Vzemite vzorec 10 obrazov in ustavite video odmor # Naredite malo čiščenja ("\ n [INFO] Izhod iz programa in čiščenje stvari ") cam.javnost () cv2.uniči vse Windows ()

Upoštevajte, da bomo vsak zajeti okvir shranili kot datoteko v podimenik »nabora podatkov«:

cv2.imwrite ("nabor podatkov / uporabnik."+ str (obraz_id) + '.'+ str (štetje) + ".jpg ", siva [y: y + h, x: x + w])

Po tem morate uvoziti knjižnico “os”, da shranite zgornjo datoteko. Ime datotek bo imelo takšno strukturo:

Uporabnik.obraz_id.štetje.jpg, / pre>

Zgoraj navedena koda bo zajela samo 10 slik za vsak id. To lahko zagotovo spremenite, če želite.
Zdaj poskusite zagnati program in zajeti nekaj ID-jev. Zaženite kodo vsakič, ko spremenite uporabnika ali obstoječo fotografijo.

10. korak: Trener


V tem koraku boste morali s funkcijo OpenCV usposobiti prepoznavnik OpenCV s podatki iz vašega nabora podatkov. Začnite z izdelavo podimenika za shranjevanje izurjenih podatkov.

mkdir trener

Nato zaženite naslednjo kodo:

uvoz cv2 uvoz numpy kot np iz PIL uvoz slike uvoz os # pot za obraz obraz pot pot = 'nabor podatkov' prepoznavnik = cv2.obraz.LBPHFaceRecognizer_create () detektor = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml "); # funkcija za pridobitev slik in oznak podatkov def getImagesAndLabels (pot): imagePaths = [os.pot.join (pot, f) za f v os.listdir (pot)] faceSamples = [] ids = [] za imagePath v imagePaths: PIL_img = Image.odpri (imagePath).convert ('L') # pretvori v sivine img_numpy = np.matrika (PIL_img, 'uint8') id = int (os.pot.split (imagePath) [- 1].razdeli (".") [1]) obrazi = detektor.zaznajteMultiScale (img_numpy) za (x, y, w, h) v obrazih: faceSamples.dodaj (img_numpy [y: y + h, x: x + w]) id.dodaj (id) return faceSamples, ids print ("\ n [INFO] Obrazi za vadbo. Trajalo bo nekaj sekund. Počakaj ... ") obrazov, ids = getImagesAndLabels (pot) prepoznavnik.vlak (obrazi, np.array (ids)) # Model shranite v vaditelj.yml prepoznavnik.write ('trener / trener.yml ') # prepoznavnik.save () je delal na Macu, ne pa na Pi # Natisnite število usposobljenih obrazov in tiskanje končnega programa ("\ n [INFO] 0 usposobljenih obrazov. Izhod iz programa ".format (len (np.unikat (id))))

Prepričajte se, da ste na Raspberry Pi namestili knjižnico PIL. Če tega nimate, zaženite naslednji ukaz:

pip namestite blazino

Tu uporabljam prepoznavnik obrazov LBPH, ki je priložen paketu OpenCV. Zdaj sledite tej vrstici:

prepoznavalec = cv2.obraz.LBPHFaceRecognizer_create ()

Vse vaše fotografije bodo s pomočjo funkcije »getImagesAndLabels« odnesene v imenik »nabora podatkov«. Vrnila bo 2 niza z imenom "ID-ji" in "Obrazi". Zdaj je čas, da prepoznamo prepoznavalca.

prepoznavalnik.vlak (obrazi, id)

Zdaj boste videli “trenerja.yml «imenovana datoteka, shranjena v imeniku trenerja.

11. korak: Prepoznavanje obrazov


Čas je za končno akcijo. Po tem koraku lahko vaš prepoznalec ugane povratni ID, če je bil obraz zajet prej. Torej, napiši svojo končno kodo:

uvoz cv2 uvoz numpy kot np uvoz os prepoznavnik = cv2.obraz.Prepoznavalnik LBPHFaceRecognizer_create ().beri ('trener / trener.yml ') cascadePath = "haarcascade_frontalface_default.xml "faceCascade = cv2.CascadeClassifier (cascadePath); pisava = cv2.FONT_HERSHEY_SIMPLEX #iniciate id counter id = 0 # imena, povezana z ids: example ==> Marcelo: id = 1, etc names = ['None', 'Markian', 'Bell', 'Grace', 'A', 'Z '] # Inicializirajte in zaženite kamero za zajem videa v realnem času = cv2.VideoCapture (0) kamera.set (3, 640) # set video widht cam.set (4, 480) # nastavi video višino # Določite najmanjšo velikost okna, ki bo prepoznana kot obraz minW = 0.1 * kamera.dobite (3) minH = 0.1 * kamera.get (4), medtem ko je True: ret, img = cam.read () img = cv2.flip (img, -1) # Obrni navpično sivo = cv2.cvtColor (img, cv2.COLOR_BGR2GREY) obrazov = faceCascade.zaznaMultiScale (siva, scaleFactor = 1.2, minSesedje = 5, minSize = (int (minW), int (minH)),) za (x, y, w, h) v obrazih: cv2.pravokotnik (img, (x, y), (x + w, y + h), (0,255,0), 2) id, zaupanje = prepoznavalec.napovedi (sivo [y: y + h, x: x + w]) # Preverite, ali je zaupanje manjše od njih 100 ==> "0" se popolnoma ujema, če (samozavest < 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()

Program deluje kot prepoznavalec. funkcija predict () zajema različne dele zajetega obraza kot različne parametre in se med prikazom id vrne shranjenemu lastniku.
Če obraza ne prepozna, bo na sliki prikazan napis »neznano«.

Torej, Voila!

Končno, Vpogledi


Torej, tako naredite prepoznavo obrazov Raspberry Pi. Za najboljši rezultat sledite temu članku korak za korakom! Zdaj lahko poleg tega klasifikatorja za prepoznavanje obrazov prepoznate oči ali prepoznate nasmeh tudi z različnimi klasifikatorji in funkcijami. Raziskal sem vse povezane članke na internetu in prišel do tega. Resnično upam, da vam je ta vodnik pomagal pri projektih. In upam, da je to za vas uspešno. Ne pozabite omeniti svojih misli v oddelku za komentarje!

Vadnica za bitko za Wesnoth
Bitka za Wesnoth je ena izmed najbolj priljubljenih odprtokodnih strateških iger, ki jih lahko trenutno igrate. Ne samo, da se ta igra razvija že zelo...
0 A.D. Vadnica
Od številnih strateških iger tam 0 A.D. uspe izstopati kot izčrpen naslov in zelo globoka, taktična igra, čeprav je odprtokodna. Razvoj igre deluje ze...
Vadnica za Unity3D
Uvod v Unity 3D Unity 3D je močan motor za razvoj iger. Navzkrižna platforma vam omogoča ustvarjanje iger za mobilne naprave, splet, namizje in konzol...