web-dev-qa-db-ja.com

.pbをTFLite形式に変換する方法

ダウンロードしたretrained_graph.pbおよびretrained_labels.txt Azureコグニティブサービスでトレーニングしたモデルのファイル。ここで、Androidアプリをそのモデルを使用して作成し、そのためにTFLite形式に変換する必要があります。tocoを使用していたため、次のエラーが発生します。

ValueError: Invalid tensors 'input' were found.

私は基本的にこのチュートリアルに従っていて、ステップ4で問題があり、ターミナルコードを貼り付けて直接コピーします: https://heartbeat.fritz.ai/neural-networks-on-mobile-devices-with-tensorflow-lite- a-tutorial-85b41f53230c

7
Ayush Saxena

バゼルなしで次のコードを試すことができます

pip uninstall tensorflow
pip install tf-nightly
pip show protobuf

Protobufがバージョン3.6.1の場合は、プレリリースバージョン3.7.0のインストールに進みます。

pip uninstall protobuf
pip install protobuf==3.7.0rc2 

それでもコマンドラインバージョンを機能させることができませんでした。 「tflite_convert:エラー:–input_arraysと–output_arraysは–graph_def_fileと一緒に必要です」というエラーが返され続けましたが、両方のパラメーターが指定されていました。ただし、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

私は前の回答からフォローアップしています。次のスクリプトを使用して、ssd mobilenetのトレーニング済みモデルをtflteに変換できます。

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

これを行うには、最初にtensorflowオブジェクト検出APIのresearchフォルダーに存在し、名前に従ってdileパス/名前を変更する必要があります。この作業がうまくいかない場合は、researchフォルダからこのスクリプトを実行して再実行してください。

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 )

最初の1つはinput_arraysで、最後の名前はoutput_arraysです(モデルの出力数に応じて複数になる場合があります)。

私の出力

  • image_tensor <--- input_array
  • キャスト
  • プリプロセッサ/マップ/シェイププリプロセッサ/マップ/ strided_slice/stack
  • プリプロセッサ/マップ/ strided_slice/stack_1
  • ポストプロセッサー/ BatchMultiClassNonMaxSuppression/map /
  • TensorArrayStack_5/TensorArrayGatherV3
  • ポストプロセッサー/ Cast_3
  • ポストプロセッサー/スクイーズ
  • 追加/ y
  • 追加
  • 検出ボックス<--- output_array
  • detection_scores <--- output_array
  • detection_multiclass_scores
  • detection_classes <--- output_array
  • num_detections <--- output_array
  • raw_detection_boxes
  • raw_detection_scores
1
Piyush Raj

ローカルマシンでtfliteコンバーターを実行するには、bazelとtocoが必要です。

また、GitHubでいくつかの問題を読んだ場合、Tensrflow tfliteの一部のバージョンでは、多くの問題が発生します。この問題を解決するために、tf-nightlyの使用を推奨する人もいます。

これをすべて回避するには、Google Colabを使用して.pbを.liteまたは.tfliteに変換します。

Colabは現在のカーネルにファイルをアップロードするための「アップロード」オプションを備え始めたので、これは他のパッケージとその依存関係を心配する必要がない最も簡単な方法だと思います。

Colabノートブックは次のとおりです。

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

現在のセッションに.pbファイルをアップロードする方法は2つあります。

i)(簡単な方法)上記のノートブックの最初のセルを実行した後、ドライブがマウントされます。画面の左側でファイル列に移動し、.pbファイルをアップロードするフォルダを右クリックして、アップロードを選択します。次に、「ls」および「cd」コマンドを使用してフォルダーに移動し、tfliteコンバーターセルを実行します。

ii)files.upload()コマンドでセルを実行し、参照をクリックして、ローカルマシンから.pbファイルを選択します。

ファイルがアップロードされたら、変数「localpb」へのパスと.liteモデルの名前も指定します。次に、「TFLiteConverter」コマンドを持つセルを実行します。

そして出来上がり。ドライブにtfliteモデルが表示されるはずです。それを右クリックしてローカルマシンにダウンロードするだけで推論を実行できます。

1
Sushanth

ユーティリティ tflite_convert を使用できます。これは、tensorflow 1.10以降のパッケージの一部です。

Float推論の単純な使用法は次のようなものです。

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

入力と出力-テンソルフローグラフの入力および出力テンソル

エラーは、正しい値を入力していないことを示しています

--input_arrays

TF Lite開発者ガイド から引用:

"input_arrayおよびoutput_array引数の設定これらの値を見つける最も簡単な方法は、TensorBoardを使用してグラフを探索することです。 "

このコマンドを実行するだけで、Tensorboardの使用も難しくありません

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

TensorBoardを見る

localhost:6006   
1
Yipeng Zhang

Mulinputに置き換えて修正しました。

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

ほとんどの場合、再トレーニングプロセス中に入力テンソルと出力テンソルの名前が変更されたことが原因です。これが再トレーニングされたinceptionv3グラフである場合は、入力テンソル名としてMulを使用し、出力テンソル名としてfinal_resultを使用してみてください。

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

Aleksandrが示唆するように、tflife_convertを使用する場合の同様の調整。

0
zai chang

tensorflowを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