Toybrick

楼主: Hhhhlnlnlnh

3399pro来做语音识别,pb模型转rknn后效果非常不好

bobby_jiang

中级会员

积分
374
发表于 2019-5-17 11:58:46 | 显示全部楼层
你按我的建议先做一下吧,目的是保证你的输入长和宽数据送入卷积。
这个方式我之前验证过可行的。
回复

使用道具 举报

Hhhhlnlnlnh

注册会员

积分
79
 楼主| 发表于 2019-5-17 15:26:00 | 显示全部楼层
感觉应该是rknn不支持长宽不同的输入,不过我后来看到官方例程车牌识别要识别的图片是32x40的单通道图片,他是先转化为一维向量输入模型,然后在模型里面reshape识别,我也打算先试试这种方法
回复

使用道具 举报

Hhhhlnlnlnh

注册会员

积分
79
 楼主| 发表于 2019-5-17 15:26:39 | 显示全部楼层
感觉应该是rknn不支持长宽不同的输入,不过我后来看到官方例程车牌识别要识别的图片是32x40的单通道图片,他是先转化为一维向量输入模型,然后在模型里面reshape识别,我也打算先试试这种方法
回复

使用道具 举报

Hhhhlnlnlnh

注册会员

积分
79
 楼主| 发表于 2019-5-17 15:28:17 | 显示全部楼层
bobby_jiang 发表于 2019-5-17 11:58
你按我的建议先做一下吧,目的是保证你的输入长和宽数据送入卷积。
这个方式我之前验证过可行的。 ...

好的我是测试一下
回复

使用道具 举报

Hhhhlnlnlnh

注册会员

积分
79
 楼主| 发表于 2019-5-18 23:04:32 | 显示全部楼层
我将模型的变成320000,再模型内部做reshape到(1600,200,1),这样转换之后pb模型可以正常使用,但rknn模型inference时候就报错:
E Catch exception when init model!
T Traceback (most recent call last):
T   File "rknn/api/rknn_base.py", line 625, in rknn.api.rknn_base.RKNNBase.inference
T   File "rknn/api/rknn_runtime.py", line 275, in rknn.api.rknn_runtime.RKNNRuntime.build_graph
T Exception: RKNN init failed. error code: RKNN_ERR_MODEL_INVALID

模型输入reshape代码
                input_data = Input(name='the_input', shape=(self.INPUT_SIZE, 1), dtype='float32')
                input_wavImage = Reshape((self.AUDIO_LENGTH, self.AUDIO_FEATURE_LENGTH, 1), name='Reshape')(input_data)
rknn模型转换代码
        rknn.config()
        # Load TensorFlow Model
        print('--> Loading model')
        rknn.load_tensorflow(tf_pb='./model.pb',
                             inputs=['the_input'],
                             outputs=['Activation0/truediv'],
                             input_size_list=[[320000, 1]])
回复

使用道具 举报

protossw512

中级会员

积分
252
发表于 2019-5-21 06:05:22 | 显示全部楼层
Hhhhlnlnlnh 发表于 2019-5-18 23:04
我将模型的变成320000,再模型内部做reshape到(1600,200,1),这样转换之后pb模型可以正常使用,但rknn模型i ...

对,因为它转换的时候和inference的时候长宽两个维度的顺序反了,所以可以正产转换,但是没办法读取来做inference
回复

使用道具 举报

bobby_jiang

中级会员

积分
374
发表于 2019-5-21 10:30:57 | 显示全部楼层
你现在用的rknn-toolkit是什么版本?
另外,你把原始模型和rknn模型,还有代码都贴上来。
回复

使用道具 举报

Hhhhlnlnlnh

注册会员

积分
79
 楼主| 发表于 2019-5-21 13:48:34 | 显示全部楼层
本帖最后由 Hhhhlnlnlnh 于 2019-5-21 13:49 编辑
bobby_jiang 发表于 2019-5-21 10:30
你现在用的rknn-toolkit是什么版本?
另外,你把原始模型和rknn模型,还有代码都贴上来。 ...

rknn-toolkit版本是0.9.9
原始pb模型和rknn模型放在百度云盘里
链接:https://pan.baidu.com/s/1doU0uLZXVBMv9EZ6C_r4rA
提取码:rlsq


keras模型代码
  1. input_data = Input(name='the_input', shape=(320000, 1), dtype='float32')

  2. input_wavImage = Reshape((1600, 200, 1), name='Reshape')(input_data)

  3. layer_h1 = Conv2D(32, (3,3), use_bias=False, activation='relu', padding='same', kernel_initializer='he_normal')(input_wavImage) # 卷积层
  4. layer_h1 = Dropout(0.05)(layer_h1)
  5. layer_h2 = Conv2D(32, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h1) # 卷积层
  6. layer_h3 = MaxPooling2D(pool_size=2, strides=None, padding="valid")(layer_h2) # 池化层
  7. #layer_h3 = Dropout(0.2)(layer_h2) # 随机中断部分神经网络连接,防止过拟合
  8. layer_h3 = Dropout(0.05)(layer_h3)
  9. layer_h4 = Conv2D(64, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h3) # 卷积层
  10. layer_h4 = Dropout(0.1)(layer_h4)
  11. layer_h5 = Conv2D(64, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h4) # 卷积层
  12. layer_h6 = MaxPooling2D(pool_size=2, strides=None, padding="valid")(layer_h5) # 池化层

  13. layer_h6 = Dropout(0.1)(layer_h6)
  14. layer_h7 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h6) # 卷积层
  15. layer_h7 = Dropout(0.15)(layer_h7)
  16. layer_h8 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h7) # 卷积层
  17. layer_h9 = MaxPooling2D(pool_size=2, strides=None, padding="valid")(layer_h8) # 池化层

  18. layer_h9 = Dropout(0.15)(layer_h9)
  19. layer_h10 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h9) # 卷积层
  20. layer_h10 = Dropout(0.2)(layer_h10)
  21. layer_h11 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h10) # 卷积层
  22. layer_h12 = MaxPooling2D(pool_size=1, strides=None, padding="valid")(layer_h11) # 池化层

  23. layer_h12 = Dropout(0.2)(layer_h12)
  24. layer_h13 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h12) # 卷积层
  25. layer_h13 = Dropout(0.2)(layer_h13)
  26. layer_h14 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h13) # 卷积层
  27. layer_h15 = MaxPooling2D(pool_size=1, strides=None, padding="valid")(layer_h14) # 池化层

  28. #test=Model(inputs = input_data, outputs = layer_h12)
  29. #test.summary()

  30. layer_h16 = Reshape((200, 3200))(layer_h15) #Reshape层
  31. #layer_h5 = LSTM(256, activation='relu', use_bias=True, return_sequences=True)(layer_h4) # LSTM层
  32. #layer_h6 = Dropout(0.2)(layer_h5) # 随机中断部分神经网络连接,防止过拟合
  33. layer_h16 = Dropout(0.3)(layer_h16)
  34. layer_h17 = Dense(128, activation="relu", use_bias=True, kernel_initializer='he_normal')(layer_h16) # 全连接层
  35. layer_h17 = Dropout(0.3)(layer_h17)
  36. layer_h18 = Dense(1422, use_bias=True, kernel_initializer='he_normal')(layer_h17) # 全连接层
复制代码


rknn模型转换代码,且log中没有error或warning
  1. from rknn.api import RKNN

  2. rknn = RKNN(verbose=True, verbose_file='./build.log')
  3. rknn.config()

  4. print('--> Loading model')
  5. rknn.load_tensorflow(tf_pb='./model.pb',
  6.                      inputs=['the_input'],
  7.                      outputs=['Activation0/truediv'],
  8.                      input_size_list=[[320000, 1]])
  9. print('done')

  10. # Build Model
  11. print('--> Building model')
  12. rknn.build(do_quantization=False)
  13. print('done')

  14. rknn.export_rknn('./model.rknn')

  15. rknn.release()
复制代码


rknn模型inference代码
  1. rknn = RKNN()
  2. rknn.load_rknn('./model.rknn')
  3. ret = rknn.init_runtime(target='rk3399pro')
  4. if ret != 0:
  5.     print('Init runtime environment failed')
  6.     exit(ret)
  7. print('done')

  8. # x_in.size  = (1, 320000, 1)
  9. x_in, in_len = load_wav_input(filename)

  10. out = rknn.inference(inputs=[x_in], data_type='float32')
复制代码


同样的环境原来模型没用Reshape直接输入(1600,200,1)可以inference,但最后softmax后np.sum(out)应该=200,pb模型是这样,但rknn模型np.sum(out)是几千完全不对,因此想输入一维向量在模型中reshape,但出之前的错误
回复

使用道具 举报

Hhhhlnlnlnh

注册会员

积分
79
 楼主| 发表于 2019-5-21 13:51:27 | 显示全部楼层
protossw512 发表于 2019-5-21 06:05
对,因为它转换的时候和inference的时候长宽两个维度的顺序反了,所以可以正产转换,但是没办法读取来做i ...

可是照你这样说的话模型中就不支持长宽不同的输入reshape操作了?
回复

使用道具 举报

bobby_jiang

中级会员

积分
374
发表于 2019-5-23 14:14:30 | 显示全部楼层
我们的rknn-toolkit1.0.0已经发布,另外toybrick prod的V1.2版本也已经发布了。
你把固件和rknn-toolkit升级到最新版本。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表