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“
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
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
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
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
Hallo Stevie,
es funktioniert. Vielen Dank. Dann werde ich mich mal an das Einpflegen von Gesichtern machen. 🙂
Vielen Dank nochmal
Michael
Hallo Michael,
freut mich sehr dies zu hören, noch gutes Gelingen beim Einpflegen 🙂
mfg
stevie
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
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
#——–
irgendwie rückt es den code nie richtig ein
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
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 $
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
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
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
Hi, coole Anleitung. Leider funktioniert bei mir die 10 Minuten Sperre nicht. Habe deinen Code 1:1 übernommen.
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
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
Hi Axel,
freut mich, dass es Ihnen gefällt. Ich bau mir mal eine Teststellung auf für die 5sec Schaltung über die GPIOs. Für die Benachrichtigung könnte https://www.pushbullet.com/ interessant sein. Dort gibt es auch schon einige Python-Bibliotheken https://www.pushbullet.com/.
Sobald ich meine Teststellung fertig habe, melde ich mich :).
Grüße
stevie
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
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
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
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
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
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
Hallo Stevie,
kann das Programm, mehrere Personen einzeln oder gleichzeitig erkennen?
viele Grüße
Markus
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
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
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
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
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
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
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
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
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