Rockchip · AI & Linux Hub

AI-инференс

RKNN-Toolkit2 Python API V2.5.0 — Генерация, сборка и запуск примеров C++

RKNN-Toolkit2 Python API V2.5.0 — Генерация, сборка и запуск примеров C++ | Полные параметры, примеры и ограничения платформ

· ArmSoM · 6 мин чтения

Платформа и источник

Статья подготовлена по PDF производителя RKNN V2.5.0 и относится только к перечисленным в нём чипам и интерфейсам. Для платы ArmSoM сначала проверьте SoC, драйвер NPU, Toolkit/Runtime, SDK/BSP и версию ядра. Проверки на оборудовании ArmSoM не проводились; примеры и измерения оригинала не являются тестами ArmSoM.

Навигация по серии

10 Генерация примера развёртывания C++

API codegen
Описание Создаёт пример развёртывания C++ для экспортированной модели RKNN. Пример выполняет инференс через zero-copy RKNN C API, сообщает производительность и может сохранять результаты как NPY.
Параметр output_path: Каталог создаваемого проекта C++.
Параметр inputs: Необязательный список путей входных файлов, по умолчанию None. Поддерживаются JPG, JPEG, PNG и NPY. Для модели с одним входом допускается строка пути. Число файлов и их порядок должны соответствовать входам модели. Форма каждого массива NPY должна совпадать с соответствующим входом исходной модели; четырёхмерный NPY имеет компоновку NCHW.
Параметр overwrite: Перезаписывать ли существующий каталог output_path. По умолчанию False: если каталог существует, API завершается ошибкой. При True существующий каталог удаляется перед повторной генерацией.
Возвращаемое значение 0: Успех.
-1: Ошибка.

10.1 Генерация примера

Перед codegen вызовите export_rknn. В примере указанное изображение используется для одного запуска модели на ПК. Выходы сохраняются как эталонные данные для проверки на устройстве, а команда со входом по умолчанию записывается в run.sh.

# Export the RKNN model before generating the C++ deployment example.
ret = rknn.export_rknn('./mobilenet_v2.rknn')
if ret != 0:
    print('Export RKNN model failed!')
    exit(ret)

ret = rknn.codegen(output_path='./rknn_app_demo',
                  inputs=['./mobilenet_v2/dog_224x224.jpg'],
                  overwrite=True)
if ret != 0:
    print('Generate C++ demo failed!')
    exit(ret)

Для модели с несколькими входами передайте список из одного файла на каждый вход. Например:

ret = rknn.codegen(output_path='./rknn_app_demo',
                  inputs=['./input0.npy', './input1.npy'],
                  overwrite=True)

При inputs=None codegen создаёт C++-проект для измерения производительности, но не создаёт входные или эталонные выходные данные. Программа на устройстве не сохраняет и не сравнивает выходы, если при запуске не указаны действительные входные пути. Аргумент dataset функции build не заменяет inputs функции codegen.

10.2 Созданные файлы

После успешной генерации output_path содержит следующие основные файлы и каталоги. Каталог data создаётся при указании inputs.

rknn_app_demo/
├── CMakeLists.txt
├── README.md / README_EN.md
├── build_linux.sh / build_android.sh
├── run.sh
├── src/ # RKNN C API inference example
├── libs/ # NPY, image resize, layout, and data type utilities
└── data/
    ├── inputs/ # Inputs prepared by codegen
    └── outputs/golden/ # FP32 reference outputs generated by the Python API

При генерации OpenCV читает изображение и меняет его размер. Созданный пример C++ использует stb и выполняет масштабирование letterbox, если размер не совпадает со входом модели. Различия реализаций обработки изображений могут снизить косинусное сходство с эталоном ниже 0.9999. Для входов, которые нельзя непосредственно представить изображением, генератор преобразует вход в файл FP32 NPY.

10.3 Сборка и запуск

Сначала укажите локальный репозиторий RKNPU2. Для Linux используется кросс-компилятор. Для RV1103/RV1103B/RV1106/RV1106B также задайте префикс инструментария GCC_COMPILER. Для Android задайте ANDROID_NDK_PATH.

Сценарий сборки Linux поддерживает RV1103, RV1103B, RV1106, RV1106B, RV1126B, RK3562, RK3566, RK3568, RK3576, RK3588 и RK3588S. Сценарий Android поддерживает RK3562, RK3566, RK3568, RK3576 и RK3588.

cd ./rknn_app_demo
export RKNPU2=/path/to/rknpu2

# Linux; replace rk3562 with the actual target platform.
./build_linux.sh rk3562

# Android
export ANDROID_NDK_PATH=/path/to/android-ndk
./build_android.sh rk3562

Результат находится в install/rknn_app_demo_Linux или install/rknn_app_demo_Android. Передайте весь каталог на устройство и запустите созданный сценарий:

adb push ./install/rknn_app_demo_Linux /data/
adb shell
cd /data/rknn_app_demo_Linux
./run.sh

Или непосредственно вызовите исполняемый файл:

./rknn_app_demo <model_path> [input_paths] [repeat_times]

Без input_paths программа выполняет только инференс и сообщает производительность, не сохраняя выходы.

Для нескольких входов объедините пути символом # в порядке входов модели. Например: ./data/inputs/input0.npy#./data/inputs/input1.npy .

repeat_times — положительное целое число повторений инференса. Чтобы задать его без входов, передайте пустую строку, например: ./rknn_app_demo ./mobilenet_v2.rknn “” 100 .

При действительных входах все выходы сохраняются как FP32 NPY в data/outputs/runtime. Если в data/outputs/golden есть одноимённый эталон, программа также выводит косинусное сходство файлов.

Источник и редакционные примечания

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

Примечания: журналы с SDK 1.5.2 сохранены как исторические примеры, а не измерения V2.5.0. Ячейка Python для Ubuntu20.04 различается: китайский текст 3.8/3.9, английский 3.8/3.8; аналогично для Debian11; в разделе ARM64 Debian всё ещё помечен x64. Значения сохранены; проверяйте фактический установочный пакет. V2.5.0 добавляет главу C++ codegen и уточняет квантование и стратегии памяти; параметры старой версии не подменяют новый источник.

RKNN-Toolkit2 · ArmSoM documentation

Другие статьи по теме → · Учебные маршруты →