简介:本文详细介绍PaddleOCR v4模型转换为RKNN格式并部署到瑞芯微(Rockchip)NPU的完整流程,涵盖模型选择、转换配置、硬件适配及性能优化等关键环节,助力开发者实现高效边缘端OCR部署。
PaddleOCR v4作为百度开源的OCR工具库,在检测、识别和方向分类任务中支持多语言、多模型架构(如PP-OCRv4、SVTR等),其轻量化设计(最小模型仅3.5M)使其成为边缘设备部署的理想选择。RKNN(Rockchip Neural Network)是瑞芯微推出的跨平台NPU模型格式,通过模型量化、算子融合等技术,可将计算密集型任务卸载至NPU加速,典型场景下推理速度可提升3-5倍,同时降低功耗。部署PaddleOCR到RKNN的核心价值在于:在低成本硬件上实现实时OCR识别,适用于工业检测、智能零售、车载HUD等边缘场景。
# 安装RKNN Toolkit 2(以pip为例)pip install rknn-toolkit2 -i https://pypi.tuna.tsinghua.edu.cn/simple# 验证安装rknn --version
使用PaddleOCR的tools/export_model.py将训练好的模型导出为inference格式:
python tools/export_model.py \-c configs/rec/rec_icdar15_train.yml \-o Global.pretrained_model=./output/rec_CRNN/best_accuracy \Global.save_inference_dir=./inference_model/rec_CRNN
输出文件包括:model.pdmodel(模型结构)、model.pdiparams(参数)、model.pdiparams.info(元数据)。
from rknn.api import RKNNrknn = RKNN()ret = rknn.load_paddle(model_path='./inference_model/rec_CRNN/model.pdmodel',params_path='./inference_model/rec_CRNN/model.pdiparams')# 配置目标平台(以RK3588为例)ret = rknn.config(target_platform='rk3588',mean_values=[[127.5, 127.5, 127.5]],std_values=[[127.5, 127.5, 127.5]],quantized_dtype='asymmetric_affine-u8') # 8位量化# 编译模型ret = rknn.build(do_quantization=True) # 启用量化ret = rknn.export_rknn('./output/rec_CRNN.rknn')rknn.release()
asymmetric_affine-u8:非对称量化,精度损失较小,适合大多数场景。symmetric_affine-u8:对称量化,硬件支持更友好,但可能损失精度。rknn.get_available_devices()检查目标平台支持的算子,若存在不支持的算子(如某些自定义OP),需手动替换或实现。Conv2D+ReLU6替代Conv2D+HardSwish)。quantized_dynamic_range调试模式,对比FP32与INT8的输出差异。
#include "rknn_api.h"rknn_context ctx = NULL;int ret = rknn_init(&ctx, "./rec_CRNN.rknn", 0, 0);if (ret < 0) {printf("rknn_init fail! ret=%d\n", ret);return -1;}// 输入数据(需与模型预处理一致)rknn_input inputs[1];inputs[0].index = 0;inputs[0].type = RKNN_TENSOR_UINT8;inputs[0].size = 3 * 32 * 100; // 假设输入为3x32x100的RGB图像inputs[0].buf = input_data;ret = rknn_inputs_set(ctx, 1, inputs);ret = rknn_run(ctx);// 获取输出rknn_output outputs[1];ret = rknn_outputs_get(ctx, 1, outputs, NULL);float* output_data = (float*)outputs[0].buf;
rknn_set_input_output_memory复用输入/输出缓冲区,减少内存拷贝。dynamic_range,支持变长输入(需硬件支持)。以PP-OCRv4-det模型为例:
python tools/export_model.py \-c configs/det/det_mv3_db.yml \-o Global.pretrained_model=./output/det_db/best_accuracy \Global.save_inference_dir=./inference_model/det_db
rknn = RKNN()rknn.load_paddle(model_path='./inference_model/det_db/model.pdmodel',params_path='./inference_model/det_db/model.pdiparams')rknn.config(target_platform='rk3588',mean_values=[[123.675, 116.28, 103.53]],std_values=[[58.395, 57.12, 57.375]],quantized_dtype='asymmetric_affine-u8')rknn.build(do_quantization=True)rknn.export_rknn('./output/det_db.rknn')
rknn_run执行推理,解析输出(DB模型的输出为概率图和阈值图)。通过以上流程,开发者可高效完成PaddleOCR v4到RKNN的部署,实现边缘设备上的高性能OCR应用。