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

发布于:2025-04-09 ⋅ 阅读:(49) ⋅ 点赞:(0)

本文的目标

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

开发环境说明

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

启动RKNN Docker环境

# 使用 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的示例目录

cd /rknn_model_zoo/examples/mobilenet/

目录结构如下:

├── 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),会从云端下载并显示实时进度条和下载速度。

def check_and_download_origin_model():

2. RKNN 模型转换

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

rknn.config(mean_values=[[...]], std_values=[[...]], target_platform=args.target)

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

rknn.load_onnx(model=args.model, ...)
rknn.build(do_quantization=do_quant, ...)

3. 推理与评估

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

rknn.eval_perf()
rknn.eval_memory()

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

outputs = rknn.inference(inputs=[img])
scores = softmax(outputs[0])

4. 跨平台支持

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

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 需要连接实机设备才能运行

使用示例

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

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

rknn_model_zoo/examples/mobilenet/python
python mobilenet.py --model ../model/mobilenetv2-12.onnx --target rk3588

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

--> 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对模型进行连板运行

python mobilenet.py --target rk3588 --npu_device_test

C语言项目开发板端部署

编译

./build-android.sh -t rk3588 -a arm64-v8a -d mobilenet

运行结果:

./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

推送到开发板

# 切换到 root 用户权限
adb root

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

开发板上运行demo

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

运行结果如下:

/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开发板进行了模型转换和部署,距离端到端部署还差着最后一公里,敬请期待。