Один из наиболее часто задаваемых вопросов в репозитории Stackoverflow или Github на Keras - это преобразование модели. Для быстрого тестирования и доступности предварительно обученной модели для классификаторов изображений большинство разработчиков / исследователей обычно используют Keras. Модели классификаторов изображений, такие как VGG16 / 19, Inception, Resnet и т. Д., Легко загрузить с помощью библиотеки Keras. В большинстве случаев эти модели используются в качестве базовой архитектуры. В задачах компьютерного зрения, таких как локализация и сегментация изображений (Mask RCNN), в качестве базовой архитектуры используется модель классификатора изображений.

Модель классификатора изображений из Keras может быть сохранена только в формате h5, родном для формата модели Keras. Однако, когда эта модель должна использоваться для вывода, она должна быть в формате прото-буфера [примечание * модель h5 может обслуживаться с помощью flask].

Давайте сразу погрузимся в код. Импортируйте модули Keras, которые могут загружать модель Keras (Начало).

import keras
import json
import os
import sys
import tensorflow as tf
from keras.applications.inception_v3 import InceptionV3
from keras.layers import Input

Давайте создадим каталог для сохранения модели в формате Keras, чтобы позже мы импортировали модель h5. Это проиллюстрирует способ сохранения модели и загрузки модели в Keras.

base_path = "/tmp/tfmodeldir/kerasmodel"
inception_model = InceptionV3(weights=’imagenet’,    input_tensor=Input(shape=(299, 299, 3)))
inception_model.save(os.path.join(base_path,’inception.h5'))

Вы можете перейти в каталог base_path, чтобы увидеть, была ли сохранена модель.

Теперь мы загрузим сохраненную модель в формате h5 с вашего диска и проверим сводку исходной модели (большая сеть, такая огромная сводка слоев).

model = tf.keras.models.load_model(os.path.join(base_path, ‘inception.h5’))
model.summary()Model: "inception_v3"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_2 (InputLayer)            [(None, 299, 299, 3) 0                                            
__________________________________________________________________________________________________
conv2d_95 (Conv2D)              (None, 149, 149, 32) 864         input_2[0][0]                    
__________________________________________________________________________________________________
batch_normalization_95 (BatchNo (None, 149, 149, 32) 96          conv2d_95[0][0]
.     .    .      .    .      .        .        .      .       .
.     .    .      .    .      .        .        .      .       .
avg_pool (GlobalAveragePooling2 (None, 2048)         0           mixed10[0][0]                    
__________________________________________________________________________________________________
predictions (Dense)             (None, 1000)         2049000     avg_pool[0][0]                   
==================================================================================================
Total params: 23,851,784
Trainable params: 23,817,352
Non-trainable params: 34,432

Тем временем вы можете проверить, может ли загруженная модель делать прогноз на входном изображении.

from keras.applications.inception_v3 import decode_predictionsimage = load_img('/tmp/elephant.jpg', target_size=(224, 224))
image = img_to_array(image)
image = image.reshape(1, image.shape[0], image.shape[1], image.shape[2])
image = preprocess_input(image)y_ = model.predict(image)
label = decode_predictions(y_)
print(label[0][0])>>('n02504458', 'African_elephant', 0.71297616)

Модель Кераса дает предсказание «африканского слона» с достоверностью 71,298%.

tf.keras.backend.set_learning_phase(0)export_dir = os.path.join(‘/tmp/tfmodeldir/kerasmodel’, ‘1’)with tf.keras.backend.get_session() as sess:
 tf.saved_model.simple_save(sess, export_dir, 
                      inputs= {“keys”:model.input},
                      outputs= {t.name: t for t in model.outputs})

Чтобы преобразовать формат буфера прототипа модели Keras (Pb), давайте создадим выходной путь с версией модели как «1», поскольку Tensorflow ищет номер версии.

рисунок: сохраненная incepetion_v3 замороженная модель

Мы можем проверить определение подписи сохраненной модели с помощью saved_model_cli.

$ saved_model_cli show --dir /tmp/tfmodeldir/kerasmodel/1/ --allsignature_def[‘serving_default’]:
 The given SavedModel SignatureDef contains the following input(s):
 inputs[‘keys’] tensor_info:
 dtype: DT_FLOAT
 shape: (-1, 299, 299, 3)
 name: input_3_2:0
 The given SavedModel SignatureDef contains the following output(s):
 outputs[‘predictions_4/Softmax:0’] tensor_info:
 dtype: DT_FLOAT
 shape: (-1, 1000)
 name: predictions_4/Softmax:0
 Method name is: tensorflow/serving/predict

По умолчанию определение сигнатуры - «serv_default». Теперь мы можем использовать tenorflow_serving для обслуживания замороженной модели (модель inception_v3 pb).

рисунок: обслуживание модели Inception_v3 из обслуживания TensorFlow

Теперь мы можем написать клиентскую секцию, если обслуживание работает хорошо. В этом случае мы не можем просто использовать curl, в отличие от других разделов, которые мы могли использовать для вывода с сервера. Здесь нам требуется извлечение функции изображения, поэтому требуется использовать библиотеку для получения функции из изображения.

from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.applications.vgg16 import preprocess_input
from keras.applications.vgg16 import decode_predictions
import requestsimage = load_img(‘/tmp/elephant.jpg’, target_size=(224, 224))
image = img_to_array(image)
image = image.reshape(1, image.shape[0], image.shape[1], image.shape[2])
image = preprocess_input(image)endpoint = “http://localhost:8501/v1/models/inception:predict"
headers = {“content-type”:”application-json”}
instances = image.tolist()
data = json.dumps({“signature_name”:”serving_default”,”instances”: instances})
response = requests.post(endpoint, data=data, headers=headers)
prediction = json.loads(response.text)[‘predictions’]
prediction[0].index(max(prediction[0]))>>916

Результатом будет 916, мы можем импортировать классы / метки из начального словаря классов, чтобы увидеть, является ли имя метки (значение) для ключа 916 «Африканский слон», как в приведенном выше примере.

Готовы узнать больше?

Свяжитесь с нашей командой экспертов, чтобы узнать, как мы можем помочь вам в создании интеллектуальных решений для прогнозирования вашего бизнеса.

Www.delvify.io