Помогите, пожалуйста! Я на несколько недель застрял в получении любого типа прогнозирующего ответа для моей модели обнаружения объекта mask rcnn на платформе GCP ai. На данный момент я обучил простую модель примерно на 200 изображениях, которая выводит файл весов в формате h5 с использованием репозитория материя. В новом сценарии python я загружаю эти веса следующим образом:
# LOAD MODEL
from config import mask_config
from model import MaskRCNN
config = get_config()
model = MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=config)
model.load_weights(H5_WEIGHT_PATH, by_name=True)
затем я создал файл .pb с замороженным графиком, используя следующий код:
def freeze_model(model, name):
frozen_graph = freeze_session(
sess,
output_names=[out.op.name for out in model.outputs][:4])
directory = PATH_TO_SAVE_FROZEN_PB
# directory = './'
tf.train.write_graph(frozen_graph, directory, name , as_text=False)
print("*"*80)
print("Finish converting keras model to Frozen PB")
print('PATH: ', PATH_TO_SAVE_FROZEN_PB)
# print('PATH: ', './')
print("*" * 80)
freeze_model(model.keras_model, FROZEN_NAME)
Пока так хорошо! Затем я продолжаю готовить мою модель тензорного потока, обслуживающего следующим образом:
def make_serving_ready(model_path, save_serve_path, version_number):
import tensorflow as tf
export_dir = os.path.join(save_serve_path, str(version_number))
graph_pb = model_path
builder = tf.saved_model.builder.SavedModelBuilder(export_dir)
with tf.gfile.GFile(graph_pb, "rb") as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
sigs = {}
# tf.import_graph_def(graph_model_def, name='', input_map={"input_image": img_uint8})
with tf.Session(graph=tf.Graph()) as sess:
# name="" is important to ensure we don't get spurious prefixing
tf.import_graph_def(graph_def, name="")
g = tf.get_default_graph()
input_image = g.get_tensor_by_name("input_image:0")
input_image_meta = g.get_tensor_by_name("input_image_meta:0")
input_anchors = g.get_tensor_by_name("input_anchors:0")
output_detection = g.get_tensor_by_name("mrcnn_detection/Reshape_1:0")
output_mask = g.get_tensor_by_name("mrcnn_mask/Reshape_1:0")
sigs[signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY] = \
tf.saved_model.signature_def_utils.predict_signature_def(
{"input_image": input_image, 'input_image_meta': input_image_meta, 'input_anchors': input_anchors},
# {"image_bytes": img_uint8, 'input_image_meta': input_image_meta, 'input_anchors': input_anchors},
{"mrcnn_detection/Reshape_1": output_detection, 'mrcnn_mask/Reshape_1': output_mask})
builder.add_meta_graph_and_variables(sess,
[tag_constants.SERVING],
signature_def_map=sigs)
builder.save()
print("*" * 80)
print("FINISH CONVERTING FROZEN PB TO SERVING READY")
print("PATH:", PATH_TO_SAVE_TENSORFLOW_SERVING_MODEL)
print("*" * 80)
# Now convert frozen graph to Tensorflow Serving Ready
make_serving_ready(os.path.join(PATH_TO_SAVE_FROZEN_PB, FROZEN_NAME),
PATH_TO_SAVE_TENSORFLOW_SERVING_MODEL,
VERSION_NUMBER)
print("COMPLETED")
Затем я развертываю вывод вышеуказанного кода (saved_model.pb) в моделях платформы AI
The thing i ' Я пытаюсь понять - как я могу изменить приведенный выше код для приема изображений в кодировке base64? Я успешно развернул модель на платформе GCP AI, но когда я делаю образец ввода для проверки прогнозов, мне нужно использовать запрошенный gcp формат:
{"instances":[
{"image_bytes":{"b64":abcdefg},{"key":"1"}
]}
Итак, когда я конвертирую изображение в кодировку base64 изображение и введите указанный выше формат, я получаю эту ошибку:
{
"error": "{ \"error\": \"Failed to process element: 0 key: image_bytes of \\'instances\\' list. Error: Invalid argument: JSON object: does not have named input: image_bytes\" }"
}
Итак, я вернулся к своему коду и попытался изменить свою переменную input_image, чтобы принять формат декодированного изображения:
# concatenate decoder graph and original graph
image = tf.map_fn(decode_and_resize, image_str_tensor, back_prop=False, dtype=tf.uint8)
tf.import_graph_def(graph_def, name="", input_map={'input_image:0':image})
но потом я получаю эту ошибку:
ValueError: Input 0 of node zero_padding2d_1/Pad_1 was passed uint8 from decoder/map/TensorArrayStack/TensorArrayGatherV3:0 incompatible with expected float.
Так что я официально совершенно не знаю, как запустить эту штуку. Есть ли кто-нибудь, кто может это исправить ?? !!!