В данной статье описываются особенности запуска моделей искусственных нейронных сетей с использованием сопроцессора Movidius Neural Computer Stick совместно с Raspberry pi для задач распознавания объектов, в том числе и на архитектуре AArch64. Помимо этого, исследуется корреляция между размерностью обрабатываемой картинки и скоростью распознавания.
Ключевые слова: искусственная нейронная сеть, Neural Computer Stick, распознавание, сопроцессор, Raspberry pi 4, NCSDK, модель.
Введение
На сегодняшний день крайне актуален вопрос расширения области применения технологий машинного зрения, реализованного с помощью моделей искусственных нейронных сетей (ИНС). Нейронные сети всё глубже проникают в повседневную жизнь человека, ведь они позволяют выполнять рутинную работу быстрее и дешевле человека.
Для решения небольших задач, например, распознавания бракованной продукции на производстве, использования сельскохозяйственных дронов для удобрения или реализации простых охранных систем, нецелесообразно покупать дорогое громоздкое оборудование, когда можно использовать системы на одноплатных компьютерах. Наиболее популярным, мощным и недорогим является Raspberry pi, однако, даже самые новые версии данного устройства работают достаточно медленно в задачах машинного зрения.
В качестве недорогого и весьма эффективного решения для увеличения скорости работы нейронных сетей можно подобрать специальный нейронный сопроцессор, одним из которых является продукт от компании Intel — Movidius Neural Computer Stick.
1. Анализ и аппаратная часть
Искусственная нейронная сеть является математической моделью, имеющей программное и аппаратное воплощение. Математическая модель реализована по принципам, схожим с организацией нервных клеток живых организмов. Она получает на вход некоторые сигналы, являющиеся интерпретацией внешнего мира. Далее эти сигналы поступают на так называемые нейроны, генерирующие новые сигналы в зависимости от того, какие получили. После большого количества пройденных слоёв нейронов, сеть предоставляет окончательные выходные сигналы, являющиеся решением поставленной задачи.
С программной точки зрения подобные модели при работе выполняют множество операций, связанных с перемножением матриц, это значит, что аппаратная часть должна быть способна совершать многочисленные параллельные операции. Для подобных задач подходят видеокарты, либо специальные процессоры, заточенные под работу с нейронными сетями.
Movidius Neural Compute Stick — это сопроцессор, предназначенный для ускорения выполнения задач, связанных с искусственным интеллектом от компании Intel. Данное устройство выполнено в форм-факторе USB-флеш-накопителя с интерфейсом USB3.0, корпус которого является охлаждающим радиатором. По заявлениям производителя, его производительность равна 100 Гигафлопс (может выполнять до 100 миллиардов операций с плавающей запятой в секунду), а его энергопотребление составляет всего 1 Ватт [1].
В качестве основного устройства управления был выбран одноплатный компьютер Raspberry pi 4 с 8 ГБ оперативной памяти.
2. Программная часть
Для начала на карту памяти microSD был записан образ операционной системы Raspberry Pi OS. Далее карта памяти была установлена в Raspberry pi 4, после запуска одноплатный компьютер стал готов к установке библиотек и инструментариев.
Для работы с нейронным сопроцессором — Movidius Neural Compute Stick (NCS) требуется специальный набор для разработки — NCSDK.
Neural Compute software developer kit (NCSDK) включает набор программных средств для компиляции, профилирования и проверки (validate) DNN, а также Intel Movidius Neural Compute API (Intel Movidius NCAPI) для разработки приложений на C / C ++ или Python [2].
Для установки NCSDK 2.x требуется ввести следующую команду для копирования репозитория:
git clone -b ncsdk2 https://github.com/movidius/ncsdk.git
Если же по каким-то причинам для работы требуется более старая версия NCSDK 1.x, вводится следующая команда:
git clone https://github.com/movidius/ncsdk.git
Вместе с пакетами NCSDK поставляется Makefile, упрощающий установку. После клонирования репозитория и перехода в него, для установки нужно запустить следующую команду:
make install
Также пакет NCSDK включает примеры для работы с моделями ИНС, для получения данных примеров нужно после установки выполнить команду:
make examples
После данных действий NCSDK готов к работе [3].
В случае, если требуется установить NCSDK на устройство с архитектурой AArch64, можно установить его версию, адаптированную для данной архитектуры. Установка производится с помощью следующих команд [4]:
git clone https://github.com/markjay4k/ncsdk-aarch64.git
cd ncsdk-aarch64
sudo make install
source ~/.bashrc
sudo make api
Следует отметить, что таким образом устанавливается лишь часть данного инструментария (API), необходимая для запуска специальных файлов (в формате graph), сгенерированных из стандартных моделей ИНС для работы с NCS. Функция для генерации подобных файлов mvNCCompile недоступна, при такой установке.
Итак, перед началом работы с данным сопроцессором требуется выбрать модель ИНС и сконвертировать её в формат graph, либо скачать такой файл из открытых источников. Файлы graph моделей ИНС «googlenet» и «squeezenet» можно найти в открытом доступе на Github [5].
Для компиляции в graph модели (например, модели Caffe), следует воспользоваться следующей командой:
mvNCCompile Model.prototxt -w Model.caffemodel -s 12 -is 300 300 -o graph_name
Где «Model.prototxt» и «Model.caffemodel» — файлы модели ИНС, «12» — количество векторных процессоров (для выбранного устройства — 12), «300 300» — разрешение вхдного изображения, «graph_name» — название файла graph.
Стоит отметить, что помимо преобразования и запуска, инструменарий NCSDK позволяет также обучать модели ИНС на собственных данных.
Импорт библиотеки для распознавания в программу производится следующим образом:
from mvnc import mvncapi as mvnc
Непосредственно распознавание реализуется такими командами:
graph.LoadTensor(image.astype(np.float16), «user object»)
(preds, userobj) = graph.GetResult()
Где «image.astype(np.float16)» — входное изображение с функцией приведения в нужный формат, ««user object»» — определяемый пользователем класс объекта, возвращаемый функцией GetResult, «preds» — массив выходных данных, «userobj» –введённый ранее класс объекта.
Пример программы для распознавания с помощью данного сопроцессора можно найти в открытом доступе на GitHub (файл «ncs_detection.py») [6].
В данном файле даны комментарии, также в открытом доступе присутствуют и другие подобные программы, поэтому расписывать отдельно задействованные функции нецелесообразно.
Для того, чтобы реализовать распознавание объектов на изображении, получаемом с камеры в реальном времени следует создать бесконечный цикл (прерываемый к примеру, при нажатии определённой клавиши клавиатуры). Цикл после получения изображения должен передать его в качестве аргумента в функцию, приведённую выше, получить результаты, отобразить рамки объектов и надписи (с помощью функций cv2.rectangle и cv2.putText библиотеки OpenCV), вывести изображение на экран и вернуться к началу.
При работе с Raspberry pi камерой, подключённой через Camera Serial Interface (CSI), захват изображения выглядит следующим образом:
import picamera
from picamera.array import PiRGBArray
camera = picamera.PiCamera()
camera.resolution = (300, 300)
camera.framerate = 30
rawCapture = PiRGBArray(camera)
camera.capture(rawCapture, format=«bgr»)
image = rawCapture.array
Сначала следует импорт библиотек, затем создание экземпляр класса PiCamera, настройка разрешения и частоты кадров в секунду, инициализация кадра в формате raw, захват изображения в формате bgr и запись изображения в переменную.
3. Тестирование и исследование
После подключения аппаратной составляющей и программной настройки оборудования была написана программа для распознавания объектов в режиме реального времени. Однозначно можно сказать, что использование нейронного сопроцессора в разы увеличило скорость обработки изображений.
Как уже было упомянуто, на сегодняшний день доступна вторая версия данного сопроцессора — Intel Neural Computer Stick 2, которая является более удобной в использовании с точки зрения программной настройки. Также изменение размерности подаваемого на вход нейронной сети изображения при работе с официальным набором инструментов (OpenVINO) может быть реализовано гораздо более удобно. Для этого не требуется каждый раз генерировать новую модель, нужно лишь изменить параметры входного изображения в программе.
Исходя из вышеизложенного, в рамках тестирования было решено также произвести подключение второй версии данного сопроцессора с помощью библиотеки OpenVINO и уже на Intel Neural Computer Stick 2 исследовать взаимосвязь между увеличением разрешения картинки и падением скорости распознавания. Данная взаимосвязь наглядно представлена ниже (рис. 1).
Рис. 1. Взаимосвязь между разрешением фото и количеством кадров в секунду
При увеличении разрешения обрабатываемой картинки, соразмерно уменьшается количество кадров в секунду (растёт время на обработку). Более подробно подключение Intel Neural Computer Stick 2, работа с OpenVINO, описание программы, а также — анализ работы различных моделей ИНС описаны в статье «Система распознавания объектов на базе Raspberry PI 4 и Intel Neural Computer Stick 2» [7].
Заключение
Для компактных систем распознавания объектов, реализуемых на одноплатных компьютерах, использование нейронных сопроцессоров, в частности Movidius Neural Computer Stick, является очень выгодным решением, учитывая компактность, невысокую стоимость и хорошую производительность описываемого устройства.
Что касается непосредственно Movidius Neural Computer Stick и инструментария NCSDK, конечно, на данный момент данное аппаратное и программное обеспечение может считаться устаревшим, уже существуют гораздо более удобные и производительные решения. При подборе оборудования для проектов будет логичнее выбрать новую версию нейронного сопроцессора — Intel Neural Computer Stick 2, однако, его более ранняя версия также показывает отличные результаты в распознавании объектов и может быть применима.
Общие результаты работы нейронного сопроцессора можно увидеть ниже (рис. 2).
Рис. 2. Распознавание объектов с экрана ноутбука через камеру
Литература:
- Movidius Neural Compute Stick — искусственный разум на флешке [Электронный ресурс] — URL: https://habr.com/ru/companies/intel/articles/405449/ (дата обращения на ресурс: 17.11.2023).
- Introduction | Intel Movidius Neural Compute SDK Documentation [Электронный ресурс] — URL: https://movidius.github.io/ncsdk/index.html (дата обращения на ресурс: 18.11.2023).
- GitHub — movidius/ncsdk: Software Development Kit for the Neural Compute Stick [Электронный ресурс] — URL: https://github.com/movidius/ncsdk (дата обращения на ресурс: 18.11.2023).
- GitHub — markjay4k/ncsdk-aarch64: a modified version of ncsdk-v1 that works with aarch64 with ubuntu18 (for the rock64) [Электронный ресурс] — URL: https://github.com/markjay4k/ncsdk-aarch64 (дата обращения на ресурс: 18.11.2023).
- GitHub — Geo-Trackers/Movidius-NCS-Classification: This repo contains script and graph files for the running classification & benchmarking with Movidius NCS [Электронный ресурс] — URL: https://github.com/Geo-Trackers/Movidius-NCS-Classification/tree/master (дата обращения на ресурс: 20.11.2023).
- ncs_detection/ncs_detection.py at master... [Электронный ресурс] — URL: https://github.com/ahangchen/ncs_detection/blob/master/ncs_detection.py (дата обращения на ресурс: 20.11.2023).
- Д. С. Аксенов, В. А. Жиляев, Н. И. Маркин, И. А. Титов Система распознавания объектов на базе Raspberry PI 4 и Intel Neural Computer Stick 2 // Информационные системы и технологии, 2023. № 4(138). С. 10–16.