[PYTHON] Gesichtserkennung mit Hauptkomponentenanalyse

Einführung

Ich habe ein Gesichtserkennungsprogramm ausprobiert, das die Hauptkomponentenanalyse verwendet. Das Programm ist Python und die Bibliothek für die Hauptkomponentenanalyse verwendet scicit-learn. Wenn das Gesichtsbild [dieses Papier] ist (https://www.ism.ac.jp/editsec/toukei/pdf/49-1-023.pdf), ist das Bild des alten Mannes nicht interessant, daher habe ich das Gesichtsbild von Kanna Hashimoto verwendet. verwenden.

Was ist Hauptkomponentenanalyse?

Da es viele Websites und Bücher mit detaillierten Erklärungen gibt, werde ich sie weglassen. Einfach ausgedrückt handelt es sich um eine Art Datenanalysemethode, bei der die Merkmale der Daten extrahiert werden, indem die Abmessungen des mehrdimensionalen Merkmalsraums auf einen niedrigdimensionalen Unterraum reduziert werden. Beachten Sie, dass es sich bei dem Ziel, wenn es sich um ein Bild handelt, um eine zweidimensionale Matrix mit N × N (Pixel) Pixelwerten als Elementen handelt, die jedoch als $ N ^ 2 $ -dimensionaler Merkmalsvektor dargestellt wird. Bei Anwendung auf Bildanpassung wie Gesichtserkennung wird der Korrelationswert (Ähnlichkeit) mit der Hauptkomponente der Vorlage berechnet und derjenige mit der höchsten Korrelation als richtige Antwort ausgegeben.

Implementierung der Gesichtserkennung

Theorie

Basierend auf diesem Artikel.

Bereiten Sie zunächst n Gesichtsdaten für das Lernen vor. Es wird angenommen, dass jedes Bild auf N × N verkleinert wird.

X = \{\vec{x}_1,\vec{x}_2,\cdots,\vec{x}_i,\cdots,\vec{x}_n\}

Hier repräsentiert $ \ vec {x_i} $ ein N × N-Bild als Merkmalsvektor der Dimension $ N ^ 2 $.

Von dort der Durchschnittswert

\vec{\mu} = \frac{1}{n}\sum_{i=1}^{n}\vec{x}_i

Und die Kovarianzmatrix

S = \sum_{i=1}^{n}\sum_{j=1}^{n}(\vec{\mu}-\vec{x}_i)(\vec{\mu}-\vec{x}_j)^T

Bekommen. Von dort das Eigenwertproblem

S\vec{v}=\lambda\vec{v}

Durch Lösen erhalten wir den Eigenwert $ \ lambda_j $ und den Eigenvektor $ \ vec {v} _j $. Durch Anordnen der Eigenvektoren in absteigender Reihenfolge der entsprechenden Eigenwerte werden die Eigenvektoren zur ersten Hauptkomponente, zur zweiten Hauptkomponente usw.

Die Gesichtserkennung wird durchgeführt, indem der Korrelationswert zwischen dem Zielbild und der gelernten Hauptkomponente berechnet wird. Der Korrelationswert ist eine Projektionsmatrix, in der die Eigenvektoren (Hauptkomponentenvektoren) nebeneinander angeordnet sind.

V = \{\vec{v}_1,\vec{v}_2,\cdots,\vec{v}_d\}

Wird vom inneren Produkt mit dem Merkmalsvektor $ X_ {obs} $ des Zielbildes unter Verwendung erhalten. Hier wird mit $ d = 1 $ der Korrelationswert aus der ersten Hauptkomponente erhalten. Das heißt, der Korrelationswert $ R $ ist

R = \vec{v}_1\cdot X_{obs}^T

Kann berechnet werden als.

Implementierung

Bereiten Sie zunächst ein Gesichtsbild von Kanna Hashimoto zum Lernen vor. Ursprünglich werden verschiedene Bilder registriert, aber im Fall der Gesichtserkennung ist es schwerwiegend und schwerwiegend, es sei denn, es werden viele Bilder aus verschiedenen Winkeln aufgenommen. Diesmal ist es nur eine Übung, also habe ich die folgenden 5 Bilder kopiert und registriert.

kanna8.png

Bereiten Sie als nächstes verschiedene Bilder zum Üben vor. Handgeschriebenes Textbild (3), Kanna Hashimoto (Original (org) und ein anderes Bild (kanna_2), das ein wenig ähnlich ist), Tetsuro Degawa (degawa), Mona Lisa (MN), insgesamt 5

pcatest.png

Code

import os
from glob import glob
import numpy as np
import sys
from sklearn.decomposition import PCA
import cv2

SIZE = 64

# GRAYSCALE
def Image_PCA_Analysis(d, X):

    #Hauptkomponentenanalyse
    pca = PCA(n_components=d)
    pca.fit(X)

    print("Hauptbestandteil")
    print(pca.components_)
    print("durchschnittlich")
    print(pca.mean_)
    print("Kovarianzmatrix")
    print(pca.get_covariance())
    print("Eindeutiger Wert der Kovarianzmatrix")
    print(pca.explained_variance_)
    print("Der Eigenvektor der Kovarianzmatrix")
    v = pca.components_
    print(v)
    #Ergebnis der Hauptkomponentenanalyse
    print("Dispersionserklärungsrate der Hauptkomponenten")
    print(pca.explained_variance_ratio_)
    print("Kumulativer Beitragssatz")
    c_contribute_ratio = pca.explained_variance_ratio_.sum()
    print(c_contribute_ratio)

    #Dimensionsreduzierung und Wiederherstellung
    X_trans = pca.transform(X)
    X_inv = pca.inverse_transform(X_trans)
    print('X.shape =', X.shape)
    print('X_trans.shape =', X_trans.shape)
    print('X_inv.shape =', X_inv.shape)
    for i in range(X_inv.shape[0]):
        cv2.imshow("gray", X_inv[i].reshape(SIZE,SIZE))
        cv2.waitKey(0)
        cv2.destroyAllWindows()

    return v,c_contribute_ratio

def img_read(path):

    x = []
    files = glob(path)
    for file in files:
        img = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
        img2 = cv2.resize(img, (SIZE, SIZE)) # N*Ändern Sie die Größe auf N.
        x.append(img2)
    X = np.array(x)
    X = X.reshape(X.shape[0],SIZE*SIZE) #Merkmalsvektor x n
    X = X / 255.0 # 0-Ich muss es auf 1 setzen, also normalisieren
    print(X.shape)

    return X

def main():

    #Nummer der Hauptkomponentenanalyse
    d = 5

    path = './kanna/*.png'
    X = img_read(path)

    # PCA
    v, c_contribute_ratio = Image_PCA_Analysis(d, X)

    #passend
    path = './kanna2/*.png'
    files = glob(path)
    for file in files:
        X2 = img_read(file)
        X2 = X2 / np.linalg.norm(X2)
        #Korrelationswert (Produkt aus Projektionsmatrix und Merkmalsvektor, erstellt mit einem d-dimensionalen Eigenvektor)
        eta = np.dot(v[0],X2.T)
        print("Korrelationswert:", file, np.linalg.norm(eta * 255))

    return


Da die durchschnittliche Helligkeit der Zieltestbilder (5) unterschiedlich ist, ist die Norm des Merkmalsvektors auf 1 standardisiert.

Ergebnis

Wie erwartet war der Korrelationswert von Kanna Hashimoto hoch und der Korrelationswert von Mona Lisa und Degawa niedrig. Degawa war niedriger als das handschriftliche Zeichen "3", und das handgeschriebene Zeichen "3" war dem Gesicht von Kanna Hashimoto näher als Idekawa.

Korrelationswert: ./kanna2\3.png 21.292788187030233
Korrelationswert: ./kanna2\degawa.png 14.11580341763399
Korrelationswert: ./kanna2\kanna_2.png 32.536060418259474
Korrelationswert: ./kanna2\kanna_org.png 39.014994579329326
 Korrelationswert: ./kanna2 \ MN.png 26.90538714456287```

Es ist natürlich, weil viele der gleichen Bilder registriert sind, aber es kann fast nur durch die erste Hauptkomponente erklärt werden, und der kumulierte Beitragssatz beträgt 100.%

 Dispersionserklärungsrate der Hauptkomponenten
[1.00000000e+00 3.15539405e-32 0.00000000e+00 0.00000000e+00
 0.00000000e+00]
 Kumulativer Beitragssatz
1.0

Als qualitatives Verständnis des Korrelationswerts, wie in der folgenden Abbildung gezeigt, werden zunächst die Daten des Trainingsbildes als auf die Hauptkomponentenachse projiziert (dimensionale Komprimierung) betrachtet. Indem das innere Produkt des Hauptkomponentenvektors und (der Merkmalsvektor von) das Zielbild genommen werden, ist der Wert des inneren Produkts für das Bild nahe der Richtung des Hauptkomponentenvektors größer.

PCA.png

Recommended Posts

Gesichtserkennung mit Hauptkomponentenanalyse
Dies und das der Hauptkomponentenanalyse
Hauptkomponentenanalyse (Hauptkomponentenanalyse: PCA)
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Lernen ohne Lehrer 3 Hauptkomponentenanalyse
Hauptkomponentenanalyse Analysieren Sie handschriftliche Zahlen mit PCA. Teil 2
Hauptkomponentenanalyse mit Python von nim mit nimpy
Hauptkomponentenanalyse Analysieren Sie handschriftliche Zahlen mit PCA. Teil 1
Hauptkomponentenanalyse mit Spark ML
Gesichtserkennung mit OpenCV (Haar-like Feature Classifier)
Hauptkomponentenanalyse mit Livedoor News Corpus --Practice--
<Kurs> Maschinelles Lernen Kapitel 4: Hauptkomponentenanalyse
Hauptkomponentenanalyse mit Livedoor News Corpus - Vorbereitung--
Dimensionskomprimierung durch Selbstcodierer- und Hauptkomponentenanalyse
Ich habe versucht, die Hauptkomponenten mit Titanic-Daten zu analysieren!
PRML Kapitel 12 Bayesianische Hauptanalyse Python-Implementierung
Datenanalyse mit xarray
2. Multivariate Analyse in Python 3-2. Hauptkomponentenanalyse (Algorithmus)
Koordinierte Filterung mit Hauptkomponentenanalyse und K-Mittel-Clustering
Mathematisches Verständnis der Hauptkomponentenanalyse von Anfang an
Clustering und Hauptkomponentenanalyse nach der K-Means-Methode (Anfänger)
Fordern Sie die Hauptkomponentenanalyse von Textdaten mit Python heraus
Hauptkomponentenanalyse (PCA) und unabhängige Komponentenanalyse (ICA) mit Python
Orthologe Analyse mit OrthoFinder
2. Multivariate Analyse in Python 3-1. Hauptkomponentenanalyse (Scikit-Learn)
Ich habe versucht, das Lachproblem mit Keras zu erkennen.
Coursera-Herausforderungen für maschinelles Lernen in Python: ex7-2 (Primäranalyse)
Visualisieren Sie die Korrelationsmatrix durch Hauptkomponentenanalyse mit Python
Ähnliche Gesichtsbilderkennung mit Gesichtserkennung und PCA- und K-Mittel-Clustering
Hauptkomponentenanalyse zum Anfassen mit PyCaret [Normalisierung + Visualisierung (grafisch)] Memo
Gesichtserkennung mit OpenCV von Python
Alterserkennung mit Peppers API
Gesichtserkennung durch Amazon Rekognition
Implementierung einer unabhängigen Komponentenanalyse
Führen Sie die handschriftliche Zeichenerkennung mit Pylearn 2 durch
Objekt-Co-Lokalisierung zur Gesichtserkennung
Gesichtserkennung / Schneiden mit OpenCV
Versuchen Sie die Gesichtserkennung mit Python
Umrisse das Gesicht mit Dlib (1)
Datenanalyse mit Python-Pandas
Einführung in die Python-Grundlagen des maschinellen Lernens (unbeaufsichtigtes Lernen / Hauptanalyse)
[GWAS] Zeichnen Sie die Ergebnisse der Hauptkomponentenanalyse (PCA) von PLINK auf
Sprachverarbeitung 100 knock-85 (abgeschnittene SVD): Dimensionskomprimierung durch Hauptkomponentenanalyse