Page 1 of 1

输入非图片的神经网络模型转rknn

Posted: 2024-07-25 13:47
by beamrobot
官方提供的例子都是输入图片类的,我的模型输入是一个一维向量(对应测量传感器的输入)。我从onnx格式转换rknn格式时,在build这一步遇到麻烦了。我应该提供什么样的验证数据呢?rknn.build函数好像不支持非图片的数据集,用我提供的txt(向量)数据直接报错。由于我使用的平台是rv1103,我不能跳过量化这一步(变量do_quant只能设为True)。

请问我应该怎么办?

ret = rknn.build(do_quantization=do_quant, dataset=DATASET_PATH)

报错如下:

Image

Re: 输入非图片的神经网络模型转rknn

Posted: 2024-07-26 2:07
by Crocodile
RKNN 支持的算子和模型都有限,目前主要还是支持视觉类的为主,RKNN-Toolkit2的转换在启动量化后会调用rknn.api.rknn_utils.get_input_img 去读图片目前还不清楚有没有其他的读取方式

Re: 输入非图片的神经网络模型转rknn

Posted: 2024-07-26 2:13
by beamrobot
我的模型非常简单,就是个全连接网络(MLP)。问题不在网络,而是输入数据的格式。为什么我们的模型非要限制成图片输入呢,不能是其它任意自定义的向量或者张量吗?我看官网有个例子是transformer大模型的,输入不是图片,但是我没法用。(原因是它没有量化所以不用数据集,而rv1106又不支持非量化)

Re: 输入非图片的神经网络模型转rknn

Posted: 2024-07-26 13:47
by Crocodile
beamrobot wrote: 2024-07-26 2:13 我的模型非常简单,就是个全连接网络(MLP)。问题不在网络,而是输入数据的格式。为什么我们的模型非要限制成图片输入呢,不能是其它任意自定义的向量或者张量吗?我看官网有个例子是transformer大模型的,输入不是图片,但是我没法用。(原因是它没有量化所以不用数据集,而rv1106又不支持非量化)
rknn_model_zoo 有说明 RV1103/RV1106 是受限制支持,所有的示例中仅支持yolov5 和 mobilenet , 我们进行测试时也仅测试过以mobilenet做为骨干网络的模型。在数据手册上有提到对浮点的支持但实际上RKNN-Toolkit2只能量化到整型才能转换成功。transformer那个我也有了解过,不启动量化在RV1103/RV1106 平台 RKNN-Toolkit2会报错,这不是模型复杂程度的问题而是官方支持的问题,很多比Yolov5简单的模型都会因为算子兼容性导致无法转换成功,没有源码很难进一步开发。
如果你的模型的数据是int4/int8的或者可以自己手动量化到整形,你可以尝试将平台设置为RK3588去转换,最后输出的数据再进行标准化或许可以成功。

Re: 输入非图片的神经网络模型转rknn

Posted: 2024-07-28 2:29
by beamrobot
我查看手册发现校验数据dataset也支持npy格式,所以我在导出模型时把输入“包装”成了图片的NCHW格式。这样可以正常的转换成rknn格式了,python中验证也基本正确了。但是现在的问题是,在板子上用C程序跑模型,输出与python版本不一致(都是错的),请问这是什么原因?C代码我参考了retinaface例子的inference_retinaface_model函数,它是像下面这样拿输出结果的,我照葫芦画瓢把我想要的向量从这里取出来,这样做对吗?
uint8_t *location = (uint8_t *)(app_ctx->output_mems[0]->virt_addr);

Re: 输入非图片的神经网络模型转rknn

Posted: 2024-07-31 1:53
by Crocodile
不太清除您的模型有几个输出通道,如果只有一个就是这样取出的,如果在转换的时候有进行过量化那么在这里要反量化才能取出正确的输出数据,反量化主要用deqnt_affine_to_f32函数实现(按照您使用的原输出数据类型进行修改)