сохраненный_модель из AutoML Vision Edge не загружается должным образом - PullRequest
1 голос
/ 19 октября 2019

Я использовал AutoML Vision Edge для некоторых задач классификации изображений с отличными результатами при экспорте моделей в формате TFLite. Однако я только что попытался экспортировать файл сохраненный_модель.pb и запустить его с Tensorflow 2.0 и, похоже, столкнулся с некоторыми проблемами.

Фрагмент кода:

import numpy as np
import tensorflow as tf
import cv2

from tensorflow import keras

my_model = tf.keras.models.load_model('saved_model')
print(my_model)
print(my_model.summary())

«сохраненная_модель» - это каталогсодержащий мой загруженный файл сохраненный_модель.pb. Вот что я вижу:

2019-10-18 23: 29: 08.801647: I tenorflow / core / platform / cpu_feature_guard.cc: 142] Ваш процессор поддерживает инструкции, что этот двоичный файл TensorFlow не былскомпилировано для использования: AVX2 FMA 2019-10-18 23: 29: 08.829017: I tenorflow / compiler / xla / service / service.cc: 168] Служба XLA 0x7ffc2d717510, выполняющая вычисления на платформе Host. Устройства: 2019-10-18 23: 29: 08.829038: I tenorflow / compiler / xla / service / service.cc: 175] Устройство StreamExecutor (0): Хост, трассировка версии по умолчанию (последний вызов был последним): файл "classify_in_out_tf2. py ", строка 81, в печати (my_model.summary ()) AttributeError: у объекта 'AutoTrackable' нет атрибута 'summary'

Я не уверен, что это проблема с тем, как яэкспорт модели, или с моим кодом для загрузки модели, или если эти модели не совместимы с Tensorflow 2.0 или какой-либо комбинацией.

Любая помощь будет принята с благодарностью!

1 Ответ

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

У меня есть saved_model.pb, работающий вне контейнера докера (для обнаружения объектов, а не для классификации - но они должны быть похожими, изменить выходы и, возможно, входы для tf 1.14), вот как:

tenorflow 1.14.0:

изображение, закодированное в байтах

import cv2
import tensorflow as tf
cv2.imread(filepath)
flag, bts = cv.imencode('.jpg', img)
inp = [bts[:,0].tobytes()]
with tf.Session(graph=tf.Graph()) as sess:
    tf.saved_model.loader.load(sess, ['serve'], 'directory_of_saved_model')
    graph = tf.get_default_graph()
    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})

изображение в виде массива numy

import cv2
import tensorflow as tf
import numpy as np
with tf.Session(graph=tf.Graph()) as sess:
    tf.saved_model.loader.load(sess, ['serve'], 'directory_of_saved_model')
    graph = tf.get_default_graph()
    # Read and preprocess an image.
    img = cv2.imread(filepath)
    # Run the model
    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={'map/TensorArrayStack/TensorArrayGatherV3:0': img[np.newaxis, :, :, :]})                                                         

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

тензор потока 2.0:

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