В этой статье вы узнаете, как ускорить модель классификации InceptionV3 и начать вывод изображений в режиме, близком к / в реальном времени, с помощью процессора Intel® Core и Intel® OpenVINO.

Давайте увеличим время вывода до 18 раз, вы готовы?

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

Используете ли вы все ресурсы, доступные на вашем оборудовании?

В чем магия?

Это все связано с оптимизацией модели! Я использовал Intel OpenVINO для оптимизации модели и выполнил выводы, используя его механизм вывода. Это действительно интересно и легко настраивается.
OpenVINO - это набор инструментов, который позволяет разработчикам развертывать предварительно обученные модели глубокого обучения. Он состоит из двух основных модулей: оптимизатора модели и механизма вывода.

Оптимизатор моделей
Набор инструментов командной строки, который позволяет импортировать обученные модели из многих платформ глубокого обучения, таких как Caffe, TensorFlow и других (поддерживает более 100 общедоступных моделей)
Это выполняет множество задач в вашей модели, чтобы оптимизировать и уменьшить ее. К этим вещам относятся:

  • Преобразуйте свою модель в промежуточное представление (IR), чтобы можно было использовать механизм вывода.
  • Преобразование модели: объедините операции, примените квантование для уменьшения длины данных и подготовьте данные с переупорядочением каналов.
    Здесь вы можете найти дополнительную информацию о поддерживаемых моделях

Механизм вывода
Использует код на основе API для выполнения выводов на выбранной вами платформе: CPU, GPU, VPU или FPGA.

  • Выполнение разных слоев на разных устройствах (например, GPU и выбранные слои на CPU)
  • Оптимизация выполнения (анализ вычислительного графа, планирование и сжатие модели)

Пожалуйста, проверьте документацию OpenVINO, чтобы настроить установку SDK соответствующим образом. https://software.intel.com/en-us/articles/OpenVINO-Install-Linux.
Обратите внимание, что OpenVINO требует как минимум Процессоры 6-го поколения.

Давайте начнем!

В этом эксперименте мы собираемся использовать очень интересную предварительно обученную модель Keras от Kaggle для классификации белков (https://www.kaggle.com/kmader/rgb-transfer-learning-with-inceptionv3-for-protein/ ).

Чтобы использовать OpenVINO, нам нужно пройти несколько шагов:

  1. Закрепите модель, если она не в формате protobuf (.pb)
  2. Преобразование модели в промежуточное представление (IR)
  3. Настройте код механизма вывода для запуска IR

Закрепите модель, если она еще не имеет формат protobuf (.pb)

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

# Create checkpoint file from saved Keras model
import tensorflow as tf
model     = tf.keras.models.load_model("model.h5")
sess      = tf.keras.backend.get_session()
saver     = tf.train.Saver()
save_path = saver.save(sess, “proteinModel.ckpt”)
# Will create the following files:
# model.ckpt
# model.ckpt.index
# model.ckpt.meta
# Find model node output
print(model.output.op.name)
the result is: dense_2/Sigmoid

Теперь у нас есть файлы контрольных точек, мы можем заморозить их с помощью скрипта TensorFlow freeze_graph.py. Обычно он находится по адресу:
( your_python_installation_path /lib/python3.6/site-packages/tensorflow/python/tools/freeze_graph.py)

# Frozen model
python your_python_installation_path/lib/python3.6/site-packages/tensorflow/python/tools/freeze_graph.py \
--input_meta_graph=model.ckpt.meta \
--input_checkpoint=model.ckpt \
--output_graph=keras_frozen.pb \
--output_node_names="dense_2/Sigmoid" \
--input_binary=true

Преобразование модели в промежуточное представление (IR)

Можно сгенерировать файлы IR с помощью модуля оптимизатора TensorFlow из OpenVINO SDK. Важно установить форму ввода в соответствии с топологией вашей модели. В данном случае мы работаем с InceptionV3; таким образом, используется форма [1, 299, 299,3].

python3 /opt/intel/computer_vision_sdk/deployment_tools/model_optimizer/mo_tf.py --input_model keras_frozen.pb \
--input_shape [1,299,299,3] \
--data_type FP32
# The following files will be created:
# keras_frozen.bin
# keras_frozen.xml
# You can optimize even more your model if you use data_type FP16 
# Check if your accuracy not reduced much.

Наконец-то у нас есть IR-файлы, и мы готовы работать над механизмом вывода!

Настройте код механизма вывода для запуска IR
В OpenVINO SDK есть множество примеров IE, показывающих, как загрузить файлы IR и выполнить логический вывод. Вы можете найти их здесь: /opt/intel/computer_vision_sdk_2018.3.343/deployment_tools/inference_engine/samples/python_samples

Одним из важных шагов является предварительная обработка. OpenVINO использует формат данных "сначала каналы" [CHW], это означает, что вам, вероятно, потребуется изменить форму массива изображений перед подачей в механизм вывода. Вот один из примеров метода предварительной обработки:

def pre_process_image(imagePath):
    # Model input format
    n, c, h, w    = [1, 3, 299, 299] 
    image         = Image.open(imagePath)
    processedImg  = image.resize((h, w), resample=Image.BILINEAR)
    
    # Normalize to keep data between 0 - 1
    processedImg  = (np.array(processedImg) - 0) / 255.0
    
    # Change data layout from HWC to CHW
    processedImg  = processedImg.transpose((2, 0, 1))
    processingImg = processingImg.reshape((n, c, h, w))
    
    return image, processingImg, imagePath

Наконец, давайте перейдем к самому выводу.
Обратите внимание, что вы можете использовать свой процессор Intel, графический процессор, MYRIAD (Movidius) и FPGA, просто изменив переменное устройство! Вы будете поражены тем, насколько быстро будет работать ваш алгоритм.

# Plugin initialization for specified device and load extensions library if specified. 
# Devices: GPU (intel), CPU, MYRIAD
plugin = IEPlugin("GPU", plugin_dirs=plugin_dir)
# Read IR
net = IENetwork.from_ir(model=model_xml, weights=model_bin)
assert len(net.inputs.keys()) == 1,
assert len(net.outputs) == 1, 
input_blob = next(iter(net.inputs))
out_blob = next(iter(net.outputs))
# Load network to the plugin
exec_net = plugin.load(network=net)
del net
# Run inference
image, processedImg, imagePath = pre_process_image(fileName)
res = exec_net.infer(inputs={input_blob: processedImg})
# Access the results and get the index of the highest confidence score
res = res['dense_2/Sigmoid']
idx = np.argsort(res[0])[-1]

Вот и все! Теперь вы готовы наслаждаться своими выводами. Если у вас есть дополнительное время, сравните стандартную версию TensorFlow и OpenVINO. Вот некоторые результаты, которые я получил при использовании этой модели.

Дополнительную информацию см. В документации OpenVINO по адресу /opt/intel/computer_vision_sdk_2018.3.343/deployment_tools/documentation/docs.

Было очень весело писать для вас этот урок. Если это было полезно, поделитесь им и хлопните мне в ладоши!

Следуйте за мной в LinkedIn: https://www.linkedin.com/in/fernando-rodrigues-junior-7390b991