[PYTHON] Schätzen Sie mit OpenCV (Eigenface, Fisherface, LBPH), wer das Gesicht hat.

Gesichtsschätzung mit OpenCV

Beim letzten Mal habe ich den Gesichtsbereich mit dem Haar-ähnlichen Feature-Klassifikator (Gesichtserkennung mit OpenCV (Haar-ähnlicher Feature-Klassifikator) extrahiert. ). Dieses Mal wurde als Anwendung das vom Haar-ähnlichen Merkmalsklassifikator extrahierte Gesichtsbild vom OpenCV-Gesichtsschätzer (Eigenface, Fisherface, LBPH) trainiert, und es gab Unterschiede in Mimik, Verkleidung und Lichtverhältnissen. Lassen Sie uns raten, wer das verlernte Gesicht ist.

Der in OpenCV installierte Gesichtsschätzungsalgorithmus lautet wie folgt. (Klicken Sie hier für Details)

  1. Bereiten Sie ein Bild für das Training vor (gleiche Lichtverhältnisse, Skalierung an Augen- und Nasenpositionen, gleiche Auflösung).

  2. Berechnen Sie den Durchschnitt der Trainingsbilder und subtrahieren Sie das Durchschnittsbild von jedem Bild.

  3. Berechnen Sie die Kovarianzmatrix des subtrahierten Bildes.

  4. Berechnen Sie den Eigenvektor und den Eigenwert aus der Kovarianzmatrix.

  5. Wählen Sie die Hauptkomponente aus.

    eigenfaces_opencv.png

Dieses Mal werden wir das Gesicht erkennen, aber diese Algorithmen werden auch auf die Handschriftenbewertung, die medizinische Bildverarbeitung und das Lippenlesen angewendet. An einem interessanten Ort ist es möglich, die verkleidete Person zu identifizieren.

OpenCV OpenCV (Open Source Computer Vision Library) ist eine Sammlung von BSD-lizenzierten Video- / Bildverarbeitungsbibliotheken. Es gibt viele Algorithmen wie Bildfilterung, Vorlagenabgleich, Objekterkennung, Videoanalyse und maschinelles Lernen.

■ Beispiel für Bewegungsverfolgung mit OpenCV (OpenCV Google Summer of Code 2015) https://www.youtube.com/watch?v=OUbUFn71S4s

■ Klicken Sie hier für die Installation und einfache Verwendung Installieren Sie OpenCV 3 (Core + Contrib) in der Python 3-Umgebung und unterscheiden Sie zwischen OpenCV 2 und OpenCV 3 und überprüfen Sie die einfache Bedienung ★ Die Predict () -Methode funktionierte im Gesichtsmodul von opencv_contrib in OpenCV 3.1 nicht wie beabsichtigt. Dieses Mal ist OpenCV 2 auf Anaconda 2 installiert und das folgende Programm wird ausgeführt.

■ Klicken Sie hier für die Standbildverarbeitung Versuchen Sie die Kantenerkennung mit OpenCV Führen Sie verschiedene Filter mit OpenCV durch (Gradient, Highpass, Laplacian, Gaussian) Extrahieren Sie Feature-Punkte mit OpenCV (AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob) Gesichtserkennung mit OpenCV (Haar-like Feature Classifier)

■ Klicken Sie hier für die Videoverarbeitung Versuchen Sie, Videos in Echtzeit mit OpenCV zu konvertieren Versuchen Sie, Webkamera- / Videokamera-Videos in Echtzeit mit OpenCV zu konvertieren Zeichnen Sie den optischen Fluss in Echtzeit mit OpenCV (Shi-Tomasi-Methode, Lucas-Kanade-Methode) Objektverfolgung mit OpenCV (Verfolgen von Funktionspunkten, die von der Maus mit der Lucas-Kanade-Methode festgelegt wurden Bewegungsvorlagenanalyse mit OpenCV (Erkennen von Objekten und deren Bewegungsrichtungen in Echtzeit)

Gesichtsdatenbank

Einführung in die Gesichtsdatenbank, die häufig in der Bildverarbeitung verwendet wird.

Dieses Mal verwenden wir die Yale-Gesichtsdatenbank (Yale-Gesichter).

Trainingsdaten und Testdaten

Yalefaces enthält 15 verschiedene Gesichtsgesichter. Jede Person hat ein normales Gesicht, ein Gesicht mit Brille, ein glückliches Gesicht, ein zwinkerndes Gesicht, ein trauriges Gesicht, ein trauriges Gesicht, ein überraschtes Gesicht und ein Licht von rechts / links. Ich habe ein Gesicht. Extrahieren Sie gegebenenfalls ein beliebiges Gesichtsbild aus dem Gesichtsbild jeder Person zum Testen (fügen Sie das Testbild nicht in das Trainingsbild ein). Dieses Mal habe ich die Trainingsbilder im Verzeichnis "yalefaces" und die Testbilder im Verzeichnis "test" gespeichert.

trainingdata.png Gesichter mit verschiedenen Ausdrücken

Programm

Der Programmablauf ist wie folgt.

  1. Laden Sie das Trainingsbild
  2. Extrahieren Sie den Gesichtsbereich mit einem Haar-ähnlichen Feature-Klassifikator
  3. Ändern Sie die Größe des Gesichtsbereichs auf eine bestimmte Größe
  4. Trainieren Sie Bilder und Etiketten als Trainingsdaten mit FaceRecognizer (train ()).
  5. Wiederholen Sie die Schritte 1 bis 4 für alle Trainingsbilder
  6. Laden Sie das Testbild
  7. Extrahieren Sie den Gesichtsbereich mit einem Haar-ähnlichen Feature-Klassifikator
  8. Ändern Sie die Größe des Gesichtsbereichs auf eine bestimmte Größe
  9. Vorhersage des Testbildes mit FaceRecognizer (predigen ()) ⇒ [Beschriftung, Genauigkeit]
  10. Wiederholen Sie 6-9 für alle Testbilder

Es gibt einige Punkte im Programm.

face_predict.py


#!/usr/bin/python
# -*- coding: utf-8 -*-

import cv2, os
import numpy as np
from PIL import Image

#Trainingsbild
train_path = './yalefaces'

#Testbild
test_path = './test'

# Haar-wie Feature-Klassifikator
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath)

#Erstellen eines Gesichtserkenners für OpenCV 2
#* In OpenCV3 ist FaceRecognizer cv2.Es wird ein Gesichtsmodul sein
# EigenFace
#recognizer = cv2.createEigenFaceRecognizer()
# FisherFace
#recognizer = cv2.createFisherFaceRecognizer()
# LBPH
recognizer = cv2.createLBPHFaceRecognizer()

#Holen Sie sich das Bild in den angegebenen Pfad
def get_images_and_labels(path):
    #Array zum Speichern von Bildern
    images = []
    #Array zum Speichern von Beschriftungen
    labels = []
    #Array zum Speichern von Dateinamen
    files = []
    for f in os.listdir(path):
        #Bildpfad
        image_path = os.path.join(path, f)
        #Laden Sie das Bild in Graustufen
        image_pil = Image.open(image_path).convert('L')
        #In einem Array von NumPy gespeichert
        image = np.array(image_pil, 'uint8')
        # Haar-wie Gesicht mit Feature-Klassifikator erkennen
        faces = faceCascade.detectMultiScale(image)
        #Verarbeitung des erkannten Gesichtsbildes
        for (x, y, w, h) in faces:
            #Ändern Sie die Größe des Gesichts auf 200 x 200
            roi = cv2.resize(image[y: y + h, x: x + w], (200, 200), interpolation=cv2.INTER_LINEAR)
            #Speichern Sie Bilder in einem Array
            images.append(roi)
            #Beschriftung vom Dateinamen abrufen
            labels.append(int(f[7:9]))
            #Speichern Sie Dateinamen in einem Array
            files.append(f)

    return images, labels, files


#Holen Sie sich ein Trainingsbild
images, labels, files = get_images_and_labels(train_path)

#Durchführung der Schulung
recognizer.train(images, np.array(labels))

#Holen Sie sich das Testbild
test_images, test_labels, test_files = get_images_and_labels(test_path)

i = 0
while i < len(test_labels):
    #Vorhersageimplementierung für Testbilder
    label, confidence = recognizer.predict(test_images[i])
    #Ausgabe des Vorhersageergebnisses an die Konsole
    print("Test Image: {}, Predicted Label: {}, Confidence: {}".format(test_files[i], label, confidence))
    #Testbild anzeigen
    cv2.imshow("test image", test_images[i])
    cv2.waitKey(300)
    
    i += 1

#Verarbeitung beenden
cv2.destroyAllWindows()

Dieses Programm lief unter Python 2.7.12 und OpenCV 2.4.13. Wenn Sie mit Python 3 und OpenCV 3 arbeiten, ändern Sie den FaceRecognizer-Teil im Programm von "cv2" in "cv2.face". In OpenCV 3.1 funktioniert die Predict () -Methode von FaceRecognizer nicht wie beabsichtigt. Weitere Informationen finden Sie unter Unterschiede zwischen OpenCV2 und OpenCV3 usw. ⇒ Einige Methoden funktionieren aufgrund von Fehlern nicht.

Ausführungsergebnis

Das Training wird ausgeführt, indem der Teil "XX" von subjectXX als numerischer Wert auf dem Etikett festgelegt wird. Das richtige Etikett (Predicted Label) kann für das Testbild (Image) geschätzt werden.

Bei der Schätzung mit Eigenface schlug die Schätzung der lichtbezogenen Markierung = 5, 6, 8, 9 fehl, und andere Schätzungen waren erfolgreich.

Test Image: subject01.happy, Predicted Label: 1, Confidence: 4383.25505059
Test Image: subject02.wink, Predicted Label: 2, Confidence: 6947.75053221
Test Image: subject03.happy, Predicted Label: 3, Confidence: 4145.80848328
Test Image: subject04.glasses, Predicted Label: 4, Confidence: 5420.9213318
Test Image: subject05.leftlight, Predicted Label: 12, Confidence: 7722.72936213
Test Image: subject06.leftlight, Predicted Label: 1, Confidence: 10086.4101755
Test Image: subject07.glasses, Predicted Label: 7, Confidence: 7043.70495967
Test Image: subject08.leftlight, Predicted Label: 2, Confidence: 10275.9545456
Test Image: subject09.rightlight, Predicted Label: 15, Confidence: 7481.31094502
Test Image: subject10.sleepy, Predicted Label: 10, Confidence: 2317.22633915
Test Image: subject11.centerlight, Predicted Label: 11, Confidence: 8077.42380817
Test Image: subject12.glasses, Predicted Label: 12, Confidence: 5233.03342586
Test Image: subject13.surprised, Predicted Label: 13, Confidence: 6516.98395617
Test Image: subject14.normal, Predicted Label: 14, Confidence: 0.0
Test Image: subject15.surprised, Predicted Label: 15, Confidence: 7165.71597327

Als ich es mit Fisherface schätzte, waren alle Schätzungen erfolgreich.

Test Image: subject01.happy, Predicted Label: 1, Confidence: 801.784987691
Test Image: subject02.wink, Predicted Label: 2, Confidence: 2368.90429845
Test Image: subject03.happy, Predicted Label: 3, Confidence: 826.018934498
Test Image: subject04.glasses, Predicted Label: 4, Confidence: 1080.94198758
Test Image: subject05.leftlight, Predicted Label: 5, Confidence: 2137.42013849
Test Image: subject06.leftlight, Predicted Label: 6, Confidence: 2092.53092982
Test Image: subject07.glasses, Predicted Label: 7, Confidence: 2042.67529443
Test Image: subject08.leftlight, Predicted Label: 8, Confidence: 2239.45348941
Test Image: subject09.rightlight, Predicted Label: 9, Confidence: 2875.2788263
Test Image: subject10.sleepy, Predicted Label: 10, Confidence: 662.762591569
Test Image: subject11.centerlight, Predicted Label: 11, Confidence: 1703.80515728
Test Image: subject12.glasses, Predicted Label: 12, Confidence: 1480.18770297
Test Image: subject13.surprised, Predicted Label: 13, Confidence: 1690.12255703
Test Image: subject14.normal, Predicted Label: 14, Confidence: 0.0
Test Image: subject15.surprised, Predicted Label: 15, Confidence: 1887.42538269

Bei der Schätzung durch LBPH schlug die Schätzung der lichtbezogenen Markierung = 6, 9 fehl. Andere waren erfolgreich.

Test Image: subject01.happy, Predicted Label: 1, Confidence: 34.9751422497
Test Image: subject02.wink, Predicted Label: 2, Confidence: 37.8730262399
Test Image: subject03.happy, Predicted Label: 3, Confidence: 35.1183059319
Test Image: subject04.glasses, Predicted Label: 4, Confidence: 37.5886492389
Test Image: subject05.leftlight, Predicted Label: 5, Confidence: 48.2634869014
Test Image: subject06.leftlight, Predicted Label: 14, Confidence: 64.5502245279
Test Image: subject07.glasses, Predicted Label: 7, Confidence: 54.5043891288
Test Image: subject08.leftlight, Predicted Label: 8, Confidence: 84.4281976817
Test Image: subject09.rightlight, Predicted Label: 12, Confidence: 75.3254674542
Test Image: subject10.sleepy, Predicted Label: 10, Confidence: 17.8806440153
Test Image: subject11.centerlight, Predicted Label: 11, Confidence: 74.8238311755
Test Image: subject12.glasses, Predicted Label: 12, Confidence: 31.8721301084
Test Image: subject13.surprised, Predicted Label: 13, Confidence: 40.3420527188
Test Image: subject14.normal, Predicted Label: 14, Confidence: 0.0
Test Image: subject15.surprised, Predicted Label: 15, Confidence: 33.2920487407

Das Vergleichsergebnis der drei Algorithmen zeigt, dass das Fisherface, wie bereits gesagt, weniger lichtempfindlich ist. Da der Erfolg und Misserfolg der Schätzung in gewissem Maße dem Wert des Vertrauens entsprach, schien es auch gut, einen Schwellenwert für das Vertrauen festzulegen und unzuverlässige Schätzergebnisse in unschätzbare Elemente zu klassifizieren.

(Bonus) GIF-Bild → PNG-Bildkonvertierung

OpenCV unterstützt keine GIF-Bilder, um Patentprobleme zu vermeiden. Das Lesen eines GIF-Bildes mit cv2.imread () liest nichts. Wenn Sie Yalefaces, eine Gesichtsbilddatenbank im GIF-Format, mit OpenCV verwenden möchten, können Sie diese im Voraus mit dem folgenden Skript in ein Gesichtsbild im PNG-Format konvertieren. Das folgende Skript konvertiert das GIF-Bild im Verzeichnis "yalefaces" in ein PNG-Bild und speichert es im Verzeichnis "png". Wenn Sie es brauchen, verwenden Sie bitte das folgende Skript.

gif2png.py


# -*- coding: utf-8 -*-

import os
from PIL import Image
import shutil

#Verzeichnis mit den zu konvertierenden Dateien
org_dir = 'yalefaces'
#Erweiterung der zu konvertierenden Datei
org_ext = 'gif'
#Verzeichnis zum Speichern der konvertierten Datei
conv_dir = 'png'
#Konvertierte Dateierweiterung
conv_ext = 'png'

#Löschen Sie vorhandene Verzeichnisse einschließlich Dateien
if os.path.exists(conv_dir):
    shutil.rmtree(conv_dir)
#Erstellen Sie ein Verzeichnis
os.mkdir(conv_dir)

# 「.Zeichenkettenlänge einschließlich der Erweiterung
org_ext_len = len(org_ext) + 1

for dirname, dirnames, filenames in os.walk(org_dir):
    for filename in filenames:
        #Pfad der zu konvertierenden Datei
        org_path = org_dir + '/' + filename

        #Dateipfad nach der Rückkehr
        if len(filename) > org_ext_len and \
            filename[-org_ext_len:] == '.' + org_ext:
            filename = filename[0:-org_ext_len]
        conv_path = conv_dir + '/' + filename + '.' + conv_ext

        try:
            #Ausführung konvertieren
            Image.open(org_path).save(conv_path)
        except IOError:
            print('cannot convert :', org_path)

Wenn Sie die Python-Bildverarbeitungsbibliothek und das PIL-Modul nicht installiert haben, installieren Sie bitte pillow. Beispiel)

$ conda install pillow

Recommended Posts

Schätzen Sie mit OpenCV (Eigenface, Fisherface, LBPH), wer das Gesicht hat.
Gesichtserkennung mit OpenCV (Haar-like Feature Classifier)