Как мне изменить этот код Python для обнаружения похожих изображений в коллекции нового входного изображения - PullRequest
0 голосов
/ 18 апреля 2019

Я работаю над кодом Python, который находит похожие изображения внутри коллекции, используя другой код Tensorflow. Мне удалось векторизовать все изображения коллекции и найти k наиболее похожих изображений для каждого отдельного изображения, используя приблизительных ближайших соседей.алгоритм.Код, который я использовал, принимает векторизованные изображения в качестве входных данных и выводит JSON-файл для каждого изображения, каждый JSON-файл содержит имя изображения и сходство (процент) k наиболее похожих изображений.

ДляНапример, файл JSON «2017-3400-039808_xx_xx_GdSOs-jpg.json» содержит:

[{"filename": "2017-3400-039808_xx_xx_GdSOs-jpg", "similarity": 1.0},
{"filename": "2018-3400-033286_xx_xx_OCxsV-JPG", "similarity": 0.8654},
{"filename": "2018-3400-028154_xx_xx_yePFK-jpg", "similarity": 0.8596}, 
{"filename": "2018-3400-037564_xx_xx_GhnLB-jpg", "similarity": 0.8561},
{"filename": "2018-3400-036039_xx_xx_QtDfu-jpg", "similarity": 0.8537}]

Проблема, с которой я сталкиваюсь, заключается в том, что я векторизую новое изображение и добавляю его в папку «image_vectors /», содержащую всевекторизованные изображения и запускают код сходства, надеясь, что он будет работать только на новом изображении, но он снова пересчитывает сходство каждого отдельного изображения коллекции, что не оптимально, особенно если коллекция изображений большая.

Чтомогу ли я изменить этот код, чтобы он находил похожие изображения только для нового входного изображения?

Векторы изображений расположены в каталоге с именем "image_vectors", и все они имеют расширение ".npz"

from annoy import AnnoyIndex
from scipy import spatial
from nltk import ngrams
import random, json, glob, os, codecs, random
import numpy as np

# data structures
file_index_to_file_name = {}
file_index_to_file_vector = {}
chart_image_positions = {}

# config
dims = 2048
n_nearest_neighbors = 30
trees = 10000
infiles = glob.glob('image_vectors/*.npz')

# build ann index
t = AnnoyIndex(dims)
for file_index, i in enumerate(infiles):
  file_vector = np.loadtxt(i)
  file_name = os.path.basename(i).split('.')[0]
  file_index_to_file_name[file_index] = file_name
  file_index_to_file_vector[file_index] = file_vector
  t.add_item(file_index, file_vector)
t.build(trees)

# create a nearest neighbours json file for each input
if not os.path.exists('Similar_Images'):
  os.makedirs('Similar_Images')

for i in file_index_to_file_name.keys():
  master_file_name = file_index_to_file_name[i]
  master_vector = file_index_to_file_vector[i]

  named_nearest_neighbors = []
  nearest_neighbors = t.get_nns_by_item(i, n_nearest_neighbors)
  for j in nearest_neighbors :
    neighbor_file_name = file_index_to_file_name[j]
    neighbor_file_vector = file_index_to_file_vector[j]

    similarity = 1 - spatial.distance.cosine(master_vector, neighbor_file_vector)
    rounded_similarity = int((similarity * 10000)) / 10000.0

    named_nearest_neighbors.append({
      'filename': neighbor_file_name,
      'similarity': rounded_similarity
    })

  with open('Similar_Images/' + master_file_name + '.json', 'w') as out:
    json.dump(named_nearest_neighbors, out)
    print(master_file_name)

...