Gesichtserkennung in Python

Ich habe mich intensiver mit der Gesichtserkennung auf dem Raspberry Pi beschäftigt. Alles was benötigt wird ist natürlich der Raspberry, als auch eine für den Pi geeignete Kamera. Unter Gesichtserkennung versteht man eine Analyse der menschlichen Merkmale am Kopf. Dazu gehören z.B. die Augen, Nase und Mund. Das hat natürlich jeder Mensch, daher wird die Position, Form und der Abstand verglichen, da diese Merkmale für jeden Menschen einzigartig sind. Die Merkmale werden auch als der biometrische Token bezeichnet. Dieser Token wird in einem System gespeichert und fortan für die Gesichtserkennung benutzt. Das System berechnet die selben Werte bei einen neuem Bild und sobald es ein Match im System hat, wird diese Person als autorisiert angesehen. In den meisten Fällen wird die Gesichtserkennung bei Zutrittskontrollen verwendet, aber auch bei z. B. forensischen Ermittlungen. Sogar in das Smartphone Geschäft hat sich die Gesichtserkennung vorgeprescht. Mit Hilfe des Gesichts kann das Smartphone z. B. entsperrt werden. Die Gesichtserkennung hat allerdings auch viele Verfechter. Durch den biometrischen Token werden sensible Personendaten gespeichert. Die DSGVO hat den Einsatz von Gesichtserkennung erschwert, da der Artikel 9 der DSGVO generell das Abspeichern solcher Daten verbietet. Dies ist aber nicht der Untergang der Gesichtserkennung. Sobald eine Person einwilligt, dass deren biometrischen Daten analysiert werden dürfen, ist datenschutztechnisch alles im Grünen.

 

 

Das war eine kleine Abschweifung in das Thema Gesichtserkennung. Kommen wir nun zurück zu meinem Raspberry Pi und dessen Kamera. Meine Kamera ist ausgestattet mit 2x Infrarot LEDs, 1x FFC Anschlusskabel, 1x Abdeckkappe für die Linse und das eigentliche Kamera Modul. Standardmäßig wird die Kamera nicht erkannt und muss in der Konfiguration eingeschaltet werden. Die Änderung erfordert ein Neustart des Pi. Um zu überprüfen, ob die Kamera richtig angeschlossen und unterstützt wird, verwenden wir diesen Befehl:

vcgencmd get_camera

Im besten Fall wird ein supported=1 und detected=1 ausgeben.

Falls ein Wert davon 0 ist, solltet ihr überprüfen, ob das Flachbandkabel richtig und in die dafür vorgesehene Stelle eingefügt wurde.

Mit

raspistill -f

kann nun das erste Test-Bild ausgegeben werden.

 

 

Installation der Gesichtserkennung

Haben wir die Kamera erfolgreich eingerichtet, folgt die Installation der Gesichtserkennung. Für Python gibt es schon eine Library auf Github, die ich ebenfalls in diesem Projekt verwende.

Installieren wir nun die erforderlichen Pakete:

sudo apt-get update 
sudo apt-get upgrade 
sudo apt-get install build-essential \ 
    cmake \ 
    gfortran \ 
    git \ 
    wget \ 
    curl \ 
    graphicsmagick \ 
    libgraphicsmagick1-dev \ 
    libatlas-dev \ 
    libavcodec-dev \ 
    libavformat-dev \ 
    libboost-all-dev \ 
    libgtk2.0-dev \ 
    libjpeg-dev \ 
    liblapack-dev \ 
    libswscale-dev \ 
    pkg-config \ 
    python3-dev \ 
    python3-numpy \ 
    python3-pip \ 
    zip \
    libatlas-base-dev 
sudo apt-get clean

 

gefolgt von pikamera python library with array Unterstützung.

sudo apt-get install python3-picamera
sudo pip3 install --upgrade picamera[array]

Zur Installation der dlib Bibliothek sollte der Swap Speicher für kurze Zeit erhoben werden.

sudo nano /etc/dphys-swapfile

< change CONF_SWAPSIZE=100 to CONF_SWAPSIZE=1024 and save / exit nano >

sudo /etc/init.d/dphys-swapfile restart

Nun installieren wir dlib

mkdir -p dlib
git clone -b 'v19.6' --single-branch https://github.com/davisking/dlib.git dlib/
cd ./dlib
sudo python3 setup.py install --compiler-flags "-mfpu=neon"

Die Installation kann einige Zeit in Anspruch nehmen. Ich sollte hier erwähnen, dass die Installation auf dem Raspberry 1 bei mir zu einer 100% CPU Auslastung geführt hat und mir der PI dauerhaft abgestürzt ist. Daher sollte der Rat befolgt werden, der auf Github gegeben wurde. Minimum Voraussetzung ist daher der Raspberry 2. Ich habe bei mir danach den Raspberry 3 benutzt und konnte die Library erfolgreich installieren. Nun können wir face_recognition installieren.

sudo pip3 install face_recognition

Im Anschluss kann der Swap wieder in seinem Default-Zustand gebracht werden.

sudo nano /etc/dphys-swapfile

< change CONF_SWAPSIZE=1024 to CONF_SWAPSIZE=100 and save / exit nano >

sudo /etc/init.d/dphys-swapfile restart

Damit wäre die Installation soweit abgeschlossen und wir können überprüfen, ob die Gesichtserkennung funktioniert.

 

 

Überprüfung der Gesichtserkennung

In dem github Repository stehen einige Examples zur Verfügung.  Für den Raspberry ist ebenfalls eines dabei.

git clone --single-branch https://github.com/ageitgey/face_recognition.git
cd ./face_recognition/examples

Das untere Script wurde speziell für den Raspberry erstellt. Ich habe dort nur kleine Änderungen vorgenommen, dass mein Gesicht vom Tool erkannt wird und nicht das von Obama, wie es Repository Script angegeben ist 🙂 .

# This is a demo of running face recognition on a Raspberry Pi.
# This program will print out the names of anyone it recognizes to the console.

# To run this, you need a Raspberry Pi 2 (or greater) with face_recognition and
# the picamera[array] module installed.
# You can follow this installation instructions to get your RPi set up:
# https://gist.github.com/ageitgey/1ac8dbe8572f3f533df6269dab35df65

import face_recognition
import picamera
import numpy as np

# Get a reference to the Raspberry Pi camera.
# If this fails, make sure you have a camera connected to the RPi and that you
# enabled your camera in raspi-config and rebooted first.
camera = picamera.PiCamera()
camera.resolution = (320, 240)
output = np.empty((240, 320, 3), dtype=np.uint8)

# Load a sample picture and learn how to recognize it.
print("Loading known face image(s)")
me_image = face_recognition.load_image_file("me.jpg")
me_face_encoding = face_recognition.face_encodings(me_image)[0]

# Initialize some variables
face_locations = []
face_encodings = []

while True:
    print("Capturing image.")
    # Grab a single frame of video from the RPi camera as a numpy array
    camera.capture(output, format="rgb")

    # Find all the faces and face encodings in the current frame of video
    face_locations = face_recognition.face_locations(output)
    print("Found {} faces in image.".format(len(face_locations)))
    face_encodings = face_recognition.face_encodings(output, face_locations)

    # Loop over each face found in the frame to see if it's someone we know.
    for face_encoding in face_encodings:
        # See if the face is a match for the known face(s)
        match = face_recognition.compare_faces([me_face_encoding], face_encoding)
        name = "<Unknown Person>"

        if match[0]:
            name = "stevie"

        print("I see someone named {}!".format(name))

Dazu habe ich das Bild unten als me.jpg in das Beispielverzeichnis gelegt und den Code leicht abgeändert.

Wenn wir nun das Script starten,

sudo python3 facerec_on_raspberry_pi.py

sollte er, sobald ich mein Gesicht in die Kamera halte, erkennen, dass der biometrische Token zu meiner Person gehört und den Text “I see someone named Stevie!” ausgeben. Bei nicht Erkennen gibt er “<unknown Person>” aus. Anbei ein kleiner Ausschnitt aus der Konsole, nachdem das Script gestartet wurde.

Damit wäre die Einrichtung der Gesichtserkennung auf dem Raspberry vollzogen. Die Möglichkeiten dies zu erweitern sind vielfältig. Ich habe geplant eine Begrüßung einzubauen. Sobald die Kamera mein Gesicht erkennt, heißt der PI mich herzlich willkommen. Aber auch eine Live Erkennung, die auf einem kleinen Display das Kamera Bild anzeigt, Personen markiert und unmittelbar den Namen, bzw. wenn es keine Referenz hat, einen anderen Text anzeigt, wäre eine sinnvolle Erweiterung. Soweit wünsche ich viel Spaß mit der Gesichtserkennung auf dem PI 🙂 .

 

Update: Hier geht es zu Part 2

 

4 Gedanken zu „Gesichtserkennung in Python

  1. Hallo,
    dein Tutorial gefällt mir, da es gut erklärt und Detailliert ist ich habe vor das ganze noch etwas zu verändern. Auf dem größten Pi möglich ich allerdings eine IP-Kamera einbinden. Dies funktioniert nicht deshalb die Frage ob es dazu irgendwelche Möglichkeiten gibt die ich nutzen kann.

    1. Moin Samuel,

      vielen Dank. Dein Vorhaben kling interessant. Die Bilder der Kamera müssten mit einem Protokoll(https,rtsp, etc.) abgegriffen werden, um es auf Live Basis zu machen. Der Video-Stream der Kamera kann mittels OpenCV ausgelesen werden: https://stackoverflow.com/questions/49978705/access-ip-camera-in-python-opencv.
      Ab hier sollte man face_recognition verwenden können. Die Kamera muss hier natürlich auch mitmachen.

      Vorstellen könnte ich mir ebenfalls einen Lösungsansatz, wo die Kamera mittels Bewegungserkennung ein Bild im Netz oder auf den internen Speicher( z.B. SD Karte) ablegt. Der PI greift auf das Bild zu und versucht das evtl. vorhandene Gesicht zu finden und zu identifizieren. Dieses würde auch ebenfalls mit dem Package in meinem Beitrag funktionieren:
      https://github.com/ageitgey/face_recognition
      Wäre soweit wahrscheinlich auch die einfachste Art und Weise.

      Viele Grüße
      stevie

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert