Что такое OpenVINO?

Привет всем читателям habr.com! Мы студенты НГТУ им. Р.Е. Алексеева, и хотим рассказать о своем опыте работы с набором инструментов Intel — OpenVINO (Open Visual Inference & Neural Network Optimization).

Для начала давайте познакомимся. Мы- студенты 2 курса ИРИТ, кафедры «Информатика и системы управления» — Божко Мария и Сторожева Ксения.  Наше знакомство с OpenVINO произошло еще на первом курсе, когда преподаватели пригласили поучаствовать в воркшопе по компьютерному зрению от Intel, направленном на получение практического опыта работы с готовыми моделями компании. Заинтересовавшись темой машинного обучения, мы изучили множество статей, посвященных нейронным сетям. К нашему удивлению, мы не нашли ни одной статьи, в которой довольно подробно, понятно и, главное, доступно для людей любого уровня знаний было бы рассказано об OpenVINO. Безусловно, информация по этой теме имеется в интернете, но она разрознена и к тому же представлена на английском языке, большинство авторов очень кратко описывает OpenVINO и все связанное с ним, из таких статей сложно сформировать полное представление об этой технологии. Поэтому у нас родилась идея — написать публикацию с описанием этого набора инструментов простым и понятным языком для тех, кто только начинает свое знакомство с OpеnVINO.

Что такое OpenVINO?

OpenVINO toolkit (или Intel Distribution of OpenVINO Toolkit) — это открытый бесплатный набор инструментов, который помогает разработчикам и аналитикам данных ускорить разработку высокопроизводительных решений для использования в различных видеосистемах. 

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

OpenVINO решает самые разнообразные задачи, включая детектирование лица, автоматическое распознавание объектов, текста и речи, обработку изображений и многое другое. 

Какие преимущества даёт пользователю OpenVINO?

Основные преимущества продукта:

  • производительность,

  • минимальный размер,

  • практически нулевое количество зависимостей.

Производительность OpenVINO при вычислении сетей на платформах Intel в разы выше по сравнению с популярными фреймворками. Также значительно ниже требования по используемой памяти, что актуально для ряда приложений. Банально, на некоторых платформах невозможно запустить сеть с использованием фреймворков по причине нехватки памяти.

В чем отличие моделей OpenVINO от других моделей, которые доступны в сети?

На этот вопрос ответил эксперт компании Intel Юрий Горбачев 

»Отличий от публичных моделей два:

  • Производительность и размер моделей. Все поставляемые модели решают узкую задачу (к примеру детектирование пешеходов) и это позволяет нам значительно уменьшить их размер. В случае публичных моделей делается попытка решить более общую задачу и это требует гораздо более вычислительно сложных моделей с большим количеством параметров. 

  • Решение экзотических задач. Часто бывает так, что задача не вызывает особого интереса у академического сообщества и найти публичную модель непросто. К примеру, детектирование углов поворота головы или анализ возраста и пола. В таком случае, наша модель освобождает вас от необходимости находить датасет и тренировать модель.»

Какие есть инструменты

Состав Intel Distribution of OpenVINO ToolkitСостав Intel Distribution of OpenVINO Toolkit
  • Deep Learning Model Optimizer (Оптимизатор моделей глубокого обучения) кроссплатформенный инструмент командной строки для импорта моделей и подготовки их к оптимальному выполнению с помощью механизма вывода. Оптимизатор моделей конвертирует и оптимизирует модели популярных фреймворков (таких как Caffe *, TensorFlow *, MXNet *, Kaldi * и ONNX *) во внутренний формат IR, который используется для представления модели внутри OpenVINO.

  • Оптимизатор моделей глубокого обучениявключает два компонента:

    • Model Optimizer — компонент для конвертации предварительно обученных моделей из формата какого-либо обучающего фреймворка в промежуточный формат (Intermediate Representation, IR) OpenVINO. Поддерживаемые форматы моделей: ONNX, TensorFlow, Caffe, MXNet, Kaldi

    • Inference Engine — компонент для реализации эффективного вывода глубоких моделей.

2cb4bb6dd6572a9950d5cf4f0a75b462.png224bfa68c36e5c5a80311aa12808e206.png
  • Deep Learning Inference Engine — API для высокопроизводительного инференса (инференес- запуск натренированной сети как готовой программы) с помощью подготовленной модели. 

  • Open Model Zoo — открытый репозиторий обученных моделей для решения различных задач. Содержит набор широко известных публичных моделей (более 20) и моделей, решающих различные задачи компьютерного зрения и обученных сотрудниками компании Intel (более 100). В составе можно обнаружить множество примеров и демо-приложений, демонстрирующих использование доступных моделей.

    Модели после загрузки из Open Model Zoo конвертируются в промежуточное представление с использованием Model Downloader и Model Optimizer, вывод осуществляется при помощи Inference Engine.

    9c4c51740475a72bec8d23c4338a3df5.png
  • Предсобранный OpenCV — версия OpenCV *, скомпилированная для оборудования Intel

  • Post-training Optimization tool — инструмент для калибровки модели и последующего ее выполнения с точностью INT8 (int8- преобразование в однобайтное представление целого числа)

  • Deep Learning Workbench — веб-графическая среда, позволяющая легко использовать различные сложные компоненты набора инструментов OpenVINO™ toolkit

  • Demo applications — набор примеров.

  • OpenVX представляет из себя C API двух уровней: immediate mode и graph mode. Первый — это отдельные функции, по структуре очень похожие на примитивы из OpenCV. У всех функций есть эквивалент в OpenCV, по большей части в модуле imgproc. Разрабатывался так, чтобы эффективно взаимодействовать с OpenCV.

Open Model Zoo

42bc43c9f24535f5ca14aa69dac40f7b.png
  • Более 200 моделей, оптимизированных и готовых к использованию:

  1. Самые популярные общедоступные модели, поддерживаемые openvino и проверенные инженерами Intel

  2. Оптимизированные модели

  3. Более 20 демонстрационных приложений

  • Инструменты для скачивания и автоконвертации моделей

Приведем несколько примеров предобученных моделей:

  1. Обнаружение объекта:

Пример модели person-vehicle-bike-detection-crossroad-1016

c2ccad04c3070f0e059f28541fa05362.png

Модель предназначена для обнаружения людей / транспортных средств / велосипедов в приложениях для видеонаблюдения.  Работает в различных сценах и погодных условиях / условиях освещения.

2.Повторная идентификация объекта

Пример модели age-gender-recognition-retail-0013

Сеть для одновременного распознавания возраста/пола, способна установить возраст людей в диапазоне [18, 75] лет

dcb7a288e0f59b81c2967c5528b0a850.png

3.Семантическая сегментация (разбиение изображения на объекты с определением типов этих объектов) 

Пример модели semantic-segmentation-adas-0001

Это сеть сегментации (сегментация- процесс выделения некоторых частей на изображении) для классификации каждого пикселя на 20 классов: дорога, тротуар, здание, стена, забор, столб, светофор, дорожный знак, растительность, местность, небо, человек, всадник, машина, грузовая машина, автобус, поезд, мотоцикл, велосипед и т.д.

33ce7063800dc826a4cdaea6b707abf5.png

4.Оценка позы человека 

Пример модели human-pose-estimation-0001

0076e3490bc590633e6bc46370375a63.png

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

5.Повторная идентификация объекта

Пример модели person-reidentification-retail-0107

Это модель повторной идентификации человека. 

Найденные объекты регистрируются в базе данных

c0d1a73c69469905fff0bfda3b8ce29d.png

6.Обработка изображения 

Пример модели single-image-super-resolution-1033

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

ee90a1900ea90f4c258fe06a9b4ccf51.jpeg

7.Распознавание текста 

Пример модели text-detection-0002

Детектор текста на основе архитектуры в качестве основы для сцен внутри и снаружи помещений.

6ab8bafa16383ea1a74c49b79b291150.png

Запуск модели из Open Model Zoo

Рассмотрим, как запустить модель person-vehicle-bike-detection-crossroad-1016 — глубокая нейронная сеть.

*для Windows

Для того, чтобы запустить данный код, необходимо установить OpenVINO toolkit (инструкция по установке есть на официальном сайте) и Python 3.6.5 64-bit (и выше), ВАЖНО:  В рамках этой установки убедитесь, что вы выбрали опцию добавления приложения в свой компьютер. PATH переменная окружения.). 

  1. Скачайте модель нейронной сети из Open Model Zoo на GitHub. 

person-vehicle-bike-detection-crossroad-1016.bin (файл с обученными весами)

person-vehicle-bike-detection-crossroad-1016.xml (файл с описанием структуры модели)

2. Скачайте любое изображение маленького  размера 

3. Откройте командную строку (Development Command Prompt на Windows) и вставьте окружение:

«C:\Program Files (x86)\IntelSWTools\openvino\bin\setupvars.bat» (добавление библиотек OpenVINO Python в переменную среды PATH)

ожидаемое сообщение:

4de6ae09747278050099d2fbc947aa2d.png

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

например:

5bb6bfd3d4f42769bea48353e7703cee.png

5.перейдем к коду

#импорт необходимых библиотек

import numpy as np

import cv2 as cv

import argparse

from openvino.inference_engine import IECore

ie = IECore()  #создается объект класса IECore

#Загрузка модели

#очень удобно пользоваться командной строкой и запускать программы с именованными аргументами. В языке Python для этого используется пакет argrparse, который позволяет описать имя, тип и другие параметры для каждого аргумента

parser = argparse.ArgumentParser(description='Run models with OpenVINO')

parser.add_argument('-mPVB',dest='person_vehicle_bike_detection_odel', default='person-vehicle-bike-detection-crossroad-1016', help='Path to the model_1')

args = parser.parse_args()

def person_vehicle_bike_detection_model_init():

net_PVB = ie.read_network(args.person_vehicle_bike_detection_model + '.xml', args.person_vehicle_bike_detection_model + '.bin') #считывается сеть и помещаем ее в переменную "net_PVB”

        exec_net_PVB = ie.load_network(net_PVB, 'CPU') #загружается сеть на устройство исполнения, инициализируется экземпляр класса IENetwork, второй параметр может быть GPU

       return net_PVB, exec_net_PVB

def person_vehicle_bike_detection (frame, net_PVB,  exec_net_PVB):

    #Подготовка входного изображения

    dim = (512, 512) #задается размер для изменения входного изображения 

    resized = cv.resize(frame, dim, interpolation = cv.INTER_AREA) #уменьшается изображение до размера входа сети, как написано в документации

Особенность работы библиотеки OpenVINO. Её ядро хранит изображения в последовательности BGR, а не RGB. Если модель загружается из Open Model Zoo и конвертируется с параметрами по умолчанию, то тогда данный момент уже учтен, однако если используется модель не из Open Model Zoo, то необходимо поменять красный и синий каналы изображения местами.

 inp = resized.transpose(2,0,1)”””изменение формата представления изображения (HWC[0,1,2] -> CHW[2,0,1])

C - количество каналов

H - высота изображения

W - ширина изображения, в соответствии с документацией”””

    #Получение данных о входе нейронной сети

    input_name = next(iter(net_PVB.input_info) #Вызывается функция синхронного исполнения нейронной сети

    Синхронный вызов (Sync API) блокирует пользовательское приложение на время выполнения запроса на вывод, нет необходимости отслеживать завершение обработки запроса. Используется для реализации режима минимизации времени выполнения одного запроса (latency mode)

outputs = exec_net_PVB.infer({input_name:inp})

    #Обработка выхода модели

    #Она нужна, потому что прямо выход модели в приложении использовать не получится

    outs = next(iter(outputs.values()))

    outs = outs[0][0]

    j = 0

    for out in outs:

        coords =[]

        if out[2] == 0.0:   

            break

        if out[2] > 0.6:

            x_min = out[3]

            y_min = out[4]

            x_max = out[5]

            y_max = out[6]

            coords.append([x_min,y_min,x_max,y_max]) #добавление в массив  координат: координаты верхнего левого угла ограничительной рамки (x_min,y_min) и нижнего правого угла ограничительной рамки (x_max,y_max)

            coord = coords[0]

            h=frame.shape[0]

            w=frame.shape[1]

            coord = coord* np.array([w, h, w, h])

            coord = coord.astype(np.int32) #возвращает копию массива, преобразованного к указанному типу (вещественные числа с одинарной точностью)

            if out[1] == 2.0:

            #Обводка прямоугольником синего цвета велосипедов

                cv.rectangle(frame, (coord[0],coord[1]), (coord[2],coord[3]), color=(0, 0, 255))

            if out[1] == 1.0:

                #Обводка прямоугольником зеленого цвета транспортных средств

                cv.rectangle(frame, (coord[0],coord[1]), (coord[2],coord[3]), color=(0, 255, 0))

            if out[1] == 0.0:

                 #Обводка прямоугольником красного цвета людей

                cv.rectangle(frame, (coord[0],coord[1]), (coord[2],coord[3]), color=(255, 0, 0))

    return frame

#вызов функции, которая инициализирует модель 

net_PVB, exec_net_PVB = person_vehicle_bike_detection_model_init()

#загрузка изображения

frame = cv.imread('имя_изображения') #в переменную img возвращается NumPy массив, элементы которого соответствуют пикселям

#вызов функции,в которой происходит обнаружение людей /транспортных средств /велосипедов

frame = person_vehicle_bike_detection (frame, net_PVB, exec_net_PVB)

cv.imshow('Frame', frame) #вывод на экран изображения, на котором выделены люди / транспортных средства / велосипеды

cv.waitKey(0) #данная команда останавливает выполнение скрипта до нажатия клавиши на клавиатуре, параметр 0 означает что нажатие любой клавиши будет засчитано.

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

Конечно, мы показали лишь малую часть возможностей OpenVINO toolkit на примере одной из моделей. На самом деле Open Model Zoo содержит большое количество моделей в открытом доступе для решения самых различных задач. Надеемся, данная статья помогла Вам найти ответы на интересующие вопросы по данной теме и побудила к дальнейшему, более глубокому, изучению OpenVINO toolkit. До встречи в будущих статьях :)

© Habrahabr.ru