web-dev-qa-db-fra.com

Comment convertir .pb au format TFLite?

J'ai téléchargé un retrained_graph.pb et retrained_labels.txt fichier d'un modèle que j'ai formé au service cognitif Azure. Maintenant, je veux créer une application Android utilisant ce modèle et pour ce faire, je dois la convertir au format TFLite. J'ai utilisé toco et j'obtiens l'erreur suivante:

ValueError: Invalid tensors 'input' were found.

Je suis fondamentalement en train de suivre ce tutoriel et j'ai un problème à l'étape 4 et je copie directement le code du terminal: https://heartbeat.fritz.ai/neural-networks-on-mobile-devices-with-tensorflow-lite- a-tutorial-85b41f53230c

7
Ayush Saxena

sans bazel vous pouvez essayer le code suivant

pip uninstall tensorflow
pip install tf-nightly
pip show protobuf

Si protobuf est la version 3.6.1, passez à l'installation de la version préliminaire de 3.7.0.

pip uninstall protobuf
pip install protobuf==3.7.0rc2 

Je n'arrivais toujours pas à faire fonctionner la version en ligne de commande. Il ne cessait de renvoyer l'erreur: "tflite_convert: error: –input_arrays et –output_arrays sont requis avec –graph_def_file" bien que les deux paramètres aient été fournis. Cependant, cela a fonctionné en Python.

import tensorflow as tf

graph_def_file = "model.pb"
input_arrays = ["model_inputs"]
output_arrays = ["model_outputs"]

converter = tf.lite.TFLiteConverter.from_frozen_graph(
        graph_def_file, input_arrays, output_arrays)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
2
zeeshan

Je fais suite à ma réponse précédente, vous pouvez utiliser le script suivant pour convertir votre modèle formé sur ssd mobilenet en tflte en utilisant

python object_detection/export_tflite_ssd_graph \
    --pipeline_config_path ssd_0.75_export/pipeline.config \
    --trained_checkpoint_prefix ssd_0.75_export/model.ckpt \
    --output_directory ssd_to_tflite_output

Pour ce faire, vous devez d'abord être présent dans le dossier de recherche de l'API de détection d'objet tensorflow, et modifier le chemin/nom du fichier selon vos noms. Si ce travail correct, essayez d'exécuter ce script à partir du dossier de recherche et réexécutez:

protoc object_detection/protos/*.proto --python_out=.
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
1
Ajinkya
import tensorflow as tf
gf = tf.GraphDef()
m_file = open('frozen_inference_graph.pb','rb')
for n in gf.node:
    print( n.name )

le premier est les tableaux input_arrays les noms sont les tableaux_sortie (il peut y en avoir plus d'un en fonction du nombre de sorties du modèle)

ma sortie

  • image_tensor <--- input_array
  • Jeter
  • Préprocesseur/map/Shape Preprocessor/map/strided_slice/stack
  • Préprocesseur/map/strided_slice/stack_1
  • .
  • .
  • .
  • Postprocesseur/BatchMultiClassNonMaxSuppression/map /
  • TensorArrayStack_5/TensorArrayGatherV3
  • Postprocesseur/Cast_3
  • Postprocesseur/Squeeze
  • ajouter/y
  • ajouter
  • zones de détection <--- tableau_sortie
  • scores_de détection <--- tableau_sortie
  • detection_multiclass_scores
  • classes_de détection <--- tableau_sortie
  • num_detections <--- output_array
  • raw_detection_boxes
  • raw_detection_scores
1
Piyush Raj

Pour exécuter le convertisseur tflite sur votre machine locale, vous aurez besoin de bazel et de toco.

Et si vous lisez certains problèmes dans GitHub, dans certaines versions de Tensrflow tflite cause beaucoup de problèmes. Pour surmonter ce problème, certains recommandent d'utiliser tf tous les soirs!

Pour éviter tout cela, utilisez simplement Google Colab pour convertir votre .pb en .lite ou .tflite.

Depuis que Colab a commencé à avoir l'option "upload" pour télécharger vos fichiers dans le noyau actuel, c'est à mon avis le moyen le plus simple sans avoir à vous soucier des autres packages et de leurs dépendances.

Voici le carnet Colab:

https://drive.google.com/file/d/1lDcttsmZC0Y6dXxwe0EVZUsyVoR8HuR-/view?usp=sharing

Vous pouvez télécharger votre fichier .pb de deux manières vers la session en cours:

i) (La manière la plus simple) Après avoir exécuté la première cellule du portable ci-dessus, le lecteur sera monté. Donc, sur votre partie gauche de l'écran, allez dans la colonne des fichiers et faites un clic droit sur le dossier que vous souhaitez télécharger votre fichier .pb et choisissez le téléchargement. Utilisez ensuite les commandes "ls" et "cd" pour accéder au dossier et exécuter la cellule du convertisseur tflite.

ii) Exécutez la cellule avec la commande files.upload () et cliquez sur Parcourir et choisissez le fichier .pb sur votre machine locale.

Une fois le fichier téléchargé, indiquez son chemin d'accès à la variable "localpb" ainsi que le nom du modèle .lite. Ensuite, exécutez simplement la cellule ayant le comamnd "TFLiteConverter".

Et le tour est joué. Un modèle tflite devrait apparaître dans votre lecteur. Faites simplement un clic droit dessus et téléchargez-le sur votre machine locale pour exécuter les inférences.

1
Sushanth

Vous pouvez utiliser l'utilitaire tflite_convert qui fait partie du paquet tensorflow 1.10 (ou supérieur).

L'utilisation simple de l'inférence flottante est quelque chose comme:

tflite_convert \
    --output_file=/tmp/retrained_graph.tflite \
    --graph_def_file=/tmp/retrained_graph.pb \
    --input_arrays=input \
    --output_arrays=output

Où entrée et sortie - sont les tenseurs d'entrée et de sortie de votre graphique tensorflow

1

L'erreur indique que vous n'avez pas entré le bon

--input_arrays

De TF Lite Developer Guide Je cite:

"La définition des arguments input_array et output_array n'est pas simple . La manière la plus simple de trouver ces valeurs consiste à explorer le graphique à l'aide de TensorBoard . "

L'utilisation du Tensorboard n'est pas difficile non plus, en exécutant simplement cette commande

tensorboard --logdir=path/to/log-directory

Voir le TensorBoard à

localhost:6006   
1
Yipeng Zhang

Substituer Mul à input l'a corrigé pour moi.

IMAGE_SIZE=299
tflite_convert \
  --graph_def_file=tf_files/retrained_graph.pb \
  --output_file=tf_files/optimized_graph.lite \
  --input_format=TENSORFLOW_GRAPHDEF \
  --output_format=TFLITE \
  --input_shape=1,${IMAGE_SIZE},${IMAGE_SIZE},3 \
  --input_array=Mul \
  --output_array=final_result \
  --inference_type=FLOAT \
  --input_data_type=FLOAT
1
Jonathan

C'est probablement parce que pendant le processus de recyclage, les tenseurs d'entrée et de sortie ont été renommés. S'il s'agit d'un graphique inceptionv3 recyclé, essayez d'utiliser Mul comme nom du tenseur d'entrée et final_result comme nom du tenseur de sortie.

bazel run --config=opt //tensorflow/contrib/lite/toco:toco -- \
    ... other options ...
    --input_shape=1,299,299,3 \
    --input_array=Mul \
    --output_array=final_result

Ajustement similaire si vous utilisez tflife_convert comme le suggère Aleksandr.

0
zai chang

importer tensorflow en tant que tf

!tflite_convert \
--output_file "random.tflite" \
--graph_def_file "pb file path" \
--input_arrays "input tensor name" \
--output_arrays "output tensor name"    
0
Intern