Я пытаюсь загрузить предварительно обученную модель обнаружения объекта тензорного потока из объекта Tensorflow Обнаружение репо как tf.estimator.Estimator
и использование его для прогнозирования.
Я могу загрузить модель и выполнить логический вывод с помощью Estimator.predict()
, однако результат будет мусором. Другие методы загрузки модели, например как Predictor
, и вывод работает нормально.
Мы будем очень благодарны за любую помощь в правильной загрузке модели в качестве Estimator
вызова predict()
. Мой текущий код:
Загрузите и подготовьте изображение
def load_image_into_numpy_array(image):
(im_width, im_height) = image.size
return np.array(list(image.getdata())).reshape((im_height, im_width, 3)).astype(np.uint8)
image_url = 'https://i.imgur.com/rRHusZq.jpg'
# Load image
response = requests.get(image_url)
image = Image.open(BytesIO(response.content))
# Format original image size
im_size_orig = np.array(list(image.size) + [1])
im_size_orig = np.expand_dims(im_size_orig, axis=0)
im_size_orig = np.int32(im_size_orig)
# Resize image
image = image.resize((np.array(image.size) / 4).astype(int))
# Format image
image_np = load_image_into_numpy_array(image)
image_np_expanded = np.expand_dims(image_np, axis=0)
image_np_expanded = np.float32(image_np_expanded)
# Stick into feature dict
x = {'image': image_np_expanded, 'true_image_shape': im_size_orig}
# Stick into input function
predict_input_fn = tf.estimator.inputs.numpy_input_fn(
x=x,
y=None,
shuffle=False,
batch_size=128,
queue_capacity=1000,
num_epochs=1,
num_threads=1,
)
Примечание:
train_and_eval_dict
также, кажется, содержит input_fn
для предсказания
train_and_eval_dict['predict_input_fn']
Однако на самом деле это возвращает tf.estimator.export.ServingInputReceiver
, с которым я не уверен, что делать. Это потенциально может быть источником моих проблем, поскольку требуется предварительная обработка, прежде чем модель действительно увидит изображение.
Загрузить модель как Estimator
Модель загружена из зоопарка TF Model Zoo здесь, код для загрузки модели адаптирован из здесь.
model_dir = './pretrained_models/tensorflow/ssd_mobilenet_v1_coco_2018_01_28/'
pipeline_config_path = os.path.join(model_dir, 'pipeline.config')
config = tf.estimator.RunConfig(model_dir=model_dir)
train_and_eval_dict = model_lib.create_estimator_and_inputs(
run_config=config,
hparams=model_hparams.create_hparams(None),
pipeline_config_path=pipeline_config_path,
train_steps=None,
sample_1_of_n_eval_examples=1,
sample_1_of_n_eval_on_train_examples=(5))
estimator = train_and_eval_dict['estimator']
Выполнить вывод
output_dict1 = estimator.predict(predict_input_fn)
Это распечатает некоторые сообщения журнала, одно из которых:
INFO:tensorflow:Restoring parameters from ./pretrained_models/tensorflow/ssd_mobilenet_v1_coco_2018_01_28/model.ckpt
Так что похоже, что предварительно натренированные веса набирают обороты. Однако результаты выглядят так:
Загрузить ту же модель, что и Predictor
from tensorflow.contrib import predictor
model_dir = './pretrained_models/tensorflow/ssd_mobilenet_v1_coco_2018_01_28'
saved_model_dir = os.path.join(model_dir, 'saved_model')
predict_fn = predictor.from_saved_model(saved_model_dir)
Выполнить вывод
output_dict2 = predict_fn({'inputs': image_np_expanded})
Результаты выглядят неплохо:
predictor
. - person DavidS   schedule 27.09.2019