Цель данной работы - решить задачу детектирования объектов, используя модуль Inference Engine инструмента Intel Distribution of OpenVINO toolkit. Предполагается работа с обученными нейронными сетями.
- В директории
src
расположен файлie_detector.py
, который содержит объявление классаInferenceEngineDetector
, обеспечивающий детектирование объектов с использованием моделиmobilenet-ssd
. - В директории
samples
расположен файлpractice2_template.py
, в котором представлена функцияmain
- точка входа в программу.
Основные задачи:
- Скачать модель для детектирования объектов mobilenet-ssd и сконвертировать модель в промежуточное представление (intermediate representation), которое принимается Inference Engine.
- Реализовать класс InferenceEngineDetector, который инициализирует Inference Engine, загружает модель и выполняет вывод модели.
- Разработать приложение для детектирования объектов на изоражениях с использованием загруженной модели.
- Реализовать вывод изображения на экран и отрисовку прямоугольников, окаймляющих объекты.
Дополнительные задачи:
- Реализовать запись видео с прямоугольниками, окаймляющими объекты, в файл.
- Попробовать другие модели для детектирования объектов, доступные в Open Model Zoo.
-
Скачать обученную модель mobilenet-ssd с помощью инструмента Model Downloader.
-
Конвертировать скачанную модель с помощью инструмента Model Optimizer.
-
Разработать класс
InferenceEngineDetector
для решения задачи детектирования объектов.- Реализовать конструктор класса
InferenceEngineDetector
, включающий инициализацию необходимых параметров. - Реализовать метод
_prepare_image
для преобразования изображения в формат входа модели. - Реализовать метод
detect
для детектирования объектов. - Реализовать метод
output_detection
для отображения получившегося результата на входном изображении.
- Реализовать конструктор класса
-
Реализовать программу которая будет использовать класс
InferenceEngineDetector
для детектирования объектов. -
Выполнить дополнительные задачи.
Для того, чтобы пользоваться всеми возможностями Intel Distribution of OpenVINO toolkit, необходимо выполнить установку при помощи установочного файла и выполнить настройку Model Optimizer для конвертации моделей. Оригинальная инструкция на английском языке доступна по ссылке.
-
Открыть командную строку Anaconda и активировать виртуальную среду, созданную на практике 1.
-
Для работы с OpenVINO в командной строке Python необходимо запустить скрипт
setupvars.bat
, который подключит все зависимости OpenVINO в переменные среды системы.$ "C:\Program Files (x86)\IntelSWTools\openvino\bin\setupvars.bat"
-
Для настройки Model Optimizer необходимо запустить скрипт
install_prerequisites.bat
, который установит все требуемые библиотеки.$ cd "C:\Program Files (x86)\IntelSWTools\openvino\deployment_tools\model_optimizer\install_prerequisites" $ install_prerequisites.bat
В консоли должны появиться сообщения, аналогичные представленным.
-
Не закрывайте текущую командную строку. Если вы закроете ее, то вам придется заново активировать виртуальную рабочую среду и запустить скрипт
setupvars.bat
.
-
В директории
<openvino_dir>/deployment_tools/tools/model_downloader
запустить скриптdownloader.py
с параметрами--name mobilenet-ssd --output_dir <destination_folder>
.$ python "C:\Program Files (x86)\IntelSWTools\openvino\deployment_tools\tools\model_downloader\downloader.py" --name mobilenet-ssd --output_dir <destination_folder>
-
В директории
<openvino_dir>/deployment_tools/tools/model_downloader/
запустить скриптconverter.py
с параметрами--name mobilenet-ssd --download_dir <destination_folder>
.$ python "C:\Program Files (x86)\IntelSWTools\openvino\deployment_tools\tools\model_downloader\converter.py" --name mobilenet-ssd --download_dir <destination_folder>
-
Создать рабочую ветку
practice-3
( см. практику 1). -
В файле
src/ie_detector.py
реализовать конструктор классаInferenceEngineDetector
. Конструктор получает следующие параметры:- Путь до xml-файла модели.
- Путь до bin-файла модели.
- Тип устройства, на котором запускаемся (CPU или GPU).
- Для CPU необходим путь до библиотеки со слоями, реализации которых нет в MKL-DNN
(например
<openvino_dir>\inference_engine\bin\intel64\Release\cpu_extension_avx2.dll
).
Конструктор выполняет следующие действия:
- Создание объекта класса
IECore
. - Установка типа устройства для запуска и путь до расширенной библиотеки слоев.
- Создание объекта класса
IENetwork
с параметрами - путями до модели. - Загрузка созданного объекта класса
IENetwork
вIECore
.
-
В файле
src/ie_detector.py
реализовать метод подготовки изображения_prepare_image
. Особенностью обработки изображений глубокими моделями отличается от обработки изображений классическими алгоритмами тем, что сети принимают изображения поканально, а не попиксельно, изображения в подаваемой пачке необходимо преобразовать из формата RGBRGBRGB в формат RRRGGGBBB. Для этого можно воспользоваться функциейtranspose
.image = image.transpose((2, 0, 1))
Также необходимо уменьшить или увеличить размер изображения до размера входа сети
-
В файле
src/ie_detector.py
реализовать метод подготовки изображенияdetect
, который запускает исполнение глубокой модели на устройстве, указанном в конструкторе. Логика работы функцииdetect
следующая:-
Получить данные о входе и выходе нейронной сети.
input_blob = next(iter(self.net.inputs)) out_blob = next(iter(self.net.outputs))
-
Из данных о входе нейронной сети получить размеры выходного изображения.
n, c, h, w = self.net.inputs[input_blob].shape
-
С помощью функции
_prepare_image
сконвертировать картинку. -
Написать функцию синхронного вывода модели.
output = self.exec_net.infer(inputs = {input_blob: blob})
-
Из выхода модели получить тензор с результатом детектирования.
output = output[out_blob]
-
Выполнить функцию
_output_detection
, для того чтобы нарисовать результат детектирования на изображении.
-
-
В файле
src/ie_detector.py
реализовать метод подготовки изображения_output_detection
.
Выходом модели mobilenet-ssd является тензор (1x1x100x7), в котором каждая строка содержит следующие параметры: [image_number, classid, score, left, bottom, right, top], где image_number - номер изображения (у нас всегда 0, так как мы подаем одно изображение); classid - номер класса; score - вероятность объекта в данном месте; left, bottom, right, top - координаты ограничивающих прямоугольников в диапазоне от 0 до 1. Необходимо отрисовать эти прямоугольники на основном изображении. Подробный пример работы с моделью moilenet-ssd при помощи OpenCV на языке Python можно посмотреть по ссылке.
- Создать копию файла
<project_source>/samples/practice2_template.py
и назвать ее<project_source>/samples/practice2_YOUR_NAME.py
. - Добавить чтение необходимых аргументов командной строки по аналогии с практикой 1.
- Создать объект класса
InferenceEngineDetector
и передайте ему все необходимые параметры. - Прочитать изображение, вызвать функцию
detect
объекта классаInferenceEngineDetector
для того, чтобы детектировать все объекты на изображении. - Вывести полученное изображение на экран или в файл.
- Реализовать дополнительный функционал: если на вход приложению не был подан путь до изображения, использовать изображение с веб-камеры.