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.
# 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]))
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.
Bild basiert auf Analyse
1.jpg |
---|
Bilder, die im selben Cluster enthalten sind
10.jpg | 11.jpg | 19.jpg | 24.jpg |
---|---|---|---|
Bild im Cluster mit dem am weitesten entfernten Schwerpunkt
12.jpg | 37.jpg | 51.jpg | 60.jpg |
---|---|---|---|
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