Как найти похожие изображения для данного изображения в каталогеPython

Программы на Python
Ответить
Anonymous
 Как найти похожие изображения для данного изображения в каталоге

Сообщение Anonymous »

Я новичок в машинном обучении и Python. Я пытаюсь найти наиболее подходящие (похожие) изображения в каталоге для данного изображения.
Например, у меня есть 50 000 изображения монет в папке и пытаюсь найти 10 лучших изображений, наиболее соответствующих указанному пользователем изображению.
Вот мои примеры файлов. https://drive.google.com/drive/folders/ ... sp=sharing
Вот пример изображения для поиска https://drive.google.com/file/d/ 1cWTxLIjG2pKW4-1g-LYfdAbccG18sPnX/view?usp=sharing
Я также изменил данное изображение с помощью OpenCV, но ничего не изменилось, вот обрезанная версия https://drive.google.com/file/d/1AvZbPg ... sp=sharing
Ожидается, что файл 18206-f.jpg будет наиболее подходящим файлом согласно указанному образцу файла.
Я попробовал множество алгоритмов и предложил решения, подобные приведенному ниже, но не смог найти подходящего решения.
  • Я использовал пользовательская модель обучения с классификацией изображений, как указано здесь https://www.tensorflow.org/tutorials/im ... sification, но мне это не удалось. Я предполагаю, что у меня нет другого файла для конкретного образца, я также попробовал пользовательские данные механизм увеличения, но снова не удалось (не удалось = не удалось найти файлы, связанные с правами)
  • Я использовал https://github.com/TechyNilesh/DeepImageSearch, но не смог, я думаю, такое решение лучше всего подходит для семантического поиска, мне нужен поиск по изображениям, например сходство изображений, а не сходство ключевых слов/содержания и т. д.
  • Я использовал хеширование алгоритмы, такие как Ahash, Dhash и Phash, но не удалось, когда изображение находилось в разных условиях и т. д.
  • Я попробовал упомянутый здесь поиск KNN https://stackoverflow.com/a/ 56881718/6799182, но снова не удалось.

Код: Выделить всё

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)
Пожалуйста, посоветуйте мне правильное решение этой задачи.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -directory
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»