Платформа и источник
Статья подготовлена по PDF производителя RKNN V2.5.0 и относится только к перечисленным в нём чипам и интерфейсам. Для платы ArmSoM сначала проверьте SoC, драйвер NPU, Toolkit/Runtime, SDK/BSP и версию ядра. Проверки на оборудовании ArmSoM не проводились; примеры и измерения оригинала не являются тестами ArmSoM.
Навигация по серии
- Среда и жизненный цикл объекта
- Конфигурация модели и параметры квантования
- Загрузка Caffe, TensorFlow, ONNX и PyTorch
- Построение, гибридное квантование и экспорт
- Среда выполнения, регистрация операторов и инференс
- Точность, производительность, память и запросы устройств
- Генерация, сборка и запуск примеров C++
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 и уточняет квантование и стратегии памяти; параметры старой версии не подменяют новый источник.
