Contents

Embedded:RK3399 RKNN

本文采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。

RKNN

RKNN API

应用程序只需要包含该头文件和动态库,就可以编写相关的 AI 应用。

RKNNAPI 的 定 义 在 :rknn_api_sdk/rknn_api/include/rknn_api.h

RKNN API 的 动 态 库 路 径 为:rknn_api_sdk/rknn_api/lib64/librknn_api.so

RKNN 模型转换工具

《RKNN-Toolkit 使用指南》

RKNN-Toolkit

RKNN-Toolkit 是为用户提供在 PC、RK3399Pro、RK1808 或 RK3399Pro Linux 开发板上进行模型转换、推理和性能评估的开发套件,用户通过提供的 python 接口可以便捷地完成以下功能:

  1. 模型转换:支持 Caffe、TensorFlow、TensorFlow Lite、ONNX、Darknet 模型转成 RKNN模型,支持 RKNN 模型导入导出,后续能够在硬件平台上加载使用。
  2. 模型推理:能够在 PC 上模拟运行模型并获取推理结果;也可以在指定硬件平台 RK3399Pro(或 RK3399Pro Linux 开发板)、RK1808 上运行模型并获取推理结果。
  3. 性能评估:能够在 PC 上模拟运行并获取模型总耗时及每一层的耗时信息;也可以通过联机调试的方式在指定硬件平台 RK3399Pro、RK1808 上运行模型,或者直接在 RK3399Pro Linux 开发板上运行,以获取模型在硬件上完整运行一次所需的总时间和每一层的耗时情况。
  4. 获取模型运行时的内存使用情况:通过联机调试的方式获取模型在指定硬件平台RK3399Pro、RK1808或RK3399ProLinux开发板上运行时的内存使用情况。

API 使用

1
2
intr knn_init(rknn_context*context,void*model,uint32_tsize,uint32_tflag);
int rknn_init2(rknn_context*context,void*model,uint32_tsize,uint32_tflag,rknn_init_extend*extend);

adb devices 进行查询 devices ID

1
2
3
4
5
char* device_id = "7d58b18e7599c7a4";
rknn_init_extend temp;
temp.device_id = device_id;
// ======================== Init model ===========================
ret = rknn_init2(&ctx, model, model_len, RKNN_FLAG_PRIOR_MEDIUM,&temp);

封装函数,先判断lsusb 结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
bool exeShellCmd(const string &cmd, vector<string> &results)
{
    int bufferSize = 10240; //10KB应该是非常充足了
    char *buffer = new char[bufferSize];
    FILE *pFile = NULL;
    if (NULL == (pFile = popen(cmd.c_str(), "r")))
    {
        printf("execute shell command error \n");
        return false;
    }
    while (NULL != fgets(buffer, bufferSize, pFile))
    {
        buffer[strlen(buffer) - 1] = '\0'; //fgets() 会自动在末尾加入换行符,linux 下换行符就是 \r(CR),这里把自动添加的换行符去掉
        results.emplace_back(buffer);
    }
    delete[] buffer;
    pclose(pFile);
    return true;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    FILE *p_file = NULL;

    string cmd = "lsusb | grep 2207:0018";
    vector<string> cmd_results;
    if (exeShellCmd(cmd, cmd_results))
    {
        if (cmd_results.size())
        {
            printf(">> External TB-RK1808S0 Attached !\n");
            rknn_devices_id rknn_devices;
            rknn_find_devices(&rknn_devices);
            init_extend.device_id = rknn_devices.ids[0];

            printf("--> %d ", rknn_devices.n_devices);
            printf("-- %s ", rknn_devices.types[0]);
            printf("-- %s ", rknn_devices.ids[0]);
            printf("\n");
        }
        else
        {
            init_extend.device_id = NULL;
            printf(">> NO External TB-RK1808S0 !\n");
        }
    }
    else
    {
        init_extend.device_id = NULL;
        printf(">> NO External TB-RK1808S0 !\n");
    }

    // ======================== Init model ===========================
    ret = rknn_init2(&ctx, model, model_len, RKNN_FLAG_PRIOR_MEDIUM, ((NULL == init_extend.device_id) ? (NULL) : (&init_extend)));

TB-RK1808S0

工作模式

1、被动模式,arm平台只限制RK公司的rk3399和rk3399pro两颗芯片平台;其它arm芯片不支持。建议采用主动模式; 2、主动模式采用socket通信,上位机linux能支持rndis即可,如果不支持,内核配置一下rndis,如附图。

https://cdn.jsdelivr.net/gh/zhangyuhu/share_images/images/202301181650368.png

使用问题

在http://repo.rock-chips.com/rk1808/rknn-api/链接下,有供上位机 C 编程使用的库文件和头文件。

C 编程的具体开发使用请参见《Rockchip_User_Guide_RKNN_API》。

上 位 机 在 执 行 编 译 出 来 的 C 语 言 的 可 执 行 程 序 前 , 需 要 先 运 行npu_transfer_proxy 和计算棒进行通信,npu_transfer_proxy 的下载链接为http://repo.rock-chips.com/rk1808/npu_transfer_proxy/。

版本问题

RKNN-Toolkit :模型转换工具,算法在用版本 1.4.0

RKNN API : 程序调用API (librknn_api.so),当前vega 所用版本为1.4.0 (后续直接集成vega)

RKNN DRV : 设备驱动,当前RK3399PRO 和 1808 版本不一致,需注意,即RK3399PRO 版本为1.5.0,1808 为 1.4.0

论坛提问

被动模式多计算棒无法使用

RK3399pro + TB-RK1808S0 rknn_find_devices 问题咨询

TB-RK1808S0被动模式咨询

其他

1
2
3
4
5
6
7
8
    char devices[512];
    find_devices = popen("adb devices", "r");

    while (fgets(devices, 100, find_devices) != NULL)
    {
        printf("%s", devices);
    }
    printf("\n");
1
sudo mount -t nfs -o nolock 192.168.100.189:/mnt/DG/WORK/2_code/4_T3R/rknn_demo/rknn_demo /home/toybrick/Rockchip/zyh/rknn_demo