ダウンロードした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
バゼルなしで次のコードを試すことができます
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)
私は前の回答からフォローアップしています。次のスクリプトを使用して、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
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です(モデルの出力数に応じて複数になる場合があります)。
私の出力
ローカルマシンで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モデルが表示されるはずです。それを右クリックしてローカルマシンにダウンロードするだけで推論を実行できます。
ユーティリティ 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
Mul
をinput
に置き換えて修正しました。
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
ほとんどの場合、再トレーニングプロセス中に入力テンソルと出力テンソルの名前が変更されたことが原因です。これが再トレーニングされた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を使用する場合の同様の調整。
tensorflowをtfとしてインポートする
!tflite_convert \
--output_file "random.tflite" \
--graph_def_file "pb file path" \
--input_arrays "input tensor name" \
--output_arrays "output tensor name"