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:
- Raspberry Pi V4
- Noir kamera
- OpenCV
Raspberry Pi kapcsolatok
A kódolás megkezdése előtt feltétlenül hozza létre a következő kapcsolatokat:
- Csatlakoztassa a Raspberry Pi és a Display szalag kábelét
- Csatlakoztassa az SDA-t a Pi SDA-tűjéhez
- Helyezze az SCL-t a kijelzőről az SCL-tűre
- Csatlakoztassa a kamera szalagkábelét a Raspberry Pi-hez
- Helyezze a GND-t a kijelzőről a Pi GND-be
- 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 „
$ 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!