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.
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.
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.
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.
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
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.
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.
Recommended Posts