rknn-toolkit2 icon indicating copy to clipboard operation
rknn-toolkit2 copied to clipboard

新版本toolkit不支持onnx中lstm操作

Open OUC-lan opened this issue 2 years ago • 12 comments

您好,我看op支持文档上,onnx支持lstm转换,实际在转带lstm的模型时,发现段错误,原始模型为降噪模型DTLN模型,模型结构及原始模型如下: image 06A7210C20783555A49DEBBD8B62DE7D model_p1.zip

OUC-lan avatar Sep 13 '22 07:09 OUC-lan

尝试用onnx搭建了一个简单的lstm层,转换也有问题,代码如下: import onnx from onnx import helper from onnx import TensorProto import numpy as np from onnxsim import simplify

node_def = onnx.helper.make_node( "LSTM", inputs=["X", "W", "R"], outputs=["Y", "Y_h"], hidden_size=128, )

X = helper.make_tensor_value_info('X', TensorProto.FLOAT, [1, 1, 128]) weight = np.random.ranf(1512128).astype(np.float32) W = helper.make_tensor('W', TensorProto.FLOAT, [1, 512, 128], weight) R = helper.make_tensor('R', TensorProto.FLOAT, [1, 512, 128], weight) Y = helper.make_tensor_value_info('Y', TensorProto.FLOAT, [1, 1, 1, 128]) Y_h = helper.make_tensor_value_info('Y_h', TensorProto.FLOAT, [1, 1, 128])

graph_def = helper.make_graph( [node_def], 'test_conv_mode', [X], # graph inputs [Y, Y_h], # graph outputs initializer=[W, R], )

mode_def = helper.make_model(graph_def, opset_imports=[helper.make_opsetid("", 12)])

onnx.checker.check_model(mode_def)

model_simp, check = simplify(mode_def) onnx.save(model_simp, "lstm.onnx")

OUC-lan avatar Sep 13 '22 07:09 OUC-lan

模型转换脚本如下:

import os import urllib import traceback import time import sys import numpy as np import cv2 from rknn.api import RKNN

ONNX_MODEL = 'Conv.onnx'

RKNN_MODEL = 'model_p1.rknn'

QUANTIZE_ON = False

if name == 'main':

rknn = RKNN(verbose=True)


print('--> Config model')
rknn.config()
print('done')

# Load ONNX model
print('--> Loading model')
ret = rknn.load_onnx(model=ONNX_MODEL)
if ret != 0:
    print('Load model failed!')
    exit(ret)
print('done')

# Build model
print('--> Building model')
ret = rknn.build(do_quantization=QUANTIZE_ON)
if ret != 0:
    print('Build model failed!')
    exit(ret)
print('done')

# Export RKNN model
print('--> Export rknn model')
ret = rknn.export_rknn(RKNN_MODEL)
if ret != 0:
    print('Export rknn model failed!')
    exit(ret)
print('done')

# Init runtime environment
print('--> Init runtime environment')
ret = rknn.init_runtime()
# ret = rknn.init_runtime('rk3566')
if ret != 0:
    print('Init runtime environment failed!')
    exit(ret)
print('done')

rknn.release()

OUC-lan avatar Sep 13 '22 07:09 OUC-lan

尝试使用1.3.0版本和1.4.0版本均报段错误问题,能否帮忙排查下问题?

OUC-lan avatar Sep 13 '22 07:09 OUC-lan

验证了一下,应该是带了stateful,因为我们的是纯时序的网络,这种能否考虑支持呢? image

OUC-lan avatar Sep 13 '22 09:09 OUC-lan

您好,请问该问题解决了嘛,我用的tflite模型转rknn 也遇到lstm不支持的问题

AotYan avatar Sep 28 '22 05:09 AotYan

您好,请问该问题解决了嘛,我用的tflite模型转rknn 也遇到lstm不支持的问题

没解决

OUC-lan avatar Oct 09 '22 08:10 OUC-lan

我试了下非stateful的onnx模型是可以转的 带stateful的就不行了

AotYan avatar Oct 09 '22 08:10 AotYan

你好,请问解决了吗,我目前也在研究基于DTLN的AEC和NS,也希望部署在这一款芯片上面。

Plutoisme avatar Apr 04 '23 03:04 Plutoisme

我试了下非stateful的onnx模型是可以转的 带stateful的就不行了

请问你解决了吗,nonstateful是不能流式的呜呜呜

Plutoisme avatar Apr 04 '23 03:04 Plutoisme

我试了下非stateful的onnx模型是可以转的 带stateful的就不行了

请问你解决了吗,nonstateful是不能流式的呜呜呜

没有哎

AotYan avatar May 18 '23 11:05 AotYan