[PYTHON] Ähnliche Gesichtsbilderkennung mit Gesichtserkennung und PCA- und K-Mittel-Clustering

Einführung

Die Erkennung ähnlicher Bilder ist eine der am häufigsten verwendeten Funktionen bei der Bilderkennung. Empfehlungssysteme und Suchsysteme verwenden häufig Zehntausende oder Hunderttausende von Bildern. Abhängig von der Größe der Bilder und der Vergleichsmethode erfordert die Suche nach ähnlichen Bildern aus Tausenden oder Zehntausenden eine enorme Verarbeitungszeit. Daher werden wir eine Methode in Betracht ziehen, um ähnliche Bilder zu erkennen, indem die Datenmenge und die Anzahl der Vergleiche unter Verwendung von k-Mitteln und PCA verringert werden.

Face Recognition Gesichtsfunktionen verwenden face_landmark, das durch einen 128-dimensionalen Vektor dargestellt wird und unter der folgenden URL in der Bibliothek implementiert werden kann. https://github.com/ageitgey/face_recognition

Die Anzahl der Dimensionen nach PCA wurde unter Berücksichtigung des Beitragssatzes auf 20 festgelegt. Nachdem Sie die PCA durchgeführt und die Dimensionen reduziert haben, klassifizieren Sie sie mit k-Mitteln in Cluster mit K = 10. Der nächstgelegene wird aus dem Schwerpunkt jedes Clusters berechnet, und nur die Bilder, die in den Cluster mit dem nächstgelegenen Schwerpunkt eingeteilt sind, werden berechnet, und die Entfernung wird berechnet, um ähnliche Bilder zu erkennen. Es ist auch wirksam bei der Reduzierung der Speicherkapazität, indem die Merkmale des Bildes als durch PCA reduzierte Daten gespeichert werden.

Bei Verwendung von 1000 Bildern ermöglicht das Clustering nach der k-means-Methode einen durchschnittlichen 100-fachen + 10-fachen Vergleich (Vergleich mit dem Schwerpunkt jedes Clusters). Darüber hinaus wurde die Anzahl der Dimensionen jedes Vektors durch PCA von 128 Dimensionen auf 20 Dimensionen reduziert, sodass der Rechenaufwand effektiv reduziert werden kann.

http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html Dieses Mal ist die Beispielquelle, die dieses freie Gesichtsbild verwendet, unten gezeigt.

Programm


# coding:utf-8
import dlib
from imutils import face_utils
import cv2
import glob
import face_recognition
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from matplotlib import pyplot as plt
import numpy as np

# --------------------------------
# 1.Vorbereitung für die Erkennung von Landmarken
# --------------------------------
#Gesichtserkennungstool aufrufen
face_detector = dlib.get_frontal_face_detector()

#Aufrufen eines Tools zur Erkennung von Gesichtsmarkierungen
predictor_path = 'shape_predictor_68_face_landmarks.dat'
face_predictor = dlib.shape_predictor(predictor_path)

images = glob.glob('./faces/*.jpg')
images = sorted(images)[:100]

face_landmarks = []
face_filepaths = []

for filepath in images:
    #Aufruf des zu erkennenden Bildes
    img = face_recognition.load_image_file(filepath)

    face_encodings = face_recognition.face_encodings(img)
    if (len(face_encodings)>0):
        face_filepaths.append(filepath)
        face_landmarks.append(face_encodings[0])

pca = PCA(n_components=20)
pca.fit(face_landmarks)

#Konvertieren Sie den Datensatz basierend auf dem Analyseergebnis in die Hauptkomponente
transformed = pca.fit_transform(face_landmarks)

#Zeichnen Sie die Hauptkomponenten
# plt.subplot(1, 2, 2)
plt.scatter(transformed[:, 0], transformed[:, 1])
plt.title('principal component')
plt.xlabel('pc1')
plt.ylabel('pc2')

#Geben Sie den Beitragssatz für jede Dimension der Hauptkomponente aus
print(pca.explained_variance_ratio_)
print(sum(pca.explained_variance_ratio_))

# print(transformed[0])
# print(len(transformed[0]))

#Starten Sie Kmeans
#Anzahl der Cluster
K = 8
cls = KMeans(n_clusters = 8)
pred = cls.fit_predict(transformed)

#Färben Sie jedes Element für jedes Etikett
for i in range(K):
    labels = transformed[pred == i]
    plt.scatter(labels[:, 0], labels[:, 1])

#Cluster-Schwerpunkt(Schwerpunkt)Zeichnen
centers = cls.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], s=100,
            facecolors='none', edgecolors='black')

#Finden Sie heraus, welcher Schwerpunkt Ihnen am nächsten liegt
min_center_distance = -1
min_center_k = 0

#Finden Sie heraus, welcher Schwerpunkt am weitesten entfernt ist
max_center_distance = -1
max_center_k = 0

for center_index in range(K):
    distance = np.linalg.norm(transformed[0] - centers[center_index])
    if ( distance < min_center_distance or min_center_distance == -1):
        min_center_distance = distance
        min_center_k = center_index
    if ( distance > max_center_distance or max_center_distance == -1):
        max_center_distance = distance
        max_center_k = center_index

#Zeigen Sie die Bildnamen der nächsten und am weitesten entfernten Cluster an
print('=========== NEAREST ==============')
for i in range(len(pred)):
    if ( min_center_k == pred[i] ):
        print(face_filepaths[i])
print('=========== FARTHEST ==============')
for i in range(len(pred)):
    if ( max_center_k == pred[i] ):
        print(face_filepaths[i])
print('=========================')

#Grafik anzeigen
plt.show()


#* Darunter befindet sich ein Schlangenbein
#Berechnen Sie den direkten Abstand zu jedem Bild
distance = {}
for index in range(len(transformed)):
    distance[face_filepaths[index]] = np.linalg.norm(transformed[0] - transformed[index])

#Sortiert und in der Reihenfolge der Entfernung angezeigt
print(sorted(distance.items(), key=lambda x:x[1]))

Clustering-Ergebnisdiagramm

Die Merkmale des Bildes, dessen Schwerpunkt durch hohle Kreise in Cluster unterteilt ist, werden in verschiedenen Farben angezeigt. Es ist etwas schwierig zu verstehen, da das 20-dimensionale Diagramm in zwei Dimensionen dargestellt ist. Sie können jedoch sehen, dass die Hauptkomponenten, die nahe beieinander liegen, zusammen gruppiert sind. image.png

Ergebnis der Analyse

Bild basiert auf Analyse

1.jpg
000001.jpg

Bilder, die im selben Cluster enthalten sind

10.jpg 11.jpg 19.jpg 24.jpg
000010.jpg 000011.jpg 000019.jpg 000024.jpg

Bild im Cluster mit dem am weitesten entfernten Schwerpunkt

12.jpg 37.jpg 51.jpg 60.jpg
000012.jpg 000037.jpg 000051.jpg 000060.jpg

Ergebnisüberlegung

Die meisten Bilder, die in dieselben Gruppen unterteilt waren, waren langhaarige Frauen, und die Bilder, die in die am weitesten entfernten Gruppen unterteilt waren, waren größtenteils kurzhaarige Männer. Ich denke, dass eine Clusterbildung ähnlich der menschlichen Empfindung möglich war. Wenn Sie ein strengeres Bild erhalten möchten, sollten Sie die Norm direkt als Gesamtbild berechnen, ohne die Hauptkomponenten zu analysieren. Diesmal scheint sie jedoch verwendet zu werden, um Serendipity anzustreben oder eine schnellere Berechnung zu realisieren. Es scheint gut, die Methode in Betracht zu ziehen.

Recommended Posts

Ähnliche Gesichtsbilderkennung mit Gesichtserkennung und PCA- und K-Mittel-Clustering
Gesichtsbildinferenz mit Flask und TensorFlow
Bilderkennung mit CNN Pferden und Hirschen
Maschinelles Lernen: Bilderkennung von MNIST mithilfe von PCA und Gaussian Native Bayes
Bestimmung von Baumkrankheiten durch Bilderkennung mit CNTK und SVM
Versuchen Sie es mit Scikit-Learn (1) - K-Clustering nach Durchschnittsmethode
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
[Bildverarbeitung] Poo-san ist durch Kantenerkennung mit Python und OpenCV nackt!
Gesichtserkennung mit Hauptkomponentenanalyse
Python x Tensoflow x Gesichtserkennung
Aufbau und Grundlagen der Bilderkennungsumgebung
Erklärbare KI ~ Erklärbares k-Mittel- und k-Median-Clustering ~
Gesichtserkennung mit einem Kaskadenklassifikator
Bilderkennung von Früchten mit VGG16
Gesichtserkennung aus mehreren Bilddateien mit openCV, ausschneiden und speichern
Gesichtserkennung mit OpenCV (Haar-like Feature Classifier)
100 Sprachverarbeitung Knock-97 (mit Scicit-Learn): k-bedeutet Clustering
Python: Grundlagen der Bilderkennung mit CNN
Hallo Welt- und Gesichtserkennung mit opencv-python 4.2
Kategorieschätzung mit der Bilderkennungs-API von docomo
Dlib-Gesichtserkennung und Blinkzähler von Python
Python: Anwendung der Bilderkennung mit CNN
Bilderkennungsmodell mit Deep Learning im Jahr 2016
Extrahieren Sie die Farbe des Objekts im Bild mit Mask R-CNN und K-Means Clustering
Kann AI zwischen Carlos Gone und Mr. Bean unterscheiden (Gesichtserkennung anhand von Gesichtspunkten)?