Zum Beispiel habe ich 50.000 Münzbilder in einem Ordner und versuche, die 10 besten Bilder zu finden, die mit dem vom Benutzer angegebenen Bild am besten übereinstimmen.
Hier sind meine Beispieldateien https://drive.google.com/drive/folders/ ... sp=sharing
Hier ist das Beispielsuchbild https://drive.google.com/file/d/ 1cWTxLIjG2pKW4-1g-LYfdAbccG18sPnX/view?usp=sharing
Ich auch Das angegebene Bild wurde mit OpenCV geändert, aber es hat sich nichts geändert. Hier handelt es sich um die beschnittene Version https://drive.google.com/file/d/1AvZbPg ... sp=sharing
Die Erwartung ist, dass 18206-f.jpg laut der angegebenen Beispieldatei die am besten passende Datei sein sollte.
Ich habe viele ausprobiert Algorithmen und bereitgestellte Lösungen wie die folgende, aber ich konnte keine richtige Lösung finden.
- Ich habe wie erwähnt ein benutzerdefiniertes Trainingsmodell mit Bildklassifizierung verwendet hier https://www.tensorflow.org/tutorials/im ... sification, aber ich habe versagt. Ich vermute, dass ich keine andere Datei für das spezifische Beispiel habe. Ich habe auch einen benutzerdefinierten Datenerweiterungsmechanismus ausprobiert, bin aber erneut fehlgeschlagen (fehlgeschlagen = Konnte nicht das richtige finden Dateien)
- Ich habe https://github.com/TechyNilesh/DeepImageSearch verwendet, bin aber fehlgeschlagen. Ich denke, diese Art von Lösung eignet sich am besten für semantische Suchen , ich brauche eine Bild-zu-Bild-Suche wie Bildähnlichkeit, nicht Stichwort-/Inhaltsähnlichkeit usw.
- Ich habe Hashing-Algorithmen wie Ahash verwendet, Dhash und Phash scheiterten jedoch, als das Bild unterschiedlich war Bedingungen usw.
- Ich habe die hier erwähnte KNN-Suche ausprobiert https://stackoverflow.com/a/56881718/6799182, bin aber erneut fehlgeschlagen.
Code: Select all
import cv2
import os
import numpy as np
from typing import Union
def read_img_from_dir(image_dir: str, query_shape: Union[list, tuple]) -> tuple[list, np.ndarray]:
name_image = []
img_array = np.empty((0, np.prod(query_shape)), dtype=np.float32)
for image_name in os.listdir(image_dir):
name_image.append(image_name)
image = cv2.imread(os.path.join(image_dir, image_name))
if not isinstance(image, np.ndarray):
# if path is not image
continue
image = cv2.resize(image, query_shape[:2][::-1])
image = image.reshape(1, -1) / 255.
img_array = np.concatenate((img_array, image))
return name_image, img_array
def find_by_knn(query_img: np.ndarray, list_name: list[str], database: np.ndarray) -> str:
query_img = query_img.reshape(1, -1) / 255.
dists = np.sqrt(np.sum((database-query_img) ** 2,axis = 1))
idx = dists.argmin()
return list_name[idx]
if __name__=='__main__':
image_query = '1tl-cropped.png'
image_dir = 'sample_flat'
img = cv2.imread(image_query)
# optional: since the query image size maybe large, resize
# all image to a small disired shape may avoid OOM problem
# and boost computing speed
# global_shape = (320, 320)
# img = cv2.resize(img, global_shape)
shape = img.shape
name_image, img_array = read_img_from_dir(image_dir, shape)
result = find_by_knn(img, name_image, img_array)
print(result)