Полный исходный код можно найти в моем репозитории GitHub.

Ранее мы представили и протестировали несколько встроенных решений для периферийных вычислений, в том числе OpenVINO для нейронных вычислительных модулей Intel, CMSIS-NN для микроконтроллеров ARM и модель TensorRT для Jetson Nano.

Их объединяет то, что у каждого поставщика оборудования есть собственные инструменты и API для квантования графа TensorFlow и объединения смежных слоев для ускорения логического вывода.

На этот раз мы рассмотрим SoC RockChip RK3399Pro со встроенным NPU (нейронным вычислительным блоком), рассчитанным на вывод 2,4TOP ​​с точностью 8 бит, который способен запускать модель Inception V3 со скоростью более 28 кадров в секунду. Вы увидите, что развертывание модели Keras на плате очень похоже на ранее упомянутые решения.

  1. Заморозьте модель Keras в графе TensorFlow и создайте модель вывода с помощью RKNN Toolkit.
  2. Загрузите модель RKNN на плату разработчика RK3399Pro и сделайте прогнозы.

Начнем с первой настройки.

Настройка платы RK3399Pro

Любая плата разработчика с SoC RK3399Pro, такая как Rockchip Toybrick RK3399PRO Board или Firefly Core-3399Pro, должна работать. У меня есть плата Rockchip Toybrick RK3399PRO с 6 ГБ ОЗУ (2 ГБ выделено для NPU).

На плате было много разъемов и интерфейсов, подобных Jetson Nano. Стоит отметить, что разъем HDMI не работает с моим монитором, однако я могу заставить работать адаптер USB Type-C на HDMI.

На нем предустановлена ​​версия Fedora Linux 28 с именем пользователя и паролем по умолчанию «toybrick».

RK3399Pro имеет 6-ядерные 64-битные процессоры с архитектурой aarch64, той же архитектурой, что и Jetson Nano, но сильно отличающейся от Raspberry 3B+, которая является только 32-битной ARMv7. Это означает, что любые предварительно скомпилированные пакеты Python Wheel, предназначенные для Raspberry Pi, вряд ли будут работать с RK3399Pro или Jetson Nano. Но не отчаивайтесь, вы можете загрузить предварительно скомпилированные файлы пакета колеса Python aarch64 из моего репозитория aarch64_python_packages, включая scipy, onnx, tensorflow и rknn_toolkit, с их официального GitHub.

Перенесите эти файлы колес на плату RK3399Pro, затем выполните следующую команду.

Шаг 1: заморозить модель Keras и преобразовать ее в модель RKNN.

Преобразование графа TensorFlow в модель RKNN займет значительное время, если вы решите запустить его на плате разработки. Поэтому рекомендуется получить машину для разработки Linux, которая может быть Windows WSL, виртуальной машиной Ubuntu или даже Google Colab.

Настройте свою разработку в первый раз, вы можете найти файлы пакета колеса rknn toolkit на их официальном GitHub.

Замораживание модели Keras в один файл .pb аналогично предыдущим руководствам. Вы можете найти код в freeze_graph.py на GitHub. Как только это будет сделано, у вас будет замороженная модель ImageNet InceptionV3, которая принимает входные данные с формой.

Запишите имена входных и выходных узлов, так как мы укажем их при загрузке замороженной модели с помощью инструментария RKNN. Для InceptionV3 и многих других моделей Keras ImageNet они будут,

INPUT_NODE: ['input_1']
OUTPUT_NODE: ['predictions/Softmax']

Затем вы можете запустить скрипт convert_rknn.py, чтобы преобразовать вашу модель в тип данных uint8 или, более конкретно, в тип uint8 с асимметричным квантованием.

При асимметричном квантовании диапазон квантования используется полностью по сравнению с симметричным режимом. Это потому, что мы точно сопоставляем минимальные/максимальные значения из диапазона с плавающей запятой с минимальными/максимальными значениями квантованного диапазона. Ниже приведена иллюстрация двух методов линейного квантования на основе диапазона. Вы можете прочитать больше об этом здесь".

rknn.config также позволяет указать channel_mean_value со списком из 4 значений (M0, M1, M2, S0) как способ автоматической нормализации данных изображения с типом данных uint8 (0 ~ 255) для разных диапазонов в конвейере вывода. Модели Keras ImageNet с бэкэндом TensorFlow ожидают, что значения данных изображения нормализованы в диапазоне от -1 до 1. Для этого мы устанавливаем channel_mean_value в "128 128 128 128", где первые три значения являются средними значениями для каждого из цветовых каналов RGB, последнее значение представляет собой шкалу. параметр. Выходные данные рассчитываются следующим образом.

R_out = (R - M0)/S0
G_out = (G - M1)/S0
B_out = (B - M2)/S0

Если вы используете Python OpenCV для чтения или захвата изображений, цветовой канал находится в порядке BGR, в этом случае вы можете установить параметр reorder_channel для rknn.config() на "2 1 0", чтобы цветовые каналы были переупорядочены в RGB в конвейере вывода.

После запуска сценария у вас будет inception_v3.rknn в каталоге проекта, передайте файл на доску разработчиков для вывода.

Шаг 2: загружает модель RKNN и делает прогнозы

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

Выходная форма (1, 1, 1000) представляет логиты 1000 классов.

Сравнительные результаты

Эталонная настройка.

  • Модель: Начало V3
  • Квантование: uint8
  • Размер ввода: (1, 499, 499, 3)

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

Среднее значение FPS составляет 28,94, что даже выше, чем у Jetson Nano (27,18 FPS) на гораздо меньшей модели MobileNetV2.

Заключение и дальнейшее чтение

В этом посте показано, как начать работу с платой разработчика RK3399Pro, преобразовать и запустить классификацию изображений Keras на своем NPU со скоростью в реальном времени.

Полный исходный код можно найти в моем репозитории GitHub.

Первоначально опубликовано на https://www.dlology.com.