Хобрук: Ваш путь к мастерству в программировании

Ошибка преобразования файла модели Facenet .pb в формат TFLITE.

Я пытаюсь преобразовать предварительно обученный замороженный .pb на основе Inception ResNet, который я получил от Дэвида Сэндберга Github с помощью конвертера Tensorflow Lite в Ubuntu, используя следующую команду:

/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

Однако я получаю следующую ошибку:

2018-12-03 15:03:16.807431: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
Traceback (most recent call last):
File "/home/nils/.local/bin/tflite_convert", line 11, in <module>
sys.exit(main())
File "/home/nils/.local/lib/python3.6/site-packages/tensorflow/contrib/lite/python/tflite_convert.py", line 412, in main
app.run(main=run_main, argv=sys.argv[:1])
File "/home/nils/.local/lib/python3.6/site-packages/tensorflow/python/platform/app.py", line 125, in run
_sys.exit(main(argv))
File "/home/nils/.local/lib/python3.6/site-packages/tensorflow/contrib/lite/python/tflite_convert.py", line 408, in run_main
_convert_model(tflite_flags)
File "/home/nils/.local/lib/python3.6/site-packages/tensorflow/contrib/lite/python/tflite_convert.py", line 162, in _convert_model
output_data = converter.convert()
File "/home/nils/.local/lib/python3.6/site-packages/tensorflow/contrib/lite/python/lite.py", line 453, in convert
**converter_kwargs)
File "/home/nils/.local/lib/python3.6/site-packages/tensorflow/contrib/lite/python/convert.py", line 342, in toco_convert_impl
input_data.SerializeToString())
File "/home/nils/.local/lib/python3.6/site-packages/tensorflow/contrib/lite/python/convert.py", line 135, in toco_convert_protos
(stdout, stderr))
RuntimeError: TOCO failed see console for info.
b'2018-12-03 15:03:26.006252: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1080] Converting unsupported operation: FIFOQueueV2\n2018-12-03 15:03:26.006322: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1127] Op node missing output type attribute: batch_join/fifo_queue\n2018-12-03 15:03:26.006339: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1080] Converting unsupported operation: QueueDequeueUpToV2\n2018-12-03 15:03:26.006352: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1127] Op node missing output type attribute: batch_join\n2018-12-03 15:03:27.496676: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Before Removing unused ops: 5601 operators, 9399 arrays (0 quantized)\n2018-12-03 15:03:28.603936: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] After Removing unused ops pass 1: 3578 operators, 6254 arrays (0 quantized)\n2018-12-03 15:03:29.418074: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Before general graph transformations: 3578 operators, 6254 arrays (0 quantized)\n2018-12-03 15:03:29.420354: F tensorflow/contrib/lite/toco/graph_transformations/resolve_batch_normalization.cc:42] 
Check failed: IsConstantParameterArray(*model, bn_op->inputs[1]) && IsConstantParameterArray(*model, bn_op->inputs[2]) && IsConstantParameterArray(*model, bn_op->inputs[3]) Batch normalization resolution requires that mean, multiplier and offset arrays be constant.\nAborted (core dumped)\n'
None

Если я правильно понял, это может быть из-за двух неподдерживаемых операций, QueueDequeueUpToV2 и FIFOQueueV2, но я не знаю наверняка. У вас есть идеи, в чем может быть проблема или как я могу решить эту ошибку? Что вообще означает эта ошибка? Я хочу, чтобы эта модель работала на мобильном устройстве Android, есть ли альтернативы? Версии: Tensorflow V1.12 Python 3.6.7 Ubuntu 18.04.1 LTS на VirtualBox Заранее благодарим!


  • Вы используете слой BatchNormalization в своей сети? 03.12.2018
  • На самом деле я не знаю, так как это предварительно обученная модель, которую я только что скачал с Дэвида Сэндберга на Github. Это похоже на архитектуру. и это точная модель, которую я использую. Большое спасибо, Шубхам, я в значительной степени заблудился. 03.12.2018
  • Как вы заморозили график TF? Похоже, вы столкнулись с аналогичной проблемой, описанной здесь. Вы пробовали загрузить модель и сохранить ее, чтобы убедиться, что все сделано правильно? Альтернативой может быть DL4J (Deep Learning for Java). 17.01.2019
  • Спасибо за ваш ответ! Да, это действительно похоже на некоторую (еще не) поддерживаемую операцию или уровень. Тем временем я нашел решение, которое сработало для меня. Комплект машинного обучения Google Firebase предлагает готовую к использованию NN для распознавания лиц (ориентиров), которая отлично работает. Что касается SVM-части сети Дэвида Сэндберга, я использовал Android-оболочку libsvm. Но DL4J действительно звучит интересно, спасибо :) 17.01.2019

Ответы:


1

Я решил эту проблему здесь, добавив здесь фрагмент кода:

Я смог преобразовать FaceNet .pb в .tflite модель, и следующие инструкции для этого:

Мы проведем количественный анализ предварительно обученной модели Facenet с размером встраивания 512. Размер этой модели до квантования составляет около 95 МБ.

$ 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)

Вывод интерпретатора:

$ 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'>}]

Надеюсь это поможет!

26.02.2019
  • Спасибо, Милинд! У меня это тоже сработало. Чтобы расширить ваш ответ, он также работает на Python2.7. pip install pathlib will enable inference_graph для запуска. 21.03.2019
  • Спасибо, Милинд, я выберу твой ответ, как только смогу его подтвердить. Тем временем я использовал библиотеку Google Firebase ML. Он предлагает довольно похожий NN для распознавания лиц и отлично работает :) 01.04.2019
  • У меня та же проблема, но с другой моделью (mobilenet_v2 для openpose), поскольку ваше решение зависит от inception_resnet_v1.inference(), я не могу преобразовать его в свою проблему. Кто-нибудь знает, как вообще исправить эту проблему? Я предполагаю, что это включает в себя исправление всех параметров пакетной нормы перед замораживанием графика, но я не уверен, как это сделать. 30.07.2019

  • 2

    Мне не повезло с предложениями @ milind-deore. Модель действительно уменьшилась до 23 МБ, но растраты вроде бы сломаны.

    Я нашел альтернативный способ: TF -> Keras -> TF Lite

    Реализацию FaceNet Дэвида Сэндберга можно преобразовать в TensorFlow Lite, сначала преобразуя из TensorFlow в Keras, а затем из Keras в TensorFlow Lite.

    Я создал эту Google Colab, которая выполняет преобразование. Большая часть кода была взята отсюда.

    Что он делает, так это:

    1. Загрузите реализацию Keras FaceNet Хироки Таняй
    2. Замените файл inception_resnet_v1.py с помощью моей исправленной версии (который добавляет к модели дополнительный уровень для вывода нормализованных вложений)
    3. Загрузите предварительно обученную модель Сэндберга (20180402-114759) с здесь и расстегивает это
    4. Извлеките тензоры из файла контрольной точки и запишите веса в несколько массивов на диске, сопоставив имя каждого соответствующего слоя.
    5. Создайте новую модель Keras со случайными весами (Важно: используйте 512 классов).
    6. Запишите веса для каждого соответствующего слоя, считывающего из массивов numpy.
    7. Сохраните модель в формате Keras .h5
    8. Преобразуйте Keras в TensorFlow Lite с помощью команды tflite_convert.

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

    Также в моем Colab я привожу код, чтобы показать, что преобразование хорошее и модель TFLite работает.

    Сравнение лиц Билла Гейтса и Ларри Пейджа

    distance bill vs bill 0.7266881 distance bill vs larry 1.2134411

    Таким образом, даже если я не выравниваю лица, порог около 1,2 был бы хорош для распознавания.

    Надеюсь, это поможет!

    16.06.2020
  • спасибо за подробные инструкции! Я разберусь! 16.06.2020
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...