
示例工程人工智能嵌入式边缘计算计算机视觉模型优化【免费下载链接】rknn_model_zoo项目地址https://gitcode.com/gh_mirrors/rk/rknn_model_zoo点击查看免费下载导读RKNN Model Zoo 的 C/C Demo 面向 RK 系列 NPU 开发板如 RK3562、RK3566、RK3568、RK3576、RK3588、RK1808、RV1109/RV1126、RV1103/RV1106 等运行这些设备多采用 ARM 架构无法直接执行在 x86 Linux 主机上编译出的二进制。因此在本地主机上编写完代码后需要借助 Android NDK 或 GNU 交叉编译工具链将examples目录下的各模型 Demo 交叉编译为可在目标板端运行的 ARM 程序。本文基于仓库中的 Compilation_Environment_Setup_Guide_CN.md 交叉编译环境搭建指南结合 build-linux.sh 与 build-android.sh 两个构建脚本的源码实现系统讲解 Android 与 Linux 两条编译路线的完整操作流程、工具链选型依据、参数语义与常见排错方法。读完本文你将能够在自己的 x86 Linux 主机上按目标平台与架构一键编译出任一模型 Demo 的板端可执行程序。一、为什么需要交叉编译环境RKNN Model Zoo 的例程包含两套使用方式Python API 推理在 x86 主机上借助 RKNN-Toolkit2 完成模型转换导出.rknn文件并可连板推理或模拟推理C/C APICAPI推理基于 3rdparty 与 utils 提供的图像、音频、文件处理工具库调用 librknnrt / librknn_runtime 在板端执行推理。C/C Demo 的典型源码布局为examples/模型名/cpp/main.cc加上rknpu1/、rknpu2/目录下的平台实现文件例如 examples/mobilenet/cpp/CMakeLists.txt 会根据TARGET_SOC选择rknpu2/mobilenet.ccRK356x/RK3588/RV1126B 等或rknpu1/mobilenet.ccRK1808/RV1109/RV1126编译。由于这些 Demo 最终要在 ARM 架构的板端运行且仓库默认使用 Android NDKr18/r19与特定的 GNU 交叉编译器版本验证在 x86 Linux 主机上必须先搭建好对应的交叉编译环境才能完成examples下 C/C Demo 的编译。这也是本文关联文档开篇即强调的前提。关联文档完整内容位于 docs/Compilation_Environment_Setup_Guide_CN.md环境依赖的总体说明可参考 README_CN.md 的「依赖库安装」与「环境依赖」章节。二、工具链版本选型重要前提在动手搭建环境之前需要先明确一个结论编译工具链的版本选择直接影响 C/C Demo 能否编译成功。仓库文档明确给出了建议版本目标系统建议工具链说明AndroidAndroid NDKr18 或 r19使用其他版本可能遇到 C Demo 编译失败问题Linuxaarch64gcc-linaro-6.3.1-2017.05面向 RK3588、RK356x、RK1808 等 64 位平台Linuxarmhfgcc-arm-8.3-2019.03arm-linux-gnueabihf面向 RV1109、RV1126 等 32 位平台Linuxarmhf-uclibcgnueabihfarm-rockchip830 系列 uClibc 工具链专门用于 RV1103 / RV1106 系列对应地build-android.sh 在启动时会解析 NDK 的source.properties并校验主版本号只有主版本为 18 或 19或无法读取到版本号时才继续执行否则会直接提示NDK Version ... is not recommanded. Please use 18 or 19并退出build-linux.sh 则会在找不到GCC_COMPILER时给出当前平台建议的工具链示例路径。可见工具链版本是构建脚本主动强制的约束而非可选建议。此外Demo 依赖 RKNN-Toolkit2 完成模型转换Python 侧编译安卓 Demo 需要安卓编译工具链编译 Linux Demo 需要 Linux 交叉编译工具链。若出现「编译阶段报错」或「运行时提示找不到某些依赖库」通常的根因就是交叉编译器与仓库默认版本不一致详见 FAQ_CN.md 1.12 节处理方式是换用对应编译器并删除旧的 build 目录后重新编译。三、Android 平台编译 C/C Demo当目标设备运行 Android 系统时使用仓库根目录下的build-android.sh脚本编译具体模型的 C/C Demo。编译前必须先通过环境变量ANDROID_NDK_PATH指定 Android NDK 的路径。3.1 下载并解压 Android NDK如果系统中已经装有 Android NDK建议 r19c 版本可直接跳过此步骤。否则按关联文档中给出的 NDK 官方下载地址获取android-ndk-r19c-linux-x86_64.zip各版本下载入口以文档原文为准解压缩下载好的 Android NDK 压缩包并记住解压后的绝对路径后续编译 C/C Demo 时会用到该路径。注意上述 NDK 解压后的目录名为android-ndk-r19c。以放在用户目录下为例解压后路径形如~/opt/android-ndk-r19c。3.2 设置环境变量并编译export ANDROID_NDK_PATHandroid_ndk_path ./build-android.sh -t TARGET_PLATFORM -a ARCH -d model_name # for RK3588: ./build-android.sh -t rk3588 -a arm64-v8a -d mobilenet # for RK3566: ./build-android.sh -t rk3566 -a arm64-v8a -d mobilenet # for RK3568: ./build-android.sh -t rk3568 -a arm64-v8a -d mobilenet参数说明android_ndk_path指定 Android NDK 路径例如~/opt/android-ndk-r19cTARGET_PLATFORM指定目标平台例如rk3566、rk3568、rk3588。注意RK1808、RV1109、RV1126、RV1103、RV1106不支持 Android 平台这些平台请走本文第四节的 Linux 编译路线ARCH指定系统架构。可以在目标设备上执行如下命令查询系统架构# Query architecture. For Android, [arm64-v8a or armeabi-v7a] should shown in log. adb shell cat /proc/versionmodel_name模型名即 examples 目录下各个模型所在的文件夹名例如mobilenet、yolov5、yolov8等。3.3 脚本内部做了什么从源码看build-android.sh 的执行流程可以概括为参数解析通过getopts解析-t/-a/-d/-b/-m/-r/-j等选项若缺少-t、-a、-d中的任一参数会打印完整用法并退出build-android.shNDK 版本校验读取$ANDROID_NDK_PATH/source.properties中的主版本号非 18/19 时拒绝编译build-android.sh平台归一化rk3566、rk3568、rk3562会被归一化为rk356x非法目标平台直接报错退出build-android.sh定位 Demo 源码在examples下查找名为model_name且含cpp子目录的目录找不到时会列出所有可用 Demo 名称build-android.sh调用 CMake 构建以-DCMAKE_SYSTEM_NAMEAndroid、-DCMAKE_SYSTEM_VERSION23、-DCMAKE_ANDROID_ARCH_ABI${TARGET_ARCH}、-DCMAKE_ANDROID_STL_TYPEc_static、-DCMAKE_ANDROID_NDK${ANDROID_NDK_PATH}等参数执行 cmake随后make -j4与make installbuild-android.sh产物校验检查安装目录的model/下是否存在.rknn模型文件若缺失会给出醒目的红色提示build-android.sh。构建产物输出到install/TARGET_SOC_android_ARCH/rknn_model_name_demo/目录中间构建文件位于build/build_rknn_model_name_demo_TARGET_PLATFORM_BUILD_TYPE/。四、Linux 平台编译 C/C Demo当目标设备是 Linux 系统时使用仓库根目录下的build-linux.sh脚本编译具体模型的 C/C Demo。编译前必须先通过环境变量GCC_COMPILER指定交叉编译工具的路径。4.1 下载交叉编译工具如果系统中已经装有对应的交叉编译工具可跳过此步骤。否则需要根据目标平台的系统架构选择对应的工具链关联文档中给出了各工具链的官方下载地址RV1103/RV1106 使用的 uClibc 工具链则通过文档中标注提取码的网盘获取架构适用平台建议工具链aarch64RK3588、RK356x、RK1808 等gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.xzarmhfRV1109、RV1126 等gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xzarmhf-uclibcgnueabihfRV1103、RV1106arm-rockchip830-linux-uclibcgnueabihf 工具链解压缩下载好的交叉编译工具并记住解压后的具体路径后面编译时会用到该路径。4.2 设置环境变量并编译# go to the rknn_model_zoo root directory cd rknn_model_zoo_root_path # if GCC_COMPILER not found while building, please set GCC_COMPILER path export GCC_COMPILERGCC_COMPILER_PATH ./build-linux.sh -t TARGET_PLATFORM -a ARCH -d model_name # for RK3588 ./build-linux.sh -t rk3588 -a aarch64 -d mobilenet # for RK3566 ./build-linux.sh -t rk3566 -a aarch64 -d mobilenet # for RK3568 ./build-linux.sh -t rk3568 -a aarch64 -d mobilenet # for RK1808 ./build-linux.sh -t rk1808 -a aarch64 -d mobilenet # for RV1109 ./build-linux.sh -t rv1109 -a armhf -d mobilenet # for RV1126 ./build-linux.sh -t rv1126 -a armhf -d mobilenet # for RV1103 ./build-linux.sh -t rv1103 -a armhf -d mobilenet # for RV1106 ./build-linux.sh -t rv1106 -a armhf -d mobilenet参数说明GCC_COMPILER_PATH指定交叉编译工具的前缀路径不含-gcc后缀。不同系统架构所用的交叉编译工具并不相同示例aarch64~/tools/cross_compiler/arm/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnuarmhf~/tools/cross_compiler/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihfarmhf-uclibcgnueabihfRV1103/RV1106~/tools/cross_compiler/arm/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihfTARGET_PLATFORM指定目标平台例如rk3588。注意每个模型当前支持的目标平台可能有所不同请参考具体模型目录下的README.md文档例如examples/yolov5/README.md、examples/mobilenet/README.md等ARCH指定系统架构。可以在目标设备上执行如下命令查询系统架构# Query architecture. For Linux, [aarch64 or armhf] should shown in log. adb shell cat /proc/versionmodel_name模型名即 examples 目录下各个模型所在的文件夹名。4.3 脚本内部做了什么build-linux.sh 的执行流程与 Android 版类似但有几个值得注意的实现细节GCC_COMPILER 的默认值逻辑如果环境变量GCC_COMPILER未设置脚本会按目标平台推断默认编译器——rv1106/rv1103直接提示必须显式设置并给出示例路径rv1109/rv1126默认使用arm-linux-gnueabihf其余平台默认使用aarch64-linux-gnubuild-linux.sh编译器存在性检查脚本用${GCC_COMPILER}-gcc与${GCC_COMPILER}-g作为CC/CXX并command -v检查若命令不可用会给出设置建议并退出build-linux.sh平台归一化rk3562/rk3566/rk3568→rk356xrv1103→rv1106同时校验合法目标集合rk3562, rk3566, rk3568, rk3588, rk3576, rv1106, rv1103, rk1808, rv1109, rv1126, rv1126bbuild-linux.shCMake 构建以-DTARGET_SOC${TARGET_SOC}、-DCMAKE_SYSTEM_NAMELinux、-DCMAKE_SYSTEM_PROCESSOR${TARGET_ARCH}等参数执行 cmake随后make -j4与make installbuild-linux.sh。这里特别说明一下-t的传参约定传入rk3562、rk3566、rk3568都会被归一化为rk356xrv1103、rv1106归一化为rv1106而rv1126bRV1126B与rv1126代表 RV1109/RV1126是两个不同的目标编译时必须按实际芯片区分。五、进阶编译选项与常见问题5.1 编译类型与内存检查-b / -m两个构建脚本均支持以下公共选项-b build_type指定构建类型可选Debug或Release默认Release-m启用 Address SanitizerASan做内存检查需要配合-b Debug使用。从源码看build-linux.sh 会在-m传入时把ENABLE_ASAN置为ON并将开关透传给 cmake在 Demo 的 CMakeLists 中如 examples/mobilenet/cpp/CMakeLists.txtENABLE_ASAN为真时会为 Debug 构建追加-fno-omit-frame-pointer -fsanitizeaddress编译与链接选项从而在板端运行时捕获内存越界、泄漏等问题。5.2 禁用 RGA-r-r用于禁用 RGARockchip 2D 图形加速硬件改由 CPU 完成图像缩放等操作。在 utils/CMakeLists.txt 中可以看到当DISABLE_RGA开启且目标平台不是rv1106/rv1103/rv1103b时会定义-DDISABLE_RGA宏imageutils将不再链接 RGA 库当目标平台为rv1106或rk3588时会额外定义-DLIBRGA_IM2D_HANDLE因为这两个平台上的 RGA 支持 im2d handle 接口。注意-r选项对rv1103/rv1103b/rv1106平台无效这三个平台本身强制走 CPU 缩放路径。5.3 禁用 libjpeg-j-j用于禁用 3rdparty/jpeg_turbo 库以避免其与 OpenCV 内置的 JPEG 库发生符号冲突。这正是 FAQ_CN.md 中「在 opencv 和 jpeg 库共用时会出现 Segmentation fault 报错」的标准解法之一若只想用 OpenCV 读取或保存 JPG 图片可在build-linux.sh或build-android.sh时加-j参数关闭 jpeg_turbo另一种做法是自行编译一个不带 JPEG 库的 OpenCV。在 utils/CMakeLists.txt 中DISABLE_LIBJPEG会定义-DDISABLE_LIBJPEG宏并使imageutils不再链接${LIBJPEG}。5.4 常见编译问题速查现象原因与处理编译阶段报错或运行时提示找不到某些依赖库交叉编译器与仓库默认版本不一致。按 Compilation_Environment_Setup_Guide_CN.md 换用对应版本工具链并删除旧的build目录后重新编译FAQ_CN.md构建结束提示 The RKNN model can not be found in .../model编译成功但安装目录缺少.rknn模型文件需先按模型目录文档将模型下载/转换到examples/model/model/下NDK 版本被脚本拒绝使用非 r18/r19 的 NDK请更换版本-t传入非法目标脚本会列出合法目标集合Linux 为rk3562,rk3566,rk3568,rk3588,rk3576,rv1106,rv1103,rk1808,rv1109,rv1126,rv1126bAndroid 仅支持rk3562,rk3566,rk3568,rk3588,rk3576找不到-d指定的 Demo 名model_name必须是 examples 下含cpp子目录的模型文件夹名脚本会打印全部可用 Demo 列表六、编译产物、部署与进一步阅读6.1 产物位置与部署前提两个脚本均将最终产物安装到install/目录下Linux 为install/TARGET_SOC_linux_ARCH/rknn_model_name_demo/Android 为install/TARGET_SOC_android_ARCH/rknn_model_name_demo/其中包含板端可执行程序如rknn_mobilenet_demomodel/目录下的.rknn模型文件与配套资源图片、标签文件等程序通过$ORIGIN/../lib运行时路径set(CMAKE_INSTALL_RPATH $ORIGIN/../lib)查找板端 runtime 动态库部署时需把仓库 3rdparty/rknpu2RKNPU2 平台对应librknnrt.so或 3rdparty/rknpu1RKNPU1 平台对应librknn_runtime.so中的对应架构.so一并拷贝到设备的 lib 目录。将install/下的整个 Demo 目录 push 到开发板adb push或 scp 等即可运行板端运行前建议先确认 NPU 驱动与 runtime 版本满足 README_CN.md「环境依赖」章节的 SDK 版本要求。6.2 模型下载与平台支持确认各模型 Demo 的模型下载脚本位于examples/模型名/model/download_model.sh模型也可从 README 中标注的网盘提取码 rknn获取同一模型在不同平台上的支持情况以examples/模型名/README.md为准涉及性能对比时README 中的 FPS 数据基于各平台最大 NPU 频率测试且只统计rknn.run推理耗时不含前后处理如需复现参考性能可结合 scaling_frequency.sh 将板子定频到最高频率详见 FAQ_CN.md 1.5 节。6.3 进一步阅读环境依赖总览与 Demo 编译命令速查README_CN.md本文对应的原始指南文档Compilation_Environment_Setup_Guide_CN.md常见问题工具链、RGA、YOLO 后处理、量化精度等FAQ_CN.md构建脚本源码build-linux.sh、build-android.sh通用工具库的构建逻辑RGA / libjpeg / libsndfile 开关utils/CMakeLists.txt一个典型 Demo 的编译目标与平台分支示例examples/mobilenet/cpp/CMakeLists.txt结语交叉编译环境的搭建是 RKNN Model Zoo C/C Demo 部署流程的第一步也是最容易因工具链版本不匹配而踩坑的一步。记住三条核心经验即可Android 使用 r18/r19 的 NDK 并通过ANDROID_NDK_PATH指定Linux 按架构选择仓库建议的交叉编译器并通过GCC_COMPILER指定一旦更换工具链或排查编译异常先删除旧的build目录再重新构建。结合本文对build-linux.sh与build-android.sh源码级行为的剖析你可以准确预判构建脚本的每一步行为从而在任何目标平台RK356x、RK3588、RK3576、RK1808、RV1109/RV1126、RV1103/RV1106、RV1126B上顺利编译出可运行的板端 Demo。赞分享示例工程人工智能嵌入式边缘计算计算机视觉模型优化【免费下载链接】rknn_model_zoo项目地址https://gitcode.com/gh_mirrors/rk/rknn_model_zoo点击查看免费下载相关推荐rknn_model_zoo 交叉编译环境搭建指南在 x86 Linux 上编译 Android / Linux 平台的 C/C Demorknn_model_zoo 交叉编译环境搭建指南在 x86 Linux 上编译 Android / Linux 平台的 C/C Demo 本指南以 rk示例工程人工智能嵌入式边缘计算计算机视觉模型优化终极指南在x86主机搭建Amlogic-S9xxx-Armbian交叉编译环境终极指南在x86主机搭建Amlogic S9xxx Armbian交叉编译环境 想要为Amlogic、Rockchip和Allwinner盒子构建功能强大的A嵌入式开发工具构建工具操作系统ESP32-S3多SPI设备并发访问终极指南从冲突到高效协同的完整解决方案ESP32 S3多SPI设备并发访问终极指南从冲突到高效协同的完整解决方案 技术摘要 在ESP32 S3物联网开发中多SPI设备并发访问是开发者面临的核心嵌入式物联网驱动开发上一篇5个btop系统监控技巧从零开始掌握终极终端资源监控工具下一篇发现社交图像的新视界Facebook计算机视觉标签Chrome扩展应用评测创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考