Как сделать вывод и перенести обучение с помощью TensorFlow Frozen GraphDef (single Saved_model.pb) из Google AutoML Vision Classification - PullRequest
2 голосов
/ 06 ноября 2019

Я использую экспортированную модель классификации из Google AutoML Vision, поэтому у меня есть только saved_model.pb и нет переменных, контрольных точек и т. Д. Я хочу загрузить этот график модели в локальную установку TensorFlow, использовать ее для вывода и продолжить обучениес большим количеством фотографий.

Основные вопросы:

  • Возможен ли этот план, т. Е. Использовать один saved_model.pb без переменных, контрольных точек и т. Д. Иобучить полученный график новым данным?

  • Если да: как получить форму ввода (?,) с изображениями, закодированными в виде строк?

  • В идеале, забегая вперед: есть что-то важное для учебной части?


Справочная информация о коде:

  • Чтобы прочитать изображение, я использую тот же подход, что и при использовании контейнера Docker для вывода, следовательно, закодированное изображение base64.

  • Для загрузкиgraph, я проверил, какой набор тегов необходим графу через CLI (saved_model_cli show --dir input/model), который равен serve.

  • Чтобы получить имена входных тензоров, я использую graph.get_operations(), что дает мне Placeholder:0 для image_bytes и Placeholder:1_0 для клавиши (просто произвольная строка идентифицирует изображение). Оба имеют размерность dim -1

import tensorflow as tf
import numpy as np
import base64

path_img = "input/testimage.jpg"
path_mdl = "input/model"

# input to network expected to be base64 encoded image
with io.open(path_img, 'rb') as image_file:
    encoded_image = base64.b64encode(image_file.read()).decode('utf-8')

# reshaping to (1,) as the expecte dimension is (?,)
feed_dict_option1 = {
    "Placeholder:0": { np.array(str(encoded_image)).reshape(1,) }, 
    "Placeholder_1:0" : "image_key"
}

# reshaping to (1,1) as the expecte dimension is (?,)
feed_dict_option2 = {
    "Placeholder:0": np.array(str(encoded_image)).reshape(1,1), 
    "Placeholder_1:0" : "image_key"
}

with tf.Session(graph=tf.Graph()) as sess:
    tf.saved_model.loader.load(sess, ["serve"], path_mdl)

    graph = tf.get_default_graph()

    sess.run('scores:0',
               feed_dict=feed_dict_option1)

    sess.run('scores:0',
               feed_dict=feed_dict_option2)



Вывод:

# for input reshaped to (1,)
ValueError: Cannot feed value of shape (1,) for Tensor 'Placeholder:0', which has shape '(?,)'

# for input reshaped to (1,1)
ValueError: Cannot feed value of shape (1, 1) for Tensor 'Placeholder:0', which has shape '(?,)'

Как получить форму ввода (?,)?

Большое спасибо.

1 Ответ

1 голос
/ 08 ноября 2019

Да! Возможно, у меня есть модель обнаружения объекта, которая должна быть похожей, я могу запустить ее в тензорном потоке 1.14.0 следующим образом:

import cv2
cv2.imread(filepath)
flag, bts = cv.imencode('.jpg', img)
inp = [bts[:,0].tobytes()]
out = sess.run([sess.graph.get_tensor_by_name('num_detections:0'),
                sess.graph.get_tensor_by_name('detection_scores:0'),
                sess.graph.get_tensor_by_name('detection_boxes:0'),
                sess.graph.get_tensor_by_name('detection_classes:0')],
               feed_dict={'encoded_image_string_tensor:0': inp})

Я использовал netron, чтобы найти свой ввод.

В tenorflow 2.0 это еще проще:

import cv2
cv2.imread(filepath)
flag, bts = cv.imencode('.jpg', img)
inp = [bts[:,0].tobytes()]
saved_model_dir = '.'
loaded = tf.saved_model.load(export_dir=saved_model_dir)
infer = loaded.signatures["serving_default"]
out = infer(key=tf.constant('something_unique'), image_bytes=tf.constant(inp))

Также saved_model.pb не является frozen_inference_graph.pb, см .: В чем разница frozen_inference_graph.pb и save_model.pb?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...