[PYTHON] Ich wurde entsetzt, als ich versuchte, mithilfe von PCA und NMF die Anzahl der Merkmale eines animierten Gesichts zu ermitteln.

Maschinelles Lernen ist Bildverarbeitung. Mit klassischen Analysemethoden wie PCA (Hauptkomponentenanalyse) und NMF (nicht negative Matrixfaktoranalyse) ist es möglich, die Hauptmerkmale aus einer großen Anzahl von Gesichtsbildern zu extrahieren. Daher habe ich sofort versucht, animierte Gesichter zu erfassen. .. Das Ziel sind 21.551 Arten von Gesichtsdaten, wie unten gezeigt. Ich habe es von https://www.kaggle.com/soumikrakshit/anime-faces ausgeliehen. Vielen Dank.

image.png

Es wäre interessant, wenn die Komponenten, die die Kontur bestimmen, und die Komponenten, die das Haar bestimmen, durch Analyse visuell zerlegt werden könnten.

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

Klicken Sie hier für die Analyseergebnisse.

image.png

Es ist Horror! Es sieht aus wie ein Grollgesicht, das an der Wand blutet!

Es sollte ein Bündel von Variablen sein (in diesem Fall Koordinaten und Pixel), um die Hauptteile des Bildes in der Reihenfolge von PC1 zu erklären ...

--PC1 Gesamthelligkeit --PC2 Gesamtvolumen der Haare? --PC3 Ist es nach links gerichtet?

Wenn Sie es übertreiben **, können Sie es lesen, aber es ist keine klare Funktion. Selbst wenn man sich die Erklärungsrate des PCs ansieht, kann man nicht sagen, dass sie so aggregiert ist. Es tut uns leid.

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

Klicken Sie hier für die Analyseergebnisse.

image.png

Es ist Horror! Werde ein Negativ des Geistes, der sich im Film widerspiegelt! Ich habe keine Lust mehr, es zu interpretieren.

Kilmy Baby

Ich werde versuchen, bei Kilmy Baby nach meinem Vorgänger zu analysieren.

PCA image.png

NMF image.png

Amen.

Fazit

Schließlich scheint es schwierig zu sein, die Merkmale eines Bildes nur linear (und ohne Lehrer) zu extrahieren. Ich werde studieren, weil es wünschenswert ist, mit fortgeschrittenen Methoden wie GAN weitere Analysen durchzuführen.

Codebeschreibung

Irgendwie ist es kürzer geworden, also werde ich den Code erklären. Informationen zum Laden und Entfalten von Bildern. Wenn Sie die Bilddatei am selben Speicherort wie die auszuführende Python-Datei ablegen, können Sie darauf zugreifen, indem Sie einfach den Dateinamen angeben. Sie können den Dateinamen mit einer einfachen Iteration angeben, indem Sie ihn als "1.jpg ", "2.jpg " bezeichnen. Der allgemeinere Code würde den Dateinamen mit "os.listdir" erhalten, aber diesmal war es einfacher.

Die geladenen Dateien werden mit einer Funktion namens "imread" im "cv2" -Modul angeordnet. Da es sich bei diesem Array jedoch um ein dreidimensionales Array mit der Länge x Breite x RGB handelt, verwenden Sie "Umformung", um es zu einem langen Vektor mit einer Linie für die spätere Analyse zu machen. Diesmal sind es 64 vertikal, 64 horizontal und RGB, also 64 * 64 * 3 = 12288. Wenn es sich bei dem Array-Wert um Rohdaten handelt, beträgt der RGB-Wert "0 bis 255". Teilen Sie ihn also durch 255, um ihn zwischen "0 und 1" zu setzen.

    file_name = str(i+1) + '.png'
    img = cv2.imread(file_name)
    img = img.reshape(12288)/255

Das Obige ist der Code des obigen Inhalts.

Die durch die Analyse erhaltenen Komponenten werden sowohl in PCA als auch in NMF in "Komponenten" gespeichert. Referenzen finden Sie unter https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html und https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.NMF.html Siehe Attribute:. Zeigen Sie dies in der Grafik mit einer Funktion namens "imshow" im "pyplot" -Modul an. Im Gegensatz zum vorherigen ist es notwendig, das Analyseergebnis (einen langen Vektor) in vertikal x horizontal x RGB umzuformen, damit wir es erneut umformen.

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

Das Obige ist der Code des obigen Inhalts. "Achsen" gibt an, welche Diagrammposition sich in einer großen Anzahl von Diagrammen befindet. Mit "Achsen.ravel" können Sie sie jedoch als eine Reihe von Arrays abrufen. Dies ist auch eine Art "Umformung".

Recommended Posts

Ich wurde entsetzt, als ich versuchte, mithilfe von PCA und NMF die Anzahl der Merkmale eines animierten Gesichts zu ermitteln.
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Ich möchte die Natur von Python und Pip kennenlernen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, die Höhen und Tiefen des Schlusskurses des Aktienkurses von Guru Navi mit TensorFlow vorherzusagen (Fortschritt)
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich versuchte zusammenzufassen, bis ich die Bank verließ und Ingenieur wurde
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, die Altersgruppe und die Ratenverteilung von Atcoder zu visualisieren
Ich habe versucht, mehrere Servomotoren MG996R mit dem Servotreiber PCA9685 zu steuern.
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Mit COTOHA habe ich versucht, den emotionalen Verlauf des Laufens von Meros zu verfolgen.
Als ich versuchte, über logistische Regression zu schreiben, fand ich schließlich den Mittelwert und die Varianz der logistischen Verteilung.
Ich habe versucht, E-Mails von Node.js und Python mithilfe des E-Mail-Zustelldienstes (SendGrid) von IBM Cloud zuzustellen!
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, die Verschlechterung des Lithium-Ionen-Akkus mithilfe des Qore SDK vorherzusagen
[Python] Ich habe versucht, das Mitgliederbild der Idolgruppe mithilfe von Keras zu beurteilen
Ich habe versucht, den Sieg oder die Niederlage der Premier League mit dem Qore SDK vorherzusagen
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Python-Übung 100 Schläge Ich habe versucht, den Entscheidungsbaum von Kapitel 5 mit graphviz zu visualisieren
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Ich habe versucht, den Text in der Bilddatei mit Tesseract der OCR-Engine zu extrahieren
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die nicht negative Matrixfaktorisierung (NMF) zu wiederholen.
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
Ich habe versucht, das Wissensdiagramm mit OpenKE zu ergänzen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe die Python-Version von "Berücksichtigung von Conner Davis 'Antwort" Drucken von Zahlen von 1 bis 100 ohne Verwendung von Schleife, rekursiv, goto "ausprobiert.
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
Ich habe versucht, die Infektion mit einer neuen Lungenentzündung mithilfe des SIR-Modells vorherzusagen: ☓ Wuhan ed. ○ Hubei ed.
Ich habe versucht, die Erstellung einer praktischen Umgebung mithilfe der SoftLayer-API der IBM Cloud zu automatisieren
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, das CNN-Modell von TensorFlow mit TF-Slim umzugestalten
Ich habe versucht, die Anzeigenoptimierung mithilfe des Banditenalgorithmus zu simulieren
Ich habe versucht, die Informationen des Webs mit "Requests" und "lxml" abzurufen.
Ich habe versucht, das Lachproblem mit Keras zu erkennen.
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Ich habe versucht, die Uhrzeit und das heutige Wetter anzuzeigen
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln