Tensorflow: [質問とエラー] tensorflow-liteにSSD-Mobile-netのような検出モデルはありますか?

作成日 2017年12月26日  ·  141コメント  ·  ソース: tensorflow/tensorflow

やあ。

tensorflow-liteを使用したAndroidアプリケーションの開発。

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/models.md
検出モデルが見つかりません。

また、tensorflow-lite-APIを使用してSSD-Inceptionv2を変換しようとしています。 しかし、問題があるようです。

指示


bazel run --config=opt --copt=-msse4.1 --copt=-msse4.2 \
  //tensorflow/contrib/lite/toco:toco -- \
  --input_file=/home/danshin/tensorflow_lite/lite_model/fire_incpetion_v2.pb \
  --output_file=/home/danshin/tensorflow_lite/lite_model/fire_inception_v2.lite \
  --input_format=TENSORFLOW_GRAPHDEF \
  --output_format=TFLITE \
  --inference_type=FLOAT \
  --input_shape=1,300,300,3 \
  --input_array=image_tensor \
  --output_array={detection_boxes,detection_scores,detection_classes,num_detections}

エラーコード


2017-12-26 14:59:25.159220: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Before general graph transformations: 2029 operators, 3459 arrays (0 quantized)
2017-12-26 14:59:25.251633: F tensorflow/contrib/lite/toco/graph_transformations/resolve_tensorflow_switch.cc:95] Check failed: other_op->type == OperatorType::kTensorFlowMerge 

fire_inception_v2ファイルが作成されますが、そのサイズは0バイトです。
問題は何ですか?

また、
オブジェクト検出用のカスタムモデルをデプロイするための最良の方法を教えてください。

誰かが私を助けてくれます!

ありがとうございます。

lite feature

最も参考になるコメント

現在、 tensorflow / contrib / lite / examples / androidで公開されています。 これは、元のTF Androidデモのより完全な移植版であり(Stylizeの例がないだけです)、今後、tensorflow / contrib / lite / java / demoの他のデモに取って代わります。

変換されたTFLiteフラットバッファはmobilenet_ssd_tflite_v1.zipにあり、Java推論の実装はTFLiteObjectDetectionAPIModel.javaあります。 これは、ボックスをJavaで手動でデコードする必要があり、ボックスの前のtxtファイルをアプリアセットにパッケージ化する必要があるという点で、元のTF実装とは異なることに注意してください(上記のモデルzipに含まれているものはほとんどの場合有効であると思います)グラフ)。

TOCO変換中に、異なる入力ノード(Preprocessor / sub)と、異なる出力ノード(concat、concat_1)が使用されます。 これにより、グラフが再構築されるか、TF LiteがTFパリティに達するまで、tfliteで問題となる一部の部分がスキップされます。

SSD MobileNetモデルをtflite形式に変換し、それを使用するデモを作成するための簡単な手順は次のとおりです。

# Download and extract SSD MobileNet model
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz
tar -xvf ssd_mobilenet_v1_coco_2017_11_17.tar.gz 
DETECT_PB=$PWD/ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb
STRIPPED_PB=$PWD/frozen_inference_graph_stripped.pb
DETECT_FB=$PWD/tensorflow/contrib/lite/examples/android/assets/mobilenet_ssd.tflite

# Strip out problematic nodes before even letting TOCO see the graphdef
bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB  --output=$STRIPPED_PB --frozen_graph=True \
--input_names=Preprocessor/sub --output_names=concat,concat_1 \
--alsologtostderr

# Run TOCO conversion.
bazel run tensorflow/contrib/lite/toco:toco -- \
--input_file=$STRIPPED_PB --output_file=$DETECT_FB \
--input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE \
--input_shapes=1,300,300,3 --input_arrays=Preprocessor/sub \
--output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr

# Build and install the demo
bazel build -c opt --cxxopt='--std=c++11' //tensorflow/contrib/lite/examples/android:tflite_demo
adb install -r -f bazel-bin/tensorflow/contrib/lite/examples/android/tflite_demo.apk

全てのコメント141件

@aselleこの問題を見ていただけますか? ありがとう。

現在、mobilenet SSDの変換(およびその後の開始ssd)に取り組んでいますが、完全にはサポートされていないopsが含まれています。 完了したら、この問題を更新します。

すばらしい、私はここで同様の質問をしました: https ://github.com/tensorflow/tensorflow/issues/14731

皆さんがssd-mobilenetからのサポートを追加するまで、どのくらいの期間を計算しますか?

ありがとう、
マーティンペニアック

TensorFlow組織のメンバーが、 stat: awaitingtensorflowerラベルが適用された後に返信しました。

しつこい譲受人:14日間活動がなく、この問題には譲受人がいます。 それに応じてラベルやステータスを更新してください。

更新はありますか?
私も同様の問題に直面しています。 前もって感謝します。

@yucheeling

ssd_mobilenet_v1_coco_2017_11_17.tar 」のような、Tシャツ、ジーンズなどのさまざまなアパレルIDの小売店で使用できるデータセットを提案してください。

@ rana3579 、stackoverflowでそのような質問をしてください。 mobilenetssdのクイックアップデート。 これは進行中であり、すぐに例が出ることを願っています。

@ rana3579私のビデオをチェックして、これをmovidius、nvidia gpus、およびarmプロセッサで実行しました。 データセットを共有することはできませんが、あなたが会社の一員である場合は、コラボレーションの可能性について話し合うことができます: https ://www.youtube.com/watch?v = 3MinI9cCJrc

@aselleアップデートしてくれてありがとう! これに関する通知はどこで探すことができますか? 可能であれば、すぐに通知を受け取りたいと思います。 ありがとう、これにあなたの努力に感謝します!

@andrewharpはこれに取り組んでおり、tfliteを使用するようにJava TFMobileアプリを更新する予定です。 したがって、リポジトリ内のこれらの変更に注意してください。 今のところ、この問題は開いたままにしておきます。

これは内部的に機能します。 来週か2週間で何かが出るはずです。

@andrewharpそれは素晴らしいです!! それはiOSカメラの例にも当てはまりますか?
また、ウェイトのサイズとパフォーマンスはどのように見えますか?
TFLite分類のモバイルネットは小さく、iOSでのパフォーマンスは非常にスムーズなので、TFLiteに非常に興奮しています。

他のいくつかは、既存のSSD Mobilenet pbをcoremlモデルに変換し、不足している出力レイヤーをSwiftに書き込みました。
https://github.com/vonholst/SSDMobileNet_CoreML

しかし、それはiPhone 7の8〜12fpsにすぎません。

やあ、
これに関する更新はありますか?

私も興味があります:)

私はAndroidTFデモを現在レビュー中のtfliteに移植することを約束しています。うまくいけば、今週githubに表示されるはずです。

@madhavajay Androidのみですが、iOSに適応できるはずです。 唯一のことは、前処理(画像のサイズ変更/正規化)と後処理(非最大抑制とボックス事前調整による調整)の一部がJavaで行われることです。これは、tfliteがMobileNetSSDで使用されるすべての演算子を完全にサポートしているわけではないためです。 。

@andrewharpそれはすごい。 これらの操作が現在TFliteで利用できない理由を簡単に説明してください。 通常のSSDのtfcoreml変換ツールの場合も同じようです。 技術的な関心から質問するだけで文句を言うのではなく、モバイルスタックに実装するのが特に難しいことをしているのでしょうか、それとも優先度が低いだけでしょうか。

Androidコードであなたの壮大な努力を見るのを楽しみにしています!!! どうもありがとう。 これを楽しみにしているのは私だけではないことを私は知っています!

@andrewharp 、および@aselle TFLiteのSSDベースのオブジェクトローカリゼーションの例を使用するためのデモの取得に関する更新はありますか?

現在、 tensorflow / contrib / lite / examples / androidで公開されています。 これは、元のTF Androidデモのより完全な移植版であり(Stylizeの例がないだけです)、今後、tensorflow / contrib / lite / java / demoの他のデモに取って代わります。

変換されたTFLiteフラットバッファはmobilenet_ssd_tflite_v1.zipにあり、Java推論の実装はTFLiteObjectDetectionAPIModel.javaあります。 これは、ボックスをJavaで手動でデコードする必要があり、ボックスの前のtxtファイルをアプリアセットにパッケージ化する必要があるという点で、元のTF実装とは異なることに注意してください(上記のモデルzipに含まれているものはほとんどの場合有効であると思います)グラフ)。

TOCO変換中に、異なる入力ノード(Preprocessor / sub)と、異なる出力ノード(concat、concat_1)が使用されます。 これにより、グラフが再構築されるか、TF LiteがTFパリティに達するまで、tfliteで問題となる一部の部分がスキップされます。

SSD MobileNetモデルをtflite形式に変換し、それを使用するデモを作成するための簡単な手順は次のとおりです。

# Download and extract SSD MobileNet model
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz
tar -xvf ssd_mobilenet_v1_coco_2017_11_17.tar.gz 
DETECT_PB=$PWD/ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb
STRIPPED_PB=$PWD/frozen_inference_graph_stripped.pb
DETECT_FB=$PWD/tensorflow/contrib/lite/examples/android/assets/mobilenet_ssd.tflite

# Strip out problematic nodes before even letting TOCO see the graphdef
bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB  --output=$STRIPPED_PB --frozen_graph=True \
--input_names=Preprocessor/sub --output_names=concat,concat_1 \
--alsologtostderr

# Run TOCO conversion.
bazel run tensorflow/contrib/lite/toco:toco -- \
--input_file=$STRIPPED_PB --output_file=$DETECT_FB \
--input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE \
--input_shapes=1,300,300,3 --input_arrays=Preprocessor/sub \
--output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr

# Build and install the demo
bazel build -c opt --cxxopt='--std=c++11' //tensorflow/contrib/lite/examples/android:tflite_demo
adb install -r -f bazel-bin/tensorflow/contrib/lite/examples/android/tflite_demo.apk

@andrewharpハッピーイースター🥚🍫あなたは伝説です! :)これを実行できるかどうかを確認します。

こんにちは、クオンタイズバージョンはありますか?

上記の手順で動作しましたが、必要でした:

  • 私のバゼルバージョンのためにAndroidSDK 15
  • また、AndroidStudioでプロジェクトを開くことができません

@andrewharpは、Gradleの代わりにbazelを使用してプロジェクトをビルドする、またはそれを機能させるための短い時間枠のために今のところいくつかのプロジェクト設定が欠落している、皆さんが向かっている新しいAndroid Studioのものですか?

問題が何であるかを理解していれば、PRを提供してください。

パフォーマンスに関しても、Android7のLGG6では遅いようです。
NNAPIはAndroid8のみに搭載されているためですか?

Android 8でテストできる人はいますか?

なるほど、指示は回心のためだけだと思いました。 これがモデルを変換する方法だと言って、文の最初の部分の後で読むのをやめました笑。

ええ、私はピクセルxlを手に入れました、私はあなたの電話が推論を加速することができるハードウェアを持っていないか、そのハードウェアがソフトウェアによってサポートされていないと思います。

私はあなたに知らせようとします。 私はそれをandroidstudiodohで構築できると思っていました...

私のiPhoneから送信された

2018年3月31日20:05、 MadhavaJaynotifications @ github.comは次のように書いています。

上記の手順で動作しましたが、必要でした:

私のバゼルバージョンのためにAndroidSDK 15
また、AndroidStudioでプロジェクトを開くことができません
@andrewharpは、Gradleの代わりにbazelを使用してプロジェクトをビルドする、またはそれを機能させるための短い時間枠のために今のところいくつかのプロジェクト設定が欠落している、皆さんが向かっている新しいAndroid Studioのものですか?

問題が何であるかを理解していれば、PRを提供してください。

パフォーマンスに関しても、Android7のLGG6では遅いようです。
NNAPIはAndroid8のみに搭載されているためですか?

Android 8でテストできる人はいますか?


コメントしたのでこれを受け取っています。
このメールに直接返信するか、GitHubで表示するか、スレッドをミュートしてください。

はい、私は同じことをして、コードとAndroidスタジオに直接行きました。 それからあなたが今朝pingした後、私は同じ問題を抱えていると答えようとしていました、そしてそれから再びRTFMしました。 🤣

LG G6は、Pixel1と同じQualcomm821 SoCを搭載しているため、NN APIをサポートできるはずです。しかし、残念ながらLGはAndroid 8または8.1をリリースしておらず、最新のLineageOSビルドは少し大雑把に見えます。だから、Android 8.1でうまく機能することがわからない限り、延期するつもりです。 Pixelで起動できれば、すばらしいでしょう。 👍

私はこれをテストすることができましたが、デモの実行は非常に遅くなります...元のバージョンよりもさらに遅くなります。
私はPixelXL(最初のバージョン)を使用しており、以前に64ビットアーチ用の古いデモをコンパイルしました。これにより、tfLiteがなくてもほぼ2倍の速度で実行できます...この場合の推論時間は約450ミリ秒です。 このデモを試してみると、約850ミリ秒、場合によっては1秒以上で実行されます。 私は何か間違ったことをしましたか、それともまともなスピードアップを期待するのは楽観的すぎましたか? ありがとう。

@mpeniakデバッグをオンまたはオフにして、LG G6で同じ速度を取得しました(最初はデバッグだと思っていました)。 NNAPIが使用されていないようです。 おそらく、nnapi_libビルドで何か特別なことをする必要がありますか?
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/BUILD

依存関係がリストされていますが、特定のアーキテクチャ用に構築する必要があるかもしれませんか?
おそらく./configureの何か
(ところで、関連している場合に備えて、。/ configureでXLAを有効にしましたが、速度は変わりませんでした)

@andrewharp
NNAPIを使いたいのですが、使い方がわかりません。
ドキュメントによると、ニューラルネットワークAPIはAndroid8.1で利用可能です>
8.1以上の場合、基本的には適用されますか? または追加のNDK作業が必要ですか? ドキュメントリンク
良い一日をXD

@ andrewharp 、tflite_demoのNNAPIを有効にしてapkを実行しようとしましたが、apkがクラッシュしました
AddOpsAndParamsを呼び出す場合、操作tflite :: BuiltinOperator_SQUEEZEはサポートされていません。
nn_op_typeが-1に設定されているため、FATALが呼び出され、exit(-1)になります。 それだと思います
根本的な原因。 将来のバージョンでサポートされるかどうか教えてください。 他に働く方法はありますか
NNAPIパスをテストするために周り? ありがとう。

@andrehentz
bazel run -c opt tensorflow / python / tools / optimize_for_inference- \
--input = $ DETECT_PB --output = $ STRIPPED_PB --frozen_graph = True \
--input_names = Preprocessor / sub --output_names = concat、concat_1 \
--alsologtostderr

input_names image_tensorではないのはなぜですか?
この方法を試しましたが、エラーが発生しました。

@nanamare
broken_inference_graph.pbの代わりにfrozen_inference_graph_stripped.pbを使用する必要があります。
「bazel-bin / tensorflow / tools / graph_transforms / summarize_graph--in_graph = frozen_inference_graph_stripped.pb」を試してください
次の出力が表示されます。
1つの可能な入力が見つかりました:(name = Preprocessor / sub、type = float(1)、shape = None)
変数は見つかりませんでした。
2つの可能な出力が見つかりました:(name = concat、op = ConcatV2)(name = concat_1、op = ConcatV2)

入力名はプリプロセッサ/サブabd出力名は連結です。

@nanamare
最新のtensorflowliteコードには、NNAPIを有効にするためのJavaインターフェイスが含まれています。

クラスインタープリターには、setUseNNAPI(true);という関数があります。
このようなインターフェイスを直接呼び出すことができます。

@ zhangbo0325
すでにsetUserNNAPI(true);を呼び出そうとしましたが、効果はありませんでした。
NNAPIを使用しない場合とほぼ同様の推論でした。
アンドロイド仕様:8.1バージョン。

@ nanamare 、ssd-mobilenetを実行していますか? このようなネットワークには、AndroidNNAPIでサポートされていないSQUEEZE操作があります。 上記の質問をしました。 mobilenet-v1の場合は問題ありません。

<strong i="5">@andrewharp</strong>  Hi, andrewharp. i just followed your quick steps for converting an SSD MobileNet model to tflite format, and then i tried to  build the demo to use it. But something accurred in apk.
for the tflite from mobilenet_ssd_tflite_v1.zip, everything is ok! i can use mobile to detecter things.
And then i tried to use pet data to fine tune the model from the checkpoint in mobilenet_ssd_tflite_v1.zip. this process is also ok. i check the generated frozen_inference_graph.pb with the object_detection_tutorial.ipynb(https://github.com/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynb). the result shown this pb can used to object detection. And then i followed the script to convert frozen pb to tflite. Then build demo with tflite, unfortunately something wrong ocurred. Then log is written below. 
It seems the Shape of output target [1, 1917, 4] does not match with the shape of the Tensor [1, 1917, 1, 4]. Because i am new to use object detection api, i donot know how to deal with the problem. 
Hope you can point out some solutions, Thx!

ここのモバイルログ:
04-04 19:46:36.099 28864-28882 / org.tensorflow.lite.demo E / AndroidRuntime:致命的な例外:推論プロセス:org.tensorflow.lite.demo、PID:28864 java.lang.IllegalArgumentException:出力ターゲットの形状[1、1917、4]はテンソル[1、1917、1、4]の形状と一致しません。 org.tensorflow.lite.Tensor.copyTo(Tensor.java:44)at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:139)at org.tensorflow.demo.TFLiteObjectDetectionAPIModel.recognizeImage(TFLiteObjectDetectionAPIModel.java:226 )at org.tensorflow.demo.DetectorActivity $ 3.run(DetectorActivity.java:248)at android.os.Handler.handleCallback(Handler.java:761)at android.os.Handler.dispatchMessage(Handler.java:98)at android.os.HandlerThread.run(HandlerThread.java:61)のandroid.os.Looper.loop(Looper.java:156)

すばらしい! これをiOSで動作させようとしています。 Tensor出力を解析するにはどうすればよいですか?

interpreter->Invoke();
float* output = interpreter->typed_output_tensor<float>(0);

DetectorActivityインターフェースが私のプロジェクトで動かなくなっています、あなたは存在しますか、どうすればそれを解決できますか?

@ zhangbo0325詳細をありがとう。 スクイーズはNNAPIでサポートされていないので、それはNNAPIがまったく使用されず、推論がそのまま遅くなることを意味しますか? 以前のコメントで述べたように、PixelXLのパフォーマンスは非常に悪くなります。 推論時間は約80〜120ミリ秒になると思います。 ありがとう!

@mpeniak 、私はandrewharpに同じ質問をしました。 tensorflow-lite cpu実装の助けを借りてssd-mobilenetを実行したところ、パフォーマンスが低下しました。

Dev Summit2018でのTensorFlowLiteの講演では、MobileNetで3倍のパフォーマンスが示されました。
https://youtu.be/FAMfy7izB6A?t=530

たぶんそれはSSDではないのですか?
おそらく最初に重みの量子化が必要ですか?

私はmobilnetを試しましたが、はるかに高速ですが、これはmobilnet-ssdには適用されません...

悲しいパンダ☹️🐼
@andrewharpパフォーマンスの高いSSD実装がいつ利用可能になるかについて何か考えはありますか? それは重量量子化の問題ですか?

また、TensorFlowLiteでssd-mobilenetのパフォーマンスが低下しました:(
しかし、別の質問があります。 結果のスコアが1を超えるのはなぜですか? 確率ではないですか?

@ a1103304122私が理解しているように、スコアはソフトマックスの前のノード「concat」の出力であるため、確率ではありません。

TOCO変換中に、異なる入力ノード(Preprocessor / sub)と、異なる出力ノード(concat、concat_1)が使用されます。 これにより、グラフが再構築されるか、TF LiteがTFパリティに達するまで、tfliteで問題となる一部の部分がスキップされます。

このモデルでTFliteがTFmobileよりも遅い理由を誰かが知っていますか?

@andrewharp TF Lite SSDのパフォーマンスについてコメントすることは可能ですか? また、量子化は可能/来るのですか? 皆さんがこれをすべて実現するために一生懸命働いていることは知っていますが、これが単なる短期間の問題なのか、それとも私たちが適用できる解決策があるのか​​を知っておくとよいでしょう。 😄

@andrewharpすばらしい投稿をありがとう。 ただし、手順について1つ質問があります。

TOCOにgraphdefを表示させる前に、問題のあるノードを取り除きます

bazel run -c opt tensorflow / python / tools / optimize_for_inference- \
--input = $ DETECT_PB --output = $ STRIPPED_PB --frozen_graph = True \
--input_names = Preprocessor / sub --output_names = concat、concat_1 \
--alsologtostderr

誤解しない限り、ここでSTRIPPED_PBを作成しますよね? その場合、現在、入力ファイルの入力はimage_tensorである必要があります。 だから、なぜプリプロセッサ/サブを使うのかよくわかりません。 詳細を教えてください。

次に、ここではoptimize_for_inferenceを使用しますが、transform_graphツールを使用できますか? 新しいテンソルフローのドキュメントでは、optimize_for_inferenceではなくtransform_graphが推奨されているためです。

@mpeniakどうやってやるの? 詳細を教えてください。

org.tensorflow.lite.demo E / AndroidRuntime:致命的な例外:推論プロセス:org.tensorflow.lite.demo、PID:28864 java.lang.IllegalArgumentException:出力ターゲットの形状[1、1917、4]がテンソルの形状[1、1917、1、4]。

@Haijunlv問題を解決しましたか? ソリューションを共有できますか?

TF Liteの新しいAndroidデモをインポートすると、OS XでError:Plugin with id 'com.android.application' not found.を取得します。

@ csmith105と同じ問題! bazelを使用してデモをビルドしてインストールできましたが、Android Studioでプロジェクトをコンパイルまたは実行できません...この問題の解決策はありますか?

@ Eddy-zheng凍結されたグラフでノード「concat」を確認した場合、concatopの後にsqueezeopが実行されていることがわかります。 それが形が合わない理由だと思います。 スクイーズ操作の速度はテストしていません。 しかし、問題を解決するには2つの方法があると思います。

  1. スクイーズと連結操作の順序を変更します。 ssd_meta_arch.py​​で、「box_encodings = tf.squeeze(tf.concat(prediction_dict ['box_encodings']、axis = 1)、axis = 2)」を少し変更します。
  2. 軸2でシェイプ1を直接削除します。box_predictor.pyで、 "box_encodings = tf.reshape(
    box_encodings、tf.stack([combined_feature_map_shape [0]、
    Combined_feature_map_shape [1] *
    Combined_feature_map_shape [2] *
    num_predictions_per_location、
    1、self._box_code_size])) "

実際、テンソルを余分な「1」の形に変形する理由がわかりません。 冗長かもしれません
op。
私は方法1を試し、モバイルでモデルを実行することに成功しました。 しかし、それでも少し遅いです。 後で私はそれがより良い速度を得ることができるかどうかを確認するために方法2を試します

@Haijunlv検出はどれくらい良いですか? @andrewharpのデモのliteモデルは、すべての前処理ノードと後処理ノード(数千)をグラフから削除し、それらを数行のコードに置き換えるだけです。 それがどのように機能するかわかりません。

androidstudioとgradleの問題には解決策があると思います。 (私が間違っている場合、またはより良い解決策がある場合は、私を訂正してください):

  • これは最善のアプローチではありませんが、Android Studio内にインストールしてGradleを「置き換える」ことができるBazelプラグインがあり、ASを介してBazelを使用してプロジェクトをビルドおよび実行できます。

  • Bazelに関するいくつかの記事を読み、Quoraでこの質問に出くわしました。回答によると、テンソルフローはフレームワークをより有効に活用し、より良い結果をもたらすため、Bazelを引き続き使用します。したがって、この特定のケースの開発者として、適応する必要があると思います。それに、テンソルフローが完全にサポートするまでGradleを残します。

@davidfant
TensorFlow Lite C ++で複数の出力を取得できましたか?

interpreter->Invoke();
???? output = interpreter->typed_output_tensor<?????>(0);

私は進歩していますが、それでもC ++で出力を取得する方法がわかりません。 これに関するドキュメントはありますか? これは私が現在持っているものです。 スコアを取得するには、データ配列にアクセスするにはどうすればよいですか?

(fill inputs)
.......
intepreter->Invoke();
const std::vector<int>& results = interpreter->outputs();
TfLiteTensor* outputLocations = interpreter->tensor(results[0]);
TfLiteTensor* outputClasses   = interpreter->tensor(results[1]);
float *data = tflite::GetTensorData<float>(outputClasses);
for(int i=0;i<NUM_RESULTS;i++)
{
   for(int j=1;j<NUM_CLASSES;j++)
   {
      float score = expit(data[i*NUM_CLASSES+j]); // ¿?
    }
}

@JaviBonilla私は同じようなことをしましたが、うまくいかないことがわかりました。 アンドロイドデモアプリからのカットオフを使用して、それはあまりにも多くのノイズを出力します。 テンソルボードを使用してグラフを読み取ると、ライトモデルが何千もの後処理ノードを削除していることがわかります。 現在の方法はうまくいかないと思います。 tensorflow liteが、このような機能しないハッキングを行うように人々に求めるのではなく、将来的にこれらの後処理ノードをサポートすることを願っています。

@YijinLiuに感謝します。 あなたのリポジトリtf-cpuを見ました。あなたのコードを見て、私の実装が正しいことを確認し、結果が良くない場合でも結果を確認します。

@JaviBonillaは、C ++で実行する方法を理解したら、お知らせください。 🙌

こんにちは@davidfant

私はまだそれをテストする必要がありますが、 @ YijinLiuはすでにそれを理解しています!。

彼のリポジトリ(https://github.com/YijinLiu/tf-cpu)をご覧ください。 特に、 Interpreter->Invoke()の後に実行されるtf-cpu/benchmark/obj_detect_lite.ccファイルAnnotateMat()関数で出力を取得する方法を見つけることができます。

@JaviBonilla obj_detect_lite.ccを終了しませんでした。特に、事前確率を使用して検出ボックスをデコードしました。
私が見つけたのは、スコアがすべてのシナリオで意味をなさないということです。 場合によっては、ノイズが多すぎます。 他の場合には、それはいくつかの良い検出を失うかもしれません。 これらのノードを調べて、これらの中間スコアを最終的な可能性スコアに変換しました。 何千ものノードがあります...

@YijinLiuこれを明確にしてくれてありがとう。 次に、オブジェクト検出用のTensorFlowLiteにさらに多くの改善が含まれるまで待つ方がよいと思います。 とにかく、時間があれば、C ++で検出ボックスをデコードしようとします。

こんにちは@andrewharp

新しいAndroidデモプロジェクトの作成にご協力いただきありがとうございますが、テンソルフローライトを作成するプロセスを簡単に理解できるように、readme.mdまたは説明ドキュメントをtensorflow / contrib / lite / examples / androidに書き込んでください。 ありがとう〜!

こんにちは、ssd_mobilenet_v1_coco_2017_11_17デモを正常に実行した後、微調整されたモデルを取得しました。 @ andrehentzのプロセスを実行すると、問題が発生しました。
bazel run tensorflow/contrib/lite/toco:toco -- --input_file=$STRIPPED_PB --output_file=$DETECT_FB --input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE --input_shapes=1,300,300,3 --input_arrays=Preprocessor/sub --output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr

未使用の演算を削除する前に:586演算子、871配列(0量子化)
2018-06-12 15:29:54.273221:I tensorflow / contrib / lite / toco /graph_transformations/graph_transformations.cc:39]一般的なグラフ変換の前:586演算子、871配列(0量子化)
2018-06-12 15:29:54.300213:I tensorflow / contrib / lite / toco /graph_transformations/graph_transformations.cc:39]一般的なグラフ変換が1を通過した後:409演算子、688配列(0量子化)
2018-06-12 15:29:54.309735:I tensorflow / contrib / lite / toco /graph_transformations/graph_transformations.cc:39]非量子化グラフ変換前:409演算子、688配列(0量子化)
2018-06-12 15:29:54.317395:I tensorflow / contrib / lite / toco / assert_transient_arrays.cc:329]一時アレイに割り当てられた合計サイズ:2880256バイト、理論上の最適値:2880128バイト。
2018-06-12 15:29:54.319173:F tensorflow / contrib / lite / toco / tflite / export.cc:330]モデルの一部の演算子は、標準のTensorFlowLiteランタイムでサポートされていません。 それらのカスタム実装がある場合は、-allow_custom_opsを使用するか、tf.contrib.lite.toco_convert()を呼び出すときにallow_custom_ops = Trueを設定することにより、このエラーを無効にできます。 カスタム実装が必要な演算子のリストは次のとおりです:RSQRT、SquaredDifference、Stack、TensorFlowShape。

これが私のモデルですhttps://drive.google.com/open?id=1IxRSU4VSmVmhUtUpSQew_5anEfxTg3Ca

誰か助けてもらえますか?
@andrehentz

@JaviBonilla@YijinLiu私はGoogleの保持されたSSDMobileNet V {1,2}とSSDLIteMobileNetV2モデルでテストしたPython実装を持っています。 こちらの簡単なドキュメントを参照してください。

@freedomtanどのバージョンのtfを使用していますか? tf 1.8?

tfliteインタープリターPythonバインディング(29c129c6)後の@hengshanjiマスターブランチ。 1.8には拘束力があるとは思いません。

@freedomtan tf1.8にはインタープリターPythonバインディングがありますが、「nnapiエラー:ライブラリlibneuralnetworks.soを開くことができません」というような問題が発生します。 この.soをどこで入手するか、またはそれを生成する方法は? ありがとう。

無視してください:)AndroidNNAPI用です。

@freedomtanデバイスまたはPCで例をテストしましたか? PCでテストすると、android-28 / x86 libneuralnetworks.soを使用すると、「tfliteが失敗を返したため中止」というエラーが表示されます。

私が言ったように、そのNNAPIの問題を無視してください。 libneuralnetwork.soが機能することは期待されていません。 Ubuntuを実行しているx86とDebianを実行しているARMv8ボードの両方でスクリプトをテストしました。

@freedomtan 、コードとドキュメントを共有していただきありがとうございます。

リポジトリに基づく(https://github.com/YijinLiu/tf-cpu)。 出力を取得するためにtf-cpu / benchmark /obj_detect_lite.ccを更新しました。 関数AnnotateMat()で、output_locationsを処理するdecodeCenterSizeBoxesコードを追加し、これらの結果に対してnmsを実行します。
同時に、 https://github.com/tensorflow/tensorflow/issues/14688を使用してlibtensorflow-lite.aを生成すると、Ubuntuを実行しているx86とssdlite_mobilenet_v2_coco_2018_05_09のtfliteモデルを備えたAndroidデバイスの両方で実行できます。 tar.gz。
皆さんありがとう。

@WeiboXuここでコードとモデルを共有できますか?

obj_detect_lite.ccの更新されたコードは次のとおりです
obj_detect_lite.cc.zip

モデルはhttp://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gzです。

@freedomtan Python実装コードには、「/ tmp / box_priors.txt」というファイルが1つありますが、このファイルを生成する方法を知っていますか? または、このファイルのデータはどのように計算されましたか? サイズ300X300の画像の推論を行うのに問題はありませんが、サイズ224X224の画像の推論を行うと、推論の精度が低下します。

@ freedomtan@ andrewharpこの手順に従うことによるprevモデルは、最新のTFLiteデモでは機能しません。最新のTFLiteデモのtfliteモデルには4つの出力が必要ですが、prevモデルには2つの出力しかありません( concat、concat1)。

助けてください、ありがとう!

これらの手順は現在更新中です。 来週に更新された指示へのリンクを提供します。

@frontword /tmp/box_priors.txtには、後処理用のボックスがあります。 @WenguoLiで言及されている新しいものを使用する場合は、それは必要ありません。 ただし、私が知る限り、これらの後処理操作はTFLiteカスタム操作として実装されています。 つまり、さらなる努力なしにNNAPIアクセラレータでそれらを加速することはできません。

画像サイズの問題については、はい、SSD300に224x224の画像をフィードし(Googleがリリースしたモデルは300x300の画像でトレーニングされています)、精度が低下することは予想外ではないと思います。

@WenguoLiあなたが言及した更新されたモデルは、非常に扱いやすいように思えます。 私の更新スクリプトを参照してください。 次の図はによって生成されます

python  tensorflow/contrib/lite/examples/python/object_detection.py --image /tmp/image2.jpg  --show_image True

image

1を超える推論結果のスコアを修正するには、JavaメソッドTrackedObject.getCurrentCorrelation()を使用できます。これは、常に1未満のものを返すように見えるためです(正しいかどうかはわかりません)。 TFLite Androidの例では、Recognition.getConfidence()を使用しています。これは、常に1より大きい値を返すようです。

@mpeniakMovidiusでssdmobilenettfliteモデルを実行しました。 私も似たようなことをするつもりです。 どうやってやったのか、少し教えていただけますか?

@achowdheryこんにちは、最新のAndroidデモの構築手順の更新をここ(https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite/examples/android/app)で見ましたが、凍結されたpbモデルをtfliteモデル(最新のデモで使用された量子化されたdetect.tflite)に実際に変換する方法を示していませんでした。 量子化されたモデル変換フローに関するその他の指示はありますか? また、ここ(https://www.tensorflow.org/performance/quantization)で説明されているように、最初に偽の量子化操作を使用して量子化トレーニングを実行してから、モデル変換を実行する必要があると思います。 また、最新のAndroidデモでNNAPIを有効にすることは可能ですか? TFLiteObjectDetectionAPIModel.javaでtfLite.setUseNNAPI(true)を使用しようとしましたが、Android8.1を実行しているPixel2でクラッシュしました(NNAPIがなくても正常に動作します)。 助言がありますか? ありがとう!

@tenoyart 「最新のAndroidデモでNNAPIを有効にすることは可能ですか?」の簡単な答えです。 NOである必要があります。 それほど短い答えではありませんが、TF Liteインタープリターを変更すると、モデルを分割したり、対応するカスタム操作をNNAPIに追加したりすることが可能になります。

@achowdheryあなたによるTensorFlowブログ記事を見ました。 これはあなたが言及した指示以上のものが来ていますか?

はい。 これは、Androidでオブジェクト検出モデルをトレーニングして提供するための手順です。

@freedomtanスクリプトを共有していただきありがとうございます。
後処理を使用した最新のスクリプトで、どのモデルファイルを使用していますか?
次のようなoptimize_for_inference.pyの引数を指定しましたか
--input_names = "プリプロセッサ/サブ"
--output_names = "detection_boxes、detection_scores、num_detections、detection_classes"

後処理の有無に違いはありますか?

ありがとう!

4つの出力を持つSqueezeNetモデルをtfliteに変換する方法はありますか?

@chanchanzhanghttps://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpusのチュートリアルの終わりに向けて新しい手順に従ってください-b78971cf1193
これは、optimize_for_inference.pyを使用する場合とは異なるワークフローを使用することに注意してください

@ashwaniag検出のためにSSDを保持したまま、MobilenetをSqueezeNet分類子に置き換えたい場合は、現在のワークフローで問題ありません。

@achowdhery ssd mobilenetv1でTFLiteモデルを見るのは素晴らしいことです。 TFLiteはssdlitemobilenet v2を完全にサポートしていますか?

@tenoyartはい。 すべてのMobilenetSSDは、このパイプラインを介して機能します。 対応するtfliteファイルはオープンソースでリリースされていません。 問題が発生した場合は、バグを報告してください。

@achowdheryが言ったように、 @ chanchanzhangは、 optimized_for_inference.py object_detection/export_tflite_ssd_graph.pyを使用してください。 そして、私が使用したtfliteモデルファイルは、Androidの例で使用されているものです。 ここで入手できます。

@ achowdheryssd_mobilenet_v1_quantized_cocossd_mobilenet_v1_0.75_depth_quantized_cocoのチェックポイントにはFakeQuantノードとテンソルはないと思います。 確認してもらえますか?

@freedomtan object_detection / export_tflite_ssd_graph.pyを使用した後、エクスポートされたグラフにweight_quantノードとact_quantノードが表示されます。
Fakequantノードがないことを確認した方法のスクリーンショットまたは正確な手順を教えてください。
チェックポイントを正常に変換することもできます

@achowdheryチェックしてくれてありがとう。 これら2つでexport_tflite_ssd_graph.pyを実行したとき、tfliteモデルを取得できなかったため、チェックポイントを調べました。 私がしたことは次のようなものです

curl http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_quantized_300x300_coco14_sync_2018_07_03.tar.gz | tar xzvf -
cd ssd_mobilenet_v1_quantized_300x300_coco14_sync_2018_07_03
strings model.ckpt.index  |grep quant

何も表示されません。

@andrewharp cutosm推論クラスTFLiteObjectDetectionAPIModel.javaをありがとうございます、ssd mobilenet v1 tflite mobilenet_ssd_tflite_v1.zipで試しましたが、アプリの起動時に関数recognizeImage(最終ビットマップビットマップ)に問題があるようです。 tfLite.runForMultipleInputsOutputs(inputArray、outputMap); この例外をスローします

07-18 10:37:02.416 19957-19996/com.app.cerist.realtimeobjectdetectionapi E/AndroidRuntime: FATAL EXCEPTION: Camera
    Process: com.app.cerist.realtimeobjectdetectionapi, PID: 19957
    java.lang.IllegalArgumentException: Output error: Outputs do not match with model outputs.
        at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:170)
        at com.app.cerist.realtimeobjectdetectionapi.ImageClassifierTFLiteAPI.recognizeImage(ImageClassifierTFLiteAPI.java:207)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity.classifyFrame(MainActivity.java:421)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity.access$1000(MainActivity.java:48)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity$4.run(MainActivity.java:455)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:159)
        at android.os.HandlerThread.run(HandlerThread.java:61)
07-18 10:37:02.436 19957-19996/com.app.cerist.realtimeobjectdetectionapi V/Process: killProcess [19957] Callers=com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException:99 java.lang.ThreadGroup.uncaughtException:693 java.lang.ThreadGroup.uncaughtException:690 <bottom of call stack> 
07-18 10:37:02.436 19957-19996/com.app.cerist.realtimeobjectdetectionapi I/Process: Sending signal. PID: 19957 SIG: 9

エラーは、出力配列の長さが入力配列の長さよりも大きいことを示していました
これがInterpreter.javaの条件です

public void runForMultipleInputsOutputs(Object[] inputs, <strong i="7">@NonNull</strong> Map<Integer, Object> outputs) {
        if (this.wrapper == null) {
            throw new IllegalStateException("Internal error: The Interpreter has already been closed.");
        } else {
            Tensor[] tensors = this.wrapper.run(inputs);
            if (outputs != null && tensors != null && outputs.size() <= tensors.length) {
                int size = tensors.length;
                Iterator var5 = outputs.keySet().iterator();
            }
       }
}

これが私の入力と出力の配列です:

d.imgData = ByteBuffer.allocateDirect(1 * d.inputSize * d.inputSize * 3 * numBytesPerChannel);
d.imgData.order(ByteOrder.nativeOrder());
d.intValues = new int[d.inputSize * d.inputSize];
 imgData.rewind();
        for (int i = 0; i < inputSize; ++i) {
            for (int j = 0; j < inputSize; ++j) {
                int pixelValue = intValues[i * inputSize + j];
                if (isModelQuantized) {
                    // Quantized model
                    imgData.put((byte) ((pixelValue >> 16) & 0xFF));
                    imgData.put((byte) ((pixelValue >> 8) & 0xFF));
                    imgData.put((byte) (pixelValue & 0xFF));
                } else { // Float model
                    imgData.putFloat((((pixelValue >> 16) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
                    imgData.putFloat((((pixelValue >> 8) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
                    imgData.putFloat(((pixelValue & 0xFF) - IMAGE_MEAN) / IMAGE_STD);

出力配列:

// Copy the input data into TensorFlow.
        Trace.beginSection("feed");
        outputLocations = new float[1][NUM_DETECTIONS][4];
        outputClasses = new float[1][NUM_DETECTIONS];
        outputScores = new float[1][NUM_DETECTIONS];
        numDetections = new float[1];

        Object[] inputArray = {imgData};
        Map<Integer, Object> outputMap = new HashMap<>();
        outputMap.put(0, outputLocations);
        outputMap.put(1, outputScores);
        outputMap.put(2, numDetections);
        outputMap.put(3, outputClasses);
        Trace.endSection();

そして推論:

// Run the inference call.
        Trace.beginSection("run");
        Log.d("TAG_INPUT",""+String.valueOf(inputArray.length));
        Log.d("TAG_OUTPUT",""+String.valueOf(outputMap.size()));

        tfLite.runForMultipleInputsOutputs(inputArray, outputMap);
        Trace.endSection();

私はこのエラーの意味を理解していませんでした。私はあなたのTFLiteObjectDetectionAPIModel.javaクラスとまったく同じことをしました。
ご協力ありがとう御座います

@achowdheryこんにちは、あなたのブログに続いて、モデルをssd_mobilenet_v1_coco_2017_11_17から変換しました。 ただし、tflite_demo.apkで変換されたmobilenet_ssd.tfliteを使用すると、次のエラーが発生しました。

    java.lang.IllegalArgumentException: Cannot copy between a TensorFlowLite tensor with shape [1, 1917, 4] and a Java object with shape [1, 10, 4].

なぜ私がそれを手に入れたのか、何か考えはありますか? ありがとう。

予想される出力テンソルのサイズは1,1917,4ではなく1,10,4であるため、これは形状の不一致です。 古いモデルファイルの場合、5月のデモアプリバージョンに回帰する必要があります。 それ以外の場合は、最新のリリースモデルを使用して変換してください。

@achowdhery自分のモデルをtfliteに変換し、実行すると。 インタープリター-> invoke()呼び出しは、セグメンテーションフォールトをスローします。 何が間違っているのでしょうか?

@ashwaniaghttps://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpus-b78971cf1193でダウンロードしたモデルを実行します
あなたのためにコンパイルしますか?
はいの場合、セグメンテーション違反が発生したときに現在使用している新しい手順を提供してください。
入力タイプ/サイズなどに不一致がある可能性があります。

@achowdheryうまくいきました。 私は間違ったinput_arraysを与えていました。 とにかく、ありがとう!

チュートリアルに従った場合、更新されたssd_mobilenet_v1_quantized_cocoおよびssd_mobilenet_v1_0.75_depth_quantized_cocoの動作。 @achowdheryに感謝します。

サンプルのデモアプリでTFLiteObjectDetectionAPIModel.javaを見ていました。 ここでの各recognizeImage呼び出しに、 outputLocationsoutputClassesoutputScores 、およびnumDetectionsが割り当てられる理由はありますか? それらは事前に割り当てられることを意図しているようです。
事前割り当てを使用してコードを実行しようとしましたが、正常に機能しているようですが、後で問題が発生する可能性のあるものが隠されていないことを確認したかっただけです。

事前割り当ての方がおそらく効率的です。 問題を予見できるように、どこに事前に割り当てていますか?

返信@achowdheryをありがとう。 静的createメソッドの事前割り当てはそのままにしておきます。 私の唯一の懸念は、コードが事前割り当て(静的メソッドが配列を事前割り当てする)を使用するように記述されているように見えることでしたが、何らかの理由で、配列は呼び出しごとに再割り当てされます。

こんにちは@achowdhery 、私は新しいAndroidtfliteアプリのデモをテストしました。 ssd_mobilenet_v1_coco、ssd_mobilenet_v1_0.75_depth_coco、ssd_mobilenet_v1_quantized_cocoで完全に機能します。
しかし、他のssd-mobilenetモデルではこの例外が発生しました。

07-25 07:41:25.292 31515-31532/org.tensorflow.lite.demo E/AndroidRuntime: FATAL EXCEPTION: inference
    Process: org.tensorflow.lite.demo, PID: 31515
    java.lang.ArrayIndexOutOfBoundsException: length=160; index=-2147483648
        at java.util.Vector.elementData(Vector.java:734)
        at java.util.Vector.get(Vector.java:750)
        at org.tensorflow.demo.TFLiteObjectDetectionAPIModel.recognizeImage(TFLiteObjectDetectionAPIModel.java:218)
        at org.tensorflow.demo.DetectorActivity$3.run(DetectorActivity.java:249)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.os.HandlerThread.run(HandlerThread.java:65)

tfliteモデルは間違ったクラスインデックスを生成しました。 例外により、数秒間正常に検出された後、アプリがクラッシュします。
ssd_mobilenet_v1_ppn_cocoは、間違った乱雑なバウンディングボックス、ラベルも生成します。

PPNはfloatモデルです。float変換コマンドを使用してTFLITEモデルを変換していますか。
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
次に、DetectorActivity.javaで以下も変更する必要があります。
private static final boolean TF_OD_API_IS_QUANTIZED = true;

私はその設定を知っていました。 実際、その設定が間違っていると、アプリはまったく実行できません。
ArrayIndexOutOfBoundsExceptionが表示されますか? チュートリアルのDockerも試しましたが、同じです。

わかった。 正確な再現手順を記載した新しいGitHubの問題を提出してください。 PPNモデルはJavaアプリの新機能リクエストです-優先順位が付けられたら返信します

ありがとう。 ArrayIndexOutOfBoundsExceptionは、ssd_mobilenet_v1_0.75_depth_quantized_coco、ssdlite_mobilenet_v2_cocoにも発生します。 PPNとの違いは、その例外によってアプリがクラッシュする前に正しい結果が得られることです。

@achowdhery新しいmodel_main.pyにはバグがあるので、legacy / train.pyを使用してtfliteの4つの出力でquantizeモデルをトレーニングする方法はありますか?
https://github.com/tensorflow/models/issues/4798

@ashwaniag 2つのコードを比較して、量子化を追加する部分を追加できます。graph_rewriter関数は、量子化操作が追加される場所であることに注意してください。

@achowdheryhttps ://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
iOSで同じことを行う方法の例またはサンプルコードはありますか? これまでのところ、私が見つけた最も近いものは、このhttps://github.com/YijinLiu/tf-cpu/blob/master/benchmark/obj_detect_lite.ccでしたが、これは常に機能するとは限りません。

現在のiOSデモアプリはssdおよびfloatモデルでは動作しません。

@achowdhery tensorflowv1.9を使用してモデルをトレーニングしました。 ブログの手順を使用してtfliteに変換されました。 検出されません。 これについて何か考えがありますか?

@ashwaniag COCOまたはペット? 正確な再現手順で新しいバグを開いてください。 他のGitHubユーザーは、Tensorflow1.10での動作を確認しています

@achowdheryそれは私自身のデータセットです。 mobilenetv2アーキテクチャのトレーニングを行いました。 .pbモデル(tensorflowモデル)を実行すると、次のようになります。
見つかりません:VAL5-04で実行されているバイナリで「NonMaxSuppressionV3」が登録されていないOpタイプ。 Opとカーネルがこのプロセスで実行されているバイナリに登録されていることを確認してください。

あなたはそれが関連していると思いますか?

@ashwaniag新しいバグを開いて、正確で再現可能な手順を提供してください

@ashwaniagはこれらの両方の問題をチェックします、私は同様の問題を抱えていました: #10254#19854

@ achraf-boussaadaありがとうございます! それを私が直した。 バージョンの不一致の問題でした。
@achowdheryさて、問題は、完全なテンソルフローモデルでは素晴らしい結果が得られますが、tfliteモデルでは非常に悪い結果が得られることです。

@ashwaniag非常に悪い結果を定義してください。 小さなものはありますか? 問題の再現に役立てるために、モデルチェックポイント、パイプライン構成、ラベルファイル、およびサンプル画像を添付してください。 ありがとう

@oopsoddこんにちは、私は間違ったクラスインデックスを取得します。 「java.lang.ArrayIndexOutOfBoundsException:length = 10; index = -739161663」と文句を言いました、助けてくれませんか?

iOSおよびAndroid用のTensorFlowLite SSD(オブジェクト検出)の最小限の動作例を作成したことに注意してください。 https://github.com/baxterai/tfliteSSDminimalWorkingExample。 iOSバージョンはYijinLiuによるobj_detect_lite.cc(WeiboXuによるnms関数付き)に基づいており、Androidバージョンはhttps://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/examples/に基づいています。

@baxterai素晴らしい仕事です! ありがとう、私はそれをテストします。

みなさん、素晴らしい仕事をありがとう! 最近追加された後処理操作に関して別の質問があります。

事前トレーニングされたssd_mobilenet_v1_quantized_cocoの出力
現在、models / research / object_detection / samples / configs / likeのデフォルト設定が含まれている場合でも、フレーム内の上位10個の検出に制限されています。
ssd_mobilenet_v1_quantized_300x300_coco14_sync.configはすべて、合計検出の上限を指定します。

post_processing { batch_non_max_suppression { score_threshold: 1e-8 iou_threshold: 0.6 max_detections_per_class: 100 max_total_detections: 100 } score_converter: SIGMOID }

これは、このパイプライン構成でネットワークを再トレーニングすることで解決されますか、それとも
「TFLite_Detection_PostProcess」は他の構成によって10に修正されましたか?

@ Georg-Wexport_tflite_ssd_graph.pyの最大検出も変更する必要があります。 コマンドラインオプションがあります。

@achowdheryああありがとう! それは私が逃したものです。

@andrewharp cutosm推論クラスTFLiteObjectDetectionAPIModel.javaをありがとうございます、ssd mobilenet v1 tflite mobilenet_ssd_tflite_v1.zipで試しましたが、アプリの起動時に関数recognizeImage(最終ビットマップビットマップ)に問題があるようです。 tfLite.runForMultipleInputsOutputs(inputArray、outputMap); この例外をスローします

07-18 10:37:02.416 19957-19996/com.app.cerist.realtimeobjectdetectionapi E/AndroidRuntime: FATAL EXCEPTION: Camera
    Process: com.app.cerist.realtimeobjectdetectionapi, PID: 19957
    java.lang.IllegalArgumentException: Output error: Outputs do not match with model outputs.
        at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:170)
        at com.app.cerist.realtimeobjectdetectionapi.ImageClassifierTFLiteAPI.recognizeImage(ImageClassifierTFLiteAPI.java:207)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity.classifyFrame(MainActivity.java:421)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity.access$1000(MainActivity.java:48)
        at com.app.cerist.realtimeobjectdetectionapi.MainActivity$4.run(MainActivity.java:455)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:159)
        at android.os.HandlerThread.run(HandlerThread.java:61)
07-18 10:37:02.436 19957-19996/com.app.cerist.realtimeobjectdetectionapi V/Process: killProcess [19957] Callers=com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException:99 java.lang.ThreadGroup.uncaughtException:693 java.lang.ThreadGroup.uncaughtException:690 <bottom of call stack> 
07-18 10:37:02.436 19957-19996/com.app.cerist.realtimeobjectdetectionapi I/Process: Sending signal. PID: 19957 SIG: 9

エラーは、出力配列の長さが入力配列の長さよりも大きいことを示していました
これがInterpreter.javaの条件です

public void runForMultipleInputsOutputs(Object[] inputs, <strong i="14">@NonNull</strong> Map<Integer, Object> outputs) {
        if (this.wrapper == null) {
            throw new IllegalStateException("Internal error: The Interpreter has already been closed.");
        } else {
            Tensor[] tensors = this.wrapper.run(inputs);
            if (outputs != null && tensors != null && outputs.size() <= tensors.length) {
                int size = tensors.length;
                Iterator var5 = outputs.keySet().iterator();
            }
       }
}

これが私の入力と出力の配列です:

d.imgData = ByteBuffer.allocateDirect(1 * d.inputSize * d.inputSize * 3 * numBytesPerChannel);
d.imgData.order(ByteOrder.nativeOrder());
d.intValues = new int[d.inputSize * d.inputSize];

`` `
imgData.rewind();
for(int i = 0; i <inputSize; ++ i){
for(int j = 0; j <inputSize; ++ j){
int pixelValue = intValues [i * inputSize + j];
if(isModelQuantized){
//量子化モデル
imgData.put((byte)((pixelValue >> 16)&0xFF));
imgData.put((byte)((pixelValue >> 8)&0xFF));
imgData.put((byte)(pixelValue&0xFF));
} else {//フロートモデル
imgData.putFloat((((pixelValue >> 16)&0xFF)-IMAGE_MEAN)/ IMAGE_STD);
imgData.putFloat((((pixelValue >> 8)&0xFF)-IMAGE_MEAN)/ IMAGE_STD);
imgData.putFloat(((pixelValue&0xFF)-IMAGE_MEAN)/ IMAGE_STD);

The outputs array :

//入力データをTensorFlowにコピーします。
Trace.beginSection( "feed");
outputLocations = new float [1] [NUM_DETECTIONS] [4];
outputClasses = new float [1] [NUM_DETECTIONS];
outputScores = new float [1] [NUM_DETECTIONS];
numDetections = new float [1];

    Object[] inputArray = {imgData};
    Map<Integer, Object> outputMap = new HashMap<>();
    outputMap.put(0, outputLocations);
    outputMap.put(1, outputScores);
    outputMap.put(2, numDetections);
    outputMap.put(3, outputClasses);
    Trace.endSection();
And the Inference :

//推論呼び出しを実行します。
Trace.beginSection( "run");
Log.d( "TAG_INPUT"、 "" + String.valueOf(inputArray.length));
Log.d( "TAG_OUTPUT"、 "" + String.valueOf(outputMap.size()));

    tfLite.runForMultipleInputsOutputs(inputArray, outputMap);
    Trace.endSection();

`` `
私はこのエラーの意味を理解していませんでした。私はあなたのTFLiteObjectDetectionAPIModel.javaクラスとまったく同じことをしました。
ご協力ありがとう御座います

私は同じ問題を抱えています..解決策がありますか?
ありがとう..

@ Georg-Wexport_tflite_ssd_graph.pyの最大検出も変更する必要があります。 コマンドラインオプションがあります。

やあ

画像内の10個を超えるオブジェクトを検出しようとしています(これはデフォルトです)
私は次のコマンドを使用しています:
bazel run -c opt tensorflow / contrib / lite / toco:toco --- input_file = $ OUTPUT_DIR / tflite_graph.pb --output_file = $ OUTPUT_DIR / mobile_net_500.tflite --input_shapes = 1,300,300,3 --input_arrays = normalized_input_image_tensor- output_arrays = 'TFLite_Detection_PostProcess'、 'TFLite_Detection_Po stProcess:1 '、 'TFLite_Detection_Po stProcess:2 '、 'TFLite_Detection_Po stProcess:3 ' --inference_type = FLOAT --max_detections = 500 --max_classes_per_detection = 1 --allow_custom_ops

私も変更しました
export_tflite_ssd_graph.py
flags.DEFINE_integer( 'max_detections'、500 <--- 10ではなく
'表示する検出(ボックス)の最大数。')
flags.DEFINE_integer( 'max_classes_per_detection'、1、
'検出ボックスごとに表示するクラスの数。')

ただし、Android [1,10,4]の出力として10個のオブジェクトを提供します。

何か案が?

@KaviSanth問題の解決にも興味があります。

@Stevelbのこのソリューションは機能するはずです。 凍結されたグラフを視覚化して、max_detectionsが正しく設定されていることを確認することをお勧めします。

@achowdheryお返事ありがとうございます。 @andrewharpによって記述されたコマンドを実行しようとしましたが、次のエラーが発生します。 確かに、tocoはこの場所にありません。 githubリポジトリのマスターバージョンとr1.95バージョンを使用しています。

bazel run tensorflow / contrib / lite / toco:toco --- input_file = $ STRIPPED_PB --output_file = $ DETECT_FB --input_format = TENSORFLOW_GRAPHDEF --output_format = TFLITE --input_shapes = 1,300,300,3 --input_arrays = Preprocessor / sub- -output_arrays = concat、concat_1 --inference_type = FLOAT --logtostderr
情報:呼び出しID:0e58a5ef-9fee-4619-b760-aeb1c83c9661
エラー:スキップ 'tensorflow / contrib / lite / toco:toco ':そのようなパッケージはありません 'tensorflow / contrib / lite / toco':ビルドファイルがパッケージパスに見つかりません
警告:ターゲットパターンの解析に失敗しました。
エラー:そのようなパッケージはありません 'tensorflow / contrib / lite / toco':ビルドファイルがパッケージパスに見つかりません
情報:経過時間:0.179秒
情報:0プロセス。
失敗:ビルドが正常に完了しませんでした(0個のパッケージがロードされました)
失敗:ビルドが正常に完了しませんでした(0個のパッケージがロードされました)
gitからプルされたローカルのテンソルフローフォルダーからこれらのコマンドを実行していることを修正する必要があります。

tensorflow / lite / tocoの下にtocoを見つけることができ、それが機能するかどうかをテストしています。
わかりました。このtocoを使用すると機能するようです。それ以外は、$ DETECT_FBパスを$ PWD / ssd_mobilenet.tfliteに変更する必要があります。これは、contrib / liteフォルダーには一部のPythonのみが他にないためです。

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android(https://github.com/tensorflow/tensorflow/blob )からDetectorActivityに.tfliteファイルを追加すると、ランタイムエラーが発生します/master/tensorflow/examples/android/src/org/tensorflow/demo/DetectorActivity.java)の行

private static final String TF_OD_API_MODEL_FILE =
            "file:///android_asset/ssd_mobilenet_v1.tflite";

E / AndroidRuntime:致命的な例外:メイン
プロセス:myProcess、PID:32611
java.lang.RuntimeException:入力ノード 'image_tensor'が見つかりませんでした
myPackage.myClass.TensorFlowObjectDetectionAPIModel.create(TensorFlowObjectDetectionAPIModel.java:106)で

そのアプリで.tfliteモデルを使用することはできませんか?

@ defaultUser3214検出アプリで分類モデルを使用しています。 MobileNetv1は分類モデルです。 MobileNetSSDモデルを使用してください

@achowdheryありがとうございます! wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gzのモデルを使用すると、そのエラーが発生しました。 しかし、これはssdバージョンだと思いましたか?

ただし、以前は.pbとして機能していた.tfliteに変換されたssd_mobilenet_v1_android_export.pbを使用すると、同じエラーが発生します。

@ defaultUser3214これは、2018年7月にリリースされた最新のデモアプリでは機能しない古いバージョンのモデルです。2018年7月に検出モデル動物園で最新モデルをダウンロードしてください。これらはアプリで機能します。 それでもブロックされる場合は、新しい問題を開いてください。

@ SteveIbTFLiteObjectDetectionAPIModel.javaのNUM_DETECTIONS = 500も変更する必要があります

ssdmobilenet v1.pbを.tfliteに変換できません
Tensorflowオブジェクト検出API @ aselle @ achowdheryを介して生成されたpb

これについて何か進展はありますか? broken_inference_graph.pbを.TFLITEファイルに変換しようとしていますが、エラーが発生します

java.lang.IllegalArgumentException: Cannot convert between a TensorFlowLite buffer with 49152 bytes and a ByteBuffer with 270000 bytes

Androidでのカスタムオブジェクト検出用。 さまざまな変換方法に関するアイデアはありますか? こちらのチュートリアルに従って、Windows10で学習したssd_mobilenet_v1_petsを転送します: https ://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

これについて何か進展はありますか? broken_inference_graph.pbを.TFLITEファイルに変換しようとしていますが、エラーが発生します

java.lang.IllegalArgumentException: Cannot convert between a TensorFlowLite buffer with 49152 bytes and a ByteBuffer with 270000 bytes

Androidでのカスタムオブジェクト検出用。 さまざまな変換方法に関するアイデアはありますか? こちらのチュートリアルに従って、Windows10で学習したssd_mobilenet_v1_petsを転送します: https ://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

これをフォローアップし、同じエラーが発生していた他の人を助けるために-これは、トレーニングに誤ったモデルチェックポイントを使用したことが原因です。 .tfliteを使用してAndroidで動作するには、初期モデルはMobileNetである必要があり、量子化されている必要があり、コードのこのセクションまたは.configファイルに類似したものが含まれます。

graph_rewriter { quantization { delay: 48000 weight_bits: 8 activation_bits: 8 } }

現在、 tensorflow / contrib / lite / examples / androidで公開されています。 これは、元のTF Androidデモのより完全な移植版であり(Stylizeの例がないだけです)、今後、tensorflow / contrib / lite / java / demoの他のデモに取って代わります。

変換されたTFLiteフラットバッファはmobilenet_ssd_tflite_v1.zipにあり、Java推論の実装はTFLiteObjectDetectionAPIModel.javaあります。 これは、ボックスをJavaで手動でデコードする必要があり、ボックスの前のtxtファイルをアプリアセットにパッケージ化する必要があるという点で、元のTF実装とは異なることに注意してください(上記のモデルzipに含まれているものはほとんどの場合有効であると思います)グラフ)。

TOCO変換中に、異なる入力ノード(Preprocessor / sub)と、異なる出力ノード(concat、concat_1)が使用されます。 これにより、グラフが再構築されるか、TF LiteがTFパリティに達するまで、tfliteで問題となる一部の部分がスキップされます。

SSD MobileNetモデルをtflite形式に変換し、それを使用するデモを作成するための簡単な手順は次のとおりです。

# Download and extract SSD MobileNet model
wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz
tar -xvf ssd_mobilenet_v1_coco_2017_11_17.tar.gz 
DETECT_PB=$PWD/ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb
STRIPPED_PB=$PWD/frozen_inference_graph_stripped.pb
DETECT_FB=$PWD/tensorflow/contrib/lite/examples/android/assets/mobilenet_ssd.tflite

# Strip out problematic nodes before even letting TOCO see the graphdef
bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB  --output=$STRIPPED_PB --frozen_graph=True \
--input_names=Preprocessor/sub --output_names=concat,concat_1 \
--alsologtostderr

# Run TOCO conversion.
bazel run tensorflow/contrib/lite/toco:toco -- \
--input_file=$STRIPPED_PB --output_file=$DETECT_FB \
--input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE \
--input_shapes=1,300,300,3 --input_arrays=Preprocessor/sub \
--output_arrays=concat,concat_1 --inference_type=FLOAT --logtostderr

# Build and install the demo
bazel build -c opt --cxxopt='--std=c++11' //tensorflow/contrib/lite/examples/android:tflite_demo
adb install -r -f bazel-bin/tensorflow/contrib/lite/examples/android/tflite_demo.apk

これは魅力のように機能します!

このページは役に立ちましたか?
0 / 5 - 0 評価