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.
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.
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.
Es ist Horror! Werde ein Negativ des Geistes, der sich im Film widerspiegelt! Ich habe keine Lust mehr, es zu interpretieren.
Ich werde versuchen, bei Kilmy Baby nach meinem Vorgänger zu analysieren.
PCA
NMF
Amen.
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.
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