Toybrick

rk3399 pro不支持 一维卷积

dddeee

新手上路

积分
32
楼主
发表于 2019-3-28 14:55:14    查看: 7174|回复: 3 | [复制链接]    打印 | 只看该作者
用tensorflow conv2d 将卷积核由5*5改成1*5,pb到rknn模型转换没有问题 ,但是在调用做推理是,加载1*64的数据报错
回复

使用道具 举报

troy

版主

积分
2374
沙发
发表于 2019-3-28 15:24:05 | 只看该作者
问问题要把错误信息贴出来
回复

使用道具 举报

dddeee

新手上路

积分
32
板凳
 楼主| 发表于 2019-3-28 16:08:24 | 只看该作者
报错信息是:Aborted (core dumped),日志是空的模型结构:
  1. import tensorflow as tf

  2. def weight_variable(shape):
  3.         tf.set_random_seed(1)
  4.         return tf.Variable(tf.truncated_normal(shape, stddev=0.1))
  5. def bias_variable(shape):
  6.         return tf.Variable(tf.constant(0.0, shape=shape))

  7. def conv2d(x, W):
  8.         return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding='SAME')

  9. def max_pool_2x2(z):
  10.         return tf.nn.max_pool(z, ksize=[1,1,2,1], strides=[1,1,2,1], padding='SAME')
  11. X = tf.placeholder(tf.float32, [None, 1, 64, 1], name="input_x")
  12. y = tf.placeholder(tf.float32, [None, 10], name="input_y")
  13. kp = tf.placeholder_with_default(1.0, shape=(), name="keep_prob")
  14. lam = tf.placeholder(tf.float32, name="lamda")
  15.         #conv1
  16. W_conv1 = weight_variable([1,5,1,32])
  17. b_conv1 = bias_variable([32])
  18. z1 = tf.nn.relu(conv2d(X, W_conv1) + b_conv1)
  19. maxpool1 = max_pool_2x2(z1) #max_pool1完后maxpool1维度为[?,32,32,32]

  20.         #conv2
  21. W_conv2 = weight_variable([1,5,32,64])
  22. b_conv2 = bias_variable([64])
  23. z2 = tf.nn.relu(conv2d(maxpool1, W_conv2) + b_conv2)
  24. maxpool2 = max_pool_2x2(z2) #max_pool2,shape [?,16,16,64]
  25. print("maxpool2.shape",maxpool2.get_shape())

  26.         #conv3  效果比较好的一次模型是没有这一层,只有两次卷积层,隐藏单元100,训练20次
  27.         # W_conv3 = weight_variable([5, 5, 64, 128])
  28.         # b_conv3 = bias_variable([128])
  29.         # z3 = tf.nn.relu(conv2d(maxpool2, W_conv3) + b_conv3)
  30.         # maxpool3 = max_pool_2x2(z3)  # max_pool3,shape [?,8,8,128]

  31.         #full connection1
  32. W_fc1 = weight_variable([1*16*64, 200])
  33. b_fc1 = bias_variable([200])
  34. maxpool2_flat = tf.reshape(maxpool2, [-1, 2*16*64])
  35. z_fc1 = tf.nn.relu(tf.matmul(maxpool2_flat, W_fc1) + b_fc1)
  36. #z_fc1_drop = tf.nn.dropout(z_fc1, keep_prob=kp)

  37. #softmax layer
  38. W_fc2 = weight_variable([200, 10])
  39. b_fc2 = bias_variable([10])
  40. z_fc2 = tf.add(tf.matmul(z_fc1, W_fc2),b_fc2, name="outlayer")
  41. prob = tf.nn.softmax(z_fc2, name="probability")
  42. pred = tf.argmax(prob, 1, output_type="int32", name="predict")

  43. init = tf.global_variables_initializer()
  44. with tf.Session() as sess:
  45.         sess.run(init)
  46.         saver = tf.train.Saver({'W_conv1':W_conv1, 'b_conv1':b_conv1, 'W_conv2':W_conv2, 'b_conv2':b_conv2,
  47.                                         'W_fc1':W_fc1, 'b_fc1':b_fc1, 'W_fc2':W_fc2, 'b_fc2':b_fc2})
  48.         saver.save(sess, "make_model/cnn_model.ckpt")
  49.         output_graph_def = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def, output_node_names=['predict'])
  50.         with tf.gfile.FastGFile('make_model_tl/digital_gesture.pb', mode='wb') as f:
  51.                 f.write(output_graph_def.SerializeToString())
复制代码
转换模型的代码是:
  1. from rknn.api import RKNN

  2. INPUT_SIZE = 64

  3. if __name__ == '__main__':
  4.         # 创建RKNN执行对象
  5.         rknn = RKNN()

  6.         #初始化RKNN运行环境,指定host=’rk3399pro’,后续的操作将会运行在NPU上
  7.         print('--> Init runtime environment')
  8.         ret = rknn.init_runtime()
  9.         if ret != 0:
  10.                 print('Init runtime environment failed')
  11.                 exit(ret)
  12.                 print('done')

  13.         # 配置模型输入,用于NPU对数据输入的预处理
  14.         # channel_mean_value='0 0 0 255',那么模型推理时,将会对RGB数据做如下转换
  15.         # (R - 0)/255, (G - 0)/255, (B - 0)/255。推理时,RKNN模型会自动做均值和归一化处理
  16.         # reorder_channel=’0 1 2’用于指定是否调整RBG顺序,设置成0 1 2即按输入的RGB顺序不做调整
  17.         # reorder_channel=’2 1 0’表示交换0和2通道,如果输入是RGB,将会被调整为BGR。如果是BGR将会被
  18.         # 调整为RGB
  19.         #rknn.config(channel_mean_value='0 0 0 255', reorder_channel='0 1 2')
  20.         rknn.config(channel_mean_value='0 0 0 1',reorder_channel='0 1 2')
  21.         # 加载TensorFlow模型
  22.         # tf_pb='../digital_gesture_recognition/model_2500/digital_gesture.pb'指定待转换的TensorFlow模型
  23.         # inputs指定模型中的输入节点
  24.         # outputs指定模型中输出节点
  25.         # input_size_list指定模型输入的大小
  26.         print('--> Loading model')
  27.         rknn.load_tensorflow(tf_pb='make_model_tl/digital_gesture.pb',
  28.                                 inputs=['input_x'],
  29.                                 outputs=['outlayer'],
  30.                                 input_size_list=[[1, 64, 1]])
  31.         print('done')

  32.         # 创建解析pb模型
  33.         # do_quantization=False指定不进行量化
  34.         # 量化会减小模型的体积和提升运算速度,但是会有精度的丢失
  35.         print('--> Building model')
  36.         rknn.build(do_quantization=False)
  37.         print('done')
复制代码
用pb推理成功的代码:
  1. import numpy as np

  2. #read image
  3. def img_to_mat(path):
  4.     mat = np.arange(64).reshape(1,1,64,1)
  5.     return mat
  6. #load pb
  7. def load_model(pb_path):
  8.     with tf.gfile.GFile(pb_path, "rb") as f:
  9.         graph_def = tf.GraphDef()
  10.         graph_def.ParseFromString(f.read())
  11.         with tf.Graph().as_default() as graph:
  12.             tf.import_graph_def(graph_def, name="")
  13.             return graph

  14. #do inference
  15. def predict(graph):
  16.     mat = img_to_mat("out.jpg")
  17.     x = graph.get_tensor_by_name("input_x:0")
  18.     outlayer = graph.get_tensor_by_name("outlayer:0")
  19.     with tf.Session(graph=graph) as sess:
  20.         np.set_printoptions(suppress=True)
  21.         out= sess.run([outlayer],feed_dict={x:mat})
  22.         return out
  23. if __name__=="__main__":
  24.     graph = load_model('make_model_tl/digital_gesture.pb')
  25.     out = predict(graph)
  26.     print(out)
复制代码
rknn推理失败的代码:
  1. from rknn.api import RKNN
  2. from PIL import Image
  3. import numpy as np

  4. #read image
  5. def img_to_mat(path):
  6.     mat = np.arange(64).reshape(1,64)
  7.     return mat
  8. #load rknn
  9. def load_model(rknn_path):
  10.     rknn = RKNN(verbose=True, verbose_file='./log.txt')
  11.      # 载入RKNN模型
  12.     print('-->loading model')
  13.     rknn.load_rknn(rknn_path)
  14.     print('loading model done')

  15.     # 初始化RKNN运行环境
  16.     print('--> Init runtime  environment')
  17.     ret = rknn.init_runtime()
  18.     if ret != 0:
  19.         print('Init runtime environment failed')
  20.         exit(ret)
  21.     print('done')

  22.     return rknn
  23. #do inference
  24. def predict(rknn):
  25.     mat = img_to_mat("out.jpg")
  26.     print("mat.shape",mat.shape)
  27.     #mat = mat.reshape(64,1)
  28.    # print("mat.shape",mat.shape)
  29.     out=rknn.inference(inputs=[mat])
  30.     print('ooo')
  31.     return out
  32. if __name__=="__main__":
  33.     rknn = load_model('make_model_tl/digital_gesture.rknn')
  34.     out = predict(rknn)
  35.     print(out)
复制代码
结论:是不支持这种1*n的卷积核吗?
回复

使用道具 举报

dddeee

新手上路

积分
32
地板
 楼主| 发表于 2019-3-28 16:09:16 | 只看该作者
troy 发表于 2019-3-28 15:24
问问题要把错误信息贴出来

您好,我把code和相关信息贴出来了
回复

使用道具 举报

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

本版积分规则

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


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