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