Wir analysieren das von Google veröffentliche Python-Skript für die Gesichtserkennung mit mediapipe.
Vorbereitung
Wir laden cv2 und mediapipe. cv2 ist ein weit verbreitetes Python-Paket für computer vision von OpenCV.
Anschliessend machen wir uns zwei Variablen. Eine zur Gesichtserkennungs-Lösung von mediapipe und eine zu den Zeichnungs-Tools, damit wir im Bild das erkannte Gesicht markieren können.
import cv2
import mediapipe as mp
mp_face_detection = mp.solutions.face_detection
mp_drawing = mp.solutions.drawing_utils
Bild-Quellen
Als Quelle für die Bilder können klassische Bilddateien dienen, man kann aber auch gleich den Input der Webcam weiterverarbeiten. In beiden Fällen (Liste von Dateien, Webcam-Input) werden die Bilder in einer Schleife abgearbeitet:
Liste von Dateien
Wir gehen die Liste der Bilddateien in einer for-Schleife durch. Wir lesen die einzelnen Dateien und verwandeln diese vom Farbmodell BGR (so liest cv2) nach RGB.
IMAGE_FILES = ["selfie.jpg"]
for file in IMAGE_FILES:
image = cv2.imread(file)
converted = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
Webcam-Input
Wir öffnen die erste Webcam des Systems. Anschliessend holen wir in der while-Schleife einzelne Bilder und bereiten diese vor.
cap = cv2.VideoCapture(0)
while cap.isOpened():
(success, image) = cap.read()
if not success:
print("Ignoring empty camera frame.")
continue
converted = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
Gesichter erkennen
Nun wird ein neues Objekt für die Gesichtserkennung erzeugt. Dem Konstruktor von FaceDetection
können diverse Argumente mitgeliefert werden.
with mp_face_detection.FaceDetection(model_selection=1, min_detection_confidence=0.5) as face_detection:
results = face_detection.process(image)
Wenn wir dann ein image
haben, können wir darauf die Erkennung anwenden:
Ausgabe sichtbar machen
Als Bilddatei speichern
Falls nichts erkannt wurde soll nichts getan werden. Sonst wird das eingelesene Bild kopiert und für jedes erkannte Gesicht werden die Koordinaten der Nasenspitze in der Konsole ausgegeben und die Erkennung mit der vordefinierten Funktion draw_detection
eingezeichnet.
if not results.detections:
continue
annotated_image = image.copy()
for detection in results.detections:
print(mp_face_detection.get_key_point(detection, mp_face_detection.FaceKeyPoint.NOSE_TIP))
mp_drawing.draw_detection(annotated_image, detection)
cv2.imwrite('output.png', annotated_image)
Schlussendlich wird das kopierte Bild mit den erkannten Gesichtern als Bilddatei abgespeichert.
Direkt anzeigen (Webcam)
Fürs Anzeigen mit cv2
wird das Bild wieder ins BGR-Format konvertiert. Anschliessend wird für jedes erkannte Gesicht eine Markierung ins Bild gezeichnet. Das Bild wird schlussendlich angezeigt.
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.detections:
for detection in results.detections:
mp_drawing.draw_detection(image, detection)
cv2.imshow('MediaPipe Face Detection', image)