Подготовка моделей глубокого обучения к худшему сценарию и кроссплатформенность с помощью набора инструментов OpenVINO.

Поскольку 2020 год только что наступил, сообщество экспертов и энтузиастов глубокого обучения ожидает значительного года инноваций в этой области. В связи с тем, что каждый день по всему миру создается множество моделей глубокого обучения, зависимость человечества от облака и сети (особенно TCP) растет с каждым днем. Вы можете подумать, а что не так с зависимостями в облаке?

Худший сценарий:

Считайте, что у вас дома есть блокировка обнаружения лица, которая построена неправильно, поскольку разработчик установил модель в облаке, и устройство должно использовать облачные службы для логического вывода. Теперь внезапно наступает день, когда вы сталкиваетесь с чрезвычайно ужасным сетевым подключением, и без какого-либо настроенного метода переопределения безопасности вы становитесь жертвой своей системы безопасности.

Другой реальный пример такого сценария - история известной многопрофильной больницы, расположенной в Бхувнешваре, Одиша, Индия. Они пробовали создать сеть глубокого обучения, должным образом обученную и настроенную с учетом опыта в предметной области, но она была реализована таким образом, что она должна была отправлять частоту сердечных сокращений пациента каждую секунду в виде потока на веб-сервер через TCP, чтобы определить инфаркт миокарда. После того, как разрушительный циклон обрушился на прибрежную Одишу, система перестала работать, потому что сотовой связи не было вообще.

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

Чтобы защитить эти модели от этих проблем, нам необходимо реализовать эти модели таким способом, чтобы модели могли принимать решения в режиме реального времени без подключения к каким-либо другим облачным сервисам или Интернету. Доказано, что этот метод более безопасен, поскольку развернутая модель находится за пределами досягаемости Интернета, и поэтому рабочие нагрузки, требующие максимального уровня безопасности, могут быть реализованы непосредственно в устройстве. Энтузиасты называют эти модели ИИ Edge AI. В этой схеме модель помещается непосредственно в устройство, и для логического вывода им не требуется подключение к сети. Теперь мы узнаем, как это достигается.

Промежуточное представление:

Модели, которые мы создаем и обучаем с использованием различных фреймворков, таких как Tensorflow, Caffe, Pytorch, ONNX и т. Д., Могут быть существенно большими, требовательными к ресурсам, а также могут зависеть от архитектуры, например, ограничиваться конкретной платформой или ядрами CPU / GPU. Чтобы эти модели могли успешно обеспечивать вывод с любого устройства или из любого места, нам необходимо преобразовать модель в формат промежуточного представления, который включает схему модели в формате .xml и веса и смещения модели в формате .bin. .

Получение и преобразование различных моделей в формат IR с помощью инструментария OpenVINO:

OpenVino Toolkit (Open Visual Inference and Neural Network Optimization toolkit) - это набор инструментов глубокого обучения с открытым исходным кодом, первоначально разработанный командой OpenCV, и включает различные инструменты для преобразования различных моделей глубокого обучения в формат IR с помощью инструмента оптимизатора моделей. В процессе преобразования моделей, созданных из различных фреймворков, инструмент оптимизатора моделей просто работает как переводчик, который фактически просто переводит часто используемые операции глубокого обучения, такие как Tensorflow, который мы видим, Conv2D, Conv3D, Dropout, Dense, BatchNormalization и т. Д. для Caffe мы используем свертку, dropout_layer и т. д. для их соответствующего аналогичного представления в наборе инструментов OpenVino и настраиваем их с соответствующими весами и смещениями из обученной модели. В дистрибутиве Intel для OpenVINO toolkit есть довольно большая коллекция различных предварительно обученных моделей, доступных на следующем веб-сайте, которые вы можете развернуть на разных устройствах. Эту предварительно обученную модель можно напрямую загрузить с помощью инструмента загрузки моделей. Предварительно обученные модели, загруженные с помощью инструмента загрузки моделей, уже имеют промежуточный формат представления с разными уровнями точности. Эти уровни точности фактически являются уровнями точности сохраненных весов и смещений модели. Различные уровни точности включают FP32 (32-разрядное число с плавающей запятой), FP16 (16-разрядное число с плавающей запятой), INT16 (16-разрядное целое число), INT8 (8-разрядное целое число, доступно только для предварительно обученных моделей) и многие другие. Эти уровни точности действительно важны из-за простоты развертывания на различных платформах. Меньшая точность дает менее точные результаты, но для запуска модели требуется гораздо меньше ресурсов, что делает ее доступной для полного развертывания на периферийных устройствах без существенного снижения производительности как устройства, так и модели. Давайте посмотрим, как мы можем использовать загрузчик моделей для загрузки предварительно обученных моделей с веб-сайта набора инструментов Intel OpenVINO и как их использовать для получения логического вывода для заданных входных данных.

Ниже приведена ссылка на предварительно обученную модель, содержащую документацию по предварительной обработке входных данных перед подачей в модель.



При условии, что инструментарий OpenVINO установлен и правильно настроен на вашем локальном компьютере, давайте сразу перейдем к процедуре загрузки указанной выше модели. Перейдите в каталог установки OpenVINO и откройте терминал или командную строку с правами администратора. Теперь, чтобы загрузить указанную выше модель, выполните следующую команду:

python C:/<OPENVINO_INSTALLATION_DIRECTORY>/openvino/deployment_tools/tools/model_downloader/downloader.py --name vehicle-attributes-recognition-barrier-0039 --progress_format=json --precisions FP16,INT8 -o \Users\<USER_ID>\Desktop

В приведенной выше команде используется программа python downloader.py, которая анализирует аргументы командной строки:

  1. - name: для указания названия модели (если вместо - name указано «- all», будут загружены все доступные предварительно обученные модели),
  2. - точность: для обеспечения различных уровней точности (если ничего не указано, будут загружены все доступные уровни точности модели)
  3. - progress_format = json: делает формат отчета о проделанной работе в формате JSON, который может быть проанализирован программой.

Проверьте промежуточное представление указанной выше модели в файле .xml, это схема архитектуры модели, а файл .bin содержит веса и смещения. В файле .xml вы можете видеть между тегами XML, разные слои и свойства модели глубокого обучения могут быть восприняты в указанном выше формате.

<layers>
............
<layer >  .......... </layer>
<layer> ...........</layer></layers>

Вывод с промежуточным представлением:

Сделать вывод с форматом модели IR очень просто. Для этой модели, приведенной выше, нам нужно предварительно обработать изображение в соответствии с размером ввода и вернуть цветовой канал. Для сети вывода нам нужно использовать функцию .load_model () с файлом модели .xml.

from inference import Network
inference_network = Network()
inference_network.load_model("/<MODEL_DOWNLOAD_FOLDER>/vehicle-attributes-recognition-barrier-0039.xml","CPU",   "/<OPENVINO_INSTALL_DIRECTORY>/openvino/deployment_tools/inference_engine/lib/intel64/libcpu_extension_sse4.so")
inference_network.sync_inference(preprocessed_image)
output = inference_network.extract_output()

Теперь необходимо обработать выходной сигнал сети логического вывода и выбрать максимумы с помощью функции argmax. Итак, нам нужно обработать вывод следующим образом, чтобы определить тип автомобиля и его цвет и наложить текст на входное изображение в результате логического вывода.

def handle_car(output, input_shape):
    color = output["color"]
    color_class = np.argmax(color)
    car_type = output["type"]
    type_class = np.argmax(car_type)
    return color_class, type_class

Преобразование моделей Tensorflow в промежуточное представление:

Чтобы преобразовать модели Tensorflow в формат IR, нам нужно получить модель, обученную в Tensorflow, сохраненную в формате .pb. А остальное очень-очень просто и легко реализовать. Чтобы преобразовать модель в формат IR с помощью оптимизатора моделей OpenVINO, необходимо заморозить графики Tensorflow. Замораживание модели Tensorflow означает удаление метаданных модели, связанных с предварительной обработкой и обучением, чтобы уменьшить размер модели и упростить развертывание. Tensorflow предоставляет встроенные функции для замораживания и размораживания графиков глубокого обучения. Файлы * .ckpt содержат мета-график замороженной модели TensorFlow.

from tensorflow.python.tools import freeze_graph
freeze_graph.freeze_graph('Model.pbtxt', "", False,                           './Model.ckpt', "output/softmax",                           "save/restore_all", "save/Const:0",                           'Model.pb', True, "")

Поскольку модель теперь заморожена, ее можно напрямую преобразовать в промежуточное представление. Перейдите в терминал или командную строку с правами администратора и введите следующую команду:

python C:/<OPENVINO_INSTALL_DIRECTORY>/openvino/deployment_tools/model_optimizer/mo_tf.py --input_model= /<MODEL_DOWNLOAD_DIRECTORY>.pb --tensorflow_use_custom_operations_config C:/<OPENVINO_INSTALL_DIRECTORY>/openvino/deployment_tools/model_optimizer/extensions/front/tf/ssd_v2_support.json --tensorflow_object_detection_api_pipeline_config /<MODEL_DOWNLOAD_DIRECTORY>/pipeline.config --reverse_input_channels

Мы будем использовать reverse_input_channels, чтобы изменить порядок цветовых каналов, поскольку OpenCV использует канал BGR вместо формата RGB. Чтобы вызвать конвейеры API обнаружения объектов, нам необходимо передать файл pipeline.config в качестве аргумента командной строки флагу tensorflow_object_detection_api_pipeline_config, чтобы правильно настроить IR модели. Как и в примере выше и ниже, мы будем использовать модель, которая на самом деле является детектором Single Shot Multibox (SSD), поэтому нам нужно дополнительно указать команду с помощью аргумента tensorflow_use_custom_operations_config. и передача файла конфигурации в формате JSON. Мы указываем файл модели .pb с помощью аргумента input_model. Процесс преобразования займет значительное время в зависимости от глубины сети.

В качестве примера мы загружаем предварительно обученную модель Tensorflow с помощью curl и извлекаем архив с помощью tar -xvf

Преобразование моделей кафе в промежуточное представление:

Чтобы преобразовать модели Caffe в формат IR, нам не нужно выполнять какую-либо специальную предварительную обработку, как в случае моделей TensorFlow, замораживая их. Чтобы преобразовать в IR, нам просто нужно указать расположение файла модели в * .caffemodel с помощью параметра input_model, и если он содержит текстовый файл protobuf, имя которого не равно к имени модели нам нужно указать ее местоположение с помощью параметра input_proto.

Для этого примера ниже мы загрузили предварительно обученную модель Caffe, размещенную в GitHub, на нашу машину Linux. И выдал следующую команду:

python <OPENVINO_INSTALL_DIRECTORY>/openvino/deployment_tools/model_optimizer/mo.py --input_model <NAME_OF_MODEL>.caffemodel --input_proto <NAME_OF_DEPLOYMENT_PROTOBUF_TEXT>.prototxt

Итак, в приведенном выше тексте мы обсудили, как мы можем легко преобразовать большие ресурсоемкие модели глубокого обучения в небольшие автономные системы, используя прямое развертывание на устройствах с помощью набора инструментов OpenVINO. При таком способе развертывания поток данных модели становится намного безопаснее, быстрее и легче. Мы можем легко снизить затраты на обработку конфиденциальной информации на серверах облачных систем и обеспечить сверхбыструю работу ИИ на каждом устройстве.

Желаю всем счастливого Нового года!

«Истину можно выразить тысячей разных способов, но каждый может быть правдой». ~ Свами Вивекананда.