• RKNPU2通用API和零拷贝API


    RKNPU2通用API

    通用API接口按照异构编程规范,需要将数据拷贝到NPU运行时的内存空间。

    通用API部署流程

    • 初始化上下文,需要先创建上下文对象和读取模型文件

      rknn_context ctx;
      model = load_model(model_path, &model_len);
      ret = rknn_init(&ctx, model, model_len, 0, NULL);
      \\使用opencv读取需要处理的图片,一定要将图片从BGR转换为RGB格式
      
      cv::Mat img = imread(img_path, cv::IMREAD_COLOR);  // 读取图片数据,并保存在img
      cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • 创建输入

      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;			// 把img拷贝到inputs[0].buf
      ``
      - 设置输入
      ```c
      ret = rknn_inputs_set(ctx, io_num.n_input, inputs);  // 把inputs数据拷贝到ctx对象当中
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    • 执行模型

      ret = rknn_run(ctx, nullptr);
      
      
      • 1
      • 2
    • 释放资源

      rknn_outputs_release(ctx, 1, outputs);
      rknn_destroy(ctx);
      free(model);
      
      
      • 1
      • 2
      • 3
      • 4

    在这里插入图片描述

    RKNPU2零拷贝API

    通用API需要利用rknn_inputs_set设置输入,零拷贝API则直接将数据拷贝到之前申请好的内存即可。

    零拷贝API部署流程

    • 初始化上下文,需要先创建上下文对象和读取模型文件

      rknn_context ctx;
      model = load_model(model_path, &model_len);
      ret = rknn_init(&ctx, model, model_len, 0, NULL);
      \\使用opencv读取需要处理的图片,一定要将图片从BGR转换为RGB格式
      
      cv::Mat img = imread(img_path, cv::IMREAD_COLOR);  // 读取图片数据,并保存在img
      cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • 创建输入

      // 调用rknn_create_mem接口申请内存
      input_mems[0]   = rknn_create_mem(ctx, input_attrs[0].size_with_stride);
      ...
      // 调用rknn_set_io_mem接口让NPU使用已经申请的内存
      rknn_set_io_mem(ctx, input_mems[0], &input_attrs[0]);
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 执行模型

      ret = rknn_run(ctx, nullptr);
      
      
      • 1
      • 2
    • 释放资源

      rknn_destroy_mem(ctx, input_mems[0]);
      rknn_destroy(ctx);
      free(model);
      
      
      • 1
      • 2
      • 3
      • 4

    在这里插入图片描述

    速度对比

    warmup轮数50,循环推理1000次,计算平均耗时,包括预处理和后处理的总时间。npu只用了一个核心。

    型号速度
    通用API30-32ms
    零拷贝API30-31ms

    来源于https://blog.csdn.net/weixin_43337573/article/details/131817935

  • 相关阅读:
    第40讲:MySQL索引的语法以及基本使用
    深度学习人体跌倒检测 -yolo 机器视觉 opencv python 计算机竞赛
    ES6中的一些新特性
    网页数据抓取工具推荐:简数采集器
    Linux系统中如何更改用户密码,以及验证用户密码是否更改成功
    JS包管理
    三维模型3DTile格式轻量化在数据存储的重要性分析
    java基本数据类型如何定义和初始化呢?
    在使用paddleocr转onnx后,推理遇到的问题解决
    【593. 有效的正方形】
  • 原文地址:https://blog.csdn.net/qq_42178122/article/details/132722582