Megvii-BaseDetection / YOLOX

YOLOX is a high-performance anchor-free YOLO, exceeding yolov3~v5 with MegEngine, ONNX, TensorRT, ncnn, and OpenVINO supported. Documentation: https://yolox.readthedocs.io/
Apache License 2.0
9.38k stars 2.2k forks source link

转换成onnx之后想转瑞芯微的rknn格式失败,请问是否有rknn转换指导 #434

Open BenjaminLiu1003 opened 3 years ago

BenjaminLiu1003 commented 3 years ago

如题,在使用onnx验证之后(已经指定opset=10),想转成瑞芯微使用的rknn格式文件,报错如下,麻烦帮忙看下,谢谢了!

I Try match Slice_Slice_9:out0 W Not match tensor Slice_Slice_9:out0 E Try match Slice_Slice_9:out0 failed, catch exception! W ----------------Warning(2)---------------- E Catch exception when loading onnx model: /home/benjamin/disk1/Work/NN_ALGO/yolo/YOLOX/yolox_s.onnx! E Traceback (most recent call last): E File "rknn/base/RKNNlib/converter/convert_onnx.py", line 826, in rknn.base.RKNNlib.converter.convert_onnx.convert_onnx.match_paragraph_and_param E File "rknn/base/RKNNlib/converter/convert_onnx.py", line 728, in rknn.base.RKNNlib.converter.convert_onnx.convert_onnx._onnx_push_ready_tensor E TypeError: 'NoneType' object is not iterable E During handling of the above exception, another exception occurred: E Traceback (most recent call last): E File "rknn/api/rknn_base.py", line 264, in rknn.api.rknn_base.RKNNBase.load_onnx E File "rknn/base/RKNNlib/RK_nn.py", line 135, in rknn.base.RKNNlib.RK_nn.RKnn.load_onnx E File "rknn/base/RKNNlib/app/importer/import_onnx.py", line 121, in rknn.base.RKNNlib.app.importer.import_onnx.Importonnx.run E File "rknn/base/RKNNlib/converter/convert_onnx.py", line 832, in rknn.base.RKNNlib.converter.convert_onnx.convert_onnx.match_paragraph_and_param E File "rknn/api/rknn_log.py", line 312, in rknn.api.rknn_log.RKNNLog.e E ValueError: Try match Slice_Slice_9:out0 failed, catch exception! --> Load onnx model failed!

GOATmessi8 commented 3 years ago

Seems rknn didn't support slice operation for Focus. You may have to replace the first layer of Focus with a conv 3x3-stride-2 layer and finetune your model first.

ymw123 commented 3 years ago

你好,你解决了吗,我也是使用rknn,转换失败了,用pytorch直接转和先转onnx再转pytorch都失败了,似乎要设置opeset=9才能转,但是好像只支持opset=10,11。

BenjaminLiu1003 commented 3 years ago

没有

BenjaminLiu1003 commented 3 years ago

请问一下

Seems rknn didn't support slice operation for Focus. You may have to replace the first layer of Focus with a conv 3x3-stride-2 layer and finetune your model first.

rknn现在只支持opset=9,请问一下可以实现opset=9的onnx转换么?谢谢。

ymw123 commented 3 years ago

我设置opset=9会报错,onnx直接不能转换,设置opset=10或11,可以成功转换为rknn,但是模型与原始模型不一致,差异太大,而且转换过程中似乎提示了错误信息,但是也能成功转换。

ymw123 commented 3 years ago

我用的rknn1.7.1版本

ymw123 commented 3 years ago

pytorch直接转rknn,会提示有几个op不支持,但是先转onnx再转rknn,就没有提示op不支持的问题,所以目前只能通过onnx转换rknn。我是直接用官方的pth模型和onnx来转换的,没有自己训练模型,因为rknn目前只支持torch1.6,所以我怀疑是torch版本太高,所以我想自己用torch1.6训练模型,然后再设置opset=9来转换,看是否可以成功。

BenjaminLiu1003 commented 3 years ago

pytorch直接转rknn,会提示有几个op不支持,但是先转onnx再转rknn,就没有提示op不支持的问题,所以目前只能通过onnx转换rknn。我是直接用官方的pth模型和onnx来转换的,没有自己训练模型,因为rknn目前只支持torch1.6,所以我怀疑是torch版本太高,所以我想自己用torch1.6训练模型,然后再设置opset=9来转换,看是否可以成功。

重新训练的话,我有yolov5的,而且太浪费时间了,就是想直接用它的,为什么瑞芯微告诉我的是最新的是1.6.1?你用的什么板子?

ymw123 commented 3 years ago

pytorch直接转rknn,会提示有几个op不支持,但是先转onnx再转rknn,就没有提示op不支持的问题,所以目前只能通过onnx转换rknn。我是直接用官方的pth模型和onnx来转换的,没有自己训练模型,因为rknn目前只支持torch1.6,所以我怀疑是torch版本太高,所以我想自己用torch1.6训练模型,然后再设置opset=9来转换,看是否可以成功。

重新训练的话,我有yolov5的,而且太浪费时间了,就是想直接用它的,为什么瑞芯微告诉我的是最新的是1.6.1?你用的什么板子?

你这个错误是rk1.6出现的,我也出现过,使用rk1.7就没有错误了,这是瑞芯微内部提供给我们的preview版本,增加了一些op的支持。还是想转换yolox,毕竟速度比yolov5快。你有尝试转换nanodet吗?

BenjaminLiu1003 commented 3 years ago

pytorch直接转rknn,会提示有几个op不支持,但是先转onnx再转rknn,就没有提示op不支持的问题,所以目前只能通过onnx转换rknn。我是直接用官方的pth模型和onnx来转换的,没有自己训练模型,因为rknn目前只支持torch1.6,所以我怀疑是torch版本太高,所以我想自己用torch1.6训练模型,然后再设置opset=9来转换,看是否可以成功。

重新训练的话,我有yolov5的,而且太浪费时间了,就是想直接用它的,为什么瑞芯微告诉我的是最新的是1.6.1?你用的什么板子?

你这个错误是rk1.6出现的,我也出现过,使用rk1.7就没有错误了,这是瑞芯微内部提供给我们的preview版本,增加了一些op的支持。还是想转换yolox,毕竟速度比yolov5快。你有尝试转换nanodet吗?

nanodet没用过,你在RK什么板子试的,要不加个好友交流一下吧。

GOATmessi8 commented 3 years ago

@ymw123 我们也没有说比v5快啊。。。不过我们也注意到了v5的一些op兼容性一般。后续会有用conv换掉Focus的模型放出来。

BenjaminLiu1003 commented 3 years ago

@ymw123 我们也没有说比v5快啊。。。不过我们也注意到了v5的一些op兼容性一般。后续会有用conv换掉Focus的模型放出来。

好的,这个太棒了,谢谢大佬。

ymw123 commented 3 years ago

@ymw123 我们也没有说比v5快啊。。。不过我们也注意到了v5的一些op兼容性一般。后续会有用conv换掉Focus的模型放出来。

我是推测的边缘设备上比v5快,因为在pc上比v5快一点

ymw123 commented 3 years ago

pytorch直接转rknn,会提示有几个op不支持,但是先转onnx再转rknn,就没有提示op不支持的问题,所以目前只能通过onnx转换rknn。我是直接用官方的pth模型和onnx来转换的,没有自己训练模型,因为rknn目前只支持torch1.6,所以我怀疑是torch版本太高,所以我想自己用torch1.6训练模型,然后再设置opset=9来转换,看是否可以成功。

重新训练的话,我有yolov5的,而且太浪费时间了,就是想直接用它的,为什么瑞芯微告诉我的是最新的是1.6.1?你用的什么板子?

你这个错误是rk1.6出现的,我也出现过,使用rk1.7就没有错误了,这是瑞芯微内部提供给我们的preview版本,增加了一些op的支持。还是想转换yolox,毕竟速度比yolov5快。你有尝试转换nanodet吗?

nanodet没用过,你在RK什么板子试的,要不加个好友交流一下吧。

我使用的是rk1806

ymw123 commented 3 years ago

这是使用rk1.7.0转onnx成功的提示,只是转换后的rknn模型输出差异太大,中间有些层转换出错了。 图片 使用pt模型直接转rknn会提示['aten::expand', 'aten::copy', 'aten::full', 'aten::mul', 'aten::meshgrid']这些op不支持。

ymw123 commented 3 years ago

@BenjaminLiu1003 github好像不可以私信

BenjaminLiu1003 commented 3 years ago

@ymw123 我用了1.7.0的rknn-toolkit还是连转换完成都不行啊。。。

ymw123 commented 3 years ago

@BenjaminLiu1003 weixin:YMWO_o

liuwenhua6666 commented 2 years ago

我转成功了

liuwenhua6666 commented 2 years ago

推理时间300ms左右