Gesichtserkennung in Python Part II

Gesichtserkennung Python Part 2

Im ersten Gesichtserkennung Tutorial habe ich an einem existierenden Beispiel gezeigt, wie diese einzurichten ist. Ich habe das Script nun um folgende Funktionen erweitert. Die erste Erweiterung ermöglicht das Erkennen von mehreren Personen. Die Zweite begrüßt erkannte Personen mit einer persönlichen Sprachnachricht.

Für diese Erweiterung habe ich die Dateistruktur leicht verändert:

 

im Ordner faces liegen Bilder von bekannten Personen. Die gleichnamige Sprachdatei liegt dabei unter welcomemessage. Der Code selber liegt im Root Ordner face_recognition.

Schaut man sich die Unterschiede zwischen dem Code in Part I und Part II an, so bemerkt man, dass es nur kleine Änderungen sind. Ich habe die Funktion WelcomePeople hinzugefügt. WelcomePeople kümmert sich um die Sprachnachricht und lädt jene, falls zu der erkannten Person eine existiert.

def WelcomePeople(name):
  #this functions is trying to load the music file in welcome/.
  #if it cannot find a file a exception raises
  #if that file exist it is starting a voice message for that recognized person

  music = name + ".wav"
  print(music)
  pygame.mixer.init()
  try:
      pygame.mixer.music.load("welcome/" + music)
      pygame.mixer.music.play()
  except:
    print("could not find welcome file")

 

Ebenfalls habe ich die Variablen zum größtenteils als Listen initialisiert. In diesem Snippet werden alle bekannten Personen von faces/ geladen. Von diesem wird dann ein Stempel erzeugt, der zu dem späteren Vergleich dazu gezogen wird.

#is loading all images in faces/ and create a stamp
try:
    for faces,i in zip(os.listdir("faces"),range(len(os.listdir("faces")))):
        known_faces.append("faces/"+faces)
        image.append(face_recognition.load_image_file("faces/" + faces))
        known_face_encoding.append(face_recognition.face_encodings(image[i])[0])
except:
  print("could not find known pictures")
  exit()

 

Im letzten Part vergleichen wir den Stempel von den Personen, die bei der Kamera eingefangen wurden und denen, die wir als bekannte Personen deklariert haben. Die For Schleife habe ich um der Variable i und (range(len(known_faces))) erweitert. Damit sollen die richtigen Daten aus den Listen known_face_encoding und known_faces hinzugezogen werden.

for face, i in zip(os.listdir("faces"), range(len(known_faces))):

 

Ebenfalls wurde ein Timestamp hinzugefügt. Dieser soll sicherstellen, dass eine Person nur alle 10 Minuten begrüßt wird. Die Bedingung überprüft die Existenz einer bereits begrüßten Person und nimmt diese 10 Minuten als Referenzwert für die nächste Begrüßung.

                #check when the person has been welcomed already. If that person has been welcomed it must wait 10 minutes to hear the message again
                if not last_welcome:
                    last_welcome[face.split(".")[0]] = datetime.datetime.now()
                    WelcomePeople(face.split(".")[0])
                elif face.split(".")[0] not in last_welcome:
                    last_welcome[face.split(".")[0]] = datetime.datetime.now()
                    WelcomePeople(face.split(".")[0])
                else:
                    if (last_welcome[face.split(".")[0]] + datetime.timedelta(minutes=10)) >= datetime.datetime.now():
                        last_welcome[face.split(".")[0]] = datetime.datetime.now()
                        WelcomePeople(face.split(".")[0])
                    else:
                        print("already greeted")

 

Hier noch einmal der komplette Block über den ich gerade gesprochen habe. Last_welcome wurde als Dictionary deklariert, damit ich eine vereinfachte Zuordnung vom Timestamp und erkannte Personen habe. Eine Liste wäre hier komplizierte da ich nur nummerische Zahlen als Key verwenden könnte.

# Loop over each face found in the frame to see if it's someone we know.
for face_encoding in face_encodings:
    
    for face, i in zip(os.listdir("faces"), range(len(known_faces))):
    	# See if the face is a match for the known face(s)
        if face_recognition.compare_faces([known_face_encoding[i]], face_encoding,0.6)[0]:
        	#print found face all upper case
            print("<found: ".upper() + known_faces[i].upper() + ">")
            #check when the person has been welcomed already. If that person has been welcomed it must wait 10 minutes to hear the message again
            if not last_welcome:
                last_welcome[face.split(".")[0]] = datetime.datetime.now()
                WelcomePeople(face.split(".")[0])
            elif face.split(".")[0] not in last_welcome:
                last_welcome[face.split(".")[0]] = datetime.datetime.now()
                WelcomePeople(face.split(".")[0])
            else:
                if (last_welcome[face.split(".")[0]] + datetime.timedelta(minutes=10)) >= datetime.datetime.now():
                    last_welcome[face.split(".")[0]] = datetime.datetime.now()
                    WelcomePeople(face.split(".")[0])
                else:
                    print("already greeted")

 

Damit hätten wir dann den Code im Schnelldurchgang erklärt.

Zum Schluss der komplette Code der Gesichtserkennung:

# 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

try:
  import face_recognition
  import picamera
  import numpy as np
  import os
  import pygame
  import datetime
except:
  print("failed to load module")
  exit()


# Initialize some variables
face_locations			= []
face_encodings 			= []
image 					= []
known_face_encoding 	= []
known_faces				= []
last_welcome			= {}

def WelcomePeople(name):
  #this functions is trying to load the music file in welcome/.
  #if it cannot find a file a exception raise
  #if that file exist it is starting a voice message for that recognized person

  music = name + ".wav"
  print(music)
  pygame.mixer.init()
  try:
      pygame.mixer.music.load("welcome/" + music)
      pygame.mixer.music.play()
  except:
    print("could not find welcome file")

# 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.
try:
    camera = picamera.PiCamera()
    camera.resolution = (320, 240)
    output = np.empty((240, 320, 3), dtype=np.uint8)	
except:
  print("something went wrong while initialize camera")
  exit()



# Load pictures and learn how to recognize it.
print("Loading known face image(s)")

#is loading all images in faces/ and create a stamp
try:
    for faces,i in zip(os.listdir("faces"),range(len(os.listdir("faces")))):
        known_faces.append("faces/"+faces)
        image.append(face_recognition.load_image_file("faces/" + faces))
        known_face_encoding.append(face_recognition.face_encodings(image[i])[0])
except:
  print("could not find known pictures")
  exit()


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:
        
        for face, i in zip(os.listdir("faces"), range(len(known_faces))):
        	# See if the face is a match for the known face(s)
            if face_recognition.compare_faces([known_face_encoding[i]], face_encoding,0.6)[0]:
            	#print found face all upper case
                print("<found: ".upper() + known_faces[i].upper() + ">")
                #check when the person has been welcomed already. If that person has been welcomed it must wait 10 minutes to hear the message again
                if not last_welcome:
                    last_welcome[face.split(".")[0]] = datetime.datetime.now()
                    WelcomePeople(face.split(".")[0])
                elif face.split(".")[0] not in last_welcome:
                    last_welcome[face.split(".")[0]] = datetime.datetime.now()
                    WelcomePeople(face.split(".")[0])
                else:
                    if (last_welcome[face.split(".")[0]] + datetime.timedelta(minutes=10)) >= datetime.datetime.now():
                        last_welcome[face.split(".")[0]] = datetime.datetime.now()
                        WelcomePeople(face.split(".")[0])
                    else:
                        print("already greeted")

 

 

 

35 Gedanken zu „Gesichtserkennung in Python Part II

  1. Hallo Stevie,

    ich bin echt begeistert von deinem Tutorial für die Gesichtserkennung. Ich habe genau nach so etwas gesucht und durch deine Hilfe, bin ich sehr schnell (fast) zum Ziel gekommen. Ich habe vor im Eingangsbereich die Gäste begrüßen zu lassen. Leider kommt es bei dem Code in Part II zu einer Fehlermeldung. Wenn er ein Gesicht erkennt und im Anschluss ein zweites Gesicht erkannt wird, kommt es zu einem Abbruch.

    Traceback (most recent call last):
    File „/home/pi/face_recognition/Gesichtserkennung.py“, line 89, in
    if not last_welcome or (last_welcome[face.split(„.“)[0]] + datetime.timedelta(seconds=10)) >= datetime.datetime.now():
    KeyError: ’steffi‘

    Ich hoffe, dass du mir helfen kannst.

    Viele Grüße aus dem hohen Norden.

    Michael

    1. Hallo Michael,

      schön zuhören, dass dir mein Tutorial gefällt.
      Ein KeyError besagt, das er in einem Dic, List, etc den Key nicht finden kann. In deinem Fall wäre es der von „steffi“.
      Funktioniert die erste Erkennung den soweit? Falls ja hab ich den Fehler wahrscheinlich schon gefunden.
      Dadurch das if not last_welcome False zurückgibt, checkt er auf den Wert last_welcome[„steffi“], den es zurzeit ja noch nicht gibt.
      Eine Umstrukturierung der Bedingung ist notwendig, damit er auch die 2 nicht erkannte Person begrüßt.

      if not last_welcome:
      last_welcome[face.split(„.“)[0]] = datetime.datetime.now()
      WelcomePeople(face.split(„.“)[0])
      elif face.split(„.“)[0] not in last_welcome:
      last_welcome[face.split(„.“)[0]] = datetime.datetime.now()
      WelcomePeople(face.split(„.“)[0])
      else:
      if (last_welcome[face.split(„.“)[0]] + datetime.timedelta(seconds=10)) >= datetime.datetime.now():
      last_welcome[face.split(„.“)[0]] = datetime.datetime.now()
      WelcomePeople(face.split(„.“)[0])
      else:
      print(„already greeted“)

      Hab ich soweit jetzt nicht getestet, aber damit könnte es gehen.

      Viel Glück.

      mfg
      stevie

      1. Hi Stevie,

        vielen Dank für deine schnelle Antwort. Ich hab den Code eingefügt. Ich bin mir nicht ganz sicher, ob ich diesen richtig eingesetzt habe, aber leider erhalte ich immer eine Fehlermeldung in der elif Zeile.

        for face_encoding in face_encodings:
        for face, i in zip(os.listdir(„faces“), range(len(known_faces))):
        # See if the face is a match for the known face(s)
        if face_recognition.compare_faces([known_face_encoding[i]], face_encoding,0.6)[0]:
        #print found face all upper case
        print(„“)

        if not last_welcome:
        last_welcome[face.split(„.“)[0]] = datetime.datetime.now()
        WelcomePeople(face.split(„.“)[0])

        elif face.split(„.“)[0] not in last_welcome:
        last_welcome[face.split(„.“)[0]] = datetime.datetime.now()
        WelcomePeople(face.split(„.“)[0])

        else:
        if (last_welcome[face.split(„.“)[0]] + datetime.timedelta(seconds=10)) >= datetime.datetime.now():
        last_welcome[face.split(„.“)[0]] = datetime.datetime.now()
        WelcomePeople(face.split(„.“)[0])
        else:
        print(„already greeted“)

        Die Fehlermeldung lautet:
        Traceback (most recent call last):
        File „/home/pi/face_recognition/Gesichtserkennung.py“, line 92
        elif face.split(„.“)[0] not in last_welcome:
        ^
        SyntaxError: invalid syntax

        Die Meldung kommt direkt, wenn ich das Script starte.
        Dass ich die Anführungszeichen in Hochkommas geändert habe, ist doch korrekt oder?
        Zu deiner Frage zum ersten Code: Ja, die erste Person wird immer erkannt, egal mit welcher Person ich starte.

        Viele Grüße
        Michael

        1. Hallo Michael,

          ich habe den Code im Tutorial nun mit den Änderungen angepasst. Ich hoffe diesmal hilft es dir weiter. Ich konnte es aber leider noch nicht testen, ob die 2. Person nun erfolgreich begrüßt wird.

          mfg
          stevie

          1. Hallo Stevie,

            es funktioniert. Vielen Dank. Dann werde ich mich mal an das Einpflegen von Gesichtern machen. 🙂

            Vielen Dank nochmal

            Michael

  2. ich habe deine Basis genutzt und auf usb cam geändert, und eine schnellere version daraus gemacht.
    Die Function WelcomePeople greift bei mir auf die Sprachausgabe von Jarvis zu.
    Eine Bildausgabe erfolgt nicht, nur auf dem Terminal wird etwas augegeben.

    try:
    import face_recognition
    import cv2
    import numpy as np
    import requests
    import os
    from datetime import datetime, timedelta
    import time
    import json
    except:
    print("Fehler, konnte modul nicht laden")
    exit()

    # Initialize some variables
    face_locations = []
    face_encodings = []
    image = []
    known_face_encoding = []
    known_faces = []
    last_welcome = {}
    process_this_frame = True

    def WelcomePeople(name):
    print("I see someone named {}!".format(name))
    url = 'http://192.168.178.129:8080/?say=Hallo {}&key=secretjarvis'.format(name)
    print(url)
    response = requests.get(url)
    print(response.text)

    # enabled your camera in raspi-config and rebooted first.
    try:
    # Get a reference to webcam #0 (the default one)
    camera = cv2.VideoCapture(0)
    except:
    print("Fehler Kamera konnte nicht gestartet werden")
    exit()

    # Load pictures and learn how to recognize it.
    print("Lade bekannte Gesichter")

    try:
    for faces,i in zip(os.listdir("faces"),range(len(os.listdir("faces")))):
    known_faces.append("faces/"+faces)
    image.append(face_recognition.load_image_file("faces/" + faces))
    known_face_encoding.append(face_recognition.face_encodings(image[i])[0])
    except:
    print("kann keine Bilder finden")
    exit()

    while True:
    ## print("hole Bild")

    # Grab a single frame of video
    ret, frame = camera.read()

    # Resize frame of video to 1/4 size for faster face recognition processing
    small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

    # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
    rgb_frame = small_frame[:, :, ::-1]

    # Only process every other frame of video to save time
    if process_this_frame:
    # Find all the faces and face enqcodings in the frame of video
    face_locations = face_recognition.face_locations(rgb_frame)

    if (len(face_locations) > 0):
    ## print(" {} Gesichter im Bild gefunden".format(len(face_locations)))
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
    # Loop over each face found in the frame to see if it's someone we know.
    for face_encoding in face_encodings:

    for face, i in zip(os.listdir("faces"), range(len(known_faces))):
    # See if the face is a match for the known face(s)
    if face_recognition.compare_faces([known_face_encoding[i]], face_encoding,0.6)[0]:
    #print found face all upper case
    clean_name = face.split(".")[0]

    print(time.strftime("%d.%m.%Y %H:%M:%S"))
    print(clean_name)
    #check when the person has been welcomed already. If that person has been welcomed it must wait 10 minutes to hear the message again
    if not last_welcome:
    last_welcome[clean_name] = datetime.now()
    WelcomePeople(clean_name)
    print("not exist")
    elif clean_name not in last_welcome:
    last_welcome[clean_name] = datetime.now()
    WelcomePeople(clean_name)
    print("not in")
    else:
    jetzt = datetime.now()
    letzte_zeit = last_welcome[clean_name]
    differenz = jetzt -letzte_zeit
    second =differenz.total_seconds()
    minutes = divmod(second, 60)[0]
    if (minutes > 10):
    last_welcome[clean_name] = datetime.now()
    WelcomePeople(clean_name)
    else:
    print("bereits begruesst")
    process_this_frame = not process_this_frame

    1. hier nochmal ohne code tags:
      #——–
      try:
      import face_recognition
      import cv2
      import numpy as np
      import requests
      import os
      from datetime import datetime, timedelta
      import time
      import json
      except:
      print(„Fehler, konnte modul nicht laden“)
      exit()

      # Initialize some variables
      face_locations = []
      face_encodings = []
      image = []
      known_face_encoding = []
      known_faces = []
      last_welcome = {}
      process_this_frame = True

      def WelcomePeople(name):
      print(„I see someone named {}!“.format(name))
      url = ‚http://192.168.178.129:8080/?say=Hallo {}&key=secretjarvis‘.format(name)
      print(url)
      response = requests.get(url)
      print(response.text)

      # enabled your camera in raspi-config and rebooted first.
      try:
      # Get a reference to webcam #0 (the default one)
      camera = cv2.VideoCapture(0)
      except:
      print(„Fehler Kamera konnte nicht gestartet werden“)
      exit()

      # Load pictures and learn how to recognize it.
      print(„Lade bekannte Gesichter“)

      try:
      for faces,i in zip(os.listdir(„faces“),range(len(os.listdir(„faces“)))):
      known_faces.append(„faces/“+faces)
      image.append(face_recognition.load_image_file(„faces/“ + faces))
      known_face_encoding.append(face_recognition.face_encodings(image[i])[0])
      except:
      print(„kann keine Bilder finden“)
      exit()

      while True:
      ## print(„hole Bild“)

      # Grab a single frame of video
      ret, frame = camera.read()

      # Resize frame of video to 1/4 size for faster face recognition processing
      small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

      # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
      rgb_frame = small_frame[:, :, ::-1]

      # Only process every other frame of video to save time
      if process_this_frame:
      # Find all the faces and face enqcodings in the frame of video
      face_locations = face_recognition.face_locations(rgb_frame)

      if (len(face_locations) > 0):
      ## print(“ {} Gesichter im Bild gefunden“.format(len(face_locations)))
      face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
      # Loop over each face found in the frame to see if it’s someone we know.
      for face_encoding in face_encodings:

      for face, i in zip(os.listdir(„faces“), range(len(known_faces))):
      # See if the face is a match for the known face(s)
      if face_recognition.compare_faces([known_face_encoding[i]], face_encoding,0.6)[0]:
      #print found face all upper case
      clean_name = face.split(„.“)[0]

      print(time.strftime(„%d.%m.%Y %H:%M:%S“))
      print(clean_name)
      #check when the person has been welcomed already. If that person has been welcomed it must wait 10 minutes to hear the message again
      if not last_welcome:
      last_welcome[clean_name] = datetime.now()
      WelcomePeople(clean_name)
      print(„not exist“)
      elif clean_name not in last_welcome:
      last_welcome[clean_name] = datetime.now()
      WelcomePeople(clean_name)
      print(„not in“)
      else:
      jetzt = datetime.now()
      letzte_zeit = last_welcome[clean_name]
      differenz = jetzt -letzte_zeit
      second =differenz.total_seconds()
      minutes = divmod(second, 60)[0]
      if (minutes > 10):
      last_welcome[clean_name] = datetime.now()
      WelcomePeople(clean_name)
      else:
      print(„bereits begruesst“)
      process_this_frame = not process_this_frame
      #——–

    1. Hallo Maik,

      welcher Editor wurde benutzt? Wenn ich meinen Code in z.B. Notepad++ einfüge, rückt dieser auch die Zeilen ordnungsgemäß ein.

      Viele Grüße
      Stevie

  3. Hallo,
    tolles Projekt und super Anleitung. Leider stehe ich vor einem Problem, dass wenn ich mehr als ein Bild in faces habe. das script dann keine Bilder einlesen kann und beendet wird. Habt ihr eine Idee?

    pi@raspberrypi:~/dlib/face_recognition $ sudo python3 facerec_on_raspberry_pi.py
    pygame 1.9.4.post1
    Hello from the pygame community. https://www.pygame.org/contribute.html
    Loading known face image(s)
    could not find known pictures
    pi@raspberrypi:~/dlib/face_recognition $

    1. Hallo Mario,
      normalerweise sollte das Script mit mehreren Bildern in faces funktionieren. Funktioniert es den soweit mit einem Bild? Von welchem Dateityp sind die Bilder – ich glaube die Library unterstützt nur jpg?

      In diesem Try-Except Block springt er raus:

      for faces,i in zip(os.listdir("faces"),range(len(os.listdir("faces")))):
      #Speichert sich den Namen der Datei. Generell der Name der Person
      known_faces.append("faces/"+faces)
      # Lade das Image und schreibe den Output von load_image_file in die Variable image
      image.append(face_recognition.load_image_file("faces/" + faces))
      #Fügt den Output von face.recognition.face.face_encodings(image[i][0] der List know_face_encoding hinzu.
      known_face_encoding.append(face_recognition.face_encodings(image[i])[0])

      Eventuell lösen die Methoden von face-recognition die Exception aus, da ich diese nicht abfange. Ist die Ordner Struktur soweit wie oben angegeben, da die Pfade fest verdrahtet sind? Helfen könnte es auch, wenn der Inhalt der drei Listen(know_faces, image, konw_face_encoding) überprüft wird. Dies könnte z.B. mit einem print oder logging.info() gemacht werden.

      Viele Grüße
      stevie

  4. Hi Stevie,

    Vielen Dank für deine detailreiche Erklärung. Will am Wochenende mal einen Test starten. Habe bereits alle Teile hier liegen, Könntest du mir noch helfen, das wenn bei der Erkennung eines bekannten Gesichts ein Ausgang geschaltet wird? Würde gerne mit der Gesichtserkennung meine Garage öffnen 🙂

    Danke und Grüße,
    Daniel

    1. Hallo Daniel,

      generell bin ich bereit zu helfen. Ich könnte etwas vorbereiten, damit ein Ausgang geschaltet wird. In Bezug auf ihr Garagentor würde ich gerne wissen, ob die Spannung dauerhaft angelegt sein muss, oder ob ein kleiner Impuls reicht.

      Viele Grüße
      stevie

    1. Hi Dominic,

      ersetze bitte das Timedelta mit diesen Werten:
      datetime.timedelta(minutes=10). Damit sollten nun 10 Minuten gewartet werden, bevor ein neuer Gruß raus geht. Wenn du den Code 1:1 genommen hast, überprüft er nur die letzten 10 Sekunden.
      Habe es auch soweit im obigen Code angepasst.

      Viele Grüße
      stevie

  5. Hallo Stevie,
    colle Anleitung. Ich werde morgen mal loslegen, ob ich es auch hin bekomme. Mich interressiert ebenfalls das Schalten eines Gpio Ausganges für ca, 5 sec. Und was ganz geil wäre ein Bild in dem Momnet wo das Bild erkannt wird von der Kamera auf dem Handy.
    Besten Dank schon mal

    Grüße

    Axel

      1. Moin Stevie,

        besten Dank. ich bekomme leider im Moment eine Fehlermeldung bei der Befehlseingabe aus dem Part 1
        sudo python setup.py install –compiler-flags „-mfpu=neon“
        führt bei mir zu
        running install
        running bdist_egg
        running build
        Traceback (most recent call last):
        File „setup.py“, line 657, in
        ‚Topic :: Software Development‘,
        File „/usr/lib/python2.7/dist-packages/setuptools/__init__.py“, line 145, in setup
        return distutils.core.setup(**attrs)
        File „/usr/lib/python2.7/distutils/core.py“, line 151, in setup
        dist.run_commands()
        File „/usr/lib/python2.7/distutils/dist.py“, line 953, in run_commands
        self.run_command(cmd)
        File „/usr/lib/python2.7/distutils/dist.py“, line 972, in run_command
        cmd_obj.run()
        File „/usr/lib/python2.7/dist-packages/setuptools/command/install.py“, line 67, in run
        self.do_egg_install()
        File „/usr/lib/python2.7/dist-packages/setuptools/command/install.py“, line 109, in do_egg_install
        self.run_command(‚bdist_egg‘)
        File „/usr/lib/python2.7/distutils/cmd.py“, line 326, in run_command
        self.distribution.run_command(command)
        File „/usr/lib/python2.7/distutils/dist.py“, line 972, in run_command
        cmd_obj.run()
        File „setup.py“, line 603, in run
        self.run_command(„build“)
        File „/usr/lib/python2.7/distutils/cmd.py“, line 326, in run_command
        self.distribution.run_command(command)
        File „/usr/lib/python2.7/distutils/dist.py“, line 972, in run_command
        cmd_obj.run()
        File „setup.py“, line 410, in run
        self.build_dlib()
        File „setup.py“, line 482, in build_dlib
        pip_exit = pip.main([‚install‘, ‚-q‘, ‚distro‘])
        AttributeError: ‚module‘ object has no attribute ‚main‘

        Kannst du nachvollziehen, woran das liegt?
        Besten Dank

        sonnige Grüße

        Axel

        1. Hi Axel,

          Meine Anleitung bezog sich auf python3 und soweit ich es sehe verwendest du python2.7. Mein erster Rat wäre auf python3 zu wechseln. Mein Code basiert ebenfalls auf python3.

          Ansonsten würde ich evtl. mal diese Schalter weglassen: –compiler-flags „-mfpu=neon“.

          Alternative würde ich dlib über folgenden Weg installieren(ungetestet):

          sudo apt-get update
          sudo apt-get install build-essential cmake
          sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
          sudo apt-get install libx11-dev libgtk-3-dev
          sudo pip install dlib

          Ich habe soweit schon begonnen meinen python3 Code umzuschreiben. Handybenachrichtigung und LED Schaltung ist soweit schon drin, muss aber noch optimiert werden. Den Code werde ich in einem neuen Beitrag veröffentlichen 🙂

          Viele Grüße
          stevie

  6. Hallo Stevie,
    immer wenn ich das Programm aus Teil 1 ausführe, bekomme ich eine Fehlermeldung:
    Traceback (most recent call last):
    File „facerec_on_raspberry_pi.py“, line 9, in
    import face_recognition
    File „/usr/local/lib/python3.7/dist-packages/face_recognition/__init__.py“, line 7, in
    from .api import load_image_file, face_locations, batch_face_locations, face_landmarks, face_encodings, compare_faces, face_distance
    File „/usr/local/lib/python3.7/dist-packages/face_recognition/api.py“, line 4, in
    import dlib
    ImportError: libatlas.so.3: cannot open shared object file: No such file or directory

    1. Hallo M,

      in der letzten Zeile befindet sich die Fehlermeldung:
      import dlib
      ImportError: libatlas.so.3: cannot open shared object file: No such file or Directory

      Es fehlen also scheinbar noch Abhängigkeiten. Schau dir bitte diesen Link dazu an.
      https://stackoverflow.com/questions/53347759/importerror-libcblas-so-3-cannot-open-shared-object-file-no-such-file-or-dire

      Dort stehen mehrere Abhängigkeiten, probiere es aber mal erst mit diesem Paket aus:

      sudo apt-get install libatlas-base-dev

      Viele grüße
      stevie

  7. Hallo Stevie,

    tut mir leid, dass ich mich jetzt erst melde. Dein alternativ Weg ging ohne Fehlermeldung. Leider hatte ich bisher keine Zeit mich weiter rein zu knien. Als nächstes werde ich versuchen, ob die Gesichtserkennung funktioniert, auch mit mehreren unterschiedlichen Gesichtern.
    Besten Dank für deinen Support
    sonnige Grüße

    Axel

    1. Hallo Axel,

      kein Problem :). sehr schön, dass es bei dir geklappt hat. Es könnten eventuell noch Fehler im Code vorkommen, da du eine andere Python Version benutzt, Beispiel echo. Viel Glück soweit. Ich schreibe gerade an einem weiteren Beitrag, der dich interessieren könnte 🙂

      viele Grüße
      stevie

    1. Hallo Markus,

      naja nicht ganz gleichzeitig. Das Script überprüft jedes Gesicht, welches es im Frame erkennt, mit denen die wir lokal als bekannte Gesichter abgespeichert haben. Das Überprüfen erfolgt in 2 For-Schleifen. Die Erste geht über alle Gesichter im Frame und die Zweite über alle gepflegten Gesichter von uns. Dies wird dann verglichen.

      Ein gleichzeitiges Abarbeiten kann es hier leider nicht geben, da ich keine Threads benutze. Aber es könnte einen wie „gleichzeitig“ vorkommen, wenn das Programm seine Durchläufe schnell genug hinbekommt(was es eigentlich auch sollte).

      Hier noch einmal die Verlinkung zu der Python Library, die ich benutzt habe: https://github.com/ageitgey/face_recognition

      Dort gibt es ebenfalls sehr schöne Beispiele, die für Sie interessant sein könnten.

      Viele Grüße
      stevie

  8. Hallo Stevie,
    vielen Dank für das Tutorial. Ich habe alles erfolgreich umsetzen könne, jedoch scheitere ich daran ein Script auszuführen bei erfolgreicher Gesichtserkennung. Könntest du mir helfen den Code entsprechend zu modifizieren 🙂

    Vielen Dank im Voraus

    1. Moin Daniel,

      gerne helfe ich dir weiter :). Was für ein Script ist es denn, bzw. wie sieht dies aus? Hast du schon versucht dieses einzubinden und falls ja hat es eine Fehlermeldung gegeben?

      Generell sollte versucht werden das Script, falls es denn ein weiteres Python Script ist, mittels import als Modul zu behandeln.

      Viele Grüße
      stevie

  9. Hallo Steve,

    vielen Dank für die tolle Idee zum Nachexperimentieren und der Bereitstellung des Codes.
    Und auch noch auf der in diesem Bereich seltenen Sprache deutsch. Wo ich mich mit fremdländisch etwas schwer tue 🙂

    Aber Dank Adrian Rosebrock“s Videos:
    https://www.youtube.com/channel/UCoQK7OVcIVy-nV4m-SMCk_Q/videos

    und Google Translator gelang mir auch die Adaption der Gesichtererkennung von Bildern bzw. aus einem Video:
    https://www.youtube.com/watch?v=h_yzsz7jG8I

    Dazu habe ich eine Frage, könnte man mit dieser Methode, durch Austauch der Gesichter mit Tierbilden, auch eine Tier-Erkennung schaffen? Z.B. um Vogelarten am Futterhaus statistisch zu erfassen?

    Viele Grüße
    Jörn

  10. Hallo Jörn,

    Mir ist nicht bewusst, ob face_recognition auch Tiergesichter erkennt. Dies müsste eventuell ausprobiert werden. Vogelarten wird es nicht erkennen können, da die Library nach Gesichtsmerkmalen scannt. Hier würde ich OpenCV vorschlagen mit einem Haar Classifier. Haar ist ein ML Objekt Erkennung Algorithmus. Eine Cascade Funktion wird dabei mit positiven und negativen(in diesem Fall Vögelbildern) trainiert. Dementsprechend wird ein großer Datenset der jeweiligen Vogelarten benötigt. Aus der Cascade sollte eine .xml Datei entspringen, die mit Opencv gelesen werden kann.

    Ich habe hier ein paar Beispiele gefunden, die allerdings auf Englisch sind:
    https://medium.com/@vipulgote4/guide-to-make-custom-haar-cascade-xml-file-for-object-detection-with-opencv-6932e22c3f0e
    https://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html

    Ich hoffe das dir der Google Translator weiterhilft, ich werde es ebenfalls versuchen umzusetzen und schreibe dann einen neuen Beitrag :).

    Viele Grüße
    Stevie

  11. Hallo Stevie,

    vielen Dank für die Tipps. Werde ich mir mal „reinziehen…
    Ich habe aber inzwischen, eine simple Methode zur Erkennung gefunden. Beispielbilder auf Googles-Verarbeitung https://teachablemachine.withgoogle.com/train/image laden.
    .
    Es wird ein keras_model.h5, ein labels.txt und ein sehr kleines Python-Skript generiert.
    Die Erkennung funktioniert ausgezeichnet.

    Da ich nicht herausbekommen hatte, wie model.predict(data) in Python weiter zu bearbeiten geht, file.write meckert wegen falschen Datentyp, mache hier per Unix-Tools weiter …

    Viele Grüße
    Jörn

    1. Moin Jörn,
      sehr schön das es bei Ihnen schon geklappt hat :). Den Link von Google kannte ich selber noch nicht. Werde ich mir definitiv genauer anschauen. Auch wenn mit Unix Tools weitergearbeitet wird, so sollte man am Ende doch froh sein, dass alles funktioniert :).

      Viele Grüße
      Stevie

  12. Guten Abend Stevie,

    inzwischen läuft es, vom Prinzip, wie gewünscht. Allerdings hatte ich mir Verarbeitungsgeschwindigkeit anders vorgestellt.

    Die Objekterkennung (Tier-Erkennung) per Tensorflow-Keras dauert auf Raspberry PI 3 ca. 50 Sekunden. Bilder vom Raspberry per SSH auf einen externen Server ( Blu1-VM-Instanz) und Erkennung dort dauert auch 15 Sekunden. Nur der PC mit Nvidia ist mit 7 Sekunden ungeschlagen …
    Warum geht die Gesichtserkennung, wie im Beispiel
    https://www.youtube.com/watch?v=xxRfcK5N0hI
    in Echtzeit und die anderen Methode der Objekterkennung sind so träge?

    Hast Du Erfahrung mit dem Einsatz vom Coral-USB-Beschleuniger, bringt dieser eine sinnvolle Verbesserung bzgl. der Geschwindigkeit?

    Ich wünsche einen frohen Jahreswechsel und erfolgreiches neues Jahr.
    Jörn

    1. Hallo Jörn,

      Sorry, aber irgendwie ist der Kommentar bei mir komplett untergegangen. Der PI3 alleine bringt nicht die Ressourcen, die benötigt werden, um alle Erkennungsmethoden flüssig abzuarbeiten. Die Daten/Bilder-Verarbeitung ist von Model zu Model unterschiedlich und dort stößt er denke ich an seine Grenzen. Ich habe mir den Google Coral-USB-Beschleuniger zugelegt, muss aber gestehen, dass ich bisher noch nicht dazu gekommen bin, diesen auszuprobieren. Generell habe ich nur positives gelesen und erwarte mir Performance-boosts bis hin zu 20%.

      Viele Grüße
      stevie

Schreibe einen Kommentar

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