RV1126で顔認識を実現----MobileFaceNetをrknnモデルに

コンテンツ

1.モデルのダウンロード

 2rknnモデルと理由に変換します

3ネットワークモデルを表示する


1.モデルのダウンロード

最初にMobileFaceNetのモデルをダウンロードします。githubのダウンロードアドレスは次のとおりです。https ://github.com/sirius-ai/MobileFaceNet_TF/tree/master/arch/pretrained_model/

 2rknnモデルと理由に変換します

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個のフロート機能であり、結果は次のようになります。

 取得する出力レイヤーが#outputs = ['embeddings']の場合、結果は-1 1--11になります。

3ネットワークモデルを表示する

エクスポートされたrknnモデルを表示するためにnetronを使用します。

 

おすすめ

転載: blog.csdn.net/u013171226/article/details/123688544