目录
1.模型下载
首先下载MobileFaceNet的模型,github下载地址为:https://github.com/sirius-ai/MobileFaceNet_TF/tree/master/arch/pretrained_model/
2 转成rknn模型并推理
import numpy as np
import cv2
from rknn.api import RKNN
if __name__ == '__main__':
# Create RKNN object
rknn = RKNN()
# pre-process config
print('--> config model')
rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], reorder_channel='0 1 2', target_platform='rv1126',
quantized_dtype='asymmetric_affine-u8', optimization_level=3, output_optimize=1)
# rknn.config(channel_mean_value='103.94 116.78 123.68 58.82', reorder_channel='0 1 2')
print('done')
# Load tensorflow model
print('--> Loading model')
ret = rknn.load_tensorflow(tf_pb='./MobileFaceNet_9925_9680.pb', inputs=['input'],
#outputs=['embeddings'],
outputs=['MobileFaceNet/Logits/SpatialSqueeze'],
input_size_list=[[112, 112, 3]])
##ret = rknn.load_tensorflow(tf_pb='./MobileFaceNet_9925_9680.pb')
############################################################################
# 此处使用 inputs=['input'] 单输入是没问题的,也不会存在前面帖子里面说的要关闭 train_node 问题
# 因为 phase_train_placeholder = tf.placeholder_with_default(tf.constant(False, dtype=tf.bool), shape=None, name='phase_train')
# 这里是有一个默认值的 False
# 我尝试过 在对pb模型进行测试时,feed_dict 加不加 phase_train_placeholder 选项其推理结果是一样的
# 如: feed_dict = {images_placeholder: normed, phase_train_placeholder: False}
# feed_dict2 = {images_placeholder: normed}
# embs = sess.run(embeddings, feed_dict=feed_dict)
# embs2 = sess.run(embeddings, feed_dict=feed_dict2)
# print(embs-embs2)
# 结果为 全 0.
# 但是运行报错:
# E File "rknn/api/rknn_runtime.py", line 303, in rknn.api.rknn_runtime.RKNNRuntime.build_graph
# E Exception: RKNN init failed. error code: RKNN_ERR_MODEL_INVALID
# E Current device id is: None
# E Devices connected:
# Init runtime environment failed
# E ['TS018082190800251']
############################################################################
if ret != 0:
print('Load mobilenet_v1 failed!')
exit(ret)
print('done')
# Build model
print('--> Building model')
ret = rknn.build(do_quantization=True, dataset='./dataset.txt')
if ret != 0:
print('Build mobilenet_v1 failed!')
exit(ret)
print('done')
# Export rknn model
print('--> Export RKNN model')
ret = rknn.export_rknn('./mobilefacenet.rknn')
if ret != 0:
print('Export mobilefacenet.rknn failed!')
exit(ret)
print('done')
# Set inputs
img = cv2.imread('./ldh.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img,(112, 112))
# init runtime environment
print('--> Init runtime environment')
#ret = rknn.init_runtime(target='rv1126')
ret = rknn.init_runtime()
if ret != 0:
print('Init runtime environment failed')
exit(ret)
print('done')
# Inference
print('--> Running model')
outputs = rknn.inference(inputs=[img])
print('len(outputs[0][0])::', len(outputs[0][0]))
print("outputs::", outputs)
print('done')
# perf
print('--> Begin evaluate model performance')
perf_results = rknn.eval_perf(inputs=[img])
print('done')
print("perf_results:", perf_results)
rknn.release()
这里我们获取的输出层是outputs=['MobileFaceNet/Logits/SpatialSqueeze'],为128个float特征,结果如下
如果我们获取的输出层是 #outputs=['embeddings'],那么结果是-1 1 - 1 1这种,
3 查看网络模型
我们用netron查看导出的rknn模型,可以看到