Toybrick

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

Hhhhlnlnlnh

注册会员

积分
79
发表于 2019-5-14 18:47:31    查看: 20023|回复: 19 | [复制链接]    打印 | 显示全部楼层
用tensorflow模型测试效果是可以识别音频转文字,但把pb转rknn后无法识别,输出结果相差非常大,不确定原因出在哪边,分析可能原因有以下几点:
1、模型转换:由于rknn.build(do_quantization=True, dataset='./dataset.txt')需要训练集,而我的是音频不是图片因此是将音频转换成模型输入input的格式后保存成npy文件,不知道这步是否出了问题?我没有在rknn-toolkit上找到详细的npy格式说明。(且设置do_quantization=False输出结果也完全不对)

2、数据输入:我的模型输入是(1600,200,1),我在inference时是直接把音频转成(1600,200,1)的x_in然后输出out = rknn.inference(inputs=[x_in]),这个结果和tensorflow跑出来结果分布完全不对
备注:由于语音识别也是将音频信号转化成语音图谱即图像来用cnn识别,因此应该在板子上和图像识别不会有太大差异

不知道问题是出在上面哪点,希望能有人帮忙解决

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

bobby_jiang

高级会员

积分
538
发表于 2019-5-14 20:25:19 | 显示全部楼层
先试一下不要量化的,看看结果。
回复

使用道具 举报

Hhhhlnlnlnh

注册会员

积分
79
 楼主| 发表于 2019-5-14 21:13:56 | 显示全部楼层
不量化的也测试过了,结果还是完全不对,可是感觉模型数据的输入应该也没有问题,所以我还是没找到问题在哪
回复

使用道具 举报

Hhhhlnlnlnh

注册会员

积分
79
 楼主| 发表于 2019-5-14 23:04:06 | 显示全部楼层
发现了可能是数据输入的问题,我的模型输入是[0,2.5]范围的数据float32,因此模型转换改成rknn.config(channel_mean_value='0 0 0 1', reorder_channel='0 1 2'),且在inference过程中,输入数据默认是uint8,但我的是浮点数,因此在后面加data_type=float32,但这样会出错,因此改成data_type=np.float32,但inference一直等待了十几分钟还没结果,是npu对输入浮点数计算太慢导致的吗?改成np.float16依然等不到结果
回复

使用道具 举报

bobby_jiang

高级会员

积分
538
发表于 2019-5-15 11:29:59 | 显示全部楼层
先试浮点。
模型转换的时候:
1、rknn.config()xxx
2、rknn.load_tensorflow(tf_pb='./xxx.pb',inputs=['xxx'],outputs=['xxx'], input_size_list=[[1,1600, 200]])
3、rknn.build(do_quantization=False, dataset='./dataset.txt', pre_compile=False),浮点用不到dataset.txt

推理的时候:
1、outputs, = rknn.inference(inputs=xxx,data_type='float32')
回复

使用道具 举报

Hhhhlnlnlnh

注册会员

积分
79
 楼主| 发表于 2019-5-15 20:23:33 | 显示全部楼层
还是不行,下面是我的模型转换代码,由于模型输入是[1600,200,1],如果改成input_size_list=[[1,1600,200]]会报错,
rknn.config()
rknn.load_tensorflow(tf_pb='./model.pb',
                     inputs=['the_input'],
                     outputs=['Activation0/truediv'],
                     input_size_list=[[1600, 200, 1]])
rknn.build(do_quantization=False)
推理的代码是out = rknn.inference(inputs=[x_in], data_type='float32')。
最终是softmax得到的out应该总和为1,keras跑pb的时候是对的,但rknn inference后的out总和非常大,不是1,所以感觉不是数据输入的问题,应该是模型转换不知道哪边出了差错
回复

使用道具 举报

Hhhhlnlnlnh

注册会员

积分
79
 楼主| 发表于 2019-5-15 20:42:18 | 显示全部楼层
========================================================================
Layer ID    Name                                         Operator            Time(us)
2           ConvolutionReluPoolingLayer2_2               CONVOLUTION         9352
3           ConvolutionReluPoolingLayer2_2               CONVOLUTION         146823
4           ConvolutionReluPoolingLayer2_2               CONVOLUTION         78806
5           ConvolutionReluPoolingLayer2_2               CONVOLUTION         154880
6           ConvolutionReluPoolingLayer2_2               CONVOLUTION         89746
7           ConvolutionReluPoolingLayer2_2               CONVOLUTION         174313
8           ConvolutionReluPoolingLayer2_2               CONVOLUTION         43653
9           ConvolutionReluPoolingLayer2_2               CONVOLUTION         43651
10          PoolingLayer2_0                              POOLING             362
11          ConvolutionReluPoolingLayer2_2               CONVOLUTION         43651
12          ConvolutionReluPoolingLayer2_2               CONVOLUTION         43650
13          PoolingLayer2_0                              POOLING             396
14          TensorTranspose_0                            TENSOR_TRANS        9224
15          ConvolutionReluPoolingLayer2_2               CONVOLUTION         10956
16          TensorTranspose_0                            TENSOR_TRANS        191
17          TensorAdd_1                                  TENSOR_ADD          309
18          ActivationLayer_0                            ACTIVATION          148
19          TensorTranspose_0                            TENSOR_TRANS        180
20          ConvolutionReluPoolingLayer2_2               CONVOLUTION         4913
21          TensorTranspose_0                            TENSOR_TRANS        1725
22          TensorAdd_1                                  TENSOR_ADD          1249
23          SoftmaxLayer_0                               SOFTMAX             104672
Total Time(us): 962850
FPS: 1.04
========================================================================
我发现我的模型per_debug的时候不是从第一层开始算的,而且有的pool是综合再ConvolutionReluPoolingLayer2_2,有的pool再PoolingLayer2_0 ,但是我的网络是标准的vgg,和例程demo的debug出来的不一样,难道是哪些层不支持吗
回复

使用道具 举报

Hhhhlnlnlnh

注册会员

积分
79
 楼主| 发表于 2019-5-15 20:49:04 | 显示全部楼层
                input_data = Input(name='the_input', shape=(self.AUDIO_LENGTH, self.AUDIO_FEATURE_LENGTH, 1))
               
                layer_h1 = Conv2D(32, (3,3), use_bias=False, activation='relu', padding='same', kernel_initializer='he_normal')(input_data) # 卷积层
                layer_h1 = Dropout(0.05)(layer_h1)
                layer_h2 = Conv2D(32, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h1) # 卷积层
                layer_h3 = MaxPooling2D(pool_size=2, strides=None, padding="valid")(layer_h2) # 池化层
                #layer_h3 = Dropout(0.2)(layer_h2) # 随机中断部分神经网络连接,防止过拟合
                layer_h3 = Dropout(0.05)(layer_h3)
                layer_h4 = Conv2D(64, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h3) # 卷积层
                layer_h4 = Dropout(0.1)(layer_h4)
                layer_h5 = Conv2D(64, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h4) # 卷积层
                layer_h6 = MaxPooling2D(pool_size=2, strides=None, padding="valid")(layer_h5) # 池化层
               
                layer_h6 = Dropout(0.1)(layer_h6)
                layer_h7 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h6) # 卷积层
                layer_h7 = Dropout(0.15)(layer_h7)
                layer_h8 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h7) # 卷积层
                layer_h9 = MaxPooling2D(pool_size=2, strides=None, padding="valid")(layer_h8) # 池化层
               
                layer_h9 = Dropout(0.15)(layer_h9)
                layer_h10 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h9) # 卷积层
                layer_h10 = Dropout(0.2)(layer_h10)
                layer_h11 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h10) # 卷积层
                layer_h12 = MaxPooling2D(pool_size=1, strides=None, padding="valid")(layer_h11) # 池化层
               
                layer_h12 = Dropout(0.2)(layer_h12)
                layer_h13 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h12) # 卷积层
                layer_h13 = Dropout(0.2)(layer_h13)
                layer_h14 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h13) # 卷积层
                layer_h15 = MaxPooling2D(pool_size=1, strides=None, padding="valid")(layer_h14) # 池化层
               
                #test=Model(inputs = input_data, outputs = layer_h12)
                #test.summary()
               
                layer_h16 = Reshape((200, 3200))(layer_h15) #Reshape层
                #layer_h5 = LSTM(256, activation='relu', use_bias=True, return_sequences=True)(layer_h4) # LSTM层
                #layer_h6 = Dropout(0.2)(layer_h5) # 随机中断部分神经网络连接,防止过拟合
                layer_h16 = Dropout(0.3)(layer_h16)
                layer_h17 = Dense(128, activation="relu", use_bias=True, kernel_initializer='he_normal')(layer_h16) # 全连接层
                layer_h17 = Dropout(0.3)(layer_h17)
                layer_h18 = Dense(self.MS_OUTPUT_SIZE, use_bias=True, kernel_initializer='he_normal')(layer_h17) # 全连接层
               
                y_pred = Activation('softmax', name='Activation0')(layer_h18)
                model_data = Model(inputs = input_data, outputs = y_pred)

我的keras模型是上面的代码,不知道有没有rknn不支持的层吗?
回复

使用道具 举报

bobby_jiang

高级会员

积分
538
发表于 2019-5-16 11:47:38 | 显示全部楼层
你模型当中的层没有什么特殊的,都支持。
还是怀疑你input数据有问题,你试一下把数据拍平了,转成[320000,1]输入,然后在你的模型中reshape成[1600, 200, 1]。
回复

使用道具 举报

protossw512

中级会员

积分
252
发表于 2019-5-17 01:59:21 | 显示全部楼层
我之前报过错误,长宽不同的输入,rknn有bug。。。转换和inference的时候长宽的先后不同,代码和模型都提供了,结果也没人查。。
回复

使用道具 举报

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

本版积分规则

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


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