Tensorflow: [Frage&Fehler] Gibt es ein Erkennungsmodell wie ein SSD-Mobilnetz in Tensorflow-Lite?

Erstellt am 26. Dez. 2017  ·  141Kommentare  ·  Quelle: tensorflow/tensorflow

HALLO.

Entwicklung einer Android-Anwendung mit Tensorflow-Lite.

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/models.md
Erkennungsmodell nicht gefunden.

Außerdem versuche ich, SSD-Inceptionv2 mit tensorflow-lite-API zu konvertieren. Aber es scheint ein Problem zu geben.

Befehl


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}

Fehlercode


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 

Die Datei fire_inception_v2 wird erstellt, aber ihre Größe beträgt null Bytes.
Was ist ein Problem?

Auch,
Bitte teilen Sie mir mit, wie das benutzerdefinierte Modell für die Objekterkennung am besten bereitgestellt werden kann.

Jemand hilft mir bitte!.

Danke.

lite feature

Hilfreichster Kommentar

Es ist jetzt live unter tensorflow/contrib/lite/examples/android ! Dies ist eine vollständigere Portierung der ursprünglichen TF-Android-Demo (nur ohne das Stylize-Beispiel) und wird in Zukunft die andere Demo in tensorflow/contrib/lite/java/demo ersetzen.

Einen konvertierten TF Lite-Flatbuffer finden Sie in mobilenet_ssd_tflite_v1.zip , und Sie finden die Java-Inferenzimplementierung in TFLiteObjectDetectionAPIModel.java . Beachten Sie, dass sich dies von der ursprünglichen TF-Implementierung darin unterscheidet, dass die Boxen manuell in Java decodiert werden müssen und eine TXT-Datei mit vorheriger Box in die App-Assets gepackt werden muss (ich denke, die im obigen Modell-Zip enthaltene sollte für die meisten gültig sein Grafiken).

Während der TOCO-Konvertierung wird ein anderer Eingangsknoten (Preprocessor/sub) verwendet, sowie verschiedene Ausgangsknoten (concat, concat_1). Dadurch werden einige Teile übersprungen, die für tflite problematisch sind, bis entweder der Graph neu strukturiert wird oder TF Lite die TF-Parität erreicht.

Hier sind die schnellen Schritte zum Konvertieren eines SSD-MobileNet-Modells in das tflite-Format und zum Erstellen der Demo, um es zu verwenden:

# 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

Alle 141 Kommentare

@aselle kannst du dir bitte dieses Problem ansehen? Danke.

Wir arbeiten derzeit daran, mobilenet SSD (und danach Inception SSD) zu konvertieren, aber es enthält Operationen, die nicht vollständig unterstützt werden. Ich werde diese Ausgabe aktualisieren, sobald wir das erledigt haben.

Großartig, ich habe hier eine ähnliche Frage gestellt: https://github.com/tensorflow/tensorflow/issues/14731

Wie lange rechnen Sie, bis Sie Unterstützung von ssd-mobilenet hinzufügen?

Danke,
Martin Peniak

Ein Mitglied der TensorFlow-Organisation hat geantwortet, nachdem das Label stat: awaiting tensorflower angewendet wurde.

?

Nörgelnder Beauftragter: Es sind 14 Tage ohne Aktivität vergangen und dieses Problem hat einen Beauftragten. Bitte aktualisieren Sie das Label und/oder den Status entsprechend.

Irgendwelche Updates?
Ich stehe auch vor einem ähnlichen Problem. Vielen Dank im Voraus.

@yucheeling

Könnten Sie bitte einen Datensatz wie " ssd_mobilenet_v1_coco_2017_11_17.tar " vorschlagen, der in einem Einzelhandelsgeschäft zur Identifizierung verschiedener Kleidungsstücke wie T-Shirts, Jeans usw. verwendet werden kann?

@rana3579 , bitte stellen Sie eine solche Frage auf Stackoverflow. Ein kurzes Update zu Mobilenet SSD. Dies schreitet voran und wir hoffen, dass wir bald ein Beispiel herausbringen werden.

@rana3579 schau dir mein Video an, habe es auf movidius, nvidia gpus sowie arm-Prozessoren laufen lassen. Ich kann den Datensatz nicht teilen, aber wenn Sie Teil eines Unternehmens sind, könnten wir über eine mögliche Zusammenarbeit sprechen: https://www.youtube.com/watch?v=3MinI9cCJrc

@aselle Danke für das Update! Wo finde ich die Benachrichtigungen dazu? Ich möchte benachrichtigt werden, sobald es herauskommt, wenn das möglich ist. Vielen Dank, ich weiß Ihre harte Arbeit zu schätzen!

@andrewharp arbeitet daran und wird die Java TF Mobile-App aktualisieren, um tflite zu verwenden. Achten Sie also auf diese Änderungen im Repository. Ich lasse dieses Thema vorerst offen.

Dies ist intern funktional; sollte in den nächsten ein bis zwei Wochen etwas herauskommen.

@andrewharp das ist toll!! Gilt das auch für das Beispiel der iOS-Kamera?
Und wie sieht es mit der Größe der Gewichte und der Leistung aus?
Das TFLite-Klassifizierungsmobilnetz ist winzig und die Leistung auf iOS ist butterweich, also bin ich wirklich gespannt auf TFLite.

Einige andere haben bereits die vorhandene SSD Mobilenet pb in ein Coreml-Modell konvertiert und die fehlenden Ausgabeschichten in Swift geschrieben:
https://github.com/vonholst/SSDMobileNet_CoreML

Aber das sind wirklich nur 8-12 fps auf einem iPhone 7.

Hallo,
Gibt es hierzu Neuigkeiten?

Ich bin auch neugierig :)

Ich habe einen Commit, der die Android TF-Demo auf tflite portiert, der derzeit überprüft wird, sollte hoffentlich diese Woche auf Github erscheinen.

@madhavajay Es ist nur Android, aber Sie sollten es für iOS anpassen können. Die einzige Sache ist, dass ein Teil der Vorverarbeitung (Bildgrößenänderung/Normalisierung) und Nachverarbeitung (Non-Max-Unterdrückung und Anpassung durch Box-Prioritäten) in Java erfolgt, da tflite nicht alle von MobileNet SSD verwendeten Operatoren vollständig unterstützt .

@andrewharp Das ist großartig. Können Sie kurz erklären, warum diese Operationen derzeit nicht in TF lite verfügbar sind. Scheint der gleiche Fall für das tfcoreml-Konvertierungstool auf normaler SSD zu sein. Sie beschweren sich nicht nur aus technischem Interesse, tun sie etwas, das im mobilen Stack besonders schwierig zu implementieren ist, oder hat es nur eine niedrige Priorität?

Wir freuen uns darauf, Ihren epischen Einsatz für den Android-Code zu sehen!!! Vielen Dank. Ich weiß, ich bin nicht der Einzige, der sich darauf freut!

@andrewharp und @aselle Gibt es ein Update zum Abrufen einer Demo für die Verwendung eines SSD-basierten Objektlokalisierungsbeispiels für TFLite?

Es ist jetzt live unter tensorflow/contrib/lite/examples/android ! Dies ist eine vollständigere Portierung der ursprünglichen TF-Android-Demo (nur ohne das Stylize-Beispiel) und wird in Zukunft die andere Demo in tensorflow/contrib/lite/java/demo ersetzen.

Einen konvertierten TF Lite-Flatbuffer finden Sie in mobilenet_ssd_tflite_v1.zip , und Sie finden die Java-Inferenzimplementierung in TFLiteObjectDetectionAPIModel.java . Beachten Sie, dass sich dies von der ursprünglichen TF-Implementierung darin unterscheidet, dass die Boxen manuell in Java decodiert werden müssen und eine TXT-Datei mit vorheriger Box in die App-Assets gepackt werden muss (ich denke, die im obigen Modell-Zip enthaltene sollte für die meisten gültig sein Grafiken).

Während der TOCO-Konvertierung wird ein anderer Eingangsknoten (Preprocessor/sub) verwendet, sowie verschiedene Ausgangsknoten (concat, concat_1). Dadurch werden einige Teile übersprungen, die für tflite problematisch sind, bis entweder der Graph neu strukturiert wird oder TF Lite die TF-Parität erreicht.

Hier sind die schnellen Schritte zum Konvertieren eines SSD-MobileNet-Modells in das tflite-Format und zum Erstellen der Demo, um es zu verwenden:

# 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 Frohe Ostern 🥚🍫 du LEGENDE! :) Mal sehen, ob ich das zum Laufen bekomme.

Hallo, gibt es eine Quantize-Version?

Ich habe es mit den obigen Anweisungen zum Laufen gebracht, brauchte aber:

  • Android SDK 15 wegen meiner Bazel-Version
  • Ich kann das Projekt auch nicht in Android Studio öffnen

@andrewharp ist das ein neues Android Studio-Ding, auf das Sie zusteuern, das Bazel verwendet, um Projekte anstelle von Gradle zu erstellen, oder nur einige Projekteinstellungen vorerst fehlen, weil der Zeitrahmen zu kurz ist, um es zum Laufen zu bringen?

Gerne eine PR, wenn ich verstehe, was das Problem ist.

Auch in Bezug auf die Leistung scheint es auf meinem LG G6 unter Android 7 langsam zu sein.
Liegt das daran, dass die NN-API nur auf Android 8 verfügbar ist?

Kann es jemand auf Android 8 testen?

Verstehe, ich dachte die Anleitung wäre nur für den Umbau. Ich habe aufgehört zu lesen, nachdem der erste Teil des Satzes gesagt hat, dass Sie so das Modell umwandeln, lol.

Ja, ich habe Pixel XL, ich nehme an, Ihr Telefon verfügt nicht über Hardware, die die Inferenz beschleunigen kann, oder diese Hardware wird nicht von Software unterstützt.

Ich werde versuchen, Ihnen Bescheid zu geben. Ich ging davon aus, dass ich das mit Android Studio Doh bauen könnte ...

von meinem Iphone gesendet

Am 31. März 2018 um 20:05 Uhr schrieb Madhava Jay [email protected] :

Ich habe es mit den obigen Anweisungen zum Laufen gebracht, brauchte aber:

Android SDK 15 wegen meiner Bazel-Version
Ich kann das Projekt auch nicht in Android Studio öffnen
@andrewharp ist das ein neues Android Studio-Ding, auf das Sie zusteuern, das Bazel verwendet, um Projekte anstelle von Gradle zu erstellen, oder nur einige Projekteinstellungen vorerst fehlen, weil der Zeitrahmen zu kurz ist, um es zum Laufen zu bringen?

Gerne eine PR, wenn ich verstehe, was das Problem ist.

Auch in Bezug auf die Leistung scheint es auf meinem LG G6 unter Android 7 langsam zu sein.
Liegt das daran, dass die NN-API nur auf Android 8 verfügbar ist?

Kann es jemand auf Android 8 testen?


Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub an oder schalten Sie den Thread stumm.

Ja, ich habe das Gleiche getan und bin direkt zum Code- und Android-Studio gegangen. Nachdem Sie heute Morgen gepingt hatten, wollte ich gerade antworten, dass ich das gleiche Problem hatte, und dann erneut RTFM senden. 🤣

Soweit ich das beurteilen kann, sollte das LG G6 in der Lage sein, die NN-API zu unterstützen, da es den gleichen Qualcomm 821 SoC wie Pixel 1 hat. Leider hat LG Android 8 oder 8.1 nicht veröffentlicht, und die neuesten LineageOS-Builds sehen etwas skizzenhaft aus Also werde ich warten, es sei denn, ich weiß, dass es unter Android 8.1 besser funktioniert. Wenn Sie es auf dem Pixel starten könnten, wäre das großartig! 👍

Ich habe es geschafft, dies zu testen, aber die Demo läuft sehr langsam ... sogar langsamer als die Originalversion.
Ich verwende Pixel XL (erste Version) und habe zuvor die alte Demo für 64-Bit-Arch kompiliert, wodurch sie auch ohne tfLite fast doppelt so schnell lief ... die Inferenzzeit beträgt in diesem Fall etwa 450 ms. Wenn ich diese Demo ausprobiere, läuft sie mit etwa 850 ms und manchmal sogar über einer Sekunde. Habe ich etwas falsch gemacht oder war ich nur zu optimistisch, eine anständige Beschleunigung zu erwarten? Danke.

@mpeniak Ich habe auf dem LG G6 die gleichen Geschwindigkeiten, mit ein- oder ausgeschaltetem Debug (dachte zuerst, es sei Debug). Ich vermute, dass NNAPI nicht verwendet wird. Vielleicht müssen wir etwas Besonderes mit dem nnapi_lib-Build machen?
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/BUILD

Die Abhängigkeit ist aufgelistet, muss aber möglicherweise für eine bestimmte Architektur erstellt werden?
Vielleicht etwas in ./configure
(Übrigens habe ich XLA in meinem ./configure aktiviert, falls das verwandt war, aber es hat die Geschwindigkeit nicht geändert)

@andrewharp
Ich möchte NNAPI verwenden, weiß aber nicht, wie ich es verwenden soll.
Laut Dokument ist die Neural Networks API in Android 8.1 > verfügbar
Wenn es 8.1 oder höher ist, wird es grundsätzlich angewendet? oder Benötige ich zusätzliche NDK-Arbeit? Dokumentenlink
Schönen Tag noch XD

@andrewharp , ich habe versucht, NNAPI für tflite_demo zu aktivieren und die apk auszuführen, aber ich fand, dass die apk abgestürzt ist
Beim Aufruf von AddOpsAndParams wird die Operation tflite::BuiltinOperator_SQUEEZE nicht unterstützt und
nn_op_type ist auf -1 gesetzt, was dazu führt, dass FATAL aufgerufen wird, und exit(-1) . Ich denke, das ist die
tiefere Ursache. Würden Sie bitte sagen, ob es in einer zukünftigen Version unterstützt wird? Gibt es eine andere Möglichkeit zu arbeiten
herum, um den NNAPI-Pfad zu testen? Danke.

@andrehentz
bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB --output=$STRIPPED_PB --frozen_graph=True \
--input_names=Präprozessor/Sub --output_names=concat,concat_1 \
--alsologtostderr

Warum ist input_names nicht image_tensor?
Ich habe es auf diese Weise versucht und bin auf einen Fehler gestoßen.

@namare
Sie sollten frozen_inference_graph_stripped.pb anstelle von frozen_inference_graph.pb verwenden.
versuche "bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=frozen_inference_graph_stripped.pb"
und Sie können die folgende Ausgabe sehen:
1 mögliche Eingaben gefunden: (name=Preprocessor/sub, type=float(1), shape=None)
Keine Variablen entdeckt.
2 mögliche Ausgaben gefunden: (name=concat, op=ConcatV2) (name=concat_1, op=ConcatV2)

Der Eingabename ist Preprocessor/sub und der Ausgabename ist concat.

@namare
Der neueste Tensorflow-Lite-Code enthält eine Java-Schnittstelle zur Aktivierung von NNAPI.

Der Klasseninterpreter hat die Funktion namens: setUseNNAPI(true);
Sie können diese Schnittstelle direkt aufrufen.

@zhangbo0325
Ich habe bereits versucht, setUserNNAPI(true); aufzurufen, aber es gab keine Wirkung.
Es war fast eine ähnliche Schlussfolgerung, wenn NNAPI nicht verwendet wurde.
Android-Spezifikation: Version 8.1.

@nanamare , läuft dein ssd-mobilenet? Für ein solches Netzwerk gibt es eine SQUEEZE-Operation, die von Android NNAPI nicht unterstützt wird. Die Frage habe ich oben gestellt. Für mobilenet-v1 ist es OK.

<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!

Mobiles Log hier:
04-04 19:46:36.099 28864-28882/org.tensorflow.lite.demo E/AndroidRuntime: FATAL EXCEPTION: Inference Process: org.tensorflow.lite.demo, PID: 28864 java.lang.IllegalArgumentException: Shape of output target [1, 1917, 4] stimmt nicht mit der Form des Tensors [1, 1917, 1, 4] überein. bei org.tensorflow.lite.Tensor.copyTo(Tensor.java:44) bei org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:139) bei org.tensorflow.demo.TFLiteObjectDetectionAPIModel.recognizeImage(TFLiteObjectDetectionAPIModel.java:226 ) unter org.tensorflow.demo.DetectorActivity$3.run(DetectorActivity.java:248) unter android.os.Handler.handleCallback(Handler.java:761) unter android.os.Handler.dispatchMessage(Handler.java:98)at android.os.Looper.loop(Looper.java:156) und android.os.HandlerThread.run(HandlerThread.java:61)

Tolle! Versuchen Sie, dies unter iOS zum Laufen zu bringen. Wie parse ich die Tensor-Ausgabe?

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

Die DetectorActivity-Schnittstelle hängt in meinem Projekt, gibt es sie, wie kann ich sie lösen?

@ zhangbo0325 Danke für die Details. Da der Squeeze von der NNAPI nicht unterstützt wird, bedeutet dies, dass die NNAPI überhaupt nicht verwendet wird und die Inferenz so langsam bleibt, wie sie ist? Wie ich in einem früheren Kommentar erwähnt habe, erhalte ich auf Pixel XL eine wirklich schlechte Leistung. Ich würde Inferenzzeiten zwischen 80 und 120 ms erwarten. Danke!

@mpeniak , ich habe andrewharp die gleiche Frage gestellt. Ich habe gerade das SSD-Mobilenet mit Hilfe der Tensorflow-Lite-CPU-Implementierung ausgeführt und auch die schlechte Leistung erhalten.

Der TensorFlow Lite-Vortrag auf dem Dev Summit 2018 zeigte die 3-fache Leistung auf MobileNet:
https://youtu.be/FAMfy7izB6A?t=530

Vielleicht ist das aber nicht für SSD?
Erfordert möglicherweise zuerst eine Gewichtsquantisierung?

Ich habe mobilnet ausprobiert und es ist viel schneller, dies gilt jedoch nicht für mobilnet-ssd ...

Trauriger Panda ☹️🐼
@andrewharp Irgendeine Ahnung, wann eine leistungsfähige SSD-Implementierung verfügbar sein wird? Ist es eine Frage der Gewichtsquantisierung?

Ich habe auch die schlechte Leistung für ssd-mobilenet auf TensorFlowLite :(
Aber ich habe eine andere Frage. Warum überschreitet die Punktzahl des Ergebnisses 1? Ist es nicht die Wahrscheinlichkeit?

@ a1103304122 Soweit ich weiß, wird die Punktzahl vor Softmax vom Knoten "concat" ausgegeben, also ist es nicht die Wahrscheinlichkeit.

Während der TOCO-Konvertierung wird ein anderer Eingangsknoten (Preprocessor/sub) verwendet, sowie verschiedene Ausgangsknoten (concat, concat_1). Dadurch werden einige Teile übersprungen, die für tflite problematisch sind, bis entweder der Graph neu strukturiert wird oder TF Lite die TF-Parität erreicht.

Hat jemand eine Idee, warum TFlite in diesem Modell langsamer als TFmobile ist?

@andrewharp ist es möglich, die Leistung der TF Lite SSD zu kommentieren? Ist auch eine Quantisierung möglich / kommt? Ich weiß, dass Sie hart daran arbeiten, dies alles zu verwirklichen, aber es wäre gut zu wissen, ob dies nur ein kurzfristiger Schluckauf ist oder ob es eine Lösung gibt, die wir anwenden können. 😄

@andrewharp Danke für deinen tollen Beitrag. Ich habe jedoch eine Frage zu Ihren Schritten.

Entfernen Sie problematische Knoten, bevor Sie TOCO überhaupt den Graphdef anzeigen lassen

bazel run -c opt tensorflow/python/tools/optimize_for_inference -- \
--input=$DETECT_PB --output=$STRIPPED_PB --frozen_graph=True \
--input_names=Präprozessor/Sub --output_names=concat,concat_1 \
--alsologtostderr

Wenn ich das nicht falsch verstehe, willst du hier STRIPPED_PB produzieren, richtig? Wenn dies der Fall ist, sollte die Eingabe unserer Eingabedatei derzeit image_tensor sein. Ich verstehe also nicht sehr, warum wir Preprocessor/sub verwenden. Könnten Sie das näher erläutern?

Zweitens verwenden wir hier optimize_for_inference, können wir das transform_graph-Tool verwenden? weil die neue Tensorflow-Dokumentation transform_graph anstelle von optimize_for_inference empfiehlt.

@mpeniak wie machst du das? Bitte sagen Sie einige Details.

org.tensorflow.lite.demo E/AndroidRuntime: FATAL EXCEPTION: inference Process: org.tensorflow.lite.demo, PID: 28864 java.lang.IllegalArgumentException: Form des Ausgabeziels [1, 1917, 4] stimmt nicht mit dem überein Form des Tensors [1, 1917, 1, 4].

@Haijunlv Hast du das Problem gelöst? Kannst du die Lösung teilen?

Beim Importieren der neuen Android-Demo von TF Lite erhalte ich unter OS X Error:Plugin with id 'com.android.application' not found. .

gleiches Problem wie @csmith105 ! Ich habe es geschafft, die Demo mit Bazel zu erstellen und zu installieren, aber ich kann das Projekt nicht auf Android Studio kompilieren oder ausführen ... gibt es eine Lösung für dieses Problem?

@Eddy-zheng Wenn Sie den Knoten "concat" im eingefrorenen Diagramm gesehen haben, werden Sie feststellen, dass die Squeeze-Op nach der Concat-Op ausgeführt wird. Ich denke, das ist der Grund, warum die Form inkompatibel ist. Ich habe die Geschwindigkeit des Squeeze Op nicht getestet. Aber ich denke, es gibt zwei Möglichkeiten, das Problem zu lösen.

  1. Ändern Sie die Reihenfolge von Squeeze und Concat op. Ändern Sie in der ssd_meta_arch.py ​​leicht " box_encodings = tf.squeeze(tf.concat(prediction_dict['box_encodings'], axis=1), axis=2)"
  2. Töten Sie direkt die Form 1 an der Achse 2. Ändern Sie in der box_predictor.py leicht " 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]))"

Eigentlich verstehe ich den Grund nicht, warum der Tensor mit einer zusätzlichen "1" -Form umgeformt wird. Kann sein, dass es überflüssig ist
op.
Ich habe Weg 1 und Erfolg ausprobiert, um das Modell auf dem Handy auszuführen. Aber immer noch etwas langsam. Später werde ich Weg 2 versuchen, um zu sehen, ob es eine bessere Geschwindigkeit erreichen kann

@Haijunlv Wie gut sind die Erkennungen? Das Lite-Modell aus der Demo von @andrewharp entfernt einfach alle Vorverarbeitungs- und Nachverarbeitungsknoten (Tausende davon) aus dem Diagramm und ersetzt sie durch mehrere Codezeilen. Ich bin mir nicht sicher, wie es funktionieren wird..

Ich denke, es gibt eine Lösung für das Problem mit Android Studio und Gradle. (Bitte korrigieren Sie mich, wenn ich falsch liege oder wenn es eine bessere Lösung gibt):

  • Es ist nicht der beste Ansatz, aber es gibt ein Bazel-Plugin, das wir in Android Studio installieren können, um Gradle zu „ersetzen“, und wir können unser Projekt mit Bazel über AS erstellen und ausführen.

  • Ich habe mehrere Artikel über Bazel gelesen und bin auf diese Frage in Quora gestoßen. Laut der Antwort wird Tensorflow weiterhin Bazel verwenden, da es das Framework besser ausnutzt und bessere Ergebnisse liefert. Ich denke, als Entwickler sollten wir uns in diesem speziellen Fall anpassen zu ihm und lassen Sie Gradle zurück, bis Tensorflow es vollständig unterstützt.

@davidfan
Haben Sie es geschafft, zu den mehreren Ausgaben in TensorFlow Lite C++ zu gelangen?

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

Ich mache Fortschritte, aber ich weiß immer noch nicht, wie ich die Ausgaben in C++ bekomme. Gibt es dazu Unterlagen? Das ist, was ich im Moment habe. Wie muss ich auf das Datenarray zugreifen, um die Ergebnisse zu erhalten?

(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 Ich habe Ähnliches gemacht und festgestellt, dass es nicht funktioniert. Mit dem Cutoff aus der Android-Demo-App gibt es einfach zu viel Rauschen aus. Wenn Sie Tensorboard verwenden, um den Graphen zu lesen, werden Sie feststellen, dass das Lite-Modell Tausende von Nachbearbeitungsknoten beschneidet. Ich glaube nicht, dass der jetzige Weg funktionieren würde. Ich hoffe, Tensorflow Lite wird diese Postprocessing-Knoten in Zukunft unterstützen, anstatt die Leute zu bitten, solche nicht funktionierenden Hacks durchzuführen.

Danke @YijinLiu. Ich habe Ihr Repository tf-cpu gesehen, ich werde mir Ihren Code ansehen, um zu überprüfen, ob meine Implementierung korrekt ist, und die Ergebnisse sehen, auch wenn sie nicht gut sind.

@JaviBonilla , bitte lass es uns wissen, wenn du herausgefunden hast, wie man mit C++ läuft! 🙌

Hallo @davidfant ,

Ich muss es noch testen, aber @YijinLiu hat es schon herausgefunden!.

Schauen Sie sich sein Repository an (https://github.com/YijinLiu/tf-cpu). Insbesondere finden Sie heraus, wie Sie die Ausgaben in der Datei $#$ tf-cpu/benchmark/obj_detect_lite.cc $#$ erhalten, die Funktion AnnotateMat() , die nach Interpreter->Invoke() ausgeführt wird.

@JaviBonilla Ich habe obj_detect_lite.cc nicht fertig gestellt, speziell um Priors zum Decodieren der Erkennungsboxen zu verwenden.
Was ich festgestellt habe, ist, dass die Partituren nicht in allen Szenarien sinnvoll sind. In einigen Fällen erzeugt es zu viel Rauschen. In anderen Fällen können einige gute Erkennungen verloren gehen. Ich habe mir diese Knoten angesehen, um diese Zwischenergebnisse in die endgültigen Möglichkeitsergebnisse umzuwandeln. Es gibt Tausende von Knoten ...

@YijinLiu danke für die Klarstellung. Dann denke ich, ist es besser zu warten, bis weitere Verbesserungen in TensorFlow Lite für die Objekterkennung enthalten sind. Wie auch immer, ich werde versuchen, die Erkennungsboxen in C++ zu decodieren, wenn ich Zeit habe.

Hallo @andrewharp ,

Vielen Dank für Ihre Mühe, das neue Android-Demoprojekt zu erstellen, aber könnten Sie bitte eine readme.md oder ein Beschreibungsdokument in tensorflow/contrib/lite/examples/android schreiben, damit wir alle den Prozess zur Erstellung von tensorflow lite leicht verstehen können? danke~!

Hallo, ich habe die Demo ssd_mobilenet_v1_coco_2017_11_17 erfolgreich ausgeführt, dann erhalte ich ein fein abgestimmtes Modell. Wenn ich den Prozess von @andrehentz darauf ausführe, trat ein Problem auf:
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

Vor dem Entfernen ungenutzter Operationen: 586 Operatoren, 871 Arrays (0 quantisiert)
2018-06-12 15:29:54.273221: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Vor allgemeinen Graphtransformationen: 586 Operatoren, 871 Arrays (0 quantisiert)
2018-06-12 15:29:54.300213: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Nach allgemeinen Graphtransformationen passieren 1: 409 Operatoren, 688 Arrays (0 quantisiert)
2018-06-12 15:29:54.309735: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Vor der Dequantisierung von Graphtransformationen: 409 Operatoren, 688 Arrays (0 quantisiert)
2018-06-12 15:29:54.317395: I tensorflow/contrib/lite/toco/allocate_transient_arrays.cc:329] Gesamte zugewiesene Größe des transienten Arrays: 2880256 Bytes, theoretischer Optimalwert: 2880128 Bytes.
2018-06-12 15:29:54.319173: F tensorflow/contrib/lite/toco/tflite/export.cc:330] Einige der Operatoren im Modell werden von der standardmäßigen TensorFlow Lite-Laufzeit nicht unterstützt. Wenn Sie eine benutzerdefinierte Implementierung dafür haben, können Sie diesen Fehler mit --allow_custom_ops deaktivieren oder indem Sie allow_custom_ops=True setzen, wenn Sie tf.contrib.lite.toco_convert() aufrufen. Hier ist eine Liste von Operatoren, für die Sie benutzerdefinierte Implementierungen benötigen: RSQRT, SquaredDifference, Stack, TensorFlowShape.

Hier ist mein Modell https://drive.google.com/open?id=1IxRSU4VSmVmhUtUpSQew_5anEfxTg3Ca

Kann mir jemand helfen?
@andrehentz

@JaviBonilla und @YijinLiu Ich habe eine Python-Implementierung , die ich mit den vorgehaltenen Modellen SSD MobileNet V{1,2} und SSDLIte MobileNet V2 von Google getestet habe. Siehe einfache Dokumentation hier .

@freedomtan welche Version von tf verwendest du? tf 1.8 ?

@hengshanji master branch nach tflite-Interpreter-Python-Bindung (29c129c6). Ich glaube nicht, dass 1.8 die Bindung hat.

@freedomtan tf1.8 hat eine Interpreter-Python-Bindung, aber ich stoße auf ein solches Problem "Napi-Fehler: Bibliothek libneuralnetworks.so kann nicht geöffnet werden". wo bekomme ich diese .so her oder wie erzeuge ich sie? Danke.

Ignoriere es :) Es ist für Android NNAPI.

@freedomtan Hast du das Beispiel auf dem Gerät oder auf dem PC getestet? Wenn ich es auf dem PC teste, verwende die android-28/x86 libneuralnetworks.so, es zeigt den Fehler "Aborting Since Tflite Returned Failure".

Wie gesagt, ignorieren Sie bitte dieses NNAPI-Problem. Es wird nicht erwartet, dass Sie einen funktionierenden libneuralnetwork.so haben. Ich habe meine Skripte sowohl auf einem x86 mit Ubuntu als auch auf einem ARMv8-Board mit Debian getestet.

@freedomtan , vielen Dank für das Teilen des Codes und der Dokumentation.

Basierend auf dem Repository (https://github.com/YijinLiu/tf-cpu). Ich habe die tf-cpu/benchmark/obj_detect_lite.cc aktualisiert, um die Ausgaben zu erhalten. Fügen Sie in der Funktion AnnotateMat() decodeCenterSizeBoxes-Code hinzu, um die output_locations zu handhaben, und führen Sie dann nms für diese Ergebnisse aus.
Gleichzeitig kann es unter Verwendung von https://github.com/tensorflow/tensorflow/issues/14688 zum Generieren von libtensorflow-lite.a sowohl auf einem x86 mit Ubuntu als auch auf einem Android-Gerät mit tflite-Modell in ssdlite_mobilenet_v2_coco_2018_05_09 ausgeführt werden. tar.gz.
Danke an alle.

@WeiboXu Können Sie den Code und das Modell hier teilen?

@freedomtan In Ihrem Python-Implementierungscode gibt es eine Datei "/tmp/box_priors.txt". Wissen Sie, wie Sie diese Datei generieren? Oder wie wurden die Daten in dieser Datei berechnet? Es ist kein Problem, eine Inferenz für das Bild mit der Größe 300 x 300 durchzuführen, aber die Inferenzgenauigkeit sinkt, wenn die Inferenz für das Bild mit der Größe 224 x 224 durchgeführt wird

@freedomtan , @andrewharp , Das vorherige Modell, das diesen Anweisungen folgt, kann in der neuesten TFLite-Demo nicht funktionieren, egal ob es quantifiziert oder fließend ist, da das tflite-Modell in der neuesten TFLite-Demo 4 Ausgänge benötigt, das vorherige Modell jedoch nur 2 Ausgänge hat ( concat, concat1).

Bitte helfen, Danke!

Diese Anleitung wird zur Zeit aktualisiert. Wird in der nächsten Woche einen Link für aktualisierte Anweisungen bereitstellen.

@frontword Was in /tmp/box_priors.txt sind Boxen für die Nachbearbeitung. Wenn Sie das neuere verwenden, das von @WenguoLi erwähnt wird, brauchen Sie es nicht. Soweit ich das beurteilen kann, werden diese Nachbearbeitungsoperationen jedoch als benutzerdefinierte TF Lite-Operationen implementiert. Das bedeutet, dass Sie sie nicht ohne weiteres mit NNAPI-Beschleunigern beschleunigen können.

Bei Problemen mit der Bildgröße, ja, ich denke, das Einspeisen von 224 x 224-Bildern in SSD300 (die von Google veröffentlichten Modelle wurden mit 300 x 300-Bildern trainiert) und eine schlechtere Genauigkeit ist nicht unerwartet.

@WenguoLi Es scheint mir, dass das von Ihnen erwähnte aktualisierte Modell recht einfach zu handhaben ist. Siehe mein Update-Skript . Die folgende Abbildung wird generiert von

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

image

Um die Punktzahl des Inferenzergebnisses zu korrigieren, die 1 überschreitet, ist es möglich, die Java-Methode TrackedObject.getCurrentCorrelation() zu verwenden, da dies immer etwas weniger als 1 zurückzugeben scheint (nicht sicher, ob es richtig ist oder nicht). Das TFLite-Android-Beispiel verwendet Recognition.getConfidence(), das immer etwas größer als 1 zurückzugeben scheint

@mpeniak Sie haben das ssd mobilenet tflite-Modell auf Movidius ausgeführt. Ich plane auch etwas ähnliches. Kannst du bitte ein bisschen erklären, wie du es gemacht hast?

@achowdhery Hallo, ich habe hier (https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite/examples/android/app) einige Aktualisierungen der Bauanleitung für die neueste Android-Demo gesehen, aber es hat nicht angegeben, wie wir das eingefrorene pb-Modell tatsächlich in das tflite-Modell konvertieren können (das quantisierte detect.tflite, das in der neuesten Demo verwendet wurde). Irgendwelche weiteren Anweisungen zum Konvertierungsfluss des quantisierten Modells? Ich denke auch, dass wir zuerst ein quantisiertes Training mit gefälschten Quantisierungsoperationen wie hier (https://www.tensorflow.org/performance/quantization) ausführen und dann die Modellkonvertierung durchführen sollten, richtig? Ist es auch möglich, NNAPI in der neuesten Android-Demo zu aktivieren? Ich habe versucht, tfLite.setUseNNAPI(true) in TFLiteObjectDetectionAPIModel.java zu verwenden, aber es ist auf meinem Pixel 2 mit Android 8.1 abgestürzt (es funktioniert gut ohne NNAPI). Irgendwelche Vorschläge? Danke!

@tenoyart Die kurze Antwort auf "Ist es möglich, NNAPI in der neuesten Android-Demo zu aktivieren?" sollte NEIN sein. Eine nicht so kurze Antwort ist, dass es irgendwie möglich ist, wenn Sie den TF Lite-Interpreter ändern, indem Sie so etwas wie das Aufteilen des Modells oder das Hinzufügen entsprechender benutzerdefinierter Operationen zu NNAPI tun.

@achowdhery Ich habe einen TensorFlow- Blogartikel von Ihnen gesehen. Ist das die Anleitung die du erwähnt hast oder kommen noch mehr?

Jawohl. Dies sind die Anweisungen zum Trainieren und Bereitstellen des Objekterkennungsmodells auf Android.

@freedomtan Danke, dass du das Skript geteilt hast.
Welche Modelldatei verwenden Sie in Ihrem neuesten Skript mit Nachbearbeitung ?
Haben Sie das Argument von optimize_for_inference.py wie angegeben
--input_names="Präprozessor/Sub"
--output_names="detection_boxes,detection_scores,num_detections,detection_classes"

Sehen Sie einen Unterschied mit/ohne Nachbearbeitung?

Danke!

Gibt es eine Möglichkeit, SqueezeNet-Modelle mit 4 Ausgängen in tflite umzuwandeln?

@chanchanzhang Bitte befolgen Sie die neuen Anweisungen gegen Ende des Tutorials in https://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpus -b78971cf1193
Beachten Sie, dass dies einen anderen Arbeitsablauf verwendet als die Verwendung von optimize_for_inference.py

@ashwaniag Wenn Sie Mobilenet durch den SqueezeNet-Klassifikator ersetzen und danach die SSD zur Erkennung beibehalten möchten, ist das für den aktuellen Workflow in Ordnung.

@achowdhery Großartig, das TF Lite-Modell auf SSD Mobilenet v1 zu sehen. Unterstützt TF Lite SSDlite Mobilenet v2 vollständig?

@tenoyart Ja. Jede Mobilenet-SSD funktioniert durch diese Pipeline. Wir haben die entsprechenden tflite-Dateien nicht in Open Source veröffentlicht. Wenn Sie auf Probleme stoßen, melden Sie bitte einen Fehler.

@chanchanzhang Wie @achowdhery sagte, verwenden Sie bitte object_detection/export_tflite_ssd_graph.py anstelle von optimized_for_inference.py . Und die von mir verwendete tflite-Modelldatei stammt von der im Android-Beispiel verwendeten Datei. Sie können es hier bekommen.

@achowdhery Ich denke, es gibt keine FakeQuant-Knoten und -Tensoren in Checkpoints von ssd_mobilenet_v1_quantized_coco und ssd_mobilenet_v1_0.75_depth_quantized_coco . Könntest du sie überprüfen?

@freedomtan Ich sehe im exportierten Diagramm die Knoten weight_quant und act_quant, nachdem ich object_detection/export_tflite_ssd_graph.py verwendet habe.
Bitte geben Sie einen Screenshot oder genaue Anweisungen, wie Sie überprüft haben, dass es keine Fakequant-Knoten gibt.
Ich bin auch in der Lage, die Checkpoints erfolgreich zu konvertieren

@achowdhery Danke fürs Prüfen. Als ich auf diesen beiden export_tflite_ssd_graph.py lief, konnte ich keine tflite-Modelle bekommen, also inspizierte ich Checkpoints. Was ich getan habe, ist so etwas wie

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

Nichts wird angezeigt.

@andrewharp Vielen Dank für Ihre Cutosm-Inferenzklasse TFLiteObjectDetectionAPIModel.java , ich habe es mit Ihrer SSD Mobilenet v1 tflite mobilenet_ssd_tflite_v1.zip versucht , aber wenn die App startet, scheint es ein Problem in der Funktion detectImage (final Bitmap bitmap) zu geben, wenn ich anrufe tfLite.runForMultipleInputsOutputs (inputArray, outputMap); es wirft diese Ausnahme

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

Der Fehler besagt, dass die Länge des Ausgangsarrays größer ist als die Länge des Eingangsarrays
Hier ist die Bedingung in 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();
            }
       }
}

und das sind meine Eingabe- und Ausgabe-Arrays:

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);

Das Ausgangsarray:

// 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();

Und die Schlussfolgerung:

// 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();

Ich habe die Bedeutung dieses Fehlers nicht verstanden, da ich genau dasselbe getan habe wie Ihre Klasse TFLiteObjectDetectionAPIModel.java .
danke für die Hilfe

@achowdhery Hallo, nach deinem Blog habe ich das Modell von ssd_mobilenet_v1_coco_2017_11_17 konvertiert. Als ich jedoch die konvertierte mobilenet_ssd.tflite in tflite_demo.apk verwendete, erhielt ich die folgende Fehlermeldung:

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

Irgendwelche Ideen, warum ich es bekommen habe? Danke.

Dies ist eine Formabweichung, da der erwartete Ausgabetensor eine Größe von 1,10,4 und nicht 1,1917,4 hat. Für die alte Modelldatei müssen Sie auf die Demo-App-Version von Mai zurückgreifen. Andernfalls verwenden Sie bitte die neuesten freigegebenen Modelle für die Konvertierung.

@achowdhery Ich habe mein eigenes Modell in tflite konvertiert und wenn ich es ausführe. Der Aufruf interpreter->invoke() löst einen Seg-Fault aus. Irgendeine Idee, was falsch sein könnte?

@ashwaniag Führen Sie die heruntergeladenen Modelle auf https://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpus-b78971cf1193 aus
für dich zusammenstellen?
Wenn ja, geben Sie bitte neue Anweisungen an, die Sie jetzt verwenden, wenn Sie einen Seg-Fehler erhalten.
Es könnte eine Diskrepanz bei Eingabetyp/-größe usw. geben.

@achowdhery Es hat funktioniert. Ich habe die falschen input_arrays angegeben. Trotzdem danke!

aktualisiert ssd_mobilenet_v1_quantized_coco und ssd_mobilenet_v1_0.75_depth_quantized_coco funktionieren, wenn Sie dem Tutorial gefolgt sind. Danke @achowdhery.

Ich habe mir TFLiteObjectDetectionAPIModel.java in der Beispiel-Demo-App angesehen. Gibt es einen Grund dafür, dass outputLocations , outputClasses , outputScores und numDetections hier bei jedem recognizeImage Aufruf zugewiesen werden ? Es scheint, dass sie dazu bestimmt sind, vorab zugewiesen zu werden.
Ich habe versucht, den Code mit Vorabzuweisung auszuführen, und es scheint gut zu funktionieren, aber ich wollte nur sicherstellen, dass nichts unter die Decke geht, was später zu Problemen führen würde.

Die Vorabzuweisung ist wahrscheinlich effizienter. Wo ordnen Sie vor, dass Sie Probleme vorhersehen könnten?

Danke für die Antwort @achowdhery. Ich lasse die Vorabzuweisung in der statischen Methode create so wie sie ist. Meine einzige Sorge war, dass der Code so geschrieben zu sein scheint, dass er die Vorabzuweisung verwendet (die statische Methode weist die Arrays vorab zu), aber aus irgendeinem Grund werden die Arrays bei jedem Aufruf neu zugewiesen.

Hallo @achowdhery , ich habe die Demo der neuen Android tflite App getestet. Es funktioniert perfekt für ssd_mobilenet_v1_coco, ssd_mobilenet_v1_0.75_depth_coco, ssd_mobilenet_v1_quantized_coco .
Aber ich habe diese Ausnahme für die anderen ssd-mobilenet-Modelle:

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)

Das tflite-Modell hat einen falschen Klassenindex erzeugt. Die Ausnahme lässt die App abstürzen, nachdem sie einige Sekunden lang gut erkannt wurde.
ssd_mobilenet_v1_ppn_coco erzeugt einen falschen unordentlichen Begrenzungsrahmen und auch ein Etikett.

PPN ist ein Float-Modell: Konvertieren Sie das TFLITE-Modell mit Float-Konvertierungsbefehlen.
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
Dann müssen Sie auch Folgendes in DetectorActivity.java ändern:
privat statisch final boolean TF_OD_API_IS_QUANTIZED = true;

Die Konfig kannte ich. Wenn diese Konfiguration falsch ist, kann die App überhaupt nicht ausgeführt werden.
Könnten Sie die ArrayIndexOutOfBoundsException sehen? Ich habe auch den Docker Ihres Tutorials ausprobiert, aber es ist dasselbe.

In Ordnung. Bitte reichen Sie ein neues GitHub-Problem mit genauen Repro-Anweisungen ein. Das PPN-Modell ist eine neue Feature-Anfrage für Java-Apps – wir werden antworten, wenn wir es priorisieren können

Danke. Die ArrayIndexOutOfBoundsException tritt auch bei ssd_mobilenet_v1_0.75_depth_quantized_coco, ssdlite_mobilenet_v2_coco auf. Der Unterschied zu PPN besteht darin, dass korrekte Ergebnisse erzielt werden, bevor die App durch diese Ausnahme abgestürzt ist.

@achowdhery Gibt es überhaupt ein Quantisierungsmodell mit 4 Ausgängen für tflite mit legacy/train.py, da das neue model_main.py Fehler aufweist?
https://github.com/tensorflow/models/issues/4798

@ashwaniag Sie können die beiden Codes unterscheiden und den Teil hinzufügen, der die Quantisierung hinzufügt: Beachten Sie, dass in der graph_rewriter-Funktion Quantisierungsoperationen hinzugefügt werden.

@achowdhery : https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
Gibt es ein Beispiel oder Beispielcode, wie man dasselbe in iOS macht. Bisher war das, was ich am nächsten gefunden habe, https://github.com/YijinLiu/tf-cpu/blob/master/benchmark/obj_detect_lite.cc , was nicht immer funktioniert.

Die aktuelle iOS-Demo-App funktioniert nicht mit SSD- und Float-Modell.

@achowdhery Ich habe mein Modell mit Tensorflow v1.9 trainiert. Mit den Schritten im Blog in tflite konvertiert. Ich bekomme keine Erkennungen. Hast du eine Ahnung davon?

@ashwaniag COCO oder Haustiere? Bitte öffnen Sie einen neuen Fehler mit genauen Repro-Anweisungen. Andere GitHub-Benutzer haben die Arbeit mit Tensorflow 1.10 bestätigt

@achowdhery Es ist mein eigener Datensatz. Ich habe für die mobilenetv2-Architektur trainiert. Wenn ich das .pb-Modell (Tensorflow-Modell) ausführe, bekomme ich
Nicht gefunden: Op-Typ nicht registriert „NonMaxSuppressionV3“ in Binärdatei, die auf VAL5-04 ausgeführt wird. Stellen Sie sicher, dass Op und Kernel in der Binärdatei registriert sind, die in diesem Prozess ausgeführt wird.

Glaubst du, es hängt damit zusammen?

@ashwaniag Bitte öffnen Sie einen neuen Fehler und geben Sie genaue reproduzierbare Anweisungen an

@ashwaniag überprüfen Sie diese beiden Probleme, ich hatte ein ähnliches Problem: # 10254 und # 19854

@achraf-boussaada Danke! Ich habe es repariert. Es war ein Versionskonflikt.
@achowdhery Nun, das Problem ist, dass das vollständige Tensorflow-Modell großartige Ergebnisse liefert, das Tflite-Modell jedoch sehr schlechte Ergebnisse.

@ashwaniag Bitte definieren Sie sehr schlechte Ergebnisse. Haben Sie kleine Objekte? Bitte fügen Sie einen Modellprüfpunkt, eine Pipelinekonfiguration und eine Labeldatei sowie ein Beispielbild an, damit wir das Problem reproduzieren können. Danke

@oopsodd hallo, ich bekomme auch einen falschen Klassenindex. es beschwerte sich "java.lang.ArrayIndexOutOfBoundsException: length=10; index=-739161663", Können Sie mir helfen?

Hinweis: Ich habe minimal funktionierende Beispiele für TensorFlow Lite SSD (Object Detection) für iOS und Android erstellt; https://github.com/baxterai/tfliteSSDminimalWorkingExample. Die iOS-Version basiert auf obj_detect_lite.cc von YijinLiu (mit nms-Funktion von WeiboXu) und die Android-Version basiert auf https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/examples/ Android tflDetect. Es entfernt den gesamten Overhead wie die interne Kamera und isoliert den Kerncode, der zum Erkennen von Objekten und Anzeigen der Erkennungsfelder erforderlich ist.

@baxterai tolle Arbeit! danke, ich werde es testen.

Danke für eure tolle Arbeit an alle! Ich habe eine weitere Frage bezüglich der kürzlich hinzugefügten Nachbearbeitungsoperation.

Die Ausgabe des vortrainierten ssd_mobilenet_v1_quantized_coco
ist derzeit auf die 10 besten Erkennungen im Frame beschränkt, obwohl die Standardkonfigurationen in models/research/object_detection/samples/configs/like
ssd_mobilenet_v1_quantized_300x300_coco14_sync.config geben alle eine höhere Grenze der Gesamterkennungen an.

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 }

wird dies gelöst, indem das Netzwerk mit dieser Pipeline-Konfiguration neu trainiert wird, oder ist die Dimensionalität von
'TFLite_Detection_PostProcess' durch andere Konfigurationen auf 10 fixiert?

@Georg-W Sie müssen auch die maximale Erkennung in export_tflite_ssd_graph.py ändern. Es gibt eine Befehlszeilenoption.

@achowdhery Ah danke! Das habe ich vermisst.

@andrewharp Vielen Dank für Ihre Cutosm-Inferenzklasse TFLiteObjectDetectionAPIModel.java , ich habe es mit Ihrer SSD Mobilenet v1 tflite mobilenet_ssd_tflite_v1.zip versucht , aber wenn die App startet, scheint es ein Problem in der Funktion detectImage (final Bitmap bitmap) zu geben, wenn ich anrufe tfLite.runForMultipleInputsOutputs (inputArray, outputMap); es wirft diese Ausnahme

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

Der Fehler besagt, dass die Länge des Ausgangsarrays größer ist als die Länge des Eingangsarrays
Hier ist die Bedingung in 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();
            }
       }
}

und das sind meine Eingabe- und Ausgabe-Arrays:

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) {
// Quantisiertes Modell
imgData.put ((byte) ((pixelValue >> 16) & 0xFF));
imgData.put ((byte) ((pixelValue >> 8) & 0xFF));
imgData.put ((byte) (pixelValue & 0xFF));
} else { // Modell schweben
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 :

// Eingabedaten in TensorFlow kopieren.
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 :

// Führen Sie den Inferenzaufruf aus.
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();

```
Ich habe die Bedeutung dieses Fehlers nicht verstanden, da ich genau dasselbe getan habe wie Ihre Klasse TFLiteObjectDetectionAPIModel.java .
danke für die Hilfe

Ich habe das gleiche Problem.. Lösung gefunden?
Danke..

@Georg-W Sie müssen auch die maximale Erkennung in export_tflite_ssd_graph.py ändern. Es gibt eine Befehlszeilenoption.

Hallo

Ich versuche, mehr als 10 Objekte im Bild zu erkennen (Standardeinstellung).
Ich verwende die folgenden Befehle:
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

habe ich auch modifiziert
export_tflite_ssd_graph.py
flags.DEFINE_integer('max_detections', 500 <--- statt 10,
'Maximale Anzahl an anzuzeigenden Erkennungen (Kästchen).')
flags.DEFINE_integer('max_classes_per_detection', 1,
'Anzahl der pro Erkennungsbox anzuzeigenden Klassen.')

aber immer noch 10 Objekte als Ausgabe im Android [1,10,4].

irgendeine Idee?

Ich wäre auch an der Lösung des @KaviSanth- Problems interessiert.

Diese Lösung von @Stevelb sollte funktionieren. Möglicherweise möchten Sie das eingefrorene Diagramm visualisieren, um sicherzustellen, dass max_detections richtig eingestellt ist.

@achowdhery Danke für deine Antwort. Ich habe versucht, die von @andrewharp geschriebenen Befehle auszuführen, aber ich erhalte die folgende Fehlermeldung. Tatsächlich befindet sich Toco an diesem Ort nicht. Ich verwende die Master-Version und die r1.95-Version aus dem Github-Repository.

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
INFO: Aufruf-ID: 0e58a5ef-9fee-4619-b760-aeb1c83c9661
FEHLER: Überspringen von „tensorflow/contrib/lite/ toco:toco “: kein solches Paket „tensorflow/contrib/lite/toco“: BUILD-Datei nicht im Paketpfad gefunden
WARNUNG: Die Analyse des Zielmusters ist fehlgeschlagen.
FEHLER: kein solches Paket 'tensorflow/contrib/lite/toco': BUILD-Datei nicht im Paketpfad gefunden
INFO: Verstrichene Zeit: 0,179 s
INFO: 0 Prozesse.
FAILED: Build wurde NICHT erfolgreich abgeschlossen (0 Pakete geladen)
FAILED: Build wurde NICHT erfolgreich abgeschlossen (0 Pakete geladen)
Ich muss ändern, dass ich diese Befehle aus meinem lokalen Tensorflow-Ordner ausführe, der aus dem Git gezogen wurde.

Ich konnte unter tensorflow/lite/toco ein toco finden und teste gerade, ob es funktioniert.
ok, es scheint mit diesem Toco zu funktionieren und außerdem muss man den $DETECT_FB-Pfad auf $PWD/ssd_mobilenet.tflite ändern, da sich im contrib/lite-Ordner nur etwas Python befindet und sonst nichts.

Beim Hinzufügen der .tflite-Datei in der DetectorActivity von https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android (https://github.com/tensorflow/tensorflow/blob /master/tensorflow/examples/android/src/org/tensorflow/demo/DetectorActivity.java) mit der Zeile

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

E/AndroidRuntime: SCHWERWIEGENDE AUSNAHME: main
Prozess: myProcess, PID: 32611
java.lang.RuntimeException: Eingabeknoten „image_tensor“ konnte nicht gefunden werden
bei myPackage.myClass.TensorFlowObjectDetectionAPIModel.create (TensorFlowObjectDetectionAPIModel.java:106)

Ist es nicht möglich, .tflite-Modelle in dieser App zu verwenden?

@defaultUser3214 Sie verwenden ein Klassifikatormodell in der Erkennungs-App. MobileNet v1 ist ein Klassifizierungsmodell. Bitte verwenden Sie das MobileNet SSD-Modell

@achowdhery Vielen Dank! Die Verwendung des Modells von wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz führte zu diesem Fehler. Aber ich dachte, dass dies die SSD-Version war?

Die Verwendung der in .tflite konvertierten ssd_mobilenet_v1_android_export.pb, die zuvor als .pb funktionierte, führt jedoch zu demselben Fehler.

@defaultUser3214 Das ist eine alte Version des Modells, die in der neuesten Demo-App, die im Juli 2018 veröffentlicht wurde, nicht funktioniert. Bitte laden Sie die neuesten Modelle im Juli 2018 im Detection Model Zoo herunter: Sie funktionieren in der App. Bitte öffnen Sie ein neues Thema, wenn dies immer noch blockiert ist.

@SteveIb Sie müssen auch NUM_DETECTIONS = 500 in TFLiteObjectDetectionAPIModel.java ändern

ssdmobilenet v1 .pb kann nicht in .tflite konvertiert werden
pb generiert durch Tensorflow-Objekterkennung api @aselle @achowdhery

Irgendwelche Fortschritte dabei? Beim Versuch, frozen_inference_graph.pb in eine .TFLITE-Datei zu konvertieren, wird jedoch ein Fehler angezeigt

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

Für benutzerdefinierte Objekterkennung in Android. Irgendwelche Ideen zu verschiedenen Konvertierungsmethoden? Übertragen Sie erlernte ssd_mobilenet_v1_pets unter Windows 10, indem Sie dem Tutorial hier folgen: https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

Irgendwelche Fortschritte dabei? Beim Versuch, frozen_inference_graph.pb in eine .TFLITE-Datei zu konvertieren, wird jedoch ein Fehler angezeigt

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

Für benutzerdefinierte Objekterkennung in Android. Irgendwelche Ideen zu verschiedenen Konvertierungsmethoden? Übertragen Sie erlernte ssd_mobilenet_v1_pets unter Windows 10, indem Sie dem Tutorial hier folgen: https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

Nur um dies nachzuverfolgen und allen anderen zu helfen, die denselben Fehler hatten - dies wird durch die Verwendung eines falschen Modellprüfpunkts zum Trainieren verursacht. Um auf Android mit .tflite zu funktionieren, muss das ursprüngliche Modell MobileNet und auch quantisiert sein und diesen Codeabschnitt oder etwas Ähnliches in der .config-Datei enthalten:

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

Es ist jetzt live unter tensorflow/contrib/lite/examples/android ! Dies ist eine vollständigere Portierung der ursprünglichen TF-Android-Demo (nur ohne das Stylize-Beispiel) und wird in Zukunft die andere Demo in tensorflow/contrib/lite/java/demo ersetzen.

Einen konvertierten TF Lite-Flatbuffer finden Sie in mobilenet_ssd_tflite_v1.zip , und Sie finden die Java-Inferenzimplementierung in TFLiteObjectDetectionAPIModel.java . Beachten Sie, dass sich dies von der ursprünglichen TF-Implementierung darin unterscheidet, dass die Boxen manuell in Java decodiert werden müssen und eine TXT-Datei mit vorheriger Box in die App-Assets gepackt werden muss (ich denke, die im obigen Modell-Zip enthaltene sollte für die meisten gültig sein Grafiken).

Während der TOCO-Konvertierung wird ein anderer Eingangsknoten (Preprocessor/sub) verwendet, sowie verschiedene Ausgangsknoten (concat, concat_1). Dadurch werden einige Teile übersprungen, die für tflite problematisch sind, bis entweder der Graph neu strukturiert wird oder TF Lite die TF-Parität erreicht.

Hier sind die schnellen Schritte zum Konvertieren eines SSD-MobileNet-Modells in das tflite-Format und zum Erstellen der Demo, um es zu verwenden:

# 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

Das funktioniert wie ein Zauber!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen