L'apprentissage automatique est un traitement d'image. En utilisant des méthodes d'analyse classiques telles que PCA (analyse en composants principaux) et NMF (analyse factorielle matricielle non négative), il est possible d'extraire les principales caractéristiques d'un grand nombre d'images de visage, j'ai donc immédiatement essayé de cibler des visages animés. .. L'objectif est de 21 551 types de données de visage, comme indiqué ci-dessous. Je l'ai emprunté à https://www.kaggle.com/soumikrakshit/anime-faces. Merci beaucoup.
Il serait intéressant que les composants qui déterminent le contour et les composants qui déterminent les cheveux puissent être visuellement décomposés par analyse.
PCA
import cv2
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
sample = 20000
X = []
for i in range(sample):
file_name = str(i+1) + '.png'
img = cv2.imread(file_name)
img = img.reshape(12288)/255
X.append(img)
pca = PCA(n_components=9, whiten=True)
pca.fit(X)
X_pca = pca.transform(X)
fig, axes = plt.subplots(3,3,figsize=(10,10))
for i,(component, ax) in enumerate(zip(pca.components_,axes.ravel())):
ax.imshow(0.5-component.reshape((64,64,3))*10)
ax.set_title('PC'+str(i+1))
print(pca.explained_variance_ratio_)
plt.show()
Cliquez ici pour les résultats de l'analyse.
C'est l'horreur! On dirait un visage rancunier qui saigne sur le mur!
Il doit s'agir d'un faisceau de variables (coordonnées et pixels dans ce cas) afin d'expliquer les parties principales de l'image dans l'ordre à partir de PC1 ...
Si vous en faites trop **, vous pouvez le lire, mais ce n'est pas une fonctionnalité claire. Même si vous regardez le taux d'explication par PC, il semble qu'on ne puisse pas dire qu'il soit si agrégé. Pardon.
print(pca.explained_variance_ratio_)
Output
[0.21259875 0.06924239 0.03746094 0.03456278 0.02741101 0.01864574
0.01643447 0.01489064 0.0133781 ]
NMF
import cv2
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import NMF
sample = 20000
X = []
for i in range(sample):
file_name = str(i+1) + '.png'
img = cv2.imread(file_name)
img = img.reshape(12288)/255
X.append(img)
nmf = NMF(n_components=9)
nmf.fit(X)
#X_nmf = nmf.transform(X)
fig, axes = plt.subplots(3,3,figsize=(10,10))
for i,(component, ax) in enumerate(zip(nmf.components_,axes.ravel())):
ax.imshow(component.reshape((64,64,3)))
ax.set_title('component'+str(i+1))
plt.show()
Cliquez ici pour les résultats de l'analyse.
C'est l'horreur! Devenez un négatif du fantôme reflété dans le film! Je n'ai plus envie de l'interpréter.
J'essaierai d'analyser chez Kilmy Baby à la suite de mon prédécesseur.
PCA
NMF
Amen.
Après tout, il semble difficile d'extraire les caractéristiques d'une image uniquement par une méthode linéaire (et sans enseignant). J'étudierai car il est souhaitable de procéder à une analyse plus approfondie en utilisant des méthodes avancées telles que le GAN.
D'une manière ou d'une autre, il est devenu plus court, alors je vais expliquer le code. À propos du chargement et du dépliage des images. Si vous placez le fichier image au même emplacement que le fichier python à exécuter, vous pouvez y accéder simplement en spécifiant le nom du fichier. Vous pouvez spécifier le nom du fichier avec une simple itération en le nommant «1.jpg», «2.jpg». Le code plus général obtiendrait le nom du fichier avec ʻos.listdir`, mais cette fois c'était plus facile.
Les fichiers lus sont organisés en utilisant la fonction «imread» dans le module «cv2». Cependant, puisque ce tableau est un tableau tridimensionnel de longueur x largeur x RVB, utilisez reshape
pour en faire un vecteur long avec une ligne pour une analyse ultérieure. Cette fois, c'est «64 * 64 * 3 = 12288» car il est 64 vertical, 64 horizontal et RVB. De plus, si la valeur du tableau est des données brutes, la valeur RVB est "0 à 255", donc divisez-la par 255 pour la mettre entre "0 et 1".
file_name = str(i+1) + '.png'
img = cv2.imread(file_name)
img = img.reshape(12288)/255
Ce qui précède est le code du contenu ci-dessus.
Les composants obtenus par l'analyse sont stockés dans "components_" à la fois dans PCA et NMF. Les références peuvent être trouvées sur https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html et https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.NMF.html Voir ʻAttributs: . Affichez ceci sur le graphe avec une fonction appelée ʻimshow
dans le module pyplot
. Contrairement au précédent, il est nécessaire de remodeler le résultat de l'analyse (un vecteur long) en vertical x horizontal x RVB, nous allons donc le remodeler à nouveau.
fig, axes = plt.subplots(3,3,figsize=(10,10))
for i,(component, ax) in enumerate(zip(pca.components_,axes.ravel())):
ax.imshow(0.5-component.reshape((64,64,3))*10)
ax.set_title('PC'+str(i+1))
Ce qui précède est le code du contenu ci-dessus. ʻAxes indique la position du graphe dans un grand nombre de graphes, mais ʻaxes.ravel
vous permet de l'obtenir sous la forme d'une série de tableaux. C'est aussi une sorte de «remodelage».
Recommended Posts