rockchip-linux / rknn-toolkit

BSD 3-Clause "New" or "Revised" License
808 stars 173 forks source link

onnx1.6.0转rknn遇到lstm算子不支持 #182

Open Amanda-Barbara opened 2 years ago

Amanda-Barbara commented 2 years ago

paddleocr模型能转到1.6.0版本的onnx,且精度没有问题,但1.6.0版本的onnx转rknn遇到了单向双层的lstm算子不支持问题,即使把onnx的选项opset-version设置成11/12也是报出了同样的问题,

W Not match tensor LSTM_LSTM_4:out0 
E Try match layer: LSTM_LSTM_4:out0 failed!
The OP of this layer may not yet support, please check document <RKNN_OP_Support.md>!
E Catch exception when loading onnx model: best_accuracy.onnx!

我查看了1.6.0版本onnx的算子支持列表是支持单向双层的lstm算子,你们发布的文档中不是支持1.6.0版本的onnx吗?请教一下这个问题如何解决?

zen-xingle commented 2 years ago

pytorch导出的lstm是支持单向多层的lstm算子的。

paddleocr我们没有具体测试,可能是由于他们框架导出的onnx算子与pytorch标准的不一样导致的,你可以试下onnx-simplify优化下模型再转RKNN试试。

Amanda-Barbara commented 2 years ago

@zen-xingle paddle->pytorch->rknn已实验能转,我试试onnx-simplify版本的模型能不能转成rknn格式的模型,多谢。

ZhangChao-maker commented 2 years ago

@Amanda-Barbara ,您好,如何转换为pytorch之后在转换为rknn呢?

Amanda-Barbara commented 2 years ago

@huashui-gif 参考examples/pytorch目录下的代码修改相应的配置文件即可实现pytorch->rknn模型的转换,前提是要把pytorch的模型用torch.jit.trace语句保存。

    input_size_list = [[3, 32, 320]]
    # pre-process config
    print('--> Config model')
    rknn.config(mean_values=[[127.5, 127.5, 127.5]], std_values=[[127.5, 127.5, 127.5]], reorder_channel='0 1 2')
    print('done')

    # Load Pytorch model
    print('--> Loading model')
    ret = rknn.load_pytorch(model=model, input_size_list=input_size_list)
    if ret != 0:
        print('Load Pytorch model failed!')
        exit(ret)
    print('done')
ZhangChao-maker commented 2 years ago

@Amanda-Barbara 谢谢指点,您如何转换paddle模型为pytorch的pt格式呢?最近也在尝试做这项工作,目前采用的是onnx直接进行部署的,纯cpu跑的,方便的话,加个vx,我想请教一下您 我的:601633950

Amanda-Barbara commented 2 years ago

@huashui-gif 免费白嫖

ZhangChao-maker commented 2 years ago

@Amanda-Barbara 谢谢您,我知道这个项目,在保存jit时我遇到了一些问题 model=torch.jit.trace(converter.net,inp,strict=False) model(inp) torch.jit.save(model, "det.pt") 采用这样的方式保存,用rknn加载会报错,您有jit保存的建议吗?我很感谢您的回复

Amanda-Barbara commented 2 years ago

@huashui-gif 没有很复杂,参考下面代码保存即可

#torch.save(self.net.state_dict(), weights_path, _use_new_zipfile_serialization=False)
im = torch.Tensor(1, 3, 32, 320)
ts = torch.jit.trace(self.net, im)
ts.save(os.path.splitext(weights_path)[0]+'.torchscript')
ZhangChao-maker commented 2 years ago

@Amanda-Barbara 谢谢指点,但是我尝试过这样的保存方式,但是在进行保存的时候,报错了,必须要加strict=False这个参数,但是这样保存的之后的模型无法再rknn中进行加载 RuntimeError: Encountering a dict at the output of the tracer might cause the trace to be incorrect, this is only valid if the container structure does not change based on the module's inputs. Consider using a constant container instead (e.g. for list, use a tuple instead. for dict, use a NamedTuple instead). If you absolutely need this and know the side effects, pass strict=False to trace() to allow this behavior.

Amanda-Barbara commented 2 years ago

@huashui-gif 这个问题就不好定位了,可能是版本的问题,我的paddleocr版本是v2.4,还有paddleocr2pytorch的convert脚本要和paddleocr模型的网络结构要对应的上,

ZhangChao-maker commented 2 years ago

@Amanda-Barbara 好的,非常感谢,我再试试,您说的paddleocr2pytorch的convert脚本要和paddleocr模型的网络结构要对应的上,是要修改转换脚本吗?

Amanda-Barbara commented 2 years ago

@huashui-gif 如果使用的是resnet18网络不需要修改,带有depthwise层的网络结构则需要修改。

ZhangChao-maker commented 2 years ago

@Amanda-Barbara https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/doc/doc_ch/models_list.md 您转换的是这个连接下的det模型吗?我测试都会有这个警告

cndcnd085 commented 2 years ago

@Amanda-Barbara paddle->pytorch->rknn已实验能转,请问您是怎么转的,可否给我下代码,我用的paddleocr 的PaddleOCR-release-2.3-Rec 自己训练的rec_mv3_none_bilstm_ctc模型,我可以按照你的免费白嫖转成了pytorch,并且测试成功,但是我转rknn时候,一直不成功。想知道下你的配置环境是如何,我怕我的环境不对,谢谢了

chen1234520 commented 2 years ago

@Amanda-Barbara paddle->pytorch->rknn已实验能转,请问您是怎么转的,可否给我下代码,我用的paddleocr 的PaddleOCR-release-2.3-Rec 自己训练的rec_mv3_none_bilstm_ctc模型,我可以按照你的免费白嫖转成了pytorch,并且测试成功,但是我转rknn时候,一直不成功。想知道下你的配置环境是如何,我怕我的环境不对,谢谢了

朋友,你最终转成功了吗? 我这边按照上面的方法把模型转成了paddle->pth->pt, 但是加载的时候还是会报错, E NotImplementedError: The following operators are not implemented: ['aten::lstm']

求各路大佬 来帮帮忙!

chen1234520 commented 2 years ago

朋友 解决了吗

Amanda-Barbara commented 2 years ago

@Amanda-Barbara paddle->pytorch->rknn已实验能转,请问您是怎么转的,可否给我下代码,我用的paddleocr 的PaddleOCR-release-2.3-Rec 自己训练的rec_mv3_none_bilstm_ctc模型,我可以按照你的免费白嫖转成了pytorch,并且测试成功,但是我转rknn时候,一直不成功。想知道下你的配置环境是如何,我怕我的环境不对,谢谢了

需要修改paddle-ocr-crnn的网络结构的代码,不是直接用paddle训练出来的crnn模型就可以转成功的,按照rknn转换的过程中报出的错误进行相应的修改即可。

Amanda-Barbara commented 2 years ago

朋友 解决了吗

@Amanda-Barbara paddle->pytorch->rknn已实验能转,请问您是怎么转的,可否给我下代码,我用的paddleocr 的PaddleOCR-release-2.3-Rec 自己训练的rec_mv3_none_bilstm_ctc模型,我可以按照你的免费白嫖转成了pytorch,并且测试成功,但是我转rknn时候,一直不成功。想知道下你的配置环境是如何,我怕我的环境不对,谢谢了

朋友,你最终转成功了吗? 我这边按照上面的方法把模型转成了paddle->pth->pt, 但是加载的时候还是会报错, E NotImplementedError: The following operators are not implemented: ['aten::lstm']

求各路大佬 来帮帮忙!

这个是paddle->pytorch->rknn转换路线报出的问题吗?我转换的过程中没有出现这个问题哎。

chen1234520 commented 2 years ago

朋友 解决了吗

@Amanda-Barbara paddle->pytorch->rknn已实验能转,请问您是怎么转的,可否给我下代码,我用的paddleocr 的PaddleOCR-release-2.3-Rec 自己训练的rec_mv3_none_bilstm_ctc模型,我可以按照你的免费白嫖转成了pytorch,并且测试成功,但是我转rknn时候,一直不成功。想知道下你的配置环境是如何,我怕我的环境不对,谢谢了

朋友,你最终转成功了吗? 我这边按照上面的方法把模型转成了paddle->pth->pt, 但是加载的时候还是会报错, E NotImplementedError: The following operators are not implemented: ['aten::lstm'] 求各路大佬 来帮帮忙!

这个是paddle->pytorch->rknn转换路线报出的问题吗?我转换的过程中没有出现这个问题哎。

朋友 解决了吗

@Amanda-Barbara paddle->pytorch->rknn已实验能转,请问您是怎么转的,可否给我下代码,我用的paddleocr 的PaddleOCR-release-2.3-Rec 自己训练的rec_mv3_none_bilstm_ctc模型,我可以按照你的免费白嫖转成了pytorch,并且测试成功,但是我转rknn时候,一直不成功。想知道下你的配置环境是如何,我怕我的环境不对,谢谢了

朋友,你最终转成功了吗? 我这边按照上面的方法把模型转成了paddle->pth->pt, 但是加载的时候还是会报错, E NotImplementedError: The following operators are not implemented: ['aten::lstm'] 求各路大佬 来帮帮忙!

这个是paddle->pytorch->rknn转换路线报出的问题吗?我转换的过程中没有出现这个问题哎。

感谢回复,我这边使用最新版本的rknn1.7.1转换时出现一个新的错误: E tensorflow.python.framework.errors_impl.InvalidArgumentError: Current implementation only supports equal length strides in the row and column dimensions. 看错误的意思是卷积的w和h方向的步长需要相同,我看了下网络结构确实有卷积的w和w的步长不相同。请问你当时转换的时候有遇到这个问题吗? 或者您的网络中卷积的w、h方向的步长都是相同的。 我使用的是ch_PP-OCRv2_rec.yml文件训练出来的模型,Backbone用的是MobileNetV1Enhance。

Amanda-Barbara commented 2 years ago

朋友 解决了吗

@Amanda-Barbara paddle->pytorch->rknn已实验能转,请问您是怎么转的,可否给我下代码,我用的paddleocr 的PaddleOCR-release-2.3-Rec 自己训练的rec_mv3_none_bilstm_ctc模型,我可以按照你的免费白嫖转成了pytorch,并且测试成功,但是我转rknn时候,一直不成功。想知道下你的配置环境是如何,我怕我的环境不对,谢谢了

朋友,你最终转成功了吗? 我这边按照上面的方法把模型转成了paddle->pth->pt, 但是加载的时候还是会报错, E NotImplementedError: The following operators are not implemented: ['aten::lstm'] 求各路大佬 来帮帮忙!

这个是paddle->pytorch->rknn转换路线报出的问题吗?我转换的过程中没有出现这个问题哎。

朋友 解决了吗

@Amanda-Barbara paddle->pytorch->rknn已实验能转,请问您是怎么转的,可否给我下代码,我用的paddleocr 的PaddleOCR-release-2.3-Rec 自己训练的rec_mv3_none_bilstm_ctc模型,我可以按照你的免费白嫖转成了pytorch,并且测试成功,但是我转rknn时候,一直不成功。想知道下你的配置环境是如何,我怕我的环境不对,谢谢了

朋友,你最终转成功了吗? 我这边按照上面的方法把模型转成了paddle->pth->pt, 但是加载的时候还是会报错, E NotImplementedError: The following operators are not implemented: ['aten::lstm'] 求各路大佬 来帮帮忙!

这个是paddle->pytorch->rknn转换路线报出的问题吗?我转换的过程中没有出现这个问题哎。

感谢回复,我这边使用最新版本的rknn1.7.1转换时出现一个新的错误: E tensorflow.python.framework.errors_impl.InvalidArgumentError: Current implementation only supports equal length strides in the row and column dimensions. 看错误的意思是卷积的w和h方向的步长需要相同,我看了下网络结构确实有卷积的w和w的步长不相同。请问你当时转换的时候有遇到这个问题吗? 或者您的网络中卷积的w、h方向的步长都是相同的。 我使用的是ch_PP-OCRv2_rec.yml文件训练出来的模型,Backbone用的是MobileNetV1Enhance。

目前rknn还不支持深度可分离卷积中参数(stride_h, stride_w)不一致的情况,建议你要不然把改一下网络结构使得stride_h与stride_w相等,要不然直接把MobileNetV1Enhance中用到的SE模块置为false,去除SE模块再重新训练。