Inhoudsopgave:

Gezichtsdetectie + herkenning - Ajarnpa
Gezichtsdetectie + herkenning - Ajarnpa

Video: Gezichtsdetectie + herkenning - Ajarnpa

Video: Gezichtsdetectie + herkenning - Ajarnpa
Video: Gezichtsdetectie 2024, Juli-
Anonim
Image
Image
Gezichtsdetectie + herkenning
Gezichtsdetectie + herkenning

Dit is een eenvoudig voorbeeld van het uitvoeren van gezichtsdetectie en -herkenning met OpenCV vanaf een camera. OPMERKING: IK HEB DIT PROJECT GEMAAKT VOOR SENSORWEDSTRIJD EN IK GEBRUIK DE CAMERA ALS SENSOR OM GEZICHTEN TE VOLGEN EN HERKENNEN. Dus, ons doel In deze sessie: 1. Installeer Anaconda 2. Download Open CV-pakket 3. Stel omgevingsvariabelen in 4. Test om te bevestigen 5 Maak code voor gezichtsdetectie 6. Maak code om dataset te creëren 7. Maak code om de herkenner te trainen 8. Maak code om de gezichten te herkennen &Resultaat.

Stap 1: installeer Anaconda

Anaconda installeren
Anaconda installeren

Anaconda is in wezen een mooi verpakte Python IDE die wordt geleverd met tal van nuttige pakketten, zoals NumPy, Panda's, IPython Notebook, enz. Het lijkt overal in de wetenschappelijke gemeenschap te worden aanbevolen. Bekijk Anaconda om het te installeren.

Stap 2: Download Open CV Pakket

Download Open CV Pakket
Download Open CV Pakket

Ga eerst naar de officiële OpenCV-site om het volledige OpenCV-pakket te downloaden. Kies een versie die je leuk vindt (2.x of 3.x). Ik gebruik Python 2.x en OpenCV 2.x - vooral omdat dit de manier is waarop de OpenCV-Python-zelfstudies zijn ingesteld/gebaseerd.

In mijn geval heb ik het pakket (in wezen een map) rechtstreeks naar mijn F-schijf uitgepakt. (F:\opencv).

Stap 3: Omgevingsvariabelen instellen

Omgevingsvariabelen instellen
Omgevingsvariabelen instellen

Kopieer en plak het bestand cv2.pyd

De map Anaconda Site-packages (bijvoorbeeld F:\Program Files\Anaconda2\Lib\site-packages in mijn geval) bevat de Python-pakketten die u kunt importeren. Ons doel is om het bestand cv2.pyd naar deze map te kopiëren en te plakken (zodat we de import cv2 in onze Python-codes kunnen gebruiken).

Kopieer hiervoor het bestand cv2.pyd…

Vanuit deze OpenCV-directory (het begingedeelte kan iets anders zijn op uw computer):

# Python 2.7 en 64-bit machine: F:\opencv\build\python\2.7\x64# Python 2.7 en 32-bit machine: F:\opencv\build\python\2.7\x84

Naar deze Anaconda-directory (het begingedeelte kan iets anders zijn op uw computer):

F:\Program Files\Anaconda2\Lib\site-packages

Na het uitvoeren van deze stap kunnen we nu import cv2 gebruiken in Python-code. MAAR, we moeten nog een beetje meer werk doen om FFMPEG (videocodec) te laten werken (om ons in staat te stellen dingen te doen zoals het verwerken van video's.)

Klik met de rechtermuisknop op "Deze computer" (of "Deze pc" in Windows 8.1) -> klik met de linkermuisknop op Eigenschappen -> klik met de linkermuisknop op het tabblad "Geavanceerd" -> klik met de linkermuisknop op de knop "Omgevingsvariabelen…". Voeg een nieuwe gebruikersvariabele toe om naar de OpenCV te verwijzen (ofwel x86 voor 32-bits systeem of x64 voor 64-bits systeem.) Ik ben momenteel op een 64-bits machine.

32-bitOPENCV_DIRC:\opencv\build\x86\vc12

64-bitOPENCV_DIRC:\opencv\build\x64\vc12

Voeg %OPENCV_DIR%\bin toe aan de gebruikersvariabele PATH.

Mijn PATH-gebruikersvariabele ziet er bijvoorbeeld zo uit …

Voordat:

F:\Users\Johnny\Anaconda;C:\Users\Johnny\Anaconda\Scripts

Na:

F:\Users\Johnny\Anaconda;C:\Users\Johnny\Anaconda\Scripts;%OPENCV_DIR%\bin

Dit is het, we zijn klaar! FFMPEG is klaar voor gebruik!

Stap 4: Test om te bevestigen

Test om te bevestigen
Test om te bevestigen
Test om te bevestigen
Test om te bevestigen

We moeten testen of we dit nu kunnen doen in Anaconda (via Spyder IDE):

  • OpenCV-pakket importeren
  • Gebruik het FFMPEG-hulpprogramma (om video's te lezen/schrijven/verwerken)

Test 1: Kunnen we OpenCV importeren?

Om te bevestigen dat Anaconda nu het OpenCV-Python-pakket (namelijk cv2) kan importeren, geef deze uit in de IPython-console:

import cv2

print cv2._versie_

Als het pakket cv2 goed is geïmporteerd zonder fouten, en de cv2-versie is uitgeprint, dan zijn we allemaal in orde!

Test 2: Kunnen we de FFMPEG-codec gebruiken?

Plaats een monster

input_video.mp4

videobestand in een map. We willen testen of we:

  • lees dit.mp4-videobestand, en
  • een nieuw videobestand wegschrijven (kan.avi of.mp4 enz. zijn)

Om dit te doen, hebben we een testpython-code nodig, noem deze test.py. Plaats het in dezelfde map als het voorbeeld

input_video.mp4

het dossier.

Dit is wat

test.py

eruit kan zien (Opmerking: veel dank aan de suggesties van Pete en Warren in het opmerkingenveld - ik heb mijn originele testcode vervangen door de zijne - test het alstublieft zelf en laat ons weten of dit beter werkt):

import cv2

cap = cv2. VideoCapture("input_video.mp4") print cap.isOpened() # True = video met succes gelezen. False - kan video niet lezen. fourcc = cv2. VideoWriter_fourcc(*'XVID') out = cv2. VideoWriter("output_video.avi", fourcc, 20.0, (640, 360)) print out.isOpened() # True = video succesvol wegschrijven. False - kan video niet wegschrijven. cap.release() uit.release()

Deze test is ZEER BELANGRIJK. Als je videobestanden wilt verwerken, moet je ervoor zorgen dat Anaconda / Spyder IDE de FFMPEG (videocodec) kan gebruiken. Het kostte me dagen om het werkend te krijgen. Maar ik hoop dat het je veel minder tijd kost!:)Opmerking: nog een zeer belangrijke tip bij het gebruik van de Anaconda Spyder IDE. Zorg ervoor dat u de Current Working Directory (CWD) controleert!!!

Stap 5: maak een code voor gezichtsdetectie

Maak code voor gezichtsdetectie
Maak code voor gezichtsdetectie
Maak code voor gezichtsdetectie
Maak code voor gezichtsdetectie

Doel

In deze sessie,

  • We zullen de basis van gezichtsdetectie zien met behulp van op Haar Feature-based Cascade Classifiers
  • We zullen hetzelfde uitbreiden voor oogdetectie enz

Haar-cascadedetectie in OpenCV

Hier gaan we het hebben over detectie. OpenCV bevat al veel vooraf getrainde classificaties voor gezicht, ogen, glimlach enz. Die XML-bestanden worden opgeslagen in de map opencv/data/haarcascades/. Laten we een gezichts- en oogdetector maken met OpenCV. Eerst moeten we de vereiste XML-classificaties laden. Laad vervolgens onze invoerafbeelding (of video) in grijswaardenmodus OF we kunnen de camera gebruiken (voor realtime gezichtsdetectie)

importeer numpy als np

import cv2 face_cascade = cv2. CascadeClassifier('F:/Program Files/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') eye_cascade = cv2. CascadeClassifier('F:/Program Files/opencv/sources/data/haarcascades/haarcascade.xml') cap = cv2. VideoCapture(0)while 1: ret, img = cap.read() grey = cv2.cvtColor(img, cv2. COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(grey, 1.5, 5) for (x, y, w, h) in vlakken: cv2.rectangle(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] eyes = eye_cascade.detectMultiScale(roi_gray) for (ex, ey, ew, eh) in eyes: cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2) print "gevonden" +str(len(gezichten)) +" gezicht(en)" cv2.imshow ('img', img) k = cv2.waitKey(30) & 0xff if k == 27: break cap.release() cv2.destroyAllWindows()

Stap 6: maak code om dataset te maken

Maak code om dataset te maken
Maak code om dataset te maken
Maak code om dataset te maken
Maak code om dataset te maken

We doen aan gezichtsherkenning, dus je hebt wat gezichtsafbeeldingen nodig! U kunt uw eigen dataset maken of beginnen met een van de beschikbare gezichtsdatabases, https://face-rec.org/databases/ geeft u een actueel overzicht. Drie interessante databases zijn (delen van de beschrijving zijn geciteerd uit

  • AT&T Facedatabase
  • Yale Facedatabase A
  • Uitgebreide Yale Face-database B

HIER gebruik ik mijn eigen dataset … met behulp van de onderstaande code:

importeer numpy als np

import cv2 face_cascade = cv2. CascadeClassifier('F:/Program Files/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') cap = cv2. VideoCapture(0) id = raw_input('voer gebruikers-ID in') sampleN=0; terwijl 1: ret, img = cap.read() grey = cv2.cvtColor(img, cv2. COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(grey, 1.3, 5) for (x, y, w, h) in faces: sampleN =steekproefN+1; cv2.imwrite("F:/Program Files/projects/face_rec/facesData/User."+str(id)+ "." +str(sampleN)+ ".jpg", grijs[y:y+h, x: x+w]) cv2.rechthoek(img, (x, y), (x+w, y+h), (255, 0, 0), 2) cv2.waitKey(100) cv2.imshow('img', img) cv2.waitKey(1) als sampleN > 20: break cap.release() cv2.destroyAllWindows()

Stap 7: Maak code om de herkenning te trainen

Maak code om de herkenning te trainen
Maak code om de herkenning te trainen

Maak de functie om de trainingsset voor te bereiden

Nu gaan we een functie definiëren

getImagesWithID(pad)

dat neemt het absolute pad naar de afbeeldingendatabase als invoerargument en retourneert tupel van 2 lijsten, één met de gedetecteerde gezichten en de andere met het bijbehorende label voor dat gezicht. Als de i-de index in de lijst met gezichten bijvoorbeeld de 5e persoon in de database vertegenwoordigt, heeft de corresponderende e-locatie in de lijst met labels een waarde die gelijk is aan 5.

Converteer nu de dataset-gezichten (die in stap 6) zijn gemaakt naar een.yml-bestand met behulp van de onderstaande code:

importeer os

importeer numpy als np importeer cv2 uit PIL importeer Image # Voor gezichtsherkenning gebruiken we de LBPH Gezichtsherkenningsherkenner = cv2.createLBPHFaceRecognizer(); path="F:/Program Files/projects/face_rec/facesData" def getImagesWithID(path): imagePaths = [os.path.join(path, f) for f in os.listdir(path)] # print image_path #getImagesWithID(path) faces = ID's = voor imagePath in imagePaths: # Lees de afbeelding en converteer naar grijswaarden facesImg = Image.open(imagePath).convert('L') faceNP = np.array(facesImg, 'uint8') # Haal het label van de afbeelding op ID= int(os.path.split(imagePath)[-1].split(".")[1]) # Detecteer het gezicht in de afbeelding faces.append(faceNP) IDs.append (ID) cv2.imshow("Gezichten toevoegen voor training", faceNP) cv2.waitKey(10) return np.array(IDs), faces Ids, faces = getImagesWithID(path) herkenner.train(faces, Ids) herkenner.save ("F:/Program Files/projects/face_rec/faceREC/trainingdata.yml") cv2.destroyAllWindows()

door deze code te gebruiken, is alle gezichtsgegevensset geconverteerd naar een enkel.yml-bestand…..padlocatie is ("F:/Program Files/projects/face_rec/faceREC/trainingdata.yml")

Stap 8: Maak een code om de gezichten en het resultaat te herkennen

Guyzz dit is de laatste stap waarin we de code kunnen maken om de gezichten te herkennen met behulp van je webcam. IN DEZE STAP ZIJN ER TWEE BEWERKINGEN DIE GAAN UITVOEREN…. 1. het vastleggen van de video van de cam 2. vergelijk het met je.yml-bestand

import numpy als npimport cv2 face_cascade = cv2. CascadeClassifier('F:/Program Files/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') cap = cv2. VideoCapture(0) rec = cv2.createLBPHFaceRecognizer(); rec.load("F:/Program Files/projects/face_rec/faceREC/trainingdata.yml") id=0 font=cv2.cv. InitFont(cv2.cv. CV_FONT_HERSHEY_COMPLEX_SMALL, 5, 1, 0, 4) terwijl 1: ret, img = cap.read() grey = cv2.cvtColor(img, cv2. COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(grey, 1.5, 5) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) id, conf=rec.predict(grijs[y:y+h, x:x+w]) if(id==2): id="alok" if id==1: id="alok" if id==3: id="anjali" if id==4: id="Gaurav" if id= =5: id='rahul' if id==6: id="akshay" cv2.cv. PutText(cv2.cv.fromarray(img), str(id), (x, y+h), lettertype, 255) cv2.imshow('img', img) if cv2.waitKey(1) == ord('q'): break cap.release()

cv2.destroyAllWindows()

en uiteindelijk zal het resultaat voor je ogen komen … je kunt het zipbestand ook downloaden van onder de link: Klik hier om de codes te downloaden Dus in deze instructable hebben we de taak van gezichtsdetectie + herkenning uitgevoerd met OpenCV ….. als je zoals deze instructable … plzzz abonneer me en stem op me … bedankt vrienden:)

Aanbevolen: