В этой статье вы узнаете, как ускорить модель классификации 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, нам нужно пройти несколько шагов:
- Закрепите модель, если она не в формате protobuf (.pb)
- Преобразование модели в промежуточное представление (IR)
- Настройте код механизма вывода для запуска 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.
Было очень весело писать для вас этот урок. Если это было полезно, поделитесь им и хлопните мне в ладоши!