La reconnaissance faciale est l’un des domaines qui emploie l’apprentissage automatique et qui est largement utilisé dans de nombreux domaines, depuis le marquage des photos sur les médias sociaux et la mise en correspondance des personnes ayant les mêmes caractéristiques faciales sur les sites de rencontre, jusqu’à la traque des criminels et la sécurisation des frontières, en passant par le maintien à distance des flambeurs dans les casinos.
Je trouve fascinant que nous puissions simuler le processus de reconnaissance faciale avec un degré de précision important, alors que dans le même temps, il y a des personnes qui souffrent de prosopagnosie, ou « cécité faciale », qui n’ont pas autant de chance. L’auteur d’un article de Cracked sur lequel je suis tombé il y a quelque temps décrit cette expérience comme la vision d’une pile de LEGO où, dès que l’on détourne le regard, on ne peut plus décrire de manière détaillée la couleur et la forme de chaque pièce ou leur position. Je me suis demandé si ce trouble cognitif n’avait pas quelque chose à voir avec l’allocation de la mémoire. Heureusement, la mémoire est quelque chose dont les ordinateurs disposent en abondance et nous n’avons même pas commencé à gratter la surface de l’ensemble des capacités que présentera l’informatique quantique.
Mais revenons aux faces propres.
Les données visuelles d’une image peuvent être mappées sur un vecteur où chaque entrée représente la luminosité du pixel correspondant. En prenant un ensemble d’images, on peut alors construire une matrice dont chaque ligne correspond à un vecteur image spécifique. Idéalement, les images sont d’abord normalisées de manière à aligner les caractéristiques de base telles que les yeux, le nez et la bouche afin d’augmenter la précision et de réduire le bruit. Les visages propres sont ensuite les vecteurs propres qui sont dérivés de la matrice de covariance de cette matrice de données de visage analysées.
Le jeu de données de visages que nous avons utilisé a été aimablement fourni par les laboratoires AT&T à Cambridge et se composait de 40 visages individuels, 10 images de chacun avec des expressions faciales et des positions de tête variables.
Les bibliothèques et modules Python suivants ont été utilisés dans cet exercice :
from sklearn.preprocessing import normalize
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from scipy.misc import imread
from itertools import chain
import numpy as np
import scipy as sp
import glob
-
normalize
La fonction met à l’échelle chaque vecteur individuel de l’échantillon pour avoir une norme unitaire. -
PCA
ou analyse en composantes principales, est un processus de réduction de la dimensionnalité linéaire utilisant la décomposition en valeurs singulières des données pour les projeter dans un espace de dimension inférieure. En d’autres termes, c’est le processus qui consiste à trouver la structure sous-jacente des données ou les directions dans lesquelles il y a le plus de variance. -
matplotlib.pyplot
est la fonction de traçage familière. -
imread
est utilisé pour lire une image à partir d’un fichier comme un tableau. -
chain
est un itérateur qui parcourt la liste en retournant des éléments individuels de chaque itérable. -
numpy
est le paquetage Python fondamental pour le calcul scientifique. -
scipy
est un autre package pour le calcul scientifique et technique, similaire ànumpy
mais qui contient des versions plus complètes des modules d’algèbre linéaire, ainsi que de nombreux autres algorithmes numériques. -
glob
Le module trouve tous les noms de chemin correspondant à un motif spécifié.
La première étape consiste à extraire tous les noms de fichiers de l’archive zippée. Ensuite, une matrice est créée en démêlant les matrices d’images en vecteurs à l’aide de la commande chain
et en les empilant. Cela crée une matrice 400×10304 dont chaque ligne contient toutes les informations sur une image spécifique 112×92.
filenames = m = for i in range(400)]for i in range(400):
m = list(chain.from_iterable(imread(filenames)))
m = np.matrix(m)
Puis, la matrice est normalisée et l’ACP est appliquée. Ici, nous avons réduit notre espace vectoriel à seulement 40 dimensions sur 10304:
model = PCA(n_components=40)
pts = normalize(m)
model.fit(pts)
pts2 = model.transform(pts)
Enfin, les visages propres, contenus dans model.components_
, peuvent être affichés:
fig, ax = plt.subplots(1,40)for i in range(40):
ord = model.components_
img = ord.reshape(112,92)
ax.imshow(img,cmap='gray')
Et voilà. Un tas de visages effrayants.
Ce que nous avons essentiellement fait, c’est créer un ensemble de base orthogonal où chaque face propre met en évidence un certain type de caractéristique, et à partir duquel les visages que nous avons utilisés peuvent être reconstruits par différentes combinaisons et proportions de vecteurs propres.
faces_pca = PCA(n_components=40)
faces_pca.fit(m)
components = faces_pca.transform(m)
projected = faces_pca.inverse_transform(components)fig, axes = plt.subplots(40,10,figsize=(20,80))
for i, ax in enumerate(axes.flat):
ax.imshow(projected.reshape(112,92),cmap="gray")
Parce que nous avons tellement compressé notre espace vectoriel (et que nous n’avons pas aligné les visages pour commencer), beaucoup de détails ont été perdus, mais les visages sont restés quelque peu reconnaissables.
Et donc, l’objectif pour le problème de vision par ordinateur de la reconnaissance des visages humains est de créer le nombre minimum de visages propres qui peuvent représenter adéquatement l’ensemble de l’entraînement. Si l’ensemble d’entraînement est suffisamment diversifié, l’ensemble de visages propres qui en résulte devrait être capable de représenter tous les visages. Et, bien que des progrès significatifs aient été réalisés ces dernières années concernant les algorithmes de reconnaissance faciale, il y a encore un long chemin à parcourir et beaucoup d’améliorations à apporter.
D’autre part, et comme toujours, il y a certains dangers associés aux capacités toujours croissantes d’un logiciel qui est capable de reconnaître, de simuler, et donc potentiellement de tromper et de manipuler un individu sans méfiance, et nous devons prendre les précautions adéquates pour nous assurer qu’il est utilisé de manière appropriée.
Et je vais juste laisser ceci ici comme un cas d’espèce et pour votre divertissement.
.