[PYTHON] Je suis devenu horreur quand j'ai essayé de détecter la quantité de fonctionnalités d'un visage animé en utilisant PCA et NMF.

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.

image.png

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.

image.png

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.

image.png

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.

Kilmy bébé

J'essaierai d'analyser chez Kilmy Baby à la suite de mon prédécesseur.

PCA image.png

NMF image.png

Amen.

Conclusion

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.

Description du code

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

Je suis devenu horreur quand j'ai essayé de détecter la quantité de fonctionnalités d'un visage animé en utilisant PCA et NMF.
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
Je veux connaître la nature de Python et pip
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé de prédire les hauts et les bas du cours de clôture du cours de l'action de Guru Navi en utilisant TensorFlow (progression)
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé de résumer jusqu'à ce que je quitte la banque et devienne ingénieur
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé de visualiser la tranche d'âge et la distribution des taux d'Atcoder
J'ai essayé de contrôler plusieurs servomoteurs MG996R en utilisant le servomoteur PCA9685.
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
En utilisant COTOHA, j'ai essayé de suivre le cours émotionnel de la course aux meros.
Quand j'ai essayé d'écrire sur la régression logistique, j'ai fini par trouver la moyenne et la variance de la distribution logistique.
J'ai essayé de livrer du courrier depuis Node.js et Python en utilisant le service de livraison de courrier (SendGrid) d'IBM Cloud!
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de prédire la détérioration de la batterie lithium-ion en utilisant le SDK Qore
[Python] J'ai essayé de juger l'image du membre du groupe d'idols en utilisant Keras
J'ai essayé de prédire la victoire ou la défaite de la Premier League en utilisant le SDK Qore
J'ai essayé de résumer la forme de base de GPLVM
Python pratique 100 coups J'ai essayé de visualiser l'arbre de décision du chapitre 5 en utilisant graphviz
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
J'ai essayé d'extraire le texte du fichier image en utilisant Tesseract du moteur OCR
J'ai essayé d'approcher la fonction sin en utilisant le chainer
J'ai essayé d'utiliser l'API de Sakenowa Data Project
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de refaire la factorisation matricielle non négative (NMF)
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
J'ai essayé d'identifier la langue en utilisant CNN + Melspectogram
J'ai essayé de compléter le graphe de connaissances en utilisant OpenKE
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé la version python de "Prise en compte de la réponse de Conner Davis" Impression de nombres de 1 à 100 sans utiliser de boucle, récursive, goto "
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
J'ai essayé de prédire l'infection d'une nouvelle pneumonie en utilisant le modèle SIR: ☓ Wuhan edition ○ Hubei province edition
J'ai essayé d'automatiser la construction d'un environnement pratique à l'aide de l'API SoftLayer d'IBM Cloud
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de refactoriser le modèle CNN de TensorFlow en utilisant TF-Slim
J'ai essayé de simuler l'optimisation des publicités à l'aide de l'algorithme Bandit
J'ai essayé d'obtenir les informations du Web en utilisant "Requests" et "lxml"
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé d'afficher l'heure et la météo d'aujourd'hui w
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
[TF] J'ai essayé de visualiser le résultat de l'apprentissage en utilisant Tensorboard
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia