Toybrick

标题: FaceNet的rknn模型推理结果和pb模型结果不同 [打印本页]

作者: puyanan    时间: 2019-8-6 14:52
标题: FaceNet的rknn模型推理结果和pb模型结果不同
本帖最后由 puyanan 于 2019-8-6 15:53 编辑

环境:PC虚拟机Ubuntu16.04;     rknn_toolkit-1.0.0-cp35-cp35m-linux_x86_64.whl 及其他依赖项。
网络模型:facenet的预训练模型20180402-114759.pb      
                 该模型对应的特征提取网络是 Inception ResNet v1
                (facenet官网 https://github.com/davidsandberg/facenet


step1 模型转换:(不量化)
1.1
  1. from rknn.api import RKNN
  2. INPUT_SIZE = 160

  3. if __name__ == '__main__':

  4.     # Create RKNN object
  5.     rknn = RKNN(verbose=True, verbose_file='./test1.log')

  6.     # Config for Model Input PreProcess
  7.     rknn.config(channel_mean_value='0 0 0 1', reorder_channel='0 1 2')
  8.     print('config done')

  9.     #load tensorflow model
  10.     print('--> Loading model')
  11.     rknn.load_tensorflow(tf_pb='./20180402-114759.pb',
  12.                          inputs=['input','phase_train'],
  13.                          outputs=['InceptionResnetV1/Bottleneck/BatchNorm/Reshape_1'],                        
  14.                          input_size_list=[[INPUT_SIZE, INPUT_SIZE, 3], [1]])                  
  15.     print('done')

  16.     # Build Model
  17.     print('--> Building model')
  18.     rknn.build(do_quantization=False)
  19.     print('done')

  20.     # Export RKNN Model
  21.     rknn.export_rknn('./facenet_Reshape_1.rknn')

  22.     rknn.release()        
复制代码

这样写会报错:
E Catch exception when loading tensorflow model: ./20180402-114759.pb!
T Traceback (most recent call last):
T   File "rknn/api/rknn_base.py", line 137, in rknn.api.rknn_base.RKNNBase.load_tensorflow
T   File "rknn/base/RKNNlib/converter/convert_tf.py", line 482, in rknn.base.RKNNlib.converter.convert_tf.convert_tf.pre_process
T   File "rknn/base/RKNNlib/converter/tensorflowloader.py", line 102, in rknn.base.RKNNlib.converter.tensorflowloader.TF_Graph_Preprocess.pre_proces
T   File "rknn/base/RKNNlib/converter/tensorflowloader.py", line 627, in rknn.base.RKNNlib.converter.tensorflowloader.TF_Graph_Preprocess.calc_2_const
T   File "rknn/base/RKNNlib/converter/tf_util.py", line 371, in rknn.base.RKNNlib.converter.tf_util.TFProto_Util.query_tensor
T   File "rknn/base/RKNNlib/converter/tf_util.py", line 374, in rknn.base.RKNNlib.converter.tf_util.TFProto_Util.query_tensor
T   File "rknn/base/RKNNlib/converter/tf_util.py", line 388, in rknn.base.RKNNlib.converter.tf_util.TFProto_Util.query_tensor
T   File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py", line 3972, in get_tensor_by_name
T     return self.as_graph_element(name, allow_tensor=True, allow_operation=False)
T   File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py", line 3796, in as_graph_element
T     return self._as_graph_element_locked(obj, allow_tensor, allow_operation)
T   File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py", line 3838, in _as_graph_element_locked
T     "graph." % (repr(name), repr(op_name)))
T KeyError: "The name 'phase_train:0' refers to a Tensor which does not exist. The operation, 'phase_train', does not exist in the graph."
done
--> Building model
E Model or data is None, please load model first.
done
E RKNN model data is None, please load model first!

(我看到论坛上一位同学在inputs中添加了‘phase_train’,但是我这里却报错。  链接: http://t.rock-chips.com/forum.php?mod=viewthread&tid=419   )

1.2
修改 inputs=[], input_size_list=[]:
  1.     #load tensorflow model
  2.     print('--> Loading model')
  3.     rknn.load_tensorflow(tf_pb='./20180402-114759.pb',
  4.                          inputs=['input'],
  5.                          outputs=['InceptionResnetV1/Bottleneck/BatchNorm/Reshape_1'],                        
  6.                          input_size_list=[[INPUT_SIZE, INPUT_SIZE, 3]])                  
  7.     print('done')
复制代码
没报错,生成了 facenet_Reshape_1.rknn (后面用来做正向推理)


1.3
facenet正向推理,最终得到一个特征向量embeddings,为什么outputs不写“embeddings” 呢?
因为会报错。
  1.     #load tensorflow model
  2.     print('--> Loading model')
  3.     rknn.load_tensorflow(tf_pb='./20180402-114759.pb',
  4.                          inputs=['input'],
  5.                          outputs=['embeddings'],                                             
  6.                          input_size_list=[[INPUT_SIZE, INPUT_SIZE, 3]])                  
  7.     print('done')
复制代码
出错信息:
I build output layer attach_embeddingsut0
I build input layer input:in0
D Try match Mul embeddings
I Match multiply [['embeddings']] [['Mul']] to [['multiply']]
D Try match Rsqrt embeddings/Rsqrt
W Not match node embeddings/Rsqrt Rsqrt
E Catch exception when loading tensorflow model: ./20180402-114759.pb!
T Traceback (most recent call last):
T   File "rknn/api/rknn_base.py", line 185, in rknn.api.rknn_base.RKNNBase.load_tensorflow
T   File "rknn/base/RKNNlib/converter/convert_tf.py", line 589, in rknn.base.RKNNlib.converter.convert_tf.convert_tf.match_paragraph_and_param
T   File "rknn/base/RKNNlib/converter/convert_tf.py", line 488, in rknn.base.RKNNlib.converter.convert_tf.convert_tf._tf_push_ready_node
T TypeError: 'NoneType' object is not iterable
done
--> Building model
E Model or data is None, please load model first.
done
E RKNN model data is None, please load model first!


从输出信息看,是输出节点名字不匹配?
用tensorboard查看模型:
[attach]421[/attach][attach]422[/attach]
embeddings模块内部是将网络输出的向量做一个L2-norm,得到最终的特征向量。
红色节点的名字是:embeddings/(embeddings)    (这是一个512维度的向量)
该节点前一个节点的名字是:InceptionResnetV1/Bottleneck/BatchNorm/Reshape_1    (这也是一个512维度的向量)

1.4
当我修改outputs写成
outputs=['embeddings/(embeddings)'],
报错信息:
pu@pu-vm:~/RKNN/demo/facenet$ python3 test1.py
D save dump info to: ./test1.log
config done
--> Loading model
D import clients finished
WARNING: Logging before flag parsing goes to stderr.
W0806 11:09:18.194516 140165858322176 deprecation_wrapper.py:119] From /usr/local/lib/python3.5/dist-packages/rknn/api/rknn.py:62: The name tf.GraphDef is deprecated. Please use tf.compat.v1.GraphDef instead.

W0806 11:09:18.313679 140165858322176 deprecation.py:323] From /usr/local/lib/python3.5/dist-packages/rknn/api/rknn.py:62: extract_sub_graph (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.compat.v1.graph_util.extract_sub_graph`
E Catch exception when loading tensorflow model: ./20180402-114759.pb!
T Traceback (most recent call last):
T   File "rknn/api/rknn_base.py", line 136, in rknn.api.rknn_base.RKNNBase.load_tensorflow
T   File "rknn/base/RKNNlib/converter/convert_tf.py", line 102, in rknn.base.RKNNlib.converter.convert_tf.convert_tf.__init__
T   File "rknn/base/RKNNlib/converter/tensorflowloader.py", line 50, in rknn.base.RKNNlib.converter.tensorflowloader.TF_Graph_Preprocess.__init__
T   File "rknn/base/RKNNlib/converter/tensorflowloader.py", line 65, in rknn.base.RKNNlib.converter.tensorflowloader.TF_Graph_Preprocess.scan_and_optim_graph
T   File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/util/deprecation.py", line 324, in new_func
T     return func(*args, **kwargs)
T   File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/graph_util_impl.py", line 182, in extract_sub_graph
T     _assert_nodes_are_present(name_to_node, dest_nodes)
T   File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/graph_util_impl.py", line 137, in _assert_nodes_are_present
T     assert d in name_to_node, "%s is not in graph" % d
T AssertionError: embeddings/(embeddings) is not in graph
done
--> Building model
E Model or data is None, please load model first.
done
E RKNN model data is None, please load model first!


从报错信息看,说embeddings/(embeddings) 不在graph中。可是明明在啊。
我后面还尝试过 “embeddings/embeddings”   "(embeddings)" 都不对。那节点名字要怎么写呢??????



step2
暂且使用上面成功生成的   facenet_Reshape_1.rknn  来做正向推理。
遇到的问题是:rknn模型的输出数据与pb模型不同。
2.1
rknn模型正向推理代码:
  1. from rknn.api import RKNN
  2. import cv2
  3. import numpy as np

  4. INPUT_SIZE = 160


  5. if __name__ == '__main__':

  6.     # Create RKNN object
  7.     rknn = RKNN(verbose=True, verbose_file='./test2.log')

  8.     #load rknn model
  9.     print('--> Loading rknn model')
  10.     rknn.load_rknn('./facenet_Reshape_1.rknn')
  11.     print('done')

  12.     #set inputs
  13.     img1 = np.load('image_1.npy')
  14.     print('img1.type:', type(img1)) #numpy.ndarray
  15.     print('img1.shape:', img1.shape) #(1,160,160,3)
  16.   
  17.     # init runtime environment
  18.     print('--> Init runtime environment')
  19.     ret = rknn.init_runtime()
  20.     if ret != 0:
  21.         print('Init runtime environment failed')
  22.         exit(ret)
  23.     print('done')

  24.     # Inference
  25.     print('--> Running model')
  26.     outputs1 = rknn.inference(inputs=[img1])
  27.     array1 = np.array(outputs1)
  28.     print('output_shape:', array1.shape)
  29.     np.save('./u_Reshape_1.npy', array1)
  30.     print('done')
  31.    
  32.     rknn.release()
复制代码
输出数据保存在  u_Reshape_1.npy 文件中。


facenet的pb模型直接做正向推理的代码:(工具:Anaconda + spyder)
  1. def main(args):

  2.     #images = load_and_align_data(args.image_files, args.image_size, args.margin, args.gpu_memory_fraction)
  3.     images = np.load('./results/image_1.npy')
  4.     print('images_shape:', images.shape) #(1,160,160,3)   

  5.     with tf.Graph().as_default():

  6.         with tf.Session() as sess:
  7.       
  8.             # Load the model
  9.             facenet.load_model(args.model)
  10.             
  11.             #test
  12.             #summary_writer = tf.summary.FileWriter("F:/pyn/spyder_projects/log", sess.graph)
  13.             #test
  14.             
  15.             # Get input and output tensors
  16.             images_placeholder = tf.get_default_graph().get_tensor_by_name("input:0")
  17.             phase_train_placeholder = tf.get_default_graph().get_tensor_by_name("phase_train:0")

  18.             #middle layer
  19.             node_Reshape_1 = tf.get_default_graph().get_tensor_by_name("InceptionResnetV1/Bottleneck/BatchNorm/Reshape_1:0")
  20.             
  21.             # Run forward pass to calculate embeddings
  22.             feed_dict = { images_placeholder: images, phase_train_placeholder:False }
  23.             Reshape_1 = sess.run(node_Reshape_1, feed_dict=feed_dict)
  24.             
  25.             print('Reshape_1 shape:', Reshape_1.shape)
  26.             np.save('./results/Reshape_1.npy', Reshape_1)
复制代码
输出信息(截取):
D [rknn_init:940] Input Tensors:
D [printRKNNTensor:853] index=0 name= n_dims=4 dims=[1 160 160 3] n_elems=76800 size=153600 fmt=NHWC type=FP16 qnt_type=NONE fl=-128 zp=85592704 scale=0.000000
D [rknn_init:953] Output Tensors:
D [printRKNNTensor:853] index=0 name= n_dims=2 dims=[0 0 1 512] n_elems=512 size=1024 fmt=NCHW type=FP16 qnt_type=NONE fl=-128 zp=85592704 scale=0.000000
done
--> Running model
D [rknn_inputs_set:1155] 0 pass_through=0
D [rknn_inputs_set:1173] 0 input.type=3

D [__input_copy:656] UINT8->FLOAT16
I [RK_nn_ConvertTensorToData:595]Create 1024 data.
output_shape: (1, 1, 512)
done

输出数据保存在  Reshape_1.npy 文件中。


对比u_Reshape_1.npy 和 Reshape_1.npy两个文件的数据,理论上它们应该是一样的。因为pb模型转换成rknn模型的时候并没有做量化。
但实际上不同。
  1. import numpy as np

  2. pc_data = np.load('./results/Reshape_1.npy')
  3. u_data = np.load('./results/u_Reshape_1.npy')
  4. print('pc_data.shape:', pc_data.shape)
  5. print('u_data.shape:', u_data.shape)

  6. pc_data = np.squeeze(pc_data)
  7. pc_data_flat = pc_data.flatten()
  8. u_data = np.squeeze(u_data)
  9. print('pc_data_flat.shape:', pc_data_flat.shape)
  10. print('u_data.shape:', u_data.shape)

  11. print(pc_data_flat)
  12. print(u_data)
复制代码

输出:
pc_data.shape: (1, 512)
u_data.shape: (1, 1, 512)
pc_data_flat.shape: (512,)
u_data.shape: (512,)


[-5.74858040e-02  7.62917578e-01 -8.15165758e-01 -1.15798497e+00
-2.25954747e+00 -4.45677876e-01  1.19305098e+00  7.95612752e-01
-1.26038074e+00 -3.16775769e-01  5.00256717e-02  3.58441472e-01
  2.47351110e-01 -2.25165412e-01  6.32283926e-01 -7.77496099e-01
-9.95897710e-01 -1.48216116e+00 -8.97606254e-01 -9.74645317e-01
  1.09282449e-01 -1.73147905e+00  1.52980596e-01  1.66164684e+00
  1.54646719e+00 -8.88299108e-01  3.76475036e-01 -4.77487057e-01 ……]


[ 3.55224609e-01 -7.94433594e-01 -7.58300781e-01  3.95507812e-01
  2.59277344e-01  3.18847656e-01  1.06933594e-01  2.07519531e-01
-4.89501953e-01  1.44409180e-01 -1.46484375e-01  4.59716797e-01
-6.03027344e-01 -3.54736328e-01  1.63940430e-01 -3.79150391e-01
  4.98046875e-01  3.13476562e-01  5.80566406e-01 -4.04296875e-01
  9.24682617e-02  1.11145020e-01  4.24804688e-01 -1.87500000e-01

  1.63940430e-01  1.01852417e-02  4.87304688e-01 -4.87365723e-02 ……]

2.2
这个数据不同,也许是有误差,要看最终能否作为特征向量识别人脸。所以我用4张测试图,预处理后保存在images.npy,然后加载进来,images.shape=(4,160,160,3).
得出 Reshape_1节点的向量后,做 L2-norm,得到最终的embeddings。对比pb模型结果和rknn模型结果。

**pb模型正向推理出embeddings, 并计算这4个向量两两之间的距离:
Distance matrix
        0         1         2         3     
0    0.0000    0.8396    1.4851    1.4614  
1    0.8396    0.0000    1.4103    1.3784  
2    1.4851    1.4103    0.0000    0.4041  
3    1.4614    1.3784    0.4041    0.0000
其中 0/1是同一个人的两张人脸图片,2/3另一个人的两张人脸图片。
可以看出,同一个人的不同照片之间的距离较小,不同人之间的人脸图片距离较大,能够正确识别。

**rknn模型正向推理出embeddings, 并计算这4个向量两两之间的距离:
Distance matrix
                0                        1                        2                        3        
0                0.0000                0.8973                0.7701                0.7091        
1                0.8973                0.0000                0.9278                1.0162        
2                0.7701                0.9278                0.0000                0.5400        
3                0.7091                1.0162                0.5400                0.0000
rknn模型结果就不能识别人脸了。


2.3
那么数据是从哪一层开始不同的呢?
我以 input节点作为输入, 经过一个 conv+relu 后的节点('InceptionResnetV1/Conv2d_1a_3x3/Relu')作为输出,比对pb模型和rknn模型数据。

在RK虚拟机中,由于需要提取中间层数据,所以重新build出新的rknn模型。
  1.     #load tensorflow model
  2.     print('--> Loading model')
  3.     rknn.load_tensorflow(tf_pb='./20180402-114759.pb',
  4.                          inputs=['input'],
  5.                          outputs=['InceptionResnetV1/Conv2d_1a_3x3/Relu'],                        
  6.                          input_size_list=[[INPUT_SIZE, INPUT_SIZE, 3]])                  
  7.     print('done')
复制代码
成功build, 模型保存在 facenet_Conv2d_1a_3x3_Relu.rknn
经过inference之后,得到输出数据,保存在 u_Conv2d_1a_3x3_Relu.npy
output.shape: (1, 1, 199712), 也就是说把(79,79,32)展开了。

pb模型也推理到节点('InceptionResnetV1/Conv2d_1a_3x3/Relu'),输出数据保存在Conv2d_1a_3x3_Relu.npy
output.shape:(1, 79, 79, 32)


对比数据
  1. import numpy as np

  2. pc_data = np.load('./results/Conv2d_1a_3x3_Relu.npy')
  3. u_data = np.load('./results/u_Conv2d_1a_3x3_Relu.npy')
  4. print('pc_data.shape:', pc_data.shape)
  5. print('u_data.shape:', u_data.shape)

  6. pc_data = np.squeeze(pc_data)
  7. u_data = np.squeeze(u_data)
  8. u_data_reshape = np.reshape(u_data, (32,79,79))
  9. print('pc_data.shape:', pc_data.shape)
  10. print('u_data_reshape.shape:', u_data_reshape.shape)

  11. print(pc_data[:,:,0])
  12. print(u_data_reshape[0,:,:])
复制代码
输出:
pc_data.shape: (1, 79, 79, 32)
u_data.shape: (1, 1, 199712)
pc_data.shape: (79, 79, 32)
u_data_reshape.shape: (79, 79, 32)

Conv2d_1a_3x3_Relu.npy   (pb模型推理的中间结果)
[[4.496504  3.5792322 3.279057  ... 4.1851587 4.199727  3.9860177]
[4.719177  3.80474   4.060274  ... 4.194205  4.0994143 4.004091 ]
[5.30498   4.7206473 4.2815747 ... 5.621602  5.3078156 4.4923596]
...
[2.477302  2.6923387 2.561545  ... 2.3765404 2.049178  1.906026 ]
[2.5384846 2.833478  2.7111642 ... 2.4625208 2.2596824 2.001416 ]
[2.5216506 3.0539947 3.2769814 ... 2.7133694 2.408282  2.0306435]]

u_Conv2d_1a_3x3_Relu.npy   (rknn模型推理的中间结果)
[[ 93.375   400.      344.75    ... 270.75    261.      367.75   ]
[237.875   195.      222.125   ... 547.      174.25     55.28125]
[578.5     379.25    381.5     ... 368.25    264.75    209.875  ]
...
[347.25    249.      255.125   ... 276.75    266.      251.75   ]
[242.75    238.375   167.      ... 357.5     308.25    290.5    ]
[ 75.375   286.25    340.25    ... 259.25     73.8125  292.5    ]]

从结果看,这两个数据不同,而且数量级都不同。

是否是输入数据有问题呢?
上文中 image_1.npy 是经过预处理的。
(1)原始图像image: [0,255],
(2)读入后为“RGB” .   img = misc.imread(os.path.expanduser(image), mode='RGB')
(3)再经过归一化函数:
  1. def prewhiten(x):
  2.     mean = np.mean(x)
  3.     std = np.std(x)
  4.     std_adj = np.maximum(std, 1.0/np.sqrt(x.size))
  5.     y = np.multiply(np.subtract(x, mean), 1/std_adj)
  6.     return y  
复制代码
rknn模型build的时候,并没有做任何处理(  rknn.config(channel_mean_value='0 0 0 1', reorder_channel='0 1 2')    )
那么image_1中的数据格式是 float64,是否可以直接作为rknn模型的输入呢?
在pc端运行pd模型的时候,也是输入的image_1.npy。两者输入是一样的,但rknn模型是否支持呢?会不会自己内部转换呢?



总结两个问题:
1. rknn模型在build的时候,input 、output 列表要怎么写?
参考tensorboard可视化出来的节点名字(  "embeddings/(embeddings)"  )为什么会出错?
2. rknn模型推理出来的数据和pd模型推理出来的数据不同,而且是经过第一个(conv+relu)之后数据就不同了。数量级都不同。
以上是哪里理解错了?





作者: jefferyzhang    时间: 2019-8-7 10:01
从代码里看,
1. 你的traning node没有关闭,推理时候引入training node是有可能造成结果随机的,特别是带dropout时候
2. inputoutput是代码里定义的,可以知道,不知道的话直接print 那层.name 就可以知道。也可以下载netron这个app来看模型,列出来的name是完整的
3. 推理出来数据不同可能原因就是同第一点,你的traning node没去掉,带有一些特殊训练的op。 第二就是先关闭量化看看结果是否一致。 第三,input数据的归一化设置是否正确
作者: puyanan    时间: 2019-8-7 17:12
本帖最后由 puyanan 于 2019-8-7 17:34 编辑
jefferyzhang 发表于 2019-8-7 10:01
从代码里看,
1. 你的traning node没有关闭,推理时候引入training node是有可能造成结果随机的,特别是带d ...

    rknn.load_tensorflow(tf_pb='./20180402-114759.pb',
                         inputs=['input','phase_train'],
                         outputs=['embeddings'],                        
                         input_size_list=[[INPUT_SIZE, INPUT_SIZE, 3], [1]])
输入输出节点名字我对照过了,是这样子的。而且这个pb模型是可以跑通的。pb模型正向推理的代码截取:
            # Get input and output tensors
            images_placeholder = tf.get_default_graph().get_tensor_by_name("input:0")
            phase_train_placeholder = tf.get_default_graph().get_tensor_by_name("phase_train:0")
            embeddings = tf.get_default_graph().get_tensor_by_name("embeddings:0")

            # Run forward pass to calculate embeddings
            feed_dict = { images_placeholder: images, phase_train_placeholder:False }
            emb = sess.run(embeddings, feed_dict=feed_dict)

但是我在rk虚拟机里报错“T KeyError: "The name 'phase_train:0' refers to a Tensor which does not exist. The operation, 'phase_train', does not exist in the graph."”

node {
  name: "phase_train"
  op: "Placeholder"
节点类型是“Placeholder”,不能作为输入吗?

请问还有什么办法可以设置 phase_train:False? 也就是training node 如何关掉呢?
作者: puyanan    时间: 2019-8-7 17:22
本帖最后由 puyanan 于 2019-8-7 17:45 编辑
jefferyzhang 发表于 2019-8-7 10:01
从代码里看,
1. 你的traning node没有关闭,推理时候引入training node是有可能造成结果随机的,特别是带d ...

我上面的代码中没有开量化  rknn.build(do_quantization=False) 。

input数据的归一化问题:
rknn的归一化方式固定,如果是其他形式的归一化就无法做到了。
channel_mean_value:包括四个值(M0 M1 M2 S0)
Cout0 = (Cin0 - M0)/S0
Cout1 = (Cin1 - M1)/S0
Cout2 = (Cin2 - M2)/S0

而我下载的facenet项目归一化方式不同,首先读取image:0-255,再将"BGR"转换成“RGB”,再送入预处理函数
def prewhiten(x):
    mean = np.mean(x)
    std = np.std(x)
    std_adj = np.maximum(std, 1.0/np.sqrt(x.size))
    y = np.multiply(np.subtract(x, mean), 1/std_adj)
    return y

我把数据事先做好归一化,保存到npy中,再读取npy作为rknn的输入,不需要rknn模型做任何归一化,所以config设置成这样:
rknn.config(channel_mean_value='0 0 0 1', reorder_channel='0 1 2')
我的理解有错误吗?


如果理解没有错,请问 "E Catch exception when loading tensorflow model: ./20180402-114759.pb!" 这个问题还应该从哪方面考虑呢?


作者: jefferyzhang    时间: 2019-8-8 13:56
pb用tensorflow载入跑过么?
作者: puyanan    时间: 2019-8-8 14:10
jefferyzhang 发表于 2019-8-8 13:56
pb用tensorflow载入跑过么?

跑过的,就是 https://github.com/davidsandberg/facenet 这个项目,src/compare.py载入pb模型,正向推理,结果正确的。
作者: jefferyzhang    时间: 2019-8-9 12:51
哦,刚看出来,你这里多输入了,目前rknn只支持单输入多输出。
所以你模型固化时候phase_train要固化成固定值,或者使用npz传入,具体可以看看文档。
作者: puyanan    时间: 2019-8-9 16:35
jefferyzhang 发表于 2019-8-9 12:51
哦,刚看出来,你这里多输入了,目前rknn只支持单输入多输出。
所以你模型固化时候phase_train要固化成固定 ...

谢谢版主回复,我去试一下重新生成固化模型。
作者: jiajia1990    时间: 2019-8-20 16:43
puyanan 发表于 2019-8-9 16:35
谢谢版主回复,我去试一下重新生成固化模型。

楼主你好,你的问题解决了吗?怎么解决的?
作者: xiaqing10    时间: 2019-8-21 09:35
分享下可以转faceNet模型的Pb文件. 输入输出如下,pb 链接为 可以转rknn的faceNet的pb模型
提取码: y3uc
inputs=['input_1'],
outputs=['strided_slice'],
input_size_list=[[160, 160, 3]].
作者: puyanan    时间: 2019-8-26 09:48
xiaqing10 发表于 2019-8-21 09:35
分享下可以转faceNet模型的Pb文件. 输入输出如下,pb 链接为  可以转rknn的faceNet的pb模型
提取码: y3uc
in ...

谢谢分享。我用Netron能打开您的pb模型查看结构,但是我的pb模型打不开,应该是模型本身有问题了。这事阁下了还没解决,今天才看到您的回复。
作者: puyanan    时间: 2019-9-19 11:54
本帖最后由 puyanan 于 2019-9-19 13:30 编辑
xiaqing10 发表于 2019-8-21 09:35
分享下可以转faceNet模型的Pb文件. 输入输出如下,pb 链接为  可以转rknn的faceNet的pb模型
提取码: y3uc
in ...

您好。您的模型确实是单输入的 inputs=['input_1'],我用Netron打开pb文件,很复杂,没有代码参考看不出网络结构来。所以我想改一改原来的pb文件,它有两个输入,feed_dict = { images_placeholder: images, phase_train_placeholder:False },在rknn.load_tensorflow中就要写成“inputs=['input','phase_train']” 。可是版主说不支持多输入,要重新固化模型。我搜素了一些资料,还是没明白,怎么把phase_train固定为false呢?也就是说,读入现有的pb模型,然后将phase_train_placeholder固定为False,再重新保存为pb文件。下次入读就只有一个输入inputs=['input']。请问将placeholder转换成constant可行吗?
作者: xiaqing10    时间: 2019-9-19 18:13
puyanan 发表于 2019-9-19 11:54
您好。您的模型确实是单输入的 inputs=['input_1'],我用Netron打开pb文件,很复杂,没有代码参考看不出网 ...

我是把Pb直接转为了keras. 更改了输入,将train_phase=False .然后再转为Pb模型即可
作者: puyanan    时间: 2019-9-20 14:35
xiaqing10 发表于 2019-9-19 18:13
我是把Pb直接转为了keras. 更改了输入,将train_phase=False .然后再转为Pb模型即可 ...

您好,十分感谢您给的思路,我自己还不熟悉tf和keras,是想不到这些办法的,感谢。我按照您的思路,想在keras中加载pb模型,再设置train_phase=False,可是不会加载pb模型,load_model函数不行,找了文档中from keras import backend as K相关的后端函数,没有找到办法。请问您是怎么做的?
作者: puyanan    时间: 2019-9-21 14:58
jefferyzhang 发表于 2019-8-9 12:51
哦,刚看出来,你这里多输入了,目前rknn只支持单输入多输出。
所以你模型固化时候phase_train要固化成固定 ...

版主,您好。我发现phase_train的类型是placeholder,无法设置为固定值再固化,请问您是怎么做的呢?现在有一个预训练好的pb文件,不重新训练的情况下怎么修改这个pb文件变成单输入呢? 有一位朋友说是转换成keras再设置phase_train=False后重新固化,可是我没有领会。请问您是如何做的呢?
作者: puyanan    时间: 2019-9-21 15:01
jiajia1990 发表于 2019-8-20 16:43
楼主你好,你的问题解决了吗?怎么解决的?

抱歉,我没解决,你有办法了吗?
作者: jefferyzhang    时间: 2019-9-22 10:08
puyanan 发表于 2019-9-21 14:58
版主,您好。我发现phase_train的类型是placeholder,无法设置为固定值再固化,请问您是怎么做的呢?现在 ...

1.2版本rknn-toolkit允许多输入了,所以你可以不用固化placeholder
作者: puyanan    时间: 2019-9-23 11:06
jefferyzhang 发表于 2019-9-22 10:08
1.2版本rknn-toolkit允许多输入了,所以你可以不用固化placeholder

谢谢版主,我去试试。
作者: liuwenhua    时间: 2019-11-18 10:37
jefferyzhang 发表于 2019-8-9 12:51
哦,刚看出来,你这里多输入了,目前rknn只支持单输入多输出。
所以你模型固化时候phase_train要固化成固定 ...

版主,phase_train怎么固化成固定值呢?
作者: liuwenhua    时间: 2019-11-18 10:38
puyanan 发表于 2019-8-9 16:35
谢谢版主回复,我去试一下重新生成固化模型。

你的问题解决?
作者: liuwenhua    时间: 2019-11-18 16:48
xiaqing10 发表于 2019-9-19 18:13
我是把Pb直接转为了keras. 更改了输入,将train_phase=False .然后再转为Pb模型即可 ...

你的最终测试结果怎么样?
作者: puyanan    时间: 2019-12-5 11:11
liuwenhua 发表于 2019-11-18 10:38
你的问题解决?

1.2版本的可以多个输入. facenet我还没完成测性能。
作者: LSC    时间: 2019-12-20 11:23
请问输出维度展开了原因找到了吗,我现在也是遇到一个问题,输出维度本应是(1,2,128,128),结果变成了(1,2*128*128)
作者: geoergecyr    时间: 2021-1-5 14:06
xiaqing10 发表于 2019-8-21 09:35
分享下可以转faceNet模型的Pb文件. 输入输出如下,pb 链接为  可以转rknn的faceNet的pb模型
提取码: y3uc
in ...

您好,能否再分享一下pb模型,这个已经失效了。谢谢。
作者: sunkai    时间: 2021-4-10 15:41
您好,请问一下facenet的推理结果怎么样,和pc上面的差距大吗
作者: sunkai    时间: 2021-4-10 15:45
您好,github上有源码吗/参考一下
作者: sunkai    时间: 2021-6-4 11:48
请问一下,后来测试facenet性能怎么样




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3