Egypaneles számítógép

Hogyan készítsünk egy Raspberry Pi arcfelismerő projektet

Hogyan készítsünk egy Raspberry Pi arcfelismerő projektet

A Raspberry Pi egy olcsó mini-számítógép, amely a legtöbb ember számára, beleértve a hallgatókat és a hobbistákat is, sokkal könnyebbé tette a számítást és a programozást. Ez a mini számítógép mindent megtehet, amit egy asztali számítógép, az internet böngészésétől kezdve egészen izgalmas projektek és programok készítéséig. Ezen csodálatos projektek egyike pedig egy Raspberry Pi arcfelismerés készítése. Bár ez a projekt nagyon érdekes lehet, nem nagyon könnyű elkészíteni. Tehát azt javasoljuk, hogy kövesse a cikket lépésről lépésre.

Raspberry Pi arcfelismerés


Egy arcfelismerő program elkészítése egyszer nagyon nehéz és haladó dolog lehetett. De Raspberry Pi-vel semmi sem túl nehéz! Ebben a cikkben az Open Source Computer Vision Library (OpenCV) könyvtárat használtam a projekt elvégzéséhez.

Ezt az adattárat úgy tervezték, hogy számítási hatékonysággal és valós idejű alkalmazásokkal működjön együtt. Ezért ideális a valós idejű arcfelismerő programunkhoz. Ez a cikk lépésről lépésre végigvezeti Önt az egész projekten. Tehát tartson a végére, hogy saját Raspberry Pi arcfelismerés legyen!

Követelmények


A Raspberry Pi arcfelismerő rendszer elkészítéséhez a következő dolgokra lesz szükség:

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

Raspberry Pi kapcsolatok


A kódolás megkezdése előtt feltétlenül hozza létre a következő kapcsolatokat:

  1. Csatlakoztassa a Raspberry Pi és a Display szalag kábelét
  2. Csatlakoztassa az SDA-t a Pi SDA-tűjéhez
  3. Helyezze az SCL-t a kijelzőről az SCL-tűre
  4. Csatlakoztassa a kamera szalagkábelét a Raspberry Pi-hez
  5. Helyezze a GND-t a kijelzőről a Pi GND-be
  6. Csatlakoztassa a Raspberry Pi 5V-ot és a kijelző 5V-ját

1. lépés: Telepítse az OpenCV-t a Raspberry Pi-re


Az első lépés az OpenCV telepítése a Pi eszközre. Ehhez indítsa el a Raspberry Pi-t, és nyisson meg egy SSH-kapcsolatot. Bővítse ki a fájlrendszerét, hogy a micro SD-kártyán az összes rendelkezésre álló helyet felvegye.

$ sudo raspi-config

Ezután válassza a menüből a „Speciális beállítások” lehetőséget, majd a „Fájlrendszer kibontása” lehetőséget:

Ezt követően nyomja meg a gombot, és indítsa újra a Raspberry Pi-t.

$ sudo reboot

2. lépés: Ellenőrizze az OpenCV telepítését


Miután végzett az újraindítással, készen kell állnia egy OpenCV virtuális környezetre a Pi-n. Most meg kell erősítenie, hogy az OpenCV megfelelően van-e telepítve a Pi-be. Futtassa a „source” parancsot minden alkalommal, amikor új terminált nyit meg, hogy a rendszerváltozók megfelelően legyenek beállítva.

forrás ~ /.profil

Most lépjen be a virtuális környezetébe:

workon cv

A (cv) szöveg azt jelenti, hogy Ön a virtuális CV virtuális környezetében van.

(cv) pi @ málna: ~ $

Beírása a Python-tolmácsba:

piton

Meglátja, hogy a tolmácsban megjelenik egy „>>>”. Az OpenCV könyvtár importálása:

import cv2

Ha nincs hibaüzenet, biztos lehet benne, hogy az OpenCV megfelelően van telepítve.

3. lépés: Töltse le az OpenCV-t


Most töltse le a telepített OpenCV-t. Le kell töltenie az OpenCV és az OpenCV közreműködését is. A közreműködés modulokkal és funkciókkal rendelkezik, amelyekre szükséged lesz ebben a kísérletben.

$ 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.postai irányítószám

Csomagolja ki az archívumot:

$ unzip opencv.zip $ unzip opencv_contrib.postai irányítószám

4. lépés: Telepítse a függőségeket


Most telepítse a szükséges OpenCV függőségeket a Raspberry Pi készülékre, hogy megfelelően működjön:

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

5. lépés: Telepítse a pip-et


Ebben a lépésben telepítenie kell egy „pip” nevű csomagkezelőt a pythonhoz.

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

6. lépés: telepítse a Numpy alkalmazást


Ezt követően telepítse a „Numpy” nevű python könyvtárat.

$ Pip3 install numpy

7. lépés: Tesztelje a kamerát


Miután telepítette az összes szükséges dolgot, beleértve az OpenCV-t is, itt az ideje ellenőrizni, hogy a fényképezőgép megfelelően működik-e. Már telepítenie kell egy Picam-ot a Raspberry Pi-re. Írja be a következő kódot a Python IDE-be:

import numpy, mint np import cv2 cap = cv2.VideoCapture (0) sapka.set (3 640) # set Szélesség sapka.set (4480) # set Magasság míg (True): ret, frame = cap.read () frame = cv2.flip (keret, -1) # Fordítsa a kamerát függőlegesen szürke = cv2.cvtColor (keret, cv2.COLOR_BGR2GRAY) cv2.imshow ('keret', keret) cv2.imshow ('szürke', szürke) k = cv2.waitKey (30) & 0xff, ha k == 27: # nyomja meg az 'ESC' billentyűt a szüneteltetés befejezéséhez.release () cv2.destrAllWindows ()

Ez a kód a PiCam által generált videófolyam rögzítésével működik, amely a szürke és a BGR színes módot egyaránt megjeleníti. Ezután hajtsa végre a kódot a következő paranccsal:

python simpleCamTest.py

Most nyomja meg az [ESC] gombot a program befejezéséhez. A befejezés előtt feltétlenül kattintson a videó ablakra. Most látnia kell, hogy a fényképezőgép megfelelően működik és eredményeket mutat. Ha a fényképezőgépén az „Assertion sikertelen” hibaüzenetek jelennek meg, akkor a következő paranccsal javítsa ki:

sudo modprobe bcm2835-v4l2

8. lépés: Arcfelismerés


Tudnia kell, hogy az arcfelismerési projektünk befejezésének első lépése az, hogy a PiCam arcot készítsen. Biztosan először fel kell fedeznie egy arcot, hogy a jövőben felismerje.

Az arcfelismerési algoritmushoz arcokkal és arc nélkül is szükség van képekre az osztályozó képzéséhez és a struktúrák megmentéséhez. Szerencsére az előzőleg letöltött OpenCV detektorral és oktatóval rendelkezik. Ezenkívül már van néhány előre kiképzett osztályozója, például arc, szem, kéz stb. Arcdetektor létrehozásához OpenCV-vel használja a következő kódokat:

import numpy as np import cv2 faceCascade = cv2.CascadeClassifier ('Cascades / haarcascade_frontalface_default.xml ') cap = cv2.VideoCapture (0) sapka.set (3 640) # set Szélesség sapka.set (4480) # set Height while True: ret, img = sapka.read () img = cv2.flip (img, -1) szürke = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) arcok = faceCascade.DetectMultiScale (szürke, scaleFactor = 1.2, min Szomszédok = 5, minMéret = (20, 20)) (x, y, w, h) esetén arcokban: cv2.téglalap (img, (x, y), (x + w, y + h), (255,0,0), 2) roi_gray = szürke [y: y + h, x: x + w] roi_color = img [ y: y + h, x: x + w] cv2.imshow ('video', img) k = cv2.waitKey (30) & 0xff, ha k == 27: # nyomja meg az 'ESC' billentyűt a szüneteltetés befejezéséhez.release () cv2.destrAllWindows ()

Most meg kell hívnia az osztályozó függvényt néhány skála tényezővel, paraméterrel és az arc minimális méretével, amelyet észlelni fog.

arcok = faceCascade.DetectMultiScale (szürke, scaleFactor = 1.2, min Szomszédok = 5, minMéret = (20, 20))

Ez a kód arcok észlelésével működik a képen. Most érdemes megjelölni az arcokat egy alakzat használatával téglalapként. Ehhez használja a következő kódot:

mert (x, y, w, h) az arcokban: cv2.téglalap (img, (x, y), (x + w, y + h), (255,0,0), 2) roi_gray = szürke [y: y + h, x: x + w] roi_color = img [ y: y + h, x: x + w]

Tehát ez így működik:

Ha az osztályozó arcokat talál a képen, akkor az arc pozícióit téglalapként jeleníti meg, amint azt parancsolja, ahol a „h” jelet használja magasságként, a „w” karaktert pedig szélességként, a bal oldali felső sarkokat (x, y) használja. Ez nagyjából összefoglalja a téglalapunkat (x, y, w, h).

Miután végzett a helyekkel, hozzon létre egy „ROI” -t az arcra, és mutassa meg az eredményt az imshow () függvénnyel. Futtassa a python környezetben a Raspberry Pi terminál használatával:

python faceDetection.py

És az eredmény:

9. lépés: Adatok mentése


Ebben a részben létre kell hoznia egy adatkészletet, ahol a program elmenti az észlelt arc azonosítóiról gyűjtött adatokat. Ehhez hozzon létre egy könyvtárat (a FacialRecognition funkciót használom):

mkdir Arcfelismerés

Most hozzon létre egy alkönyvtárat a „dataset” névvel.

mkdir adatkészlet

Ezután használja a következő kódot:

import cv2 import os cam = cv2.VideoCapture (0) kamera.set (3, 640) # set videó szélességű kamera.set (4, 480) # set video magasság face_detector = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml ') # Minden személynél adjon meg egy numerikus arcazonosítót face_id = input (' \ n írja be a felhasználói azonosítót  ==> ') print ("\ n [INFO] Arcfelvétel inicializálása. Nézze meg a kamerát, és várjon ... ") # Inicializálja az egyedi mintavételezési arcszámot = 0, míg (Igaz): ret, img = bütyök.read () img = cv2.flip (img, -1) # videofájl függőleges szürke = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) arcok = arcdetektor.DetectMultiScale (szürke, 1.3, 5) az (x, y, w, h) esetében az arcokban: cv2.téglalap (img, (x, y), (x + w, y + h), (255,0,0), 2) count + = 1 # A rögzített képet mentse a cv2 adatkészlet mappába.imwrite ("adatkészlet / Felhasználó."+ str (face_id) + '.'+ str (count) + ".jpg ", szürke [y: y + h, x: x + w]) cv2.imshow ('kép', img) k = cv2.waitKey (100) & 0xff # Nyomja meg az 'ESC' gombot a videó kilépéséhez, ha k == 27: break elif count> = 10: # Vegyen 10 arcmintát és állítsa le a video breaket # Végezzen egy kis tisztítási nyomtatást ("\ n [INFO] Kilépés a programból és a takarításból ") cam.release () cv2.destrAllWindows ()

Vegye figyelembe, hogy az összes rögzített keretet fájlként menti a „dataset” alkönyvtárba:

cv2.imwrite ("adatkészlet / Felhasználó."+ str (face_id) + '.'+ str (count) + ".jpg ", szürke [y: y + h, x: x + w])

Ezt követően importálnia kell az „os” könyvtárat a fenti fájl mentéséhez. A fájlok neve a következő szerkezetet fogja követni:

Felhasználó.face_id.számol.jpg, / pre>

A fent említett kód minden azonosítóhoz csak 10 képet készít. Ezen biztosan változtathat, ha akarja.
Most próbálja meg futtatni a programot, és rögzítsen néhány azonosítót. Mindenképpen futtassa a kódot minden alkalommal, amikor megváltoztatja a felhasználót vagy a meglévő fényképet.

10. lépés: Edző


Ebben a lépésben egy OpenCV függvényt kell használnia az OpenCV-felismerő betanításához az adatkészlet adataival. Először hozzon létre egy alkönyvtárat a betanított adatok tárolásához.

mkdir edző

Ezután futtassa a következő kódot:

import cv2 import numpy as np from PIL import Image import os # Arckép elérési útvonala path = 'dataset' tunnistozó = cv2.arc.LBPHFaceRecognizer_create () detektor = cv2.CascadeClassifier ("haarcascade_frontalface_default.xml "); # függvény a képek megszerzéséhez és az adatok címkézéséhez def getImagesAndLabels (elérési út): imagePaths = [os.pálya.csatlakozzon (útvonal, f) f-hez az os-ban.listdir (útvonal)] faceSamples = [] ids = [] a imagePath-hoz a imagePaths-ban: PIL_img = Image.nyitott (imagePath).konvertálás ('L') # konvertálás szürkeárnyalattá img_numpy = np.tömb (PIL_img, 'uint8') id = int (os.pálya.split (imagePath) [- 1].hasított(".") [1]) arcok = detektor.DetectMultiScale (img_numpy) (x, y, w, h) esetén arcokban: faceSamples.csatolja (img_numpy [y: y + h, x: x + w]) azonosítókat.append (id) return faceSamples, ids print ("\ n [INFO] Képzési arcok. Ez eltart néhány másodpercig. Várjon ... ") arcok, ids = getImagesAndLabels (útvonal) felismerő.vonat (arcok, np.tömb (ids)) # Mentse el a modellt oktatóba / trénerbe.yml felismerő.írjon ('tréner / tréner.yml ') # felismerő.A save () Mac-en működött, de a Pi-n nem # Nyomtassa ki a betanított arcok számát és fejezze be a program nyomtatását ("\ n [INFO] 0 betanított arcok. Kilépés a programból ".formátum (len (np.egyedi (azonosítók))))

Győződjön meg arról, hogy telepítette a PIL könyvtárat a Raspberry Pi készülékre. Ha még nincs ilyen, futtassa a következő parancsot:

pip telepítse a párnát

Itt az OpenCV csomaghoz mellékelt LBPH arcfelismerőt használom. Most kövesse ezt a sort:

felismerő = cv2.arc.LBPHFaceRecognizer_create ()

Minden fényképét a „getImagesAndLabels” függvény viszi az „adatkészlet” könyvtárba. 2 „Ids” és „arc” nevű tömböt ad vissza. Itt az ideje, hogy kiképezzük a felismerőt.

felismerő.vonat (arcok, azonosítók)

Most látni fogja az „edzőt.yml ”nevű fájl mentve az oktató könyvtárába.

11. lépés: Arcfelismerés


Itt az ideje az utolsó akciónak. E lépés után a felismerője kitalálhatja a visszatérő azonosítót, ha az arcot korábban rögzítették. Tehát írjuk meg a végső kódunkat:

import cv2 import numpy mint np import os felismerő = cv2.arc.LBPHFaceRecognizer_create () felismerő.read ('edző / tréner.yml ') cascadePath = "haarcascade_frontalface_default.xml "faceCascade = cv2.CascadeClassifier (cascadePath); font = cv2.FONT_HERSHEY_SIMPLEX #iniciate id számláló id = 0 # azonosítóhoz kapcsolódó név: példa ==> Marcelo: id = 1, stb. Név = ['Nincs', 'Markian', 'Bell', 'Grace', 'A', 'Z '] # Inicializálja és indítsa el a valós idejű videofelvétel cam = cv2-t.VideoCapture (0) kamera.set (3, 640) # set video widht kamera.set (4, 480) # set video magasság # Definiálja az arc minimális méretét, amelyet arcként kell felismerni minW = 0.1 * bütyök.get (3) minH = 0.1 * bütyök.get (4), míg True: ret, img = cam.read () img = cv2.flip (img, -1) # Flip függőlegesen szürke = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) arcok = faceCascade.DetectMultiScale (szürke, scaleFactor = 1.2, min Szomszédok = 5, minSize = (int (minW), int (minH)),) (x, y, w, h) esetén arcokban: cv2.téglalap (img, (x, y), (x + w, y + h), (0,255,0), 2) id, megbízhatóság = felismerő.megjósolni (szürke [y: y + h, x: x + w]) # Ellenőrizze, hogy kisebb-e a magabiztosság = 100 ==> "0" tökéletesen megfelel, ha (magabiztosság < 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()

A program felismerőként működik. A prediktív () függvény a rögzített arc különböző részeit különböző paraméterként veszi fel, és visszatér az elmentett tulajdonoshoz az azonosító megjelenítése közben.
Ha nem ismeri fel az arcot, akkor a képen „ismeretlen” jelenik meg.

Így, Voálá!

Végül Insights


Tehát így készít egy Raspberry Pi arcfelismerést. A legjobb eredmény elérése érdekében kövesse lépésről lépésre ezt a cikket! Most ezen az arcfelismerési osztályozón kívül különféle osztályozók és funkciók segítségével szem- vagy mosolyfelismerést is végezhet. Megvizsgáltam az összes kapcsolódó cikket az interneten, és előálltam ezzel. Tehát nagyon remélem, hogy ez az útmutató segített a projektekben. Remélem, hogy ez sikeres lesz az Ön számára. Ne felejtsd el megemlíteni a gondolataidat a megjegyzés részben!

Az Xdotool használata az egérkattintások és a billentyűleütések ösztönzéséhez Linux alatt
Az Xdotool egy ingyenes és nyílt forráskódú parancssori eszköz az egérkattintások és a billentyűleütések szimulálására. Ez a cikk egy rövid útmutatót ...
A top 5 ergonómikus számítógépes egértermék Linuxhoz
Hosszan tartó számítógép-használat okoz-e fájdalmat a csuklóján vagy az ujjain?? Merev ízületek szenvednek, és folyamatosan kezet kell rázniuk? Égő fá...
Az egér és az érintőpad beállításainak módosítása az Xinput használatával Linux alatt
A legtöbb Linux disztribúció alapértelmezés szerint „libinput” könyvtárral szállítja a rendszer bemeneti eseményeit. Feldolgozhatja a Wayland és az X ...