Как передать tensorflow изображение с URL-адреса?

#tensorflow #google-colaboratory

#tensorflow #google-colaboratory

Вопрос:

Пять строк, прокомментированных ниже, должны работать, но не работают. Оценка прогноза даже близко не соответствует тому, что я ожидал бы, и когда я делаю plt.imshow(img), он показывает неправильное изображение. Вот ссылка на мой блокнот в Colab.

 x, y = next(valid_generator)
image = x[0, :, :, :]
true_index = np.argmax(y[0])
plt.imshow(image)

image_url = 'https://mysite_example/share/court3.jpg'
image_url = tf.keras.utils.get_file('Court', origin=image_url )

#img = keras.preprocessing.image.load_img( image_url, target_size=( 224, 224 ) )
#img_array = keras.preprocessing.image.img_to_array(img)
#img_array = tf.expand_dims(img_array, 0) 
#prediction_scores = model.predict(np.expand_dims(img_array, axis=0))
#plt.imshow(img)

# Expand the validation image to (1, 224, 224, 3) before predicting the label
prediction_scores = model.predict(np.expand_dims(image, axis=0))
predicted_index = np.argmax(prediction_scores)
print("True label: "   get_class_string_from_index(true_index))
print("Predicted label: "   get_class_string_from_index(predicted_index)
 

Комментарии:

1. сначала вам нужно загрузить файл с некоторым кодом, я думаю, это единственный способ

Ответ №1:

Метод tf.keras.utils.get_file загружает файл с URL-адреса в локальный кэш, только если файл еще не кэширован. Итак, если вы используете одно и то же имя кэша для всех URL-адресов («Суд» в вашем коде?), Вы увидите только первый файл.

Также во время обучения у вас есть этап предварительной обработки нормализации всех пикселей путем их разделения 255 . Вы также должны применить тот же этап предварительной обработки во время вывода.

Рабочий код:

 _, axis = plt.subplots(1,3) 

for i, image_url in enumerate(['https://squashvideo.site/share/court3.jpg',
                               'https://i.pinimg.com/originals/0f/c2/9b/0fc29b35532f8e2fb998f5605212ab27.jpg',
                               'https://thumbs.dreamstime.com/b/squash-court-photo-empty-30346175.jpg']):  
  image_url = tf.keras.utils.get_file('Court', origin=image_url )
  img = tf.keras.preprocessing.image.load_img(image_url, target_size=( 224, 224 ) )
  os.remove(image_url) # Remove the cached file
  axis[i].imshow(img)

  img_array = keras.preprocessing.image.img_to_array(img)
  prediction_scores = model.predict(np.expand_dims(img_array, axis=0)/255)
  axis[i].title.set_text(np.argmax(prediction_scores, axis=1))
 

Вывод:
введите описание изображения здесь

Как вы можете видеть, прогнозы идеальны, последнее изображение относится к классу 0 (пустой корт для игры в сквош), а второе изображение относится к классу 1 (игроки, играющие на корте для игры в сквош).

Комментарии:

1. Отлично, спасибо! Никогда бы не подумал, что керас кэширует загружаемые изображения. Я обновил свой ноутбук colab, и он работает правильно. Однако, когда я сохраняю обученную модель, а затем пытаюсь использовать ее в другом сценарии, прогнозы оказываются совершенно неверными. Чтобы сохранить модель, которую я только что сделал: tf.saved_model.save(model, saved_model_path) Затем в моем новом скрипте я делаю: model = tf.keras.models.load_model('./saved_flowers_model/') Но новые прогнозы скрипта совершенно неверны, используя тот же код, которым вы поделились выше.

2. Я понял это. Вместо того, чтобы делать keras…. Мне пришлось вызывать все с помощью tf.keras… Я полагаю, что простое использование keras напрямую вызывает конфликт версий с tf.keras.