Gezichtsherkenning met Python en OpenCV

Dagelijks houden wij ons bij Growteq bezig met het analyseren en visualiseren van data. In heel veel gevallen is de data opgeslagen in databases die meestal redelijk gestructureerd zijn. We komen ook steeds vaker meer ongestructureerde data tegen. Foto’s, video’s en PDF documenten bevatten een schat aan informatie die veel nieuwe inzichten kan opleveren. Om deze informatie te ontsluiten is het de kunst om de ‘chaos’ van de ongestructureerde data om te zitten in gelabelde elementen die vervolgens gebruikt kunnen worden om nader te analyseren. In deze blog laat ik in een eerste stap zien hoe met behulp van Python en de opensource library OpenCV gezichten herkent kunnen worden in foto’s. Het blijkt verrassend eenvoudig..

OpenCV – de techniek

OpenCV gebruikt machine learning technieken om te zoeken naar gezichten in een afbeelding. Gezichten zijn er in alle soorten en maten en er is dan ook niet één simpele test om vast te stellen of iets een gezicht is of niet. Er zijn duizenden kleine patronen en eigenschappen die een gezicht een gezicht maken. Een algoritme deelt al deze eigenschappen op in kleine taken en loopt ze allemaal na om vast te stellen of het bij een gezicht hoort, of niet. Deze taken worden ook wel ‘classifiers’ genoemd. Voor een gezicht kunnen er wel 5.000 classifiers nodig zijn om een gezicht te kunnen herkennen. Het algoritme moet elk blok in een afbeelding nalopen of het bij een gezicht hoort of niet. Dit zijn miljoenen berekeningen en kost dan ook veel rekenkracht van de computer.

OpenCV heeft dit opgelost door gebruik te maken van ‘cascades’ of in het Nederlands ‘watervallen’. OpenCV deelt het probleem op in meerdere fases. Eerst wordt een ruwe scan gedaan. Als wordt voldaan aan de ruwe test wordt een meer gedetailleerde test uitgevoerd. Zo wordt doorgegaan tot uiteindelijk een gezicht wordt herkend. Gemiddeld zijn er 30 tot 50 fasen nodig om tot een conclusie te komen. Elk blok dat niet aan een ruwere scan voldoet, hoeft niet verder onderzocht te worden zodat dit veel rekenkracht scheelt.

Benodigheden

Om deze blog te kunnen volgen moet het volgende geïnstalleerd zijn:

Afbeelding met gezichten

De volgende afbeelding bevat de gezichten van (een deel van) de collega’s van Refine.

Onze code gaat proberen alle gezichten in deze afbeelding te herkennen en om elk gezicht een vierkantje te plaatsen.

Python script – breakdown

Importeren libraries

In de eerste stap importeren we de OpenCV library

Definieren paden

We definiëren nu de paden naar de afbeelding en het XML bestand waarin de definities van de cascades zijn opgenomen.


imagePath = “C:/Python/Python36/cropped2.png”

cascPath = “C:/Python/Python36/haarcascade_frontalface_default.xml”

Aanmaken van de haar cascade

De haar cascade is de standard cascade die door OpenCv wordt aangeleverd voor het detecteren van gezichten. De cascade wordt ingelezen in het geheugen zodat het gebruikt kan worden.


faceCascade = cv2.CascadeClassifier(cascPath)

Uitlezen van de afbeelding

In de volgende stap wordt de afbeelding uitgelezen en geconverteerd naar een grayscale. De meeste analyses in OpenCV worden uitgevoerd in grayscale.


image = cv2.imread(imagePath)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Detecteren van gezichten

De volgende code gaat op zoek naar de gezichten in de afbeelding.


faces = faceCascade.detectMultiScale(

gray,

scaleFactor=1.1,

minNeighbors=5,

minSize=(30, 30),

flags = cv2.CASCADE_SCALE_IMAGE

)

De detectMultiScale functie detecteert de gezichten. De functie heeft de volgende opties:

  1. De eerste optie is de grayscale afbeelding die we in een eerdere stap gedefinieerd hebben
  2. Sommige gezichten kunnen dichter bij de camera staan en daardoor groter lijken dan de gezichten in de achtergrond. De scalefactor corrigeert hiervoor.
  3. De functie gebruikt een venster om de objecten te herkennen.
    De optie minNeighbors definieert hoeveel objecten gevonden moeten worden in de buurt van het huidige object om vast te stellen dat het om een gezicht gaat.
    De optie minSize geeft de grootte van elk venster aan.

 

Teken een rechthoek om elk gezicht

De volgende code itereert over alle gevonden gezichten heen en tekent een rechthoek om elk gevonden gezicht.


for (x, y, w, h) in faces:

cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

Toon de nieuwe afbeelding

In deze laatste stap wordt een nieuw venster geopend met een rechthoek om de gevonden gezichten.


cv2.imshow(“Gevonden gezichten”, image)

Resultaat

Als je bovenstaande Python code uitvoert, krijg je het volgende resultaat:

Zoals je ziet zijn alle Refiners geïdentificeerd!

Afsluiting

Met minder dan 20 regels code kunnen gezichten al herkend worden in foto’s. Dit biedt uiteraard veel mogelijkheden om ongestructureerde data om te zetten naar herkenbare, gedefinieerde data elementen die goed gebruikt kunnen worden voor verdere analyses.

Mocht je hier nog vragen over hebben of heb je hulp nodig, dan hoor ik dat uiteraard graag!

Geef een reactie

Uw e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Fill out this field
Fill out this field
Geef alstublieft een geldig e-mailadres op.

Categorieën

Categorieën

Vragen?

Onze specialisten geven graag antwoord op uw vragen!