RKNN模型部署(4)—— 模型部署


1、简介

   RKNN SDK为带有RKNPU的芯片平台提供C语言编程接口,用于用户部署RKNN模型。RK3588芯片适用SDK库中的/rknpu2/runtime的librknnrt.so。

  在虚拟机ubuntu环境解压rknpu2压缩包。安装交叉编译平台sudo apt install gcc-aarch64-linux-gnu g+±aarch64-linux-gnu。接着可以进入解压后example目录,修改编译脚本中的编译器名称。执行编译后会生成install目录,将其拷贝到RK3588平台运行。

  实际上rknpu2文件夹因为适配多种硬件平台,所以目录结构复杂。如果像我一样只需要在RK3588上进行部署,可以将3rdpart、runtime及感兴趣的样例目录拷贝出来单独组成自己的项目工程。

  像华为的AscendCL、英伟达的TensorRT一样,瑞芯微同样提供一套C语言API接口。用于模型部署时应用开发。比较特别的是瑞芯微提供通用API接口和零拷贝API接口(限RK356X/RK3588)。通用API接口按照异构编程规范,需要将数据拷贝到NPU运行时的内存空间。

2、 模型部署流程

  • 初始化上下文,需要先创建上下文对象和读取模型文件
rknn_context ctx;
model = load_model(model_path, &model_len);
ret = rknn_init(&ctx, model, model_len, 0, NULL);
\\使用opencv读取需要处理的图片,一定要将图片从BGR转换为RGB格式

cv::Mat orig_img = imread(img_path, cv::IMREAD_COLOR);
cv::cvtColor(orig_img, orig_img_rgb, cv::COLOR_BGR2RGB);
  • 创建输入
rknn_input inputs[1];
inputs[0].index = 0;
inputs[0].type = RKNN_TENSOR_UINT8;
inputs[0].size = img.cols*img.rows*img.channels();
inputs[0].fmt = RKNN_TENSOR_NHWC;
inputs[0].buf = img.data;
``
- 设置输入
```c
ret = rknn_inputs_set(ctx, io_num.n_input, inputs);
  • 执行模型
ret = rknn_run(ctx, nullptr);
  • 创建输出对象
rknn_output outputs[1];
  • 解析输出信息
rknn_outputs_get(ctx, 1, outputs, NULL);
float *buffer = (float *)outputs[i].buf;
  • 释放资源
rknn_outputs_release(ctx, 1, outputs);
rknn_destroy(ctx);
free(model);

来源: https://zhuanlan.zhihu.com/p/523627210

猜你喜欢

转载自blog.csdn.net/baidu_39231810/article/details/128645496
今日推荐