当前位置: 首页 > news >正文

RK3588芯片NPU的使用:Windows11 Docker中运行PPOCRv4例子

本文的目标

本文将在RKNN Docker环境中练习PPOCR示例,并通过adb工具部署到RK3588开发板。

开发环境说明

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

PPOCR目录结构说明

PPOCR样例的目录在rknn_model_zoo\examples\PPOCR,里面有三个子目录,分别描述如下:

1. PPOCR-Det

核心功能

实现文字区域检测,基于DB++(Dynamic Binarization++)算法改进,支持多尺度特征融合和自适应阈值预测。

技术特性

  • 输入图像尺寸自适应
    通过det_limit_side_len参数控制最大边长为960像素,det_limit_type选择"max"模式进行动态缩放
  • 后处理优化
    包含可微分二值化、Vatti Clipping多边形扩展(det_db_unclip_ratio=1.5)等模块
  • 多算法扩展
    支持EAST、SAST等检测模型的后处理参数配置

2. PPOCR-Rec

核心功能

实现文字内容识别,采用SVTR(Scene Text Recognition with Transformer)架构,支持多语言识别。

技术特性

  • 输入规范
    图像统一缩放至3,48,320尺寸,通过rec_char_dict_path加载包含6625个字符的字典文件
  • 动态序列建模
    使用Transformer编码器处理变长文本,支持CRNN、ABINet等算法的混合训练策略
  • 量化优化
    提供INT8量化配置方案,模型体积从11.9MB压缩至3.8MB

3. PPOCR-System

核心功能

端到端OCR流水线系统,整合检测、方向分类、识别三阶段模型。

工作流程

在这里插入图片描述

启动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

先跑PPOCR-Det例子

下载ppocrv4_det.onnx

cd /rknn_model_zoo/examples/PPOCR/PPOCR-Det/model
./download_model.sh

执行结果:

Length: 4771801 (4.5M) [application/octet-stream]
Saving to: './ppocrv4_det.onnx'

./ppocrv4_det.onnx                     100%[============================================================================>]   4.55M  1.36MB/s    in 3.3s

2025-04-09 08:43:41 (1.36 MB/s) - './ppocrv4_det.onnx' saved [4771801/4771801]

将onnx转为RKNN格式

cd ../python
# python convert.py <onnx_model> <TARGET_PLATFORM> <dtype(optional)> <output_rknn_path(optional)>
python convert.py ../model/ppocrv4_det.onnx rk3588

运行结果:

I rknn-toolkit2 version: 2.3.0
--> Config model
done
--> Loading model
done
--> Building model
I Loading : 100%|█████████████████████████████████████████████| 342/342 [00:00<00:00, 119289.14it/s]
I OpFusing 0: 100%|██████████████████████████████████████████████| 100/100 [00:00<00:00, 706.50it/s]
I OpFusing 1 : 100%|█████████████████████████████████████████████| 100/100 [00:00<00:00, 340.48it/s]
I OpFusing 0 : 100%|█████████████████████████████████████████████| 100/100 [00:00<00:00, 263.83it/s]
I OpFusing 1 : 100%|█████████████████████████████████████████████| 100/100 [00:00<00:00, 250.24it/s]
I OpFusing 2 : 100%|█████████████████████████████████████████████| 100/100 [00:00<00:00, 167.88it/s]
I GraphPreparing : 100%|███████████████████████████████████████| 214/214 [00:00<00:00, 21065.53it/s]
I Quantizating : 100%|████████████████████████████████████████████| 214/214 [00:02<00:00, 72.65it/s]
I rknn building ...
I rknn building done.
done

# ls ../model/
download_model.sh  ppocrv4_det.onnx  ppocrv4_det.rknn  test.jpg

运行安卓系统C++例子

1. 编译

# go back to the rknn_model_zoo root directory
cd ../../
./build-android.sh -t rk3588 -a arm64-v8a -d PPOCR-Det

毫无悬念的编译成功。

./build-android.sh -t rk3588 -a arm64-v8a -d PPOCR-Det
===================================
BUILD_DEMO_NAME=PPOCR-Det
BUILD_DEMO_PATH=examples/PPOCR/PPOCR-Det/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_PPOCR-Det_demo
BUILD_DIR=/rknn_model_zoo/build/build_rknn_PPOCR-Det_demo_rk3588_android_arm64-v8a_Release
ANDROID_NDK_PATH=/rknn_model_zoo/android-ndk-r19c
===================================
Install the project...
-- Install configuration: "Release"
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_PPOCR-Det_demo/./rknn_ppocr_det_demo
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_PPOCR-Det_demo/model/test.jpg
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_PPOCR-Det_demo/model/ppocrv4_det.rknn
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_PPOCR-Det_demo/lib/librknnrt.so
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_PPOCR-Det_demo/lib/librga.so

2.推送到开发板

# 切换到 root 用户权限
adb root
adb remount
adb push install/rk3588_android_arm64-v8a/rknn_PPOCR-Det_demo /data/rknn-test

3.开发板上运行demo

adb shell
# 进入开发板中rknn_yolov5_demo目录
cd /data/rknn-test/rknn_PPOCR-Det_demo/
# 设置依赖库环境
export LD_LIBRARY_PATH=./lib
# 运行可执行文件
./rknn_ppocr_det_demo model/ppocrv4_det.rknn model/test.jpg

运行结果如下:

rk3588_s:/data/rknn-test/rknn_PPOCR-Det_demo # chmod +x rknn_ppocr_det_demo
/rknn_ppocr_det_demo model/ppocrv4_det.rknn model/test.jpg                                                                                                <
model input num: 1, output num: 1
input tensors:
  index=0, name=x, n_dims=4, dims=[1, 480, 480, 3], n_elems=691200, size=691200, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=-14, scale=0.018658
output tensors:
  index=0, name=sigmoid_0.tmp_0, n_dims=4, dims=[1, 1, 480, 480], n_elems=230400, size=230400, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
model is NHWC input fmt
model input height=480, width=480, channel=3
origin size=500x500 crop size=496x496
input image: 500 x 500, subsampling: 4:4:4, colorspace: YCbCr, orientation: 1
src width is not 4/16-aligned, convert image use cpu
finish
rknn_run
DRAWING OBJECT
[0]: [(27, 459), (136, 459), (136, 478), (27, 478)] 0.990703
[1]: [(27, 428), (371, 428), (371, 446), (27, 446)] 0.865059
[2]: [(25, 397), (361, 395), (362, 413), (26, 415)] 0.947026
[3]: [(367, 368), (474, 366), (476, 386), (368, 388)] 0.988166
[4]: [(27, 363), (282, 365), (281, 384), (26, 382)] 0.952994
[5]: [(25, 334), (342, 334), (342, 352), (25, 352)] 0.955286
[6]: [(26, 303), (252, 303), (252, 320), (26, 320)] 0.977311
[7]: [(25, 270), (180, 270), (180, 289), (25, 289)] 0.995351
[8]: [(25, 240), (241, 240), (241, 259), (25, 259)] 0.987780
[9]: [(413, 233), (429, 233), (429, 305), (413, 305)] 0.977658
[10]: [(26, 209), (234, 209), (234, 227), (26, 227)] 0.999072
[11]: [(25, 179), (298, 177), (300, 194), (26, 195)] 0.991600
[12]: [(28, 142), (281, 144), (280, 163), (27, 161)] 0.963910
[13]: [(27, 111), (332, 113), (331, 134), (26, 133)] 0.929749
[14]: [(26, 82), (171, 82), (171, 104), (26, 104)] 0.997311
[15]: [(28, 37), (302, 39), (301, 70), (27, 69)] 0.961222
    SAVE TO ./out.jpg
write_image path: ./out.jpg width=500 height=500 channel=3 data=0xb4000079e8295e50

先跑PPOCR-Rec例子

下载onnx模型

cd /rknn_model_zoo/examples/PPOCR/PPOCR-Rec/model
./download_model.sh


Saving to: 'ppocrv4_rec.onnx'

ppocrv4_rec.onnx                       100%[============================================================================>]  10.36M  2.52MB/s    in 6.2s

2025-04-09 09:12:14 (1.67 MB/s) - 'ppocrv4_rec.onnx' saved [10862445/10862445]

转为rknn格式

cd ../python
python convert.py ../model/ppocrv4_rec.onnx rk3588
# output model will be saved as ../model/ppocrv4_rec.rknn

运行C++Demo(安卓开发板)

1.编译

# go back to the rknn_model_zoo root directory
cd ../../
./build-android.sh -t rk3588 -a arm64-v8a -d PPOCR-Rec

毫无疑问的编译成功。

2.推送到开发板

adb root
adb remount
adb push .\install\rk3588_android_arm64-v8a\rknn_PPOCR-Rec_demo\ /data/rknn-test

3.开发板上运行

adb shell
cd /data/rknn-test/rknn_PPOCR-Rec_demo
export LD_LIBRARY_PATH=./lib
./rknn_ppocr_rec_demo model/ppocrv4_rec.rknn model/test.png

运行结果:

model input num: 1, output num: 1
input tensors:
  index=0, name=x, n_dims=4, dims=[1, 48, 320, 3], n_elems=46080, size=92160, fmt=NHWC, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000
output tensors:
  index=0, name=softmax_11.tmp_0, n_dims=3, dims=[1, 40, 6625, 0], n_elems=265000, size=530000, fmt=UNDEFINED, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000
model is NHWC input fmt
model input height=48, width=320, channel=3
rknn_run
regconize result: JOINT, score=0.994140

最后跑PPOCR-System例子

上述已经将检测和识别两个onnx模型下载并转换为rknn格式,下面就将整个流程串联起来吧。

1.编译

# go back to the rknn_model_zoo root directory
cd ../../
./build-android.sh -t rk3588 -a arm64-v8a -d PPOCR-System

编译结果:

Install the project...
-- Install configuration: "Release"
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_PPOCR-System_demo/./rknn_ppocr_system_demo
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_PPOCR-System_demo/model/test.jpg
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_PPOCR-System_demo/model/ppocrv4_det.rknn
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_PPOCR-System_demo/model/ppocrv4_rec.rknn
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_PPOCR-System_demo/lib/librknnrt.so
-- Installing: /rknn_model_zoo/install/rk3588_android_arm64-v8a/rknn_PPOCR-System_demo/lib/librga.so

2.推送到开发板

adb root
adb remount
adb push .\install\rk3588_android_arm64-v8a\rknn_PPOCR-System_demo\ /data/rknn-test

3.开发板上运行

adb shell
cd /data/rknn-test/rknn_PPOCR-System_demo
export LD_LIBRARY_PATH=./lib
chmod +x rknn_ppocr_system_demo
./rknn_ppocr_system_demo model/ppocrv4_det.rknn model/ppocrv4_rec.rknn   model/test.jpg

注意:模型的先后顺序一定要按照上面的放置。
结果:

DRAWING OBJECT
[0] @ [(28, 37), (302, 39), (301, 70), (27, 69)]
regconize result: 纯臻营养护发素, score=0.997977
[1] @ [(26, 82), (171, 82), (171, 104), (26, 104)]
regconize result: 产品信息/参数, score=0.994559
[2] @ [(27, 111), (332, 113), (331, 134), (26, 133)]
regconize result: (45元/每公斤,100公斤起订), score=0.971967
[3] @ [(28, 142), (281, 144), (280, 163), (27, 161)]
regconize result: 每瓶22元,1000瓶起订), score=0.981864
[4] @ [(25, 179), (298, 177), (300, 194), (26, 195)]
regconize result: 【品牌】:代加工方式/OEMODM, score=0.986213
[5] @ [(26, 209), (234, 209), (234, 227), (26, 227)]
regconize result: 【品名】:纯臻营养护发素, score=0.996297
[6] @ [(25, 240), (241, 240), (241, 259), (25, 259)]
regconize result: 【产品编号】:YM-X-3011, score=0.985657
[7] @ [(413, 233), (429, 233), (429, 305), (413, 305)]
regconize result: ODMOEM, score=0.992676
[8] @ [(25, 270), (180, 270), (180, 289), (25, 289)]
regconize result: 【净含量】:220ml, score=0.992010
[9] @ [(26, 303), (252, 303), (252, 320), (26, 320)]
regconize result: 【适用人群】:适合所有肤质, score=0.995155
[10] @ [(25, 334), (342, 334), (342, 352), (25, 352)]
regconize result: 【主要成分】:鲸蜡硬脂醇、燕麦β-葡聚, score=0.969624
[11] @ [(27, 363), (282, 365), (281, 384), (26, 382)]
regconize result: 糖、椰油酰胺丙基甜菜碱、泛酸, score=0.925781
[12] @ [(367, 368), (474, 366), (476, 386), (368, 388)]
regconize result: (成品包材), score=0.986409
[13] @ [(25, 397), (361, 395), (362, 413), (26, 415)]
regconize result: 【主要功能】:可紧致头发磷层,从而达到, score=0.995605
[14] @ [(27, 428), (371, 428), (371, 446), (27, 446)]
regconize result: 即时持久改善头发光泽的效果,给干燥的头, score=0.997995
[15] @ [(27, 459), (136, 459), (136, 478), (27, 478)]
regconize result: 发足够的滋养, score=0.998616
    SAVE TO ./out.jpg
write_image path: ./out.jpg width=500 height=500 channel=3 data=0xb400007c6db69e50

相关文章:

  • 人工智能100问☞第1问:人工智能(AI)的定义是什么?
  • [D1,2]回溯刷题
  • python面试技巧
  • Android 应用蓝牙连接通信实现
  • 巧*书重大更新!商务标智能编写,标书一次成型!
  • 函数式编程在 Java:Function、BiFunction、UnaryOperator 你真的会用?
  • 研发效能实践:BDD(行为驱动开发)深度解毒手册:从「撕逼大会」到「人见人爱」的协作秘笈
  • chrome提示https不安全, 不能记住账号密码怎么办? 可以利用js输入账号
  • SQL:DML的基本语法
  • android wifi通过命令行打开2.4G热点
  • 网络安全·第二天·ARP协议安全分析
  • 从代码学习深度学习 - 注意力汇聚:注意力评分函数(加性和点积注意力) PyTorch 版
  • SQL问题分析与诊断(8)——其他工具和技术
  • ECMAScript 7~10 新特性
  • RLAgent note
  • 数据结构与算法-动态规划-线性动态规划,0-1背包,多重背包,完全背包,有依赖的背包,分组背包,背包计数,背包路径
  • 取消echarts地图悬浮时默认黄色高亮
  • Sigma-Delta ADC调制器的拓扑结构分类
  • java中的JNI调用c库
  • 若依微服务集成Flowable仿钉钉工作流
  • wordpress显示不出来/信息如何优化上百度首页公司
  • 台州超值营销型网站建设地址/国家卫健委:不再发布每日疫情信息
  • 仿皮皮淘网站开发全程培训/百度一下app下载安装
  • 上海网站设计工具/百度竞价是什么
  • 南山做网站多少钱/推广网站推广
  • 地图截选做分析图的网站/互联网营销工具