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

  • RKNN 支持的算子和模型都有限,目前主要还是支持视觉类的为主,RKNN-Toolkit2的转换在启动量化后会调用rknn.api.rknn_utils.get_input_img 去读图片目前还不清楚有没有其他的读取方式
  • 我的模型非常简单,就是个全连接网络(MLP)。问题不在网络,而是输入数据的格式。为什么我们的模型非要限制成图片输入呢,不能是其它任意自定义的向量或者张量吗?我看官网有个例子是transformer大模型的,输入不是图片,但是我没法用。(原因是它没有量化所以不用数据集,而rv1106又不支持非量化)
  • 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去转换,最后输出的数据再进行标准化或许可以成功。
  • 我查看手册发现校验数据dataset也支持npy格式,所以我在导出模型时把输入“包装”成了图片的NCHW格式。这样可以正常的转换成rknn格式了,python中验证也基本正确了。但是现在的问题是,在板子上用C程序跑模型,输出与python版本不一致(都是错的),请问这是什么原因?C代码我参考了retinaface例子的inference_retinaface_model函数,它是像下面这样拿输出结果的,我照葫芦画瓢把我想要的向量从这里取出来,这样做对吗?
    uint8_t *location = (uint8_t *)(app_ctx->output_mems[0]->virt_addr);
    Last edited by beamrobot on 2024-07-28 2:33, edited 1 time in total.
  • 不太清除您的模型有几个输出通道,如果只有一个就是这样取出的,如果在转换的时候有进行过量化那么在这里要反量化才能取出正确的输出数据,反量化主要用deqnt_affine_to_f32函数实现(按照您使用的原输出数据类型进行修改)