在使用 ZLMediaKit 并结合RK MPP解码模块后,想对得到的视频帧进行深度学习模型推理,在推理之前,有必要先了解一下RKNN使用C++推理的流程。此外,为了方便之后项目的扩展,建议将RKNN推理库封装成一个类(仅供参考)。
目录
1. RKNN通用API C++ 推理流程
1.1 初始化RKNN Context对象
// 创建rknn_context对象
rknn_context rknn_ctx_
int ret = rknn_init(&rknn_ctx_, model_data, model_data_size, 0, NULL);
参数:
- arg1:rknn_context对象
- arg2:RKNN 模型的二进制数据或者 RKNN 模型路径
- arg3:当 model 是二进制数据,表示模型大小,当 model 是路径,则设置为0
- arg4:特定的初始化标志
- arg5:特定初始化时的扩展信息
1.2 查询RKNN相关信息
ret = rknn_query(rknn_ctx_, rknn_query_cmd, void* info, uint32_t size);
参数:
- arg1:rknn_context对象
- arg2:查询相关命令
rknn_query_cmd常用值 |
含义 |
RKNN_QUERY_SDK_VERSION |
版本相关信息 |
RKNN_QUERY_IN_OUT_NUM |
输入输出 的个数 |
RKNN_QUERY_INPUT_ATTR |
输入tensor的属性 |
RKNN_QUERY_OUTPUT_ATTR |
输出tensor的属性 |
- arg3:存放查询结果的结构体变量
- arg4:结构体变量的大小
1.3 设置RKNN输入数据
//创建rknn_input对象
rknn_input rknn_inputs[g_max_io_num];
int ret = rknn_inputs_set(rknn_ctx_, (uint32_t)inputs.size(), rknn_inputs);
参数:
- arg1:rknn_context对象
- arg2:输入数据个数
- arg3:输入数据数组,数组每个元素是rknn_input类型的结构体
1.4 执行推理
ret = rknn_run(rknn_ctx_, nullptr);
参数:
- arg1:rknn_context对象
- arg2:目前默认填nullptr即可
1.5 获取RKNN输出数据
rknn_output rknn_outputs[g_max_io_num];
ret = rknn_outputs_get(rknn_ctx_, output_num_, rknn_outputs, NULL);
参数:
- arg1:rknn_context对象
- arg2:输出数据个数
- arg3:输出数据数组,数组每个元素是rknn_output类型的结构体
2. 封装自己的RKNN库
因涉及到的其它库较多,本章节仅供提供一个思路用于RKNN 推理库项目封装,如果需要完整项目代码和指导可以私信我,创作不易,请多多支持!
封装思路:通用框架推理库-->RKNN框架推理库