Я пытаюсь загрузить предварительно обученную модель обнаружения тензорного объекта из репозитория Tensorflow Object Detection как 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})
Результаты выглядят хорошо: