web-dev-qa-db-fra.com

Tensorflow Convertir un fichier pb en TFLITE en utilisant python

Je suis nouveau avec le travail sur Tensorflow. J'ai un modèle enregistré après la formation en tant que fichier pb, je veux utiliser tensorflow mobile et il est important de travailler avec le fichier TFLITE. Le problème est que la plupart des exemples que j'ai trouvés après avoir recherché les convertisseurs sur Google sont des commandes sur le terminal ou cmd. Pouvez-vous me partager un exemple de conversion en fichiers tflite en utilisant le code python?

Merci

5
Nael Marwan

Suite à cela exemple TF vous pouvez passer le paramètre "--Saved_model_dir" pour exporter le dossier saved_model.pb et variables dans un répertoire (aucun répertoire existant) avant d'exécuter le script retrain.py:

python retrain.py ...... --saved_model_dir /home/..../export

Afin de convertir votre modèle en tflite, vous devez utiliser la ligne ci-dessous:

convert_saved_model.convert(saved_model_dir='/home/.../export',output_arrays="final_result",output_tflite='/home/.../export/graph.tflite')

Remarque: vous devez importer convert_saved_model:

à partir de tensorflow.contrib.lite.python import convert_saved_model

N'oubliez pas que vous pouvez convertir en tflite de 2 manières:

enter image description here

Mais la façon la plus simple est d'exporter saved_model.pb avec des variables au cas où vous voudriez éviter d'utiliser des outils de construction comme Bazel.

1
Nael Abd eljawad

Vous pouvez convertir directement en tflite dans python directement. Vous devez figer le graphique et utiliser toco_convert . Il a besoin des noms d'entrée et de sortie et les formes à déterminer avant d'appeler l'API comme dans le cas de la ligne de commande.

Un exemple d'extrait de code

Copié de documentation , où un graphique "gelé" (sans variables) est défini dans le cadre de votre code:

import tensorflow as tf

img = tf.placeholder(name="img", dtype=tf.float32, shape=(1, 64, 64, 3))
val = img + tf.constant([1., 2., 3.]) + tf.constant([1., 4., 4.])
out = tf.identity(val, name="out")
with tf.Session() as sess:
  tflite_model = tf.contrib.lite.toco_convert(sess.graph_def, [img], [out])
  open("test.tflite", "wb").write(tflite_model)

Dans l'exemple ci-dessus, il n'y a pas d'étape de gel du graphe car il n'y a pas de variables. Si vous avez des variables et exécutez toco sans geler le graphique, c'est-à-dire en convertissant d'abord ces variables en constantes, alors toco se plaindra!

Si vous avez gelé graphdef et connaissez les entrées et sorties

Ensuite, vous n'avez pas besoin de la session. Vous pouvez appeler directement l'API toco:

path_to_frozen_graphdef_pb = '...'
input_tensors = [...]
output_tensors = [...]
frozen_graph_def = tf.GraphDef()
with open(path_to_frozen_graphdef_pb, 'rb') as f:
  frozen_graph_def.ParseFromString(f.read())
tflite_model = tf.contrib.lite.toco_convert(frozen_graph_def, input_tensors, output_tensors)

Si vous avez un graphdef non gelé et connaissez les entrées et sorties

Ensuite, vous devez charger la session et figer le graphique avant d'appeler toco:

path_to_graphdef_pb = '...'
g = tf.GraphDef()
with open(path_to_graphdef_pb, 'rb') as f:
  g.ParseFromString(f.read())
output_node_names = ["..."]
input_tensors = [..]
output_tensors = [...]

with tf.Session(graph=g) as sess:
  frozen_graph_def = tf.graph_util.convert_variables_to_constants(
      sess, sess.graph_def, output_node_names)
# Note here we are passing frozen_graph_def obtained in the previous step to toco.
tflite_model = tf.contrib.lite.toco_convert(frozen_graph_def, input_tensors, output_tensors)

Si vous ne connaissez pas les entrées/sorties du graphique

Cela peut arriver si vous n'avez pas défini le graphique, ex. vous avez téléchargé le graphique quelque part ou utilisé une API de haut niveau comme les tf.estimators qui vous cachent le graphique. Dans ce cas, vous devez charger le graphique et fouiller pour comprendre les entrées et sorties avant d'appeler toco. Voir ma réponse à this SO question .

9
Pannag Sanketi

C'est ce qui a fonctionné pour moi: (modèle SSD_InceptionV2)

  1. Après avoir terminé la formation. j'ai utilisé model_main.py du dossier object_detection. TFv1.11
  2. ExportGraph comme TFLITE:
python /tensorflow/models/research/object_detection/export_tflite_ssd_graph.py

--pipeline_config_path annotations/ssd_inception_v2_coco.config 
--trained_checkpoint_prefix trained-inference-graphs/inference_graph_v7.pb/model.ckpt 
--output_directory trained-inference-graphs/inference_graph_v7.pb/tflite 
--max_detections 3
  1. Cela génère un fichier .pb afin que vous puissiez générer le fichier tflite comme ceci:
tflite_convert 
--output_file=test.tflite 
--graph_def_file=tflite_graph.pb 
--input_arrays=normalized_input_image_tensor 
--output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3'

--input_shape=1,300,300,3 
--allow_custom_ops

Maintenant, les entrées/sorties je ne sais pas 100 comment obtenir cela, mais ce code m'aide avant:

import tensorflow as tf
frozen='/tensorflow/mobilenets/mobilenet_v1_1.0_224.pb'
gf = tf.GraphDef()
gf.ParseFromString(open(frozen,'rb').read())
[n.name + '=>' +  n.op for n in gf.node if n.op in ( 'Softmax','Placeholder')]    
[n.name + '=>' +  n.op for n in gf.node if n.op in ( 'Softmax','Mul')]
2
Chop Labalagun
converter = tf.contrib.lite.TFLiteConverter.from_frozen_graph(
    frozen_model_filename, INPUT_NODE, OUTPUT_NODE)

tflite_model = converter.convert()
open(TFLITE_OUTPUT_FILE, "wb").write(tflite_model)

INPUT_NODE et OUTPUT_NODE sont les listes de noms d'entrée et de sortie respectivement.

0
prateek agrawal