[PYTHON] Reconnaissance faciale à l'aide de l'analyse des composants principaux

introduction

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.

Qu'est-ce que l'analyse en composantes principales?

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.

Mise en place de la reconnaissance faciale

théorie

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.

la mise en oeuvre

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.

kanna8.png

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

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):

    #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.

résultat

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.

PCA.png

Recommended Posts

Reconnaissance faciale à l'aide de l'analyse des composants principaux
Ceci et cela de l'analyse en composantes principales
Analyse en composantes principales (Analyse en composantes principales: ACP)
J'ai essayé la reconnaissance faciale avec Face ++
Apprendre sans enseignant 3 Analyse des principales composantes
Analyse en composantes principales Analyser les nombres manuscrits à l'aide de l'ACP. Partie 2
Analyse des composants principaux à l'aide de python de nim avec nimpy
Analyse en composantes principales Analyser les nombres manuscrits à l'aide de l'ACP. Partie 1
Analyse des composants principaux avec Spark ML
Python: apprentissage non supervisé: analyse principale
Reconnaissance faciale à l'aide d'OpenCV (classificateur de caractéristiques de type Haar)
Analyse des composants principaux avec le corpus d'actualités Livedoor - Pratique--
<Cours> Machine learning Chapitre 4: Analyse des principaux composants
Analyse des composants principaux avec Livedoor News Corpus --Préparation--
Compression dimensionnelle par auto-encodeur et analyse des composants principaux
J'ai essayé d'analyser les principaux composants avec les données du Titanic!
PRML Chapitre 12 Mise en œuvre de l'analyse principale bayésienne Python
Analyse des données à l'aide de xarray
2. Analyse multivariée décrite dans Python 3-2. Analyse en composantes principales (algorithme)
Filtrage coordonné avec analyse des composants principaux et clustering K-means
Compréhension mathématique de l'analyse en composantes principales depuis le début
Clustering et analyse en composantes principales par méthode K-means (débutant)
Défiez l'analyse des composants principaux des données textuelles avec Python
Analyse en composants principaux (PCA) et analyse en composants indépendants (ICA) avec python
Analyse orthologue à l'aide d'OrthoFinder
2. Analyse multivariée expliquée dans Python 3-1. Analyse en composantes principales (scikit-learn)
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
Défis d'apprentissage automatique de Coursera en Python: ex7-2 (analyse principale)
Visualisez la matrice de corrélation par l'analyse des composants principaux avec Python
Détection d'image de visage similaire utilisant la reconnaissance faciale et le clustering PCA et K-means
Analyse pratique des composants principaux avec PyCaret [Normalisation + visualisation (tracé)] Mémo
Reconnaissance faciale avec OpenCV de Python
Reconnaissance de l'âge à l'aide de l'API de Pepper
Reconnaissance faciale par Amazon Rekognition
Mise en œuvre d'une analyse de composants indépendante
Effectuer la reconnaissance de caractères manuscrits à l'aide de Pylearn 2
Co-localisation d'objets pour la reconnaissance faciale
Reconnaissance faciale / coupe avec OpenCV
Essayez la reconnaissance faciale avec Python
Décrivez le visage avec Dlib (1)
Analyse de données à l'aide de pandas python
Introduction aux bases de Python de l'apprentissage automatique (apprentissage non supervisé / analyse principale)
[GWAS] Tracez les résultats de l'analyse en composantes principales (ACP) par PLINK
Traitement du langage 100 knock-85 (SVD tronqué): Compression dimensionnelle par analyse en composantes principales