Tensorflow возвращает похожие изображения

Я хочу использовать Google Tensorflow для возврата похожих изображений на входное изображение.

Я установил Tensorflow из http://www.tensorflow.org (используя установку PIP - pip и python 2.7) на Ubuntu14.04 на CPU виртуальной машины.

Я загрузил обучаемую модель Inception-V3 (inception-2015-12-05.tgz) из http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz, которая обучается на ImageNet Large Visual Recognition Challenge с использованием данных с 2012 года, но я думаю, что в ней есть как нейронная сеть, так и классификатор внутри нее (поскольку задача была предсказана для категории). Я также загрузил файл classify_image.py, который классифицирует изображение в 1 из 1000 классов в модели.

Итак, у меня есть случайное изображение image.jpg, которое я запускаю для тестирования модели. когда я запускаю команду:

python /home/amit/classify_image.py --image_file=/home/amit/image.jpg

Я получаю следующий результат: (Классификация выполняется с использованием softmax)

I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 3
I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 3
trench coat (score = 0.62218)
overskirt (score = 0.18911)
cloak (score = 0.07508)
velvet (score = 0.02383)
hoopskirt, crinoline (score = 0.01286)

Теперь задача состоит в том, чтобы найти изображения, похожие на входное изображение (image.jpg), из базы данных из 60 000 изображений (формат jpg и храниться в папке в /home/amit/images ). Я считаю, что это можно сделать, удалив финальный слой классификации из модели begin-v3 и используя набор функций входного изображения, чтобы найти расстояние от косинуса от набора функций, все 60 000 изображений, и мы можем вернуть изображения с меньшим расстоянием (cos 0 = 1)

Пожалуйста, предложите мне путь для этой проблемы и как это сделать с помощью API Python.

Ответ 1

Думаю, я нашел ответ на свой вопрос:

В файле classify_image.py, который классифицирует изображение с использованием предварительно обученной модели (классификатор NN +), я сделал следующие изменения (инструкции С#ADDED, написанные рядом с ними):

def run_inference_on_image(image):
  """Runs inference on an image.
  Args:
    image: Image file name.
  Returns:
    Nothing
  """
  if not gfile.Exists(image):
    tf.logging.fatal('File does not exist %s', image)
  image_data = gfile.FastGFile(image, 'rb').read()

  # Creates graph from saved GraphDef.
  create_graph()

with tf.Session() as sess:
 # Some useful tensors:
 # 'softmax:0': A tensor containing the normalized prediction across
 #   1000 labels.
 # 'pool_3:0': A tensor containing the next-to-last layer containing 2048
 #   float description of the image.
 # 'DecodeJpeg/contents:0': A tensor containing a string providing JPEG
 #   encoding of the image.
 # Runs the softmax tensor by feeding the image_data as input to the graph.
 softmax_tensor = sess.graph.get_tensor_by_name('softmax:0')
 feature_tensor = sess.graph.get_tensor_by_name('pool_3:0') #ADDED
 predictions = sess.run(softmax_tensor,
                        {'DecodeJpeg/contents:0': image_data})
 predictions = np.squeeze(predictions)
 feature_set = sess.run(feature_tensor,
                        {'DecodeJpeg/contents:0': image_data}) #ADDED
 feature_set = np.squeeze(feature_set) #ADDED
 print(feature_set) #ADDED
 # Creates node ID --> English string lookup.
 node_lookup = NodeLookup()

 top_k = predictions.argsort()[-FLAGS.num_top_predictions:][::-1]
 for node_id in top_k:
   human_string = node_lookup.id_to_string(node_id)
   score = predictions[node_id]
   print('%s (score = %.5f)' % (human_string, score))

Я запустил тензор pool_3: 0, загрузив в него image_data. Пожалуйста, дайте мне знать, если я ошибаюсь. Если это правильно, я считаю, что мы можем использовать этот тензор для дальнейших вычислений.

Ответ 2

В Tensorflow теперь есть хороший урок о том, как получить активации перед финальным слоем и переобучить новый слой классификации с различными категориями: https://www.tensorflow.org/versions/master/how_tos/image_retraining/

Пример кода: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/image_retraining/retrain.py

В вашем случае, да, вы можете получить активации из pool_3 слоя под слоем softmax (или так называемые узкие места) и отправить их в другие операции в качестве входных данных:

retrain imagenet

Наконец, что касается поиска похожих изображений, я не думаю, что активации узких мест imagenet являются очень подходящим представлением для поиска изображений. Вы могли бы рассмотреть возможность использования сети автоэнкодера с прямым вводом изображений.

autoencoder
(источник: deeplearning4j.org)

Ответ 3

Ваша проблема звучит аналогично этому