Мы превращаем raspberry PI 3B + в сервер распознавания объектов, разворачивая архитектуру MobileNet-SSD для полноценного решения на платформе Intel OpenVINO.

В этой части мы собираемся использовать легко скомпилированную нейронную сеть в Intel Neural Compute Stick, чтобы она могла получать изображения в кодировке Base64 и превращать их в предсказания ограничивающей рамки. Кроме того, будет предоставлен пример внешнего интерфейса, который отправляет данные с камеры в PI. Не забудьте также ознакомиться с удивительным руководством по развертыванию и тестированию моделей от Mattio Varile ».

  • Предварительно обученная и скомпилированная модель будет предоставлена ​​во вложении.
  • Обучение и компиляция модели для пользовательского набора данных, а также более подробная информация о пользовательском интерфейсе будут частью другой истории, так что следите за обновлениями!

«0. Требования"

Обновление 1, 29.05.2019: добавлена ​​системная диаграмма,
Обновление 2, 05.08.2019: pybase64 удален из требований как неиспользуемый

0. Требования

По желанию

  • Некоторые веб-камеры USB
  • Другой компьютер, на котором будет работать клиентская часть

1. Приготовление Raspberry PI

1.1. Установите образ NOOBS

Запишите образ NOOBS на карту micro SD, отформатированную в FAT32. Https://www.raspberrypi.org/downloads/

Загрузите образ USB в обычном режиме, установите пароль учетной записи, подключитесь к Интернету и т. Д.

Не забудьте также установить python3, pip3 и wget.

sudo apt-get update
sudo apt-get install python3-picamera python3-pip wget

1.2. Установите последнюю версию программного обеспечения Intel OpenVINO

Загрузите инструментарий OpenVINO

cd ~/Downloads && wget https://download.01.org/opencv/2019/openvinotoolkit/l_openvino_toolkit_raspbi_p_2019.1.094.tgz

Я рекомендую следовать следующему руководству до (не включая) раздела «Сборка и запуск образцов обнаружения объектов».



После успешного выполнения всего при открытии нового терминала вы должны увидеть следующий результат:

1.3. Развертывание обнаружения объектов на нейронной вычислительной палке

Мы собираемся использовать фляжный сервер, который получает закодированные изображения для предсказания. Вы можете найти весь код в следующем репозитории github https://github.com/AlexeyGy/NCS2-server

a) Сначала создайте новую папку с именем detection_server в вашей домашней папке.

mkdir ~/detection_server && cd detection_server

б) создайте файл requirements.txt со следующим содержимым. Этот файл содержит необходимые пакеты.

  • flask - это веб-сервер, а flask-cors - это оболочка, которая передает заголовки CORS (необходимые для межсайтовых скриптов), подробнее об этом здесь
  • Обратите внимание, что OpenCV (cv2) не входит в этот список пакетов, поскольку этот пакет устанавливается вместе с OpenVINO на шаге 1.2. Это связано с тем, что OpenVINO предоставляет свой собственный вариант cv2, включая поддержку архитектур CNN.
flask-cors
flask

теперь беги

pip3 install -r requirements.txt

для автоматической установки пакетов.

в) настроить сценарий запуска сервера, создать файл с именем RUN.SH

г) Загрузите предварительно обученные файлы промежуточного представления архитектуры MobileNet-SSD, которые могут различать винты и штифты. Следите за обновлениями второй части этого урока, где мы рассмотрим обучение.

mkdir models && cd models && wget https://github.com/AlexeyGy/NCS2-server/raw/master/models/no_bn.bin && wget https://github.com/AlexeyGy/NCS2-server/raw/master/models/labelmap.prototxt && wget https://raw.githubusercontent.com/AlexeyGy/NCS2-server/master/models/no_bn.xml

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

д) Теперь давайте создадим реальный сервер, создадим файл server.py со следующим содержимым. Более подробная информация об отдельных функциях будет представлена ​​ниже.

  • В строке 12 мы читаем предоставленные файлы моделей с помощью функции Intel OpenVino cv2.dnn.readNet.
  • строка 14 устанавливает предпочтительную цель для выполнения наших вычислений
  • строки 17-19 содержат некоторую стандартную конфигурацию для нашего фляжного сервера,
  • строка 23 использует оболочку flask-cors для установки заголовка CORS, подробнее здесь
  • строки 25–29 являются необязательными, они устанавливают фильтр для всех входящих данных, которые не состоят из изображений в правильном формате jpg или png.
  • строка 31 устанавливает маршрут по умолчанию для нашего фляжного сервера, мы принимаем запросы POST, которые содержат изображение
  • строка 37 позволяет нам принять порог в дополнение к изображению, которое мы передаем на сервер s.t. все прогнозы ниже порогового значения не возвращаются
  • строка 43 возвращает результаты прогноза в формате JSON.
  • функция в строках 46–50 выполняет фактическую обработку изображения, мы сразу же перейдем к соответствующему файлу util_mobilnet.py. Вот общий обзор того, что он делает
    - сначала выполняется этап предварительной обработки и масштабирования, специфичный для архитектуры Mobilenet-SSD
    - затем сеть выполняет вывод (строки 48–49)
    - наконец, выполняется этап постобработки, включая пороговую фильтрацию

е) наконец, давайте создадим и посмотрим на файл util_mobilnet.py

  • Строка 5 конфигурирует размеры, которые требуются mobilnet, так как он был обучен на квадратных изображениях 300x300, мы установили именно это как наши размеры
  • функция read_labels считывает файл карты меток построчно, чтобы определить поддерживаемые классы
  • функция предварительной обработки в строке 21 обрабатывает цвета и размеры входящего изображения, произвольно выглядящие преобразования необходимы для mobilnet для правильной обработки изображения
  • Функция постобработки в строке 32 просматривает все прогнозы и отфильтровывает прогнозы ниже порогового значения, кроме того, прогноз фона не возвращается.

3. Запуск сервера и настройка автозапуска при загрузке

Чтобы свести к минимуму использование ресурсов в Raspberry PI, мы хотим настроить клиент-серверное приложение, в котором флеш-сервер получает изображения и возвращает прогнозы ограничивающей рамки.

Я обнаружил, что лучший способ автозапуска фляги - это а) добавить флягу в файл .bashrc в домашнюю папку pi и б) настроить систему на автозапуск в cli с автологином.

а) Что касается добавления строк в файл. bashrc, обязательно установите папку «Загрузки» в папку, в которую вы скачали свой инструментарий OpenVINO.

б) запустите следующую строку в терминале

sudo raspi-config

вы увидите следующие экраны, на которых вы должны выбрать опции: 3 варианта загрузки / 1 интерфейс командной строки для рабочего стола / 2 автологин консоли.

Теперь, после запуска, вы увидите, что Raspberry автоматически запустит флеш-сервер на порту 5000, поздравляем!

4. Использование образца графического интерфейса для развертывания нашего сервера.

Следующие шаги должны быть выполнены на другом компьютере, но они могут быть выполнены и на Raspberry, если вы решили запустить на нем графический интерфейс (приведет к снижению производительности).

клонировать репозиторий https://github.com/AlexeyGy/NCS2-frontend

git clone https://github.com/AlexeyGy/NCS2-frontend

просто запустите файл RUN.SH, чтобы запустить простой сервер Python. Вы можете получить к нему доступ через localhost: 8000, хотя вам, возможно, придется предоставить ему доступ к вашей камере, прежде чем вы увидите какие-либо изображения.

Сервер отправит изображения с веб-камеры по адресу https://192.168.0.2:5000/. Если вы работаете на другой машине, а не на вашей raspberry, обязательно настройте это на адрес вашей raspberry.

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

Данный пример графического интерфейса пользователя был взят из пилотного демонстратора в FIR, который мы использовали для демонстрации возможных вариантов использования платформы смарт-контрактов. Подробнее об этом в более позднем посте.

Вы можете отладить настройку через консоль JavaScript вашего браузера.

5. Выводы и перспективы

Вот гифка, на которой изображена целая система совместной работы клиентской части и серверной части:

Пример обнаружения винтов и дюбелей

Работающая система способна передавать видео со скоростью 60 кадров в секунду и примерно 8 кадров в секунду при обнаружении, если запускается на двух машинах. На взаимодействие с пользователем это не влияет, поскольку прогнозы отображаются асинхронно в интерфейсе JavaScript. Я обнаружил, что на самом деле слишком большое количество кадров в секунду при обнаружении приводит к ухудшению взаимодействия с пользователем, поскольку обнаружения обновляются слишком быстро!

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

Следите за новостями об обучении и внешнем дизайне.

Ресурсы