9

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

Я установил 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)

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

+0

У меня есть несколько решений в виду, но я хотел бы понять проблему больше. Я предполагаю, что вы пытаетесь найти все «траншеи» на 60 000 изображений. Если это так, вы можете просто запустить все 60 000 изображений с помощью Inception, извлечь изображения, где «пальто» появляется как верх 5 (добавьте пороговое значение, если хотите), и все готово. Ответит ли это на это? – jkschin

+0

Спасибо за помощь. Но дело в том, что файл изображения image.jpg выше на самом деле является saree, и я не хочу ограничиваться только 1000 классами в модели. Кроме того, если я найду способ добавления новых классов, это будет очень широкий классификатор, а маркировка изображений будет утомительной задачей. Итак, я подумывал удалить слой классификации из обученной модели, а затем использовать вектор признаков для вычисления ближайших изображений. –

+2

Справа. Итак, заявление о проблеме: «Учитывая 60 000 изображений, как я могу сгруппировать все сари вместе с помощью модифицированной версии Inception?». – jkschin

ответ

7

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

В файле 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 к нему. Пожалуйста, дайте мне знать, если я ошибаюсь. Если это правильно, я считаю, что мы можем использовать этот тензор для дальнейших вычислений.

+0

Как это сработало для вас? – jjinking

+1

Я выбрал набор функций pool3 для всех моих 50000 изображений, а затем я вычислил расстояние для косинуса с набором функций входного изображения и остальными изображениями .. он показывает соответствующие результаты, но цвет не имеет значения. –

+0

Привет @AmitMadan, мне было интересно, как вы управляли данными 'feature set' для всех« 50K изображений »? Вы использовали 'lucene'? Или вы сделали что-то еще? – oak

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 с прямым вводом изображений.

autoencoder