RK3588芯片NPU的使用:Windows11 Docker中运行MobileNet模型以及部署到开发板进行目标检测

本文的目标

本文将在RKNN Docker环境(见本系列的第二篇文章)中练习MobileNet图像分类示例,并通过adb工具部署到RK3588开发板。

MobileNet简介请参考上一篇文章。

开发环境说明

  • 主机系统:Windows11
  • 目标设备:搭载RK3588芯片的安卓开发板
  • 核心工具:包含rknn-toolkit2、rknn_model_zoo等工具的Docker镜像、ADB调试工具

启动RKNN Docker环境

bash 复制代码
# 使用 docker run 命令创建并运行 RKNN Toolkit2 容器
# 并通过附加 -v <host src folder>:<image dst folder> 参数,将本地文件映射进容器中
docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb -v D:\rknn\rknn_model_zoo-v2.3.0:/rknn_model_zoo rknn-toolkit2:2.3.0-cp38 /bin/bash

介绍一下mobilenet目录结构

Docker启动后,来到rknn_model_zoo中mobilenet的示例目录

bash 复制代码
cd /rknn_model_zoo/examples/mobilenet/

目录结构如下:

bash 复制代码
├── rknn_model_zoo/examples/mobilenet
│ ├── cpp # Cpp项目例子,部署会用到
│ ├── model # 模型目录
│ │ ├── bell.jpg # 例子中用到的待检测图片
│ │ ├── download_model.sh # 下载模型脚本
│ │ └── synset.txt #  ImageNet类别标签文件
│ └── python # Python工具链
|   └── mobilenet.py # 核心工具脚本

MobileNet 工具脚本说明

mobilenet.py 用于在 RKNN(Rockchip Neural Network)平台上部署 MobileNetV2 模型的工具脚本,支持模型转换、性能评估和推理测试。

整体流程


核心功能

1.模型下载与准备

自动下载 ONNX 模型 若检测到本地无模型文件(mobilenetv2-12.onnx),会从云端下载并显示实时进度条和下载速度。

python 复制代码
def check_and_download_origin_model():

2. RKNN 模型转换

配置预处理参数 标准化参数适配 ImageNet 数据集(均值/方差)。

python 复制代码
rknn.config(mean_values=[[...]], std_values=[[...]], target_platform=args.target)

模型加载与量化 支持 ONNX 模型转换,可选择 INT8/UINT8/FP32 量化。

python 复制代码
rknn.load_onnx(model=args.model, ...)
rknn.build(do_quantization=do_quant, ...)

3. 推理与评估

性能测试 支持耗时评估(--eval_perf)和内存占用分析(--eval_memory)。

python 复制代码
rknn.eval_perf()
rknn.eval_memory()

分类推理 输入图像预处理 → 推理 → 输出 Top-5 分类结果。

python 复制代码
outputs = rknn.inference(inputs=[img])
scores = softmax(outputs[0])

4. 跨平台支持

多设备兼容 通过 --target 参数指定 RKNPU 平台(如 rk3588、rk1808)。

python 复制代码
RKNPU1_TARGET = ['rk1808', 'rv1109', 'rv1126']

命令行参数说明

参数 默认值 可选值 说明
--target rk3566 rk3566/rk1808/rv1109/rv1126 指定NPU芯片型号,不同平台支持的量化类型不同
--dtype i8 i8(INT8)/fp32(浮点)/u8(UINT8) RKNPU2平台推荐使用i8,RKNPU1平台需用u8
--eval_perf False True/False 启用后会输出各层耗时分析报告
--accuracy_analysis False True/False 需要连接实机设备才能运行

使用示例

bash 复制代码
# 在RK3566平台上进行INT8量化性能测试
python mobilenet.py --target rk3566 --dtype i8 --eval_perf

使用mobilenet.py对模型进行转换并使用模拟器推理

bash 复制代码
rknn_model_zoo/examples/mobilenet/python
python mobilenet.py --model ../model/mobilenetv2-12.onnx --target rk3588

执行流程:参数解析 → 模型下载 → 跨平台构建 → 多模式推理 → 结果分析

执行流程图:

运行结果如下:

bash 复制代码
--> Download ../model/mobilenetv2-12.onnx
0.00%   [--------------------------------------------------] Speed: 0.00 KB/s
100.02% [##################################################] Speed: 61.72 KB/s
done
I rknn-toolkit2 version: 2.3.0
--> Config model
done
--> Loading model
W load_onnx: If you don't need to crop the model, don't set 'inputs'/'input_size_list'/'outputs'!
I Loading : 100%|██████████████████████████████████████████████| 177/177 [00:00<00:00, 51774.31it/s]
done
--> Building model
I OpFusing 0: 100%|█████████████████████████████████████████████| 100/100 [00:00<00:00, 5654.91it/s]
I OpFusing 2 : 100%|█████████████████████████████████████████████| 100/100 [00:00<00:00, 405.05it/s]
W build: found outlier value, this may affect quantization accuracy
                        const nameabs_mean    abs_std     outlier value
                        478      0.89        1.59        -15.073
                        550      0.61        0.68        11.299
                        577      0.64        0.65        -9.877
                        604      0.60        0.55        -9.970
I GraphPreparing : 100%|███████████████████████████████████████| 100/100 [00:00<00:00, 20185.30it/s]
I Quantizating : 100%|████████████████████████████████████████████| 100/100 [00:01<00:00, 90.17it/s]
W build: The default input dtype of 'input' is changed from 'float32' to 'int8' in rknn model for performance!
                       Please take care of this change when deploy rknn model with Runtime API!
W build: The default output dtype of 'output' is changed from 'float32' to 'int8' in rknn model for performance!
                      Please take care of this change when deploy rknn model with Runtime API!
I rknn building ...
I rknn building done.
done
--> Export rknn model
done
--> Init runtime environment
I Target is None, use simulator!
done
--> Running model
W inference: The 'data_format' is not set, and its default value is 'nhwc'!
I GraphPreparing : 100%|███████████████████████████████████████| 102/102 [00:00<00:00, 20605.87it/s]
I SessionPreparing : 100%|██████████████████████████████████████| 102/102 [00:00<00:00, 2492.67it/s]
--> PostProcess
-----TOP 5-----
[494] score=0.98 class="n03017168 chime, bell, gong"
[653] score=0.01 class="n03764736 milk can"
[469] score=0.00 class="n02939185 caldron, cauldron"
[505] score=0.00 class="n03063689 coffeepot"
[463] score=0.00 class="n02909870 bucket, pail"
done

使用mobilenet.py对模型进行连板运行

bash 复制代码
python mobilenet.py --target rk3588 --npu_device_test

C语言项目开发板端部署

编译

bash 复制代码
./build-android.sh -t rk3588 -a arm64-v8a -d mobilenet

运行结果:

bash 复制代码
./build-android.sh -t rk3588 -a arm64-v8a -d mobilenet
===================================
BUILD_DEMO_NAME=mobilenet
BUILD_DEMO_PATH=examples/mobilenet/cpp
TARGET_SOC=rk3588
TARGET_ARCH=arm64-v8a
BUILD_TYPE=Release
ENABLE_ASAN=OFF
DISABLE_RGA=
INSTALL_DIR=/rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_mobilenet_demo
BUILD_DIR=/rknn_model_zoo/build/build_rknn_mobilenet_demo_rk3588_android_arm64-v8a_Release
ANDROID_NDK_PATH=/rknn_model_zoo/android-ndk-r19c
===================================
-- Android: Targeting API '23' with architecture 'arm64', ABI 'arm64-v8a', and processor 'aarch64'
[100%] Built target imagedrawing
Install the project...
-- Install configuration: "Release"
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_mobilenet_demo/./rknn_mobilenet_demo
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_mobilenet_demo/model/bell.jpg
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_mobilenet_demo/model/synset.txt
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_mobilenet_demo/model/mobilenet_v2.rknn
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_mobilenet_demo/lib/librknnrt.so
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_mobilenet_demo/lib/librga.so

推送到开发板

bash 复制代码
# 切换到 root 用户权限
adb root

adb push install/rk3588_android_arm64-v8a/rknn_mobilenet_demo /data/rknn-test

开发板上运行demo

bash 复制代码
adb shell
# 进入开发板中rknn_yolov5_demo目录
cd /data/rknn-test/rknn_mobilenet_demo/
# 设置依赖库环境
export LD_LIBRARY_PATH=./lib
# 运行可执行文件
 ./rknn_mobilenet_demo model/mobilenet_v2.rknn model/bell.jpg

运行结果如下:

bash 复制代码
/rknn_mobilenet_demo model/mobilenet_v2.rknn model/bell.jpg                                                                                               <
num_lines=1001
model input num: 1, output num: 1
input tensors:
  index=0, name=input, n_dims=4, dims=[1, 224, 224, 3], n_elems=150528, size=150528, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=-14, scale=0.018658
output tensors:
  index=0, name=output, n_dims=2, dims=[1, 1000, 0, 0], n_elems=1000, size=1000, fmt=UNDEFINED, type=INT8, qnt_type=AFFINE, zp=-55, scale=0.141923
model is NHWC input fmt
model input height=224, width=224, channel=3
origin size=500x333 crop size=496x320
input image: 500 x 333, subsampling: 4:4:4, colorspace: YCbCr, orientation: 1
src width is not 4/16-aligned, convert image use cpu
finish
rknn_run
[494] score=0.990035 class=n03017168 chime, bell, gong
[469] score=0.003907 class=n02939185 caldron, cauldron
[653] score=0.001089 class=n03764736 milk can

小结

本文将mobilenet模型样例在安卓系统的RK3588开发板进行了模型转换和部署,距离端到端部署还差着最后一公里,敬请期待。

相关推荐
青州从事52118 小时前
20260108【mac】【brew】【docker】安装
macos·docker·eureka
Fortune_yangyang18 小时前
Kubernetes 操作管理
云原生·容器·kubernetes
逸俊晨晖19 小时前
昇腾算力卡310p编解码推理性能记录
目标检测·音视频·昇腾
逸俊晨晖19 小时前
昇腾算力卡 AICPU 自定义算子实现画框
目标检测·昇腾
菜鸟思维19 小时前
优化NextJs 项目的Docker 镜像 从3.62G 优化到 296.85M
docker
怣疯knight20 小时前
Docker Desktop 4.55.0版本安装成功教程
windows·docker
放寒假脚后跟v20 小时前
Pod 的 YAML 文件中 exitCode 字段的具体含义、不同取值代表的场景
运维·云原生·容器·kubernetes·k8s
东方佑20 小时前
使用Docker Compose一键部署OnlyOffice:完整指南与配置解析
运维·docker·容器
原神启动121 小时前
K8S(五)—— YAML文件解析
java·容器·kubernetes
lin张21 小时前
k8s(二)项目生命周期管理、发布策略与声明式资源管理
云原生·容器·kubernetes