将Facenet模型.pb文件转换为TFLITE格式时出错

时间:2018-12-03 15:11:36

标签: python tensorflow face-recognition tensorflow-lite toco

我正尝试使用以下命令在Ubuntu上使用Tensorflow Lite Converter转换基于我从David Sandbergs Github获得的Inception ResNet的经过预训练的冻结.pb:

auto ia = new InterfaceA();
auto ca = ControlerA(ia);
ca.commonMethod();  // Method defined in the base class
ca.uniqueMethod();  // Method defined in InterfaceA only

但是,出现以下错误:

/home/nils/.local/bin/tflite_convert
--output_file=/home/nils/Documents/frozen.tflite
--graph_def_file=/home/nils/Documents/20180402-114759/20180402-114759.pb 
--input_arrays=input 
--output_arrays=embeddings 
--input_shapes=1,160,160,3

如果我做对了,这可能是由于两个不受支持的Ops,QueueDequeueUpToV2和FIFOQueueV2,但是我不确定。 您有任何想法可能是什么问题,或者我如何解决此错误?该错误甚至意味着什么?我希望此模型在移动android设备上运行,还有其他选择吗? 版本: Tensorflow V1.12 的Python 3.6.7 Ubuntu 18.04.1 LTS 在VirtualBox上 预先感谢!

2 个答案:

答案 0 :(得分:3)

我对@ milind-deore的建议不走运。 该模型的确减小到23 MB,但嵌入似乎已损坏。

我发现了另一种方式:TF-> Keras-> TF Lite

David Sandberg的FaceNet实现可以转换为TensorFlow Lite,首先将从TensorFlow转换为Keras,然后从Keras转换为TensorFlow Lite

我创建了this Google Colab来进行转换。 大部分代码都摘自from here

它的作用如下:

  1. 下载Hiroki Taniai's Keras FaceNet implementation
  2. 使用my patched version覆盖inception_resnet_v1.py文件(这确实为模型增加了一层,以使标准化嵌入作为输出)
  3. here下载Sandberg的预训练模型(20180402-114759),并将其解压缩
  4. 从检查点文件中提取张量,并将权重写入磁盘上的numpy数组,从而映射每个对应层的名称。
  5. 使用随机权重创建一个新的Keras模型(重要:使用512个类)。
  6. 写出从numpy数组中读取的每个对应图层的权重。
  7. 以Keras格式.h5存储模型
  8. 使用命令“ tflite_convert”将Keras转换为TensorFlow Lite。

    tflite_convert --post_training_quantize --output_file facenet.tflite --keras_model_file /content/keras-facenet/model/keras/model/facenet_keras.h5

还在我的Colab中,我提供了一些代码来表明转换效果很好,并且TFLite模型确实可以工作。

Comparing faces from Bill Gates and Larry Page

distance bill vs bill 0.7266881 distance bill vs larry 1.2134411

因此,即使我没有对齐人脸,大约1.2的阈值也将很容易识别。

希望有帮助!

答案 1 :(得分:1)

我已经解决了此问题here,并在此处添加了代码段:

我可以将FaceNet .pb转换为.tflite模型,并按照以下说明进行操作:

我们将量化具有512嵌入大小的预训练Facenet model。在进行量化之前,该模型的大小约为95MB。

$ ls -l model_pc
total 461248
-rw-rw-r--@ 1 milinddeore  staff   95745767 Apr  9  2018 20180402-114759.pb

使用以下代码创建文件inference_graph.py

import tensorflow as tf
from src.models import inception_resnet_v1
import sys
import click
from pathlib import Path

@click.command()
@click.argument('training_checkpoint_dir', type=click.Path(exists=True, file_okay=False, resolve_path=True))
@click.argument('eval_checkpoint_dir', type=click.Path(exists=True, file_okay=False, resolve_path=True))

def main(training_checkpoint_dir, eval_checkpoint_dir):
    traning_checkpoint = Path(training_checkpoint_dir) / "model-20180402-114759.ckpt-275"
    eval_checkpoint = Path(eval_checkpoint_dir) / "imagenet_facenet.ckpt"
    data_input = tf.placeholder(name='input', dtype=tf.float32, shape=[None, 160, 160, 3])
    output, _ = inception_resnet_v1.inference(data_input, keep_probability=0.8, phase_train=False, bottleneck_layer_size=512)
    label_batch= tf.identity(output, name='label_batch')
    embeddings = tf.identity(output, name='embeddings')
    init = tf.global_variables_initializer()
    with tf.Session() as sess:
        sess.run(init)
        saver = tf.train.Saver()
        saver.restore(sess, traning_checkpoint.as_posix())
        save_path = saver.save(sess, eval_checkpoint.as_posix())
        print("Model saved in file: %s" % save_path)

if __name__ == "__main__":
     main()

在预训练的模型上运行此文件,将生成模型以进行推断。下载预训练的模型并将其解压缩到model_pre_trained /目录。 确保您的python≥3.4版本。

python3 eval_graph.py model_pre_trained/ model_inference/

FaceNet提供了freeze_graph.py文件,我们将使用它来冻结推理模型。

python3  src/freeze_graph.py model_inference/  my_facenet.pb

一旦生成冻结模型,就可以将其转换为.tflite

$ tflite_convert --output_file model_mobile/my_facenet.tflite --graph_def_file my_facenet.pb  --input_arrays "input" --input_shapes "1,160,160,3" --output_arrays embeddings --output_format TFLITE --mean_values 128 --std_dev_values 128 --default_ranges_min 0  --default_ranges_max 6 --inference_type QUANTIZED_UINT8 --inference_input_type QUANTIZED_UINT8

让我们检查量化模型的大小:

$ ls -l model_mobile/
total 47232
-rw-r--r--@ 1 milinddeore  staff  23667888 Feb 25 13:39 my_facenet.tflite

交易人代码:

 import numpy as np
 import tensorflow as tf


 # Load TFLite model and allocate tensors.
 interpreter = tf.lite.Interpreter(model_path="/Users/milinddeore/facenet/model_mobile/my_facenet.tflite")
 interpreter.allocate_tensors()

 # Get input and output tensors.
 input_details = interpreter.get_input_details()
 output_details = interpreter.get_output_details()

 # Test model on random input data.
 input_shape = input_details[0]['shape']
 input_data = np.array(np.random.random_sample(input_shape), dtype=np.uint8)
 interpreter.set_tensor(input_details[0]['index'], input_data)

 interpreter.invoke()
 output_data = interpreter.get_tensor(output_details[0]['index'])

 print('INPUTS: ')
 print(input_details)
 print('OUTPUTS: ')
 print(output_details)

Interpeter输出:

$ python inout.py
INPUTS:
[{'index': 451, 'shape': array([  1, 160, 160,   3], dtype=int32), 'quantization': (0.0078125, 128L), 'name': 'input', 'dtype': <type 'numpy.uint8'>}]
OUTPUTS:
[{'index': 450, 'shape': array([  1, 512], dtype=int32), 'quantization': (0.0235294122248888, 0L), 'name': 'embeddings', 'dtype': <type 'numpy.uint8'>}]

希望这会有所帮助!