【RKNN】RKNN-Toolkit2 Python API之rknn_outputs_get 函数详解

rknn_outputs_get 是 RKNN-Toolkit2 中用于 ​获取模型推理结果​ 的核心接口,支持多输出模型的解析与后处理。以下是其功能、参数、使用场景及注意事项的完整说明:


一、功能与作用

  1. 核心功能

    • 从 NPU 推理后的内存中提取输出数据,支持 ​多输出模型​(如目标检测模型的分类、框坐标、置信度分支)。
    • 输出数据格式可通过 rknn_output 结构体灵活配置,支持 ​浮点型​(FLOAT32)或 ​量化型​(如 UINT8)数据 。
  2. 适用场景

    • 图像分类、目标检测等任务的结果解析。
    • 实时视频流中逐帧获取推理结果。
    • 多模型串联推理时的中间结果传递。

二、参数与返回值

1. 参数说明

参数名类型说明
ctxrknn_contextRKNN 上下文句柄,需通过 rknn_init 初始化。
n_outputsuint32_t输出张量数量,需与模型定义的输出数量一致(可通过 rknn_query 查询)。
outputsrknn_output*输出数据数组,每个元素描述一个输出张量的属性与数据指针。
paramsvoid*扩展参数,通常设为 NULL

2. 返回值

  • 成功​:返回 RKNN_SUCC(状态码 0)。
  • 失败​:返回错误码(如 RKNN_ERR_FAIL),常见原因包括内存不足或上下文未初始化 。

三、数据结构与使用流程

1. rknn_output 结构体

typedef struct {
    uint32_t index;         // 输出索引(从0开始)
    void* buf;              // 数据指针(由 SDK 自动分配内存)
    uint32_t size;          // 数据总字节数
    bool want_float;        // 是否返回浮点型数据(1: float,0: 量化数据)
} rknn_output;

2. 使用流程

// 初始化输出结构体数组
rknn_output outputs[2];  // 假设模型有2个输出
memset(outputs, 0, sizeof(outputs));

// 配置输出参数(例如分类任务)
for (int i = 0; i < 2; i++) {
    outputs[i].want_float = 1;  // 返回浮点型数据
}

// 获取输出数据
int ret = rknn_outputs_get(ctx, 2, outputs, NULL);
if (ret != RKNN_SUCC) {
    printf("获取输出失败!错误码:%d\n", ret);
    exit(-1);
}

// 解析输出(示例:分类结果)
float* class_scores = (float*)outputs[0].buf;
float* bbox_coords = (float*)outputs[1].buf;

四、示例与最佳实践

1. 图像分类结果解析

rknn_output outputs[1];
outputs[0].want_float = 1;  // 强制转换为 float 类型
ret = rknn_outputs_get(ctx, 1, outputs, NULL);

// 获取概率最大值
float* prob = (float*)outputs[0].buf;
int max_idx = 0;
float max_val = prob[0];
for (int i = 1; i < 1000; i++) {  // 假设输出为 1000 类
    if (prob[i] > max_val) {
        max_val = prob[i];
        max_idx = i;
    }
}
printf("预测类别:%d,置信度:%.2f\n", max_idx, max_val);

2. 目标检测结果处理

// 获取多个输出(例如 YOLOv5 的 3 个检测头)
rknn_output outputs[3];
memset(outputs, 0, sizeof(outputs));
for (int i = 0; i < 3; i++) {
    outputs[i].want_float = 1;
}
rknn_outputs_get(ctx, 3, outputs, NULL);

// 后处理(非极大值抑制等)
post_process((float*)outputs[0].buf, (float*)outputs[1].buf, (float*)outputs[2].buf);

五、注意事项

  1. 内存管理

    • 输出数据的内存由 SDK 自动分配,需调用 rknn_outputs_release 释放资源 。
    • 若未释放输出缓存,可能导致内存泄漏(尤其在高频推理场景中)。
  2. 数据类型匹配

    • 对于量化模型(如 UINT8 输入),需根据 want_float 标志决定是否反量化。例如:
      outputs[i].want_float = 0;  // 直接获取量化后的 uint8 数据
  3. 零拷贝优化

    • 若启用零拷贝接口(如 pass_through=1),需确保输出通道数对齐(如 RK3588 需 16 像素对齐)。
  4. 错误处理

    • 检查返回值是否为 RKNN_SUCC,避免因未初始化或参数错误导致程序崩溃 。

总结

  • 核心价值​:rknn_outputs_get 是模型部署流程中 ​结果解析的关键环节,直接影响后处理效率和精度。
  • 最佳实践​:
    1. 通过 rknn_query 查询输出属性,确保 n_outputs 与模型一致 。
    2. 优先使用浮点型数据简化后处理(非量化场景)。
    3. 多线程场景中,为每个线程分配独立的输出缓存以避免竞争 。
  • 扩展阅读​:

 

### 关于RKNN Toolkit2的信息 #### 安装指南 对于带有RKNPU的芯片平台,如RK3399Pro,为了部署由RKNN-Toolkit2导出的RKNN模型并加速AI应用的实现,环境安装是必要的前置条件[^1]。确保设备可以正常访问互联网是一个重要前提,这可以通过尝试ping baidu.com来验证网络状况良好[^2]。 针对RKNN Toolkit2的基础库安装,由于其与旧版rknn-toolkit存在差异,并且项目releases中不再提供以往版本的安装包,因此建议直接获取最新版本以享受更稳定的服务和支持[^3]。具体操作上,在Linux环境下可通过如下命令完成基本依赖项的安装: ```bash sudo apt-get update && sudo apt-get install -y python3-pip libusb-1.0-0-dev pip3 install --upgrade pip setuptools wheel ``` 接着,通过Python包管理器`pip`安装RKNN Toolkit2: ```bash pip3 install rknn-toolkit2 ``` #### 使用教程 RKNN Toolkit2提供了丰富的API用于支持多种任务,包括但不限于模型量化、转换以及加载等核心功能。下面给出一段简单的代码片段展示如何利用此工具进行模型转换过程中的部分工作流处理: ```python from rknn.api import RKNN # 创建RKNN对象实例 rknn = RKNN() # 加载TensorFlow模型文件(.pb) print('--> Loading model') ret = rknn.load_tensorflow(model='./mobilenet_v1_1.0_224_frozen.pb', inputs=['input'], outputs=['MobilenetV1/Predictions/Reshape_1'], input_size_list=[[224, 224, 3]]) if ret != 0: print('Load TensorFlow model failed!') exit(ret) # 构建RKNN模型 print('--> Building model') ret = rknn.build(do_quantization=True, dataset='./dataset.txt') if ret != 0: print('Build RKNN model failed!') exit(ret) # 导出为.rknn格式文件 print('--> Export RKNN model') ret = rknn.export_rknn('./mobilenet_v1_1.0_224.rknn') if ret != 0: print('Export RKNN model failed!') exit(ret) ``` 这段脚本展示了从加载预训练好的TensorFlow模型到构建适用于目标硬件平台优化后的RKNN模型整个流程的关键步骤。 #### 更新说明 鉴于rknn-toolkit2和早期版本rknn-toolkit之间的区别明显,官方已停止维护后者并将精力集中投入到前者之上;这意味着用户应当关注rknn-toolkit2最新的发行日志来了解新特性加入情况、性能改进措施以及其他重要的变更信息。通常情况下,这些更新记录可以在GitHub仓库的Releases页面找到,其中包含了每次发布的主要改动概览及其对应的下载链接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩瀚之水_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值