J'ai essayé un programme de reconnaissance faciale qui utilise l'analyse des composants principaux. Le programme est python et la bibliothèque pour l'analyse des composants principaux utilise scicit-learn. Si l'image du visage est cet article, l'image du vieil homme n'est pas intéressante, j'ai donc utilisé l'image du visage de Kanna Hashimoto. utilisation.
Comme il existe de nombreux sites et livres avec des explications détaillées, je les omettrai. En termes simples, il s'agit d'un type de méthode d'analyse de données qui extrait les caractéristiques des données en réduisant les dimensions de l'espace d'entités multidimensionnelles à un sous-espace de faible dimension. Notez que si la cible est une image, il s'agit d'une matrice bidimensionnelle avec N × N (pixels) pixels comme éléments, mais elle est représentée comme un vecteur de caractéristiques de dimension $ N ^ 2 $. Lorsqu'elle est appliquée à la correspondance d'image telle que la reconnaissance faciale, la valeur de corrélation (similarité) avec le composant principal du modèle est calculée, et celle avec la corrélation la plus élevée est sortie comme la réponse correcte.
Basé sur cet article.
Tout d'abord, préparez les données n faces pour l'apprentissage. On suppose que chaque image est redimensionnée à N × N.
X = \{\vec{x}_1,\vec{x}_2,\cdots,\vec{x}_i,\cdots,\vec{x}_n\}
Ici, $ \ vec {x_i} $ représente une image N × N comme un vecteur caractéristique de dimension $ N ^ 2 $.
À partir de là, la valeur moyenne
\vec{\mu} = \frac{1}{n}\sum_{i=1}^{n}\vec{x}_i
Et la matrice de covariance
S = \sum_{i=1}^{n}\sum_{j=1}^{n}(\vec{\mu}-\vec{x}_i)(\vec{\mu}-\vec{x}_j)^T
Obtenir. De là, le problème des valeurs propres
S\vec{v}=\lambda\vec{v}
En résolvant, nous obtenons la valeur propre $ \ lambda_j $ et le vecteur propre $ \ vec {v} _j $. En arrangeant les vecteurs propres dans l'ordre décroissant des valeurs propres correspondantes, les vecteurs propres deviennent le premier composant principal, le deuxième composant principal, etc.
La reconnaissance faciale est effectuée en calculant la valeur de corrélation entre l'image cible et le composant principal appris. La valeur de corrélation est une matrice de projection dans laquelle des vecteurs propres (vecteurs de composantes principales) sont disposés côte à côte.
V = \{\vec{v}_1,\vec{v}_2,\cdots,\vec{v}_d\}
Est obtenu par le produit interne avec le vecteur caractéristique $ X_ {obs} $ de l'image cible en utilisant. Ici, avec $ d = 1 $, la valeur de corrélation est obtenue à partir du premier composant principal. Autrement dit, la valeur de corrélation $ R $ est
R = \vec{v}_1\cdot X_{obs}^T
Peut être calculé comme.
Tout d'abord, préparez une image du visage de Kanna Hashimoto pour l'apprentissage. À l'origine, diverses images sont enregistrées, mais dans le cas de la reconnaissance faciale, elle est sévère et sévère à moins qu'il y ait beaucoup d'images prises sous différents angles. Pour le moment, cette fois c'est juste une pratique, j'ai donc copié et enregistré les 5 images suivantes.
Ensuite, préparez diverses images pour la pratique. Image de texte manuscrite (3), Kanna Hashimoto (original (org) et une autre image (kanna_2) qui est un peu similaire), Tetsuro Degawa (degawa), Mona Lisa (MN), un total de 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):
#Analyse des composants principaux
pca = PCA(n_components=d)
pca.fit(X)
print("Composant principal")
print(pca.components_)
print("moyenne")
print(pca.mean_)
print("Matrice de covariance")
print(pca.get_covariance())
print("Valeur unique de la matrice de covariance")
print(pca.explained_variance_)
print("Le vecteur propre de la matrice de covariance")
v = pca.components_
print(v)
#Résultat de l'analyse des composants principaux
print("Taux d'explication de dispersion des principaux composants")
print(pca.explained_variance_ratio_)
print("Taux de cotisation cumulé")
c_contribute_ratio = pca.explained_variance_ratio_.sum()
print(c_contribute_ratio)
#Réduction dimensionnelle et restauration
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*Redimensionner à N
x.append(img2)
X = np.array(x)
X = X.reshape(X.shape[0],SIZE*SIZE) #Vecteur de caractéristiques x n
X = X / 255.0 # 0-Je dois le mettre à 1, donc normalise
print(X.shape)
return X
def main():
#Numéro de dimension d'analyse des composants principaux
d = 5
path = './kanna/*.png'
X = img_read(path)
# PCA
v, c_contribute_ratio = Image_PCA_Analysis(d, X)
#correspondant à
path = './kanna2/*.png'
files = glob(path)
for file in files:
X2 = img_read(file)
X2 = X2 / np.linalg.norm(X2)
#Valeur de corrélation (produit de la matrice de projection et du vecteur de caractéristiques créé à l'aide du vecteur propre à dimension d)
eta = np.dot(v[0],X2.T)
print("Valeur de corrélation:", file, np.linalg.norm(eta * 255))
return
La luminosité moyenne des images de test cibles (5) étant différente, la norme du vecteur de caractéristiques est normalisée à 1.
Comme prévu, la valeur de corrélation de Kanna Hashimoto était élevée et la valeur de corrélation de Mona Lisa et de Degawa était faible. Degawa est plus bas que le caractère manuscrit "3", et le caractère manuscrit "3" est plus proche du visage de Kanna Hashimoto que d'Idekawa.
Valeur de corrélation: ./kanna2\3.png 21.292788187030233
Valeur de corrélation: ./kanna2\degawa.png 14.11580341763399
Valeur de corrélation: ./kanna2\kanna_2.png 32.536060418259474
Valeur de corrélation: ./kanna2\kanna_org.png 39.014994579329326
Valeur de corrélation: ./kanna2 \ MN.png 26.90538714456287 ''
C'est naturel parce que plusieurs des mêmes images sont enregistrées, mais cela ne peut presque s'expliquer que par la première composante principale, et le taux de cotisation cumulé est de 100.%
Taux d'explication de dispersion des principaux composants
[1.00000000e+00 3.15539405e-32 0.00000000e+00 0.00000000e+00
0.00000000e+00]
Taux de cotisation cumulé
1.0
En tant que compréhension qualitative de la valeur de corrélation, comme le montre la figure ci-dessous, tout d'abord, les données de l'image d'apprentissage sont considérées comme projetées sur l'axe de la composante principale (compression dimensionnelle). En prenant le produit interne du vecteur composant principal et (le vecteur caractéristique de) l'image cible, la valeur du produit interne est plus grande pour l'image proche de la direction du vecteur composant principal.