viola-jones-algorithm

Gesichtserkennung mit Python und OpenCV

Von am 13.01.2024

Die Gesichtserkennung ist ein Anwendungsgebiet der Bildverarbeitung. Heutzutage verwenden wir fortschrittliche maschinelle Lernmethoden, die eine Gesichtserkennung mit nahezu menschlicher Präzision und Echtzeitleistung ermöglichen. Bereits im Jahr 2001 gab es Algorithmen wie den Viola-Jones-Algorithmus, der heute in Anbetracht stärkerer Techniken oft vergessen wird. Die Gesichtserkennung kann mithilfe von Python und OpenCV effizient umgesetzt werden. In diesem Artikel werde ich einen grundlegenden Überblick über die Gesichtserkennung mit Python unter Verwendung des OpenCV-Frameworks geben.

Voila Jones Algorithmus und seine Rolle

Der Viola-Jones-Algorithmus wurde im Jahr 2001 von den Computer-Vision-Forschern Paul Viola und Michael Jones entwickelt und speziell für die Gesichtserkennung konzipiert. Dieser Algorithmus nutzt Haar-like Features und einen Kaskadenklassifikator, um Gesichter in Echtzeit effizient zu identifizieren.

Der Viola-Jones-Algorithmus besteht aus vier grundlegenden Schritten:
1. Auswahl von Haar-like Features
2. Erstellung eines Integralbildes
3. Durchführung des AdaBoost-Trainings
4. Erstellung von Klassifikator-Kaskaden

Eine der besten Demonstrationen, wie die Erkennung funktioniert, stammt von einem ehemaligen ITP-Studenten, Adam Harvey, der in seinem Video “OpenCV Face Detection: Visualized” zeigt, wie ein Entscheidungsbaum mit Threshold-Filtern in verschiedenen Bildbereichen auf verschiedene Skalen ausgewertet werden kann, um ein Objekt zu erkennen. Hier kannst du es dir ansehen:

Wie funktioniert Gesichtserkennung mit OpenCV?

OpenCV bietet eine Vielzahl von Funktionen, die es ermöglichen, den Viola-Jones-Algorithmus für die Gesichtserkennung zu nutzen. Hier sind die Schritte, um es selbst auszuprobieren:

1. Installation von OpenCV: Um mit Gesichtserkennung in Python zu beginnen, musst du OpenCV installieren:

pip install opencv-python

2. Code für einfache Gesichtserkennung: Speichere diesen Code nun in einer Datei, z.B. faceDetection.py:

import cv2
from matplotlib import pyplot as plt
import glob

COLOR_FACE = (255, 0, 255)  # Farbe für Rahmen ums Gesicht (Magenta)

image_files = glob.glob("*.jpg")  # Alle jpg-Dateien im aktuellen Verzeichnis in Liste speichern

# Für jedes Bild Gesichtserkennung machen
for file in image_files:
    img_bgr = cv2.imread(file, cv2.IMREAD_COLOR)  # Die Bilddatei farbig einlesen
    b, g, r = cv2.split(img_bgr)  # Die Farbwerte auslesen (cv2 erstellt BGR-Bild)
    img_rgb = cv2.merge([r, g, b])  # Aus den BGR-Farbwerten ein RGB-Bild machen
    img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)  # Ein Graustufenbild für die Erkennung machen

    # Gesichts-Klassifikatoren aus Datei laden
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")

    # Eigentliche Gesichtserkennung ausführen
    faces = face_cascade.detectMultiScale(img_gray, scaleFactor=1.2, minNeighbors=5)

    print("Anzahl erkannte Gesichter:", len(faces))  # Anzahl erkannte Gesichter ausgeben

    # Erkannte Gesichter durchgehen.
    # Die erkannten Gesichter werden durch ein umrahmendes Rechteck gegeben:
    # (x, y, w, h) stellen Koordinaten, Breite und Höhe des Rechtecks dar
    for (x, y, w, h) in faces:
        # das Gesicht durch ein farbiges Rechteck im Bild markieren
        cv2.rectangle(img_rgb, (x, y), (x + w, y + h), COLOR_FACE, 2)

    plt.axis('off')  # Diagramm-Achsen ausblenden
    plt.imshow(img_rgb)  # Dem Diagramm das Bild hinzufügen
    plt.title(file)  # Titel des Diagramms setzen
    plt.show()  # Diagramm anzeigen

exit()

3. Ausführung: Speichere nun ein oder mehrere Bilder in das gleiche Verzeichnis ab, in der die faceDetection.py Datei liegt. Wähle ein Bild, bei dem das Gesicht / die Gesichter frontal zu sehen sind, sonst wird es vermutlich nicht einwandfrei funktionieren. In dem Codebeispiel verwende ich den haarcascade_frontalface_default.xml-Classifier, er ist darauf spezialisiert, frontal ausgerichtete Gesichter zu erkennen. Wenn die Gesichter in den Bildern seitlich oder in anderen Ausrichtungen erscheinen, kann dies zu geringerer Erkennungsgenauigkeit führen. In solchen Fällen könnte es sinnvoll sein, einen spezifischeren Gesichts- oder Kopf-Classifier zu verwenden, der auf die speziellen Anforderungen der Bilder zugeschnitten ist.
OpenCV bietet verschiedene vordefinierte Haarcascade-Classifier, die sich auf unterschiedliche Ausrichtungen und Kontexte spezialisieren. Hier sind zwei Beispiele:

  • haarcascade_profileface.xml: Erkennt seitlich ausgerichtete Gesichter (Profilansicht).
  • haarcascade_fullbody.xml: Erkennt den gesamten menschlichen Körper.

Wenn du dich für einen passenden Classifier für dein Bild entschieden hast, führe anschließend in deinem Verzeichnis folgenden Befehl aus:

python faceDetection.py

4. Ausgabe: Im Terminal solltest du dann sehen, wie viele Gesichter erkannt wurden (“Anzahl erkannte Gesichter: xy”), außerdem öffnet sich ein Fenster mit dem jeweiligen Bild. Die erkannten Gesichter sollten Magentafarben umrahmt sein.

Limitationen des Viola-Jones-Algorithmus

Obwohl es keine wesentlichen Nachteile dieses Algorithmus gibt, die dazu führen, dass er weiterhin sehr beliebt ist, weist er einige Einschränkungen auf. Diese umfassen die Unfähigkeit, Gesichter in bestimmten Szenarien zu erkennen, in denen das Gesicht einer Person beispielsweise mit einer Maske bedeckt ist. Auch kann der Algorithmus Schwierigkeiten bei nicht korrekt ausgerichteten Gesichtern haben.

Fazit

Insgesamt bietet die Gesichtserkennung mit Python und OpenCV eine effiziente Möglichkeit, visuelle Daten zu analysieren. Die bereitgestellten Codebeispiele ermöglichen eine einfache Umsetzung der Gesichtserkennung, wobei die Auswahl des Haarcascade-Classifiers für die Ausrichtung der Gesichter entscheidend ist. Trotz der Leistungsfähigkeit des Viola-Jones-Algorithmus sollten seine Limitationen, insbesondere bei nicht konventionellen Ausrichtungen der Gesichter, berücksichtigt werden.

Quellen:
https://github.com/kylemcdonald/AppropriatingNewTechnologies/wiki/Week-2
https://iq.opengenus.org/face-detection-using-viola-jones-algorithm/
https://medium.com/@Andrew_D./computer-vision-viola-jones-object-detection-d2a609527b7c
https://www.h-brs.de/sites/default/files/20171215_fbinf_mclab_ss15_gesichtserkennung_malz_nawid_msmk.pdf

The comments are closed.