In diesem Tutorial sehen wir, wie wir ein Python-Programm erstellen können, das Emotionen auf einem menschlichen Gesicht erkennt. Dies könnte interessant sein, wenn Sie Dinge wie die Emotionserkennung mit Python tun möchten oder wenn Sie maschinelle Lernsysteme trainieren, um menschliche Emotionen zu lesen. Wir werden ein Programm erstellen, das ein Bild als Eingabe verwendet und eine Liste menschlicher Emotionen ausgibt, die das Bild hervorruft. Dazu verwenden wir ein Paket namens Deepface.

Was ist Deepface?

Deepface ist ein Open-Source-Framework zur Gesichtserkennungsattributanalyse, das für Python entwickelt wurde. Es ist eine sehr leistungsstarke Computer Vision-Bibliothek, die bei der Identifizierung von Dingen in Bildern wie Formen und Gesichtern im Bild hilfreich ist, sodass sie leicht erkannt und analysiert werden können. Es handelt sich um ein hybrides Gesichtserkennungs-Framework-Wrap-Modell wie VGG-Face, Google FaceNet, OpenFace, Facebook DeepFace, DeepID, ArcFace und Dlib.

Der einfachste Weg, Deepface zu installieren, besteht darin, es mit den pip-Befehlen von PyPI herunterzuladen.

pip3 install deepface

Für die Zwecke dieses Artikels verwenden wir nur eines der vielen Module, die deepface bereitstellt, nämlich das Modul Gesichtsattributanalyse. Es kann uns anhand des bereitgestellten Bildes Informationen zu Alter, Geschlecht, Gesichtsausdruck und Rasse geben oder Daten.

Mit Fotos Emotionen ins Gesicht zaubern

Zunächst erstellen wir eine kleine Anwendung, die nur die Ergebnisse und in numerischer Form anzeigt.

#emotion_detection.py
import cv2
from deepface import DeepFace
import numpy as np  #this will be used later in the process

imgpath = face_img.png'  #put the image where this file is located and put its name here
image = cv2.imread(imgpath)

analyze = DeepFace.analyze(image,actions=['emotions'])  #here the first parameter is the image we want to analyze #the second one there is the action
print(analyze)

Die Aktionsklasse DeepFace.analyze im obigen Code enthält den Parameter Aktionen, sie gibt an, welche Gesichtsattributanalyse wir durchführen möchten. DeepFace unterstützt derzeit 4 Aktionen, darunter Alter, Geschlecht, Emotion und Rasse. Aber für unser Projekt werden wir nur emotionale Aktionen verwenden.

Sie können den Code ausführen, indem Sie einfach den Dateinamen an seinem Speicherort im Terminal ausführen. Nachdem Sie den obigen Code ausgeführt haben, sollten Sie Ergebnisse erhalten, die ungefähr so ​​​​aussehen:

{'emotion': {'angry': 0.2837756188594808, 'disgust': 2.789757723035734e-07, 'fear': 0.456878175451973, "happy': 92.482545707485, 'sad': 0.152323190865646454,
surprise': 1.9998317176006223, 'neutral': 0.0084371718453264), 'dominant_emotion': 'happy', 'region': {'X': 1910, 'y': 878, 'w': 1820, 'h': 1820}}
[Finished in 13.48s]

Hier sehen Sie alle Gesichtsdaten, die deepface sammeln konnte. Die Emotionswerte, die es ‘angry’, ‘disgust’, ‘fear’, ‘happy’, ‘sad’, ‘surprise’, and ‘neutral’. Damit zeigt es auch die vorherrschende Emotion, die in unserem Fall „glücklich“ ist, und die Region auf dem Foto, in der sich das Gesicht befindet. Dies ist praktisch, wenn wir so etwas wie eine Schachtel um das Gesicht legen müssen, um es zu präsentieren.

Wir können auch nur sehr leicht die am stärksten ausgedrückten Emotionen erhalten, indem wir das Attribut dominant_emotion in der print-Funktion verwenden.

print(analyze['dominanmt_emotion'])  #add this instead of the already written print function 

Nachdem Sie das angegebene Attribut hinzugefügt haben, führen Sie den Code ähnlich wie oben beschrieben aus. Sie sollten ein Ergebnis wie dieses erhalten:

happy
[Finished in 10.08s]

Und wenn Sie sich fragen, warum wir als Ergebnis glücklich waren. Das liegt daran, dass happy den höchsten numerischen Wert hat. Sie können es im vorherigen Ergebnis sehen.

Holen Sie sich Emotionen aus einem Gesicht durch eine Webcam

Jetzt, da wir wissen, wie dies funktioniert, können wir es jetzt mit einer Webcam oder Kameras zum Erkennen von Gesichtern und ihren Emotionen einsetzen. Wir verwenden jetzt die zusätzlichen Pakete, die wir zuvor importiert haben, und sorgen dafür, dass unser vorheriger Code effizienter funktioniert.

import cv2
from deepface import DeepFace
import numpy as np

face_cascade_name = cv2.data.haarcascades + 'haarcascade_frontalface_alt.xml'  #getting a haarcascade xml file
face_cascade = cv2.CascadeClassifier()  #processing it for our project
if not face_cascade.load(cv2.samples.findFile(face_cascade_name)):  #adding a fallback event
    print("Error loading xml file")

video=cv2.VideoCapture(0)  #requisting the input from the webcam or camera

while video.idOpened():  #checking if are getting video feed and using it
    _,frame = video.read()

    gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)  #changing the video to grayscale to make the face analisis work properly
    face=face_cascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5)

    for x,y,w,h in face:
      img=cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),1)  #making a recentangle to show up and detect the face and setting it position and colour
   
      #making a try and except condition in case of any errors
      try:
          analyze = DeepFace.analyze(frame,actions=['emotions'])  #same thing is happing here as the previous example, we are using the analyze class from deepface and using ‘frame’ as input
          print(analyze['dominant_emotion'])  #here we will only go print out the dominant emotion also explained in the previous example
      except:
          print("no face")

      #this is the part where we display the output to the user
      cv2.imshow('video', frame)
      key=cv2.waitKey(1) 
      if key==ord('q'):   # here we are specifying the key which will stop the loop and stop all the processes going
        break
    video.release()

Ergebnisse

Sie können es wie zuvor ausführen, indem Sie den Dateinamen im Terminal ausführen. Nachdem Sie es gestartet haben, wird Ihr Webcam-Fenster geöffnet und Sie sollten in der Lage sein, ein rotes Kästchen auf Ihrem Gesicht zu sehen, das versucht, Ihr Gesicht zu erkennen.

Sie werden auch sehen, wie die dominanten Emotionen Ihres Gesichts auf dem Terminal erkannt und ausgedruckt werden, was ungefähr so ​​​​aussehen würde:

neutral
neutral
neutral
neutral
happy
happy
neutral

Es wird die Erkennungen ständig ausgeben, es sei denn, Sie stoppen es. Wir haben auch die Taste zum Stoppen von Operationen eingestellt, die auf „q“ lautet. Sie können sie drücken, um alle Prozesse sofort zu stoppen.

Und das ist es! Wir haben eine sehr einfache App erstellt, die mit Python Emotionserkennung durchführen kann. Es war ein sehr einfaches Projekt, aber es kann Ihnen helfen, Ihre Fähigkeiten stark zu erweitern. Es gibt viel Raum für Verbesserungen und Experimente.

Hier sind einige nützliche Tutorials, die Sie lesen können: