Tensorflow: [Question&Erreur] Existe-t-il un modèle de détection tel qu'un SSD-Mobile-net dans tensorflow-lite ?

Créé le 26 déc. 2017  ·  141Commentaires  ·  Source: tensorflow/tensorflow

SALUT.

Développement d'une application android avec tensorflow-lite.

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/models.md
Modèle de détection introuvable.

De plus, j'essaie de convertir SSD-Inceptionv2 en utilisant tensorflow-lite-API. Mais il semble y avoir un problème.

Commander


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}

Code d'erreur


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 

Le fichier fire_inception_v2 est créé, mais sa taille est de zéro octet.
Qu'est-ce qu'un problème ?

aussi,
s'il vous plaît laissez-moi savoir quelle est la meilleure façon de déployer un modèle personnalisé pour la détection d'objets ?

Quelqu'un m'aide svp!.

Merci.

lite feature

Commentaire le plus utile

Il est désormais en ligne sur tensorflow/contrib/lite/examples/android ! Il s'agit d'un portage plus complet de la démo Android TF originale (il ne manque que l'exemple Stylize) et remplacera l'autre démo dans tensorflow/contrib/lite/java/demo à l'avenir.

Un flatbuffer TF Lite converti se trouve dans mobilenet_ssd_tflite_v1.zip , et vous pouvez trouver l'implémentation d'inférence Java dans TFLiteObjectDetectionAPIModel.java . Notez que cela diffère de l'implémentation TF d'origine en ce que les boîtes doivent être décodées manuellement en Java, et un fichier txt de boîte préalable doit être empaqueté dans les actifs de l'application (je pense que celui inclus dans le modèle zip ci-dessus devrait être valide pour la plupart graphiques).

Lors de la conversion TOCO, un nœud d'entrée différent (préprocesseur/sous-processeur) est utilisé, ainsi que différents nœuds de sortie (concat, concat_1). Cela ignore certaines parties qui posent problème pour tflite, jusqu'à ce que le graphique soit restructuré ou que TF Lite atteigne la parité TF.

Voici les étapes rapides pour convertir un modèle SSD MobileNet au format tflite et créer la démo pour l'utiliser :

# 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

Tous les 141 commentaires

@aselle pouvez-vous s'il vous plaît jeter un oeil à ce problème? Merci.

Nous travaillons actuellement à la conversion du SSD mobilenet (puis de la création du ssd par la suite), mais il contient des opérations qui ne sont pas complètement prises en charge. Je mettrai à jour ce problème une fois que nous aurons terminé.

Génial, j'ai posé une question similaire ici : https://github.com/tensorflow/tensorflow/issues/14731

Combien de temps comptez-vous jusqu'à ce que vous ajoutiez le support de ssd-mobilenet ?

Merci,
Martin Peniak

Un membre de l'organisation TensorFlow a répondu après l'application du libellé stat: waiting tensorflower.

?

Nagging Assignee : Cela fait 14 jours sans activité et ce problème a un cessionnaire. Veuillez mettre à jour le libellé et/ou le statut en conséquence.

Les mises à jour?
Je suis également confronté à un problème similaire. Merci d'avance.

@yucheeling

Pourriez-vous s'il vous plaît suggérer un ensemble de données comme " ssd_mobilenet_v1_coco_2017_11_17.tar " qui peut être utilisé dans un magasin de détail pour l'identification de différents vêtements comme les t-shirts, les jeans, etc.

@rana3579 , veuillez poser une telle question sur stackoverflow. Une mise à jour rapide sur mobilenet ssd. Cela progresse et nous espérons que nous aurons bientôt un exemple.

@rana3579 regarde ma vidéo, ça fonctionne sur movidius, nvidia gpus ainsi que sur les processeurs arm. Je ne peux pas partager l'ensemble de données, mais si vous faites partie d'une entreprise, nous pourrions parler d'une éventuelle collaboration : https://www.youtube.com/watch?v=3MinI9cCJrc

@aselle merci pour la mise à jour! Où chercher les notifications à ce sujet ? Je souhaite être prévenu dès sa sortie si cela est possible. Merci, j'apprécie votre travail acharné à ce sujet!

@andrewharp , y travaille et mettra à jour l'application Java TF Mobile pour utiliser tflite. Alors surveillez ces changements dans le référentiel. Je laisse ce problème ouvert pour l'instant.

Ceci est fonctionnel en interne; devrait avoir quelque chose dans la semaine ou les deux prochaines.

@andrewharp c'est génial !! Cela vaut-il également pour l'exemple de caméra iOS ?
De plus, à quoi ressemblent la taille des poids et les performances ?
Le réseau mobile de classification TFLite est minuscule et les performances sur iOS sont fluides, donc je suis vraiment excité pour TFLite.

D'autres ont déjà converti le SSD Mobilenet pb existant en un modèle coreml et ont écrit les couches de sortie manquantes dans Swift :
https://github.com/vonholst/SSDMobileNet_CoreML

Mais c'est vraiment comme 8-12 fps sur un iPhone 7.

Salut,
Une mise à jour pour ceci?

moi aussi je suis curieuse :)

J'ai un commit portant la démo Android TF sur tflite actuellement en cours d'examen, devrait apparaître sur github cette semaine, espérons-le.

@madhavajay C'est Android uniquement, mais vous devriez pouvoir l'adapter pour iOS. La seule chose est qu'une partie du pré-traitement (redimensionnement/normalisation de l'image) et du post-traitement (suppression non maximale et ajustement par les priors de la boîte) est effectué en Java car tflite ne prend pas entièrement en charge tous les opérateurs utilisés par MobileNet SSD .

@andrewharp C'est génial. Pouvez-vous expliquer brièvement pourquoi ces opérations ne sont pas disponibles actuellement dans TF lite. Cela semble être le même cas pour l'outil de conversion tfcoreml sur un SSD standard. Ne se plaignent pas simplement de demander par intérêt technique, font-ils quelque chose qui est particulièrement difficile à mettre en œuvre dans la pile mobile ou est-ce simplement une faible priorité ?

Au plaisir de voir votre effort épique sur le code Android !!! Merci beaucoup. Je sais que je ne suis pas le seul à attendre ça avec impatience !

@andrewharp et @aselle Toute mise à jour sur l'obtention d'une démo pour l'utilisation d'un exemple de localisation d'objets basé sur SSD pour TFLite ?

Il est désormais en ligne sur tensorflow/contrib/lite/examples/android ! Il s'agit d'un portage plus complet de la démo Android TF originale (il ne manque que l'exemple Stylize) et remplacera l'autre démo dans tensorflow/contrib/lite/java/demo à l'avenir.

Un flatbuffer TF Lite converti se trouve dans mobilenet_ssd_tflite_v1.zip , et vous pouvez trouver l'implémentation d'inférence Java dans TFLiteObjectDetectionAPIModel.java . Notez que cela diffère de l'implémentation TF d'origine en ce que les boîtes doivent être décodées manuellement en Java, et un fichier txt de boîte préalable doit être empaqueté dans les actifs de l'application (je pense que celui inclus dans le modèle zip ci-dessus devrait être valide pour la plupart graphiques).

Lors de la conversion TOCO, un nœud d'entrée différent (préprocesseur/sous-processeur) est utilisé, ainsi que différents nœuds de sortie (concat, concat_1). Cela ignore certaines parties qui posent problème pour tflite, jusqu'à ce que le graphique soit restructuré ou que TF Lite atteigne la parité TF.

Voici les étapes rapides pour convertir un modèle SSD MobileNet au format tflite et créer la démo pour l'utiliser :

# 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 Joyeuses Pâques 🥚🍫 vous LÉGENDE! :) Je vais voir si je peux faire fonctionner ça.

HI, existe-t-il une version quantifiée?

Je l'ai fait fonctionner avec les instructions ci-dessus mais j'avais besoin de:

  • Android SDK 15 à cause de ma version bazel
  • Je ne peux pas non plus ouvrir le projet dans Android Studio

@andrewharp est-ce une nouvelle chose d'Android Studio vers laquelle vous vous dirigez qui utilise bazel pour créer des projets au lieu de Gradle, ou manque-t-il simplement certains paramètres de projet pour l'instant en raison du court délai pour le faire fonctionner?

Heureux de fournir un PR si je comprends quel est le problème.

Également en ce qui concerne les performances, il semble être lent sur mon LG G6 sous Android 7.
Est-ce parce que l'API NN n'est disponible que sur Android 8 ?

Quelqu'un peut-il le tester sur Android 8 ?

Je vois, je pensais que les instructions n'étaient que pour la conversion. J'ai arrêté de lire après la première partie de la phrase en disant que c'est ainsi que vous convertissez le modèle lol.

Oui, j'ai le pixel xl, je suppose que votre téléphone n'a pas de matériel capable d'accélérer l'inférence ou que ce matériel n'est pas pris en charge par le logiciel.

Je vais essayer et je vous tiens au courant. Je supposais que je pouvais construire cela avec android studio doh...

Envoyé de mon iPhone

Le 31 mars 2018, à 20h05, Madhava Jay [email protected] a écrit :

Je l'ai fait fonctionner avec les instructions ci-dessus mais j'avais besoin de:

Android SDK 15 à cause de ma version bazel
Je ne peux pas non plus ouvrir le projet dans Android Studio
@andrewharp est-ce une nouvelle chose d'Android Studio vers laquelle vous vous dirigez qui utilise bazel pour créer des projets au lieu de Gradle, ou manque-t-il simplement certains paramètres de projet pour l'instant en raison du court délai pour le faire fonctionner?

Heureux de fournir un PR si je comprends quel est le problème.

Également en ce qui concerne les performances, il semble être lent sur mon LG G6 sous Android 7.
Est-ce parce que l'API NN n'est disponible que sur Android 8 ?

Quelqu'un peut-il le tester sur Android 8 ?


Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, consultez-le sur GitHub ou désactivez le fil de discussion.

Oui, j'ai fait la même chose et je suis allé directement au studio de code et Android. Ensuite, après que vous ayez envoyé un ping ce matin, j'étais sur le point de répondre que j'avais le même problème, puis j'ai refait une nouvelle diffusion sur RTFM. 🤣

D'après ce que je peux dire, le LG G6 devrait être en mesure de prendre en charge l'API NN car il a le même SoC Qualcomm 821 que le Pixel 1. Mais, malheureusement, LG n'a pas publié Android 8 ou 8.1 et les dernières versions de LineageOS semblent un peu sommaires donc je vais attendre sauf si je SAIS que cela fonctionne mieux sur Android 8.1. Si vous pouviez l'allumer sur le Pixel, ce serait génial ! 👍

J'ai réussi à tester cela mais la démo tourne très lentement... encore plus lentement que la version originale.
J'utilise Pixel XL (première version) et j'ai déjà compilé l'ancienne démo pour arch 64 bits, ce qui l'a fait fonctionner presque deux fois plus vite même sans tfLite... le temps d'inférence dans ce cas est d'environ 450 ms. Lorsque j'essaie cette démo, elle tourne à environ 850 ms et parfois même plus d'une seconde. Ai-je fait quelque chose de mal ou étais-je simplement trop optimiste pour m'attendre à une accélération décente ? Merci.

@mpeniak J'ai obtenu les mêmes vitesses sur le LG G6, avec le débogage activé ou désactivé (je pensais que c'était le débogage au début). Je soupçonne que NNAPI n'est pas utilisé. Peut-être devons-nous faire quelque chose de spécial avec la construction nnapi_lib ?
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/BUILD

La dépendance est répertoriée mais peut-être besoin d'être construite pour une architecture spécifique ?
Peut-être quelque chose dans ./configure
(btw j'ai activé XLA dans mon ./configure au cas où cela serait lié mais cela n'a pas changé la vitesse)

@andrewharp
Je veux utiliser NNAPI, mais je ne sais pas comment l'utiliser.
Selon le document, l'API Neural Networks est disponible dans Android 8.1 >
S'il s'agit de 8.1 ou d'une version supérieure, est-il fondamentalement appliqué ? ou Ai-je besoin d'un travail NDK supplémentaire ? Lien vers le document
Bonne journée XD

@andrewharp , j'ai essayé d'activer NNAPI pour tflite_demo et d'exécuter l'apk, mais j'ai trouvé l'apk planté
lors de l'appel AddOpsAndParams, l'opération tflite :: BuiltinOperator_SQUEEZE n'est pas prise en charge et
nn_op_type est défini sur -1, ce qui entraînera l'appel de FATAL et exit(-1) . je pense que c'est le
cause première. Pourriez-vous s'il vous plaît dire s'il sera pris en charge dans la future version? Y a-t-il une autre façon de travailler
autour pour tester le chemin NNAPI ? Merci.

@andrehentz
bazel run -c opt tensorflow/python/tools/optimize_for_inference --\
--input=$DETECT_PB --output=$STRIPPED_PB --frozen_graph=Vrai \
--input_names=Préprocesseur/sous --output_names=concat,concat_1 \
--alsologtostderr

Pourquoi input_names n'est pas image_tensor ?
J'ai essayé de cette façon et j'ai rencontré une erreur.

@nanamare
Vous devez utiliser frozen_inference_graph_stripped.pb au lieu de frozen_inference_graph.pb.
essayez "bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=frozen_inference_graph_stripped.pb"
et vous pouvez voir la sortie suivante :
1 entrées possibles trouvées : (name=Preprocessor/sub, type=float(1), shape=None)
Aucune variable repérée.
Trouvé 2 sorties possibles : (name=concat, op=ConcatV2) (name=concat_1, op=ConcatV2)

Le nom d'entrée est Preprocessor/sub et le nom de sortie est concat.

@nanamare
Le dernier code tensorflow lite inclut une interface java pour activer NNAPI.

La classe Interpreter a une fonction appelée : setUseNNAPI(true);
Vous pouvez appeler directement une telle interface.

@zhangbo0325
J'ai déjà essayé d'appeler setUserNNAPI(true);, mais cela n'a eu aucun effet.
C'était une inférence presque similaire sans utiliser NNAPI.
spécification android : version 8.1.

@nanamare , est-ce que votre ssd-mobilenet est en cours d'exécution ? Pour un tel réseau, il existe une opération SQUEEZE qui n'est pas prise en charge par Android NNAPI. J'ai posé la question ci-dessus. Pour mobilenet-v1, c'est 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!

Journal mobile ici :
04-04 19:46:36.099 28864-28882/org.tensorflow.lite.demo E/AndroidRuntime : EXCEPTION FATALE : processus d'inférence : org.tensorflow.lite.demo, PID : 28864 java.lang.IllegalArgumentException : forme de la cible de sortie [1, 1917, 4] ne correspond pas à la forme du Tenseur [1, 1917, 1, 4]. sur org.tensorflow.lite.Tensor.copyTo(Tensor.java:44) sur org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:139) sur org.tensorflow.demo.TFLiteObjectDetectionAPIModel.recognizeImage(TFLiteObjectDetectionAPIModel.java:226 ) sur org.tensorflow.demo.DetectorActivity$3.run(DetectorActivity.java:248) sur android.os.Handler.handleCallback(Handler.java:761) sur android.os.Handler.dispatchMessage(Handler.java:98)sur android.os.Looper.loop(Looper.java:156) à android.os.HandlerThread.run(HandlerThread.java:61)

Étonnante! Essayer de faire fonctionner cela sur iOS. Comment analyser la sortie Tensor ?

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

L'interface DetectorActivity est bloquée dans mon projet, existez-vous, comment puis-je le résoudre ?

@zhangbo0325 Merci pour les détails. Étant donné que la compression n'est pas prise en charge par la NNAPI, cela signifie-t-il que la NNAPI n'est pas utilisée du tout et que l'inférence restera aussi lente qu'elle l'est ? Comme je l'ai mentionné dans le commentaire précédent, j'obtiens de très mauvaises performances sur Pixel XL. Je m'attendrais à des temps d'inférence d'environ 80 à 120 ms. Merci!

@mpeniak , j'ai posé la même question à andrewharp. Je viens d'exécuter le ssd-mobilenet à l'aide de l'implémentation du processeur tensorflow-lite et j'ai également obtenu des performances médiocres.

La conférence TensorFlow Lite au Dev Summit 2018 a montré des performances multipliées par 3 sur MobileNet :
https://youtu.be/FAMfy7izB6A?t=530

Peut-être que ce n'est pas pour le SSD ?
Nécessite peut-être d'abord une quantification du poids ?

J'ai essayé mobilnet et c'est beaucoup plus rapide, cela ne s'applique pas au mobilnet-ssd cependant...

Panda triste ☹️🐼
@andrewharp Avez -vous une idée de quand une implémentation SSD performante sera disponible ? Est-ce une question de quantification du poids ?

J'ai également eu les mauvaises performances de ssd-mobilenet sur TensorFlowLite :(
Mais, j'ai une autre question. Pourquoi le score du résultat dépasse-t-il 1 ? N'est-ce pas la probabilité ?

@ a1103304122 d'après ce que je comprends, le score est la sortie du nœud "concat", avant softmax, donc ce n'est pas la probabilité.

Lors de la conversion TOCO, un nœud d'entrée différent (préprocesseur/sous-processeur) est utilisé, ainsi que différents nœuds de sortie (concat, concat_1). Cela ignore certaines parties qui posent problème pour tflite, jusqu'à ce que le graphique soit restructuré ou que TF Lite atteigne la parité TF.

Quelqu'un sait-il pourquoi TFlite est plus lent que TFmobile dans ce modèle ?

@andrewharp est-il possible de commenter les performances du SSD TF Lite ? La quantification est-elle également possible / à venir ? Je sais que vous travaillez dur pour que tout cela se produise, mais il serait bon de savoir s'il ne s'agit que d'un contretemps à court terme ou s'il existe une solution que nous pouvons appliquer. 😄

@andrewharp Merci pour votre excellente publication. Cependant, j'ai une question pour vos étapes.

Supprimez les nœuds problématiques avant même de laisser TOCO voir le graphdef

bazel run -c opt tensorflow/python/tools/optimize_for_inference --\
--input=$DETECT_PB --output=$STRIPPED_PB --frozen_graph=Vrai \
--input_names=Préprocesseur/sous --output_names=concat,concat_1 \
--alsologtostderr

Si je ne comprends pas mal, ici vous voulez produire STRIPPED_PB, n'est-ce pas ? Si c'est le cas, actuellement, l'entrée de notre fichier d'entrée devrait être image_tensor. Donc, je ne comprends pas très bien pourquoi nous utilisons Preprocessor/sub. Pourriez-vous expliquer plus en détail?

Deuxièmement, nous utilisons ici l'optimize_for_inference, pouvons-nous utiliser l'outil transform_graph ? car la nouvelle documentation de tensorflow recommande transform_graph au lieu d'optimize_for_inference.

@mpeniak comment fais-tu ? Veuillez dire quelques détails.

org.tensorflow.lite.demo E/AndroidRuntime : EXCEPTION FATALE : processus d'inférence : org.tensorflow.lite.demo, PID : 28864 java.lang.IllegalArgumentException : la forme de la cible de sortie [1, 1917, 4] ne correspond pas à la forme du Tenseur [1, 1917, 1, 4].

@Haijunlv Avez-vous résolu le problème ? Pouvez-vous partager la solution?

Lors de l'importation de la nouvelle démo Android de TF Lite, j'obtiens Error:Plugin with id 'com.android.application' not found. sur OS X.

même problème que @csmith105 ! J'ai réussi à construire et à installer la démo avec bazel mais je ne peux pas compiler ou exécuter le projet sur Android Studio... une solution à ce problème ?

@Eddy-zheng Si vous avez vu le nœud "concat" dans le graphique figé, vous constaterez que l'opération squeeze est exécutée après l'opération concat. Je pense que c'est la raison pour laquelle la forme est incompatible. Je n'ai pas testé la vitesse du squeeze op. Mais je pense qu'il y a deux façons de résoudre le problème.

  1. changer l'ordre de squeeze et concat op. Dans le ssd_meta_arch.py, modifiez légèrement " box_encodings = tf.squeeze(tf.concat(prediction_dict['box_encodings'], axis=1), axis=2)"
  2. tuez directement la forme 1 à l'axe 2. Dans le box_predictor.py, modifiez légèrement " box_encodings =tf.reshape(
    box_encodings, tf. pile([combined_feature_map_shape[0],
    combination_feature_map_shape[1] *
    combiné_feature_map_shape [2] *
    num_predictions_per_location,
    1, self._box_code_size]))"

En fait, je ne comprends pas la raison pour laquelle remodeler le tenseur avec une forme "1" supplémentaire. Peut-être que c'est un redondant
op.
J'ai essayé la méthode 1 et réussi à exécuter le modèle sur mobile. Mais encore un peu lent. plus tard, j'essaierai la voie 2 pour voir s'il peut obtenir une meilleure vitesse

@Haijunlv Quelle est la qualité des détections ? Le modèle simplifié de la démo de @andrewharp supprime simplement tous les nœuds de prétraitement et de post-traitement (des milliers d'entre eux) du graphique et les remplace par plusieurs lignes de code. Je ne sais pas comment cela fonctionnera..

Je pense qu'il existe une solution au problème d'Android Studio et Gradle. (veuillez me corriger si je me trompe ou s'il existe une meilleure solution) :

  • Ce n'est pas la meilleure approche, mais il existe un plugin Bazel que nous pouvons installer dans Android Studio pour "remplacer" Gradle et nous pouvons construire et exécuter notre projet en utilisant Bazel via AS.

  • J'ai lu plusieurs articles sur Bazel et je suis tombé sur cette question dans Quora.. et selon la réponse tensorflow continuera à utiliser Bazel puisqu'il exploite mieux le framework et donne de meilleurs résultats.. donc je pense qu'en tant que développeurs dans ce cas particulier nous devrions nous adapter et laissez Gradle derrière jusqu'à ce que tensorflow le supporte complètement.

@davidfant
Avez-vous réussi à accéder aux multiples sorties dans TensorFlow Lite C++ ?

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

Je progresse, mais je ne sais toujours pas comment obtenir les sorties en C++. Existe-t-il une documentation à ce sujet ? C'est ce que j'ai en ce moment. Comment dois-je accéder au tableau de données pour obtenir les scores ?

(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 J'ai fait la même chose et j'ai trouvé que cela ne fonctionnait pas. En utilisant la coupure de l'application de démonstration Android, cela produit juste trop de bruit. Si vous utilisez tensorboard pour lire le graphique, vous constaterez que le modèle léger supprime des milliers de nœuds de post-traitement. Je ne pense pas que la méthode actuelle fonctionnerait. J'espère que tensorflow lite prendra en charge ces nœuds de post-traitement à l'avenir, au lieu de demander aux gens de faire de tels hacks qui ne fonctionnent pas.

Merci @YijinLiu. J'ai vu votre repository tf-cpu, je vais jeter un oeil à votre code pour vérifier que mon implémentation est correcte, et voir les résultats même s'ils ne sont pas bons.

@JaviBonilla , s'il vous plaît, faites-nous savoir quand vous aurez compris comment exécuter avec C++ ! 🙌

Salut @davidfant ,

Je dois encore le tester, mais @YijinLiu l' a déjà compris !.

Jetez un œil à son dépôt (https://github.com/YijinLiu/tf-cpu). En particulier, vous pouvez trouver comment obtenir les sorties dans le fichier tf-cpu/benchmark/obj_detect_lite.cc , la fonction AnnotateMat() , qui est exécutée après le Interpreter->Invoke() .

@JaviBonilla Je n'ai pas terminé obj_detect_lite.cc, spécialement, pour utiliser les priors pour décoder les boîtes de détection.
Ce que j'ai trouvé, c'est que les scores n'ont pas de sens dans tous les scénarios. Dans certains cas, cela génère trop de bruit. Pour d'autres cas, il peut perdre quelques bonnes détections. J'ai regardé ces nœuds pour convertir ces scores intermédiaires en scores de possibilité finaux. Il y a des milliers de nœuds...

@YijinLiu merci d'avoir clarifié cela. Ensuite, je pense qu'il vaut mieux attendre que d'autres améliorations soient incluses dans TensorFlow Lite pour la détection d'objets. Quoi qu'il en soit, j'essaierai de décoder les boîtes de détection en C++ si j'ai le temps.

Salut @andrewharp ,

Merci pour vos efforts pour créer le nouveau projet de démonstration Android, mais pourriez-vous s'il vous plaît écrire un fichier readme.md ou un document de description dans tensorflow/contrib/lite/examples/android afin que nous puissions tous comprendre facilement le processus de création de tensorflow lite ? merci ~ !

Bonjour, j'ai exécuté la démo ssd_mobilenet_v1_coco_2017_11_17 avec succès, puis j'obtiens un modèle affiné. Lorsque j'exécute le processus de @andrehentz dessus, un problème est survenu :
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

Avant de supprimer les opérations inutilisées : 586 opérateurs, 871 tableaux (0 quantifié)
2018-06-12 15:29:54.273221 : I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Avant les transformations de graphe générales : 586 opérateurs, 871 tableaux (0 quantifié)
2018-06-12 15:29:54.300213 : I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Après les transformations générales du graphe, passez 1 : 409 opérateurs, 688 tableaux (0 quantifié)
2018-06-12 15:29:54.309735 : I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Avant transformations de graphe de déquantification : 409 opérateurs, 688 tableaux (0 quantifié)
2018-06-12 15:29:54.317395 : I tensorflow/contrib/lite/toco/allocate_transient_arrays.cc:329] Taille totale allouée du tableau transitoire : 2880256 octets, valeur théorique optimale : 2880128 octets.
2018-06-12 15:29:54.319173 : F tensorflow/contrib/lite/toco/tflite/export.cc:330] Certains des opérateurs du modèle ne sont pas pris en charge par l'environnement d'exécution TensorFlow Lite standard. Si vous avez une implémentation personnalisée pour eux, vous pouvez désactiver cette erreur avec --allow_custom_ops, ou en définissant allow_custom_ops=True lors de l'appel de tf.contrib.lite.toco_convert(). Voici une liste d'opérateurs pour lesquels vous aurez besoin d'implémentations personnalisées : RSQRT, SquaredDifference, Stack, TensorFlowShape.

Voici mon modèle https://drive.google.com/open?id=1IxRSU4VSmVmhUtUpSQew_5anEfxTg3Ca

Quelqu'un peut-il m'aider?
@andrehentz

@JaviBonilla et @YijinLiu J'ai une implémentation Python que j'ai testée avec les modèles SSD MobileNet V{1,2} et SSDLIte MobileNet V2 de Google. Voir la documentation simple ici .

@freedomtan quelle version de tf utilisez-vous ? tf 1.8 ?

Branche principale @hengshanji après la liaison Python de l'interpréteur tflite (29c129c6). Je ne pense pas que 1.8 ait la liaison.

@freedomtan tf1.8 a une liaison Python interpréteur, mais je rencontre ce genre de problème "erreur nnapi: impossible d'ouvrir la bibliothèque libneuralnetworks.so". où trouver ce .so ou comment le générer ? Merci.

Ignorez-le :) C'est pour Android NNAPI.

@freedomtan Avez-vous testé l'exemple sur l'appareil ou sur le pc ? Lorsque je le teste sur le PC, utilisez le android-28/x86 libneuralnetworks.so, il affiche l'erreur "Abandon depuis que tflite a renvoyé un échec".

Comme je l'ai dit, veuillez ignorer ce problème NNAPI. On ne s'attend pas à ce que vous ayez un libneuralnetwork.so fonctionnel. J'ai testé mes scripts à la fois sur un x86 exécutant Ubuntu et sur une carte ARMv8 exécutant Debian.

@freedomtan , merci d'avoir partagé le code et la documentation.

Basé sur le référentiel (https://github.com/YijinLiu/tf-cpu). J'ai mis à jour le tf-cpu/benchmark/obj_detect_lite.cc pour obtenir les sorties. Dans la fonction AnnotateMat(), ajoutez le code decodeCenterSizeBoxes pour gérer les output_locations, puis faites nms pour ces résultats.
Dans le même temps, en utilisant le https://github.com/tensorflow/tensorflow/issues/14688 pour générer le libtensorflow-lite.a, il peut fonctionner à la fois sur un x86 exécutant Ubuntu et un appareil Android avec le modèle tflite dans ssdlite_mobilenet_v2_coco_2018_05_09. tar.gz.
Merci a tous.

@WeiboXu Pouvez-vous partager le code et le modèle ici ?

@freedomtan Dans votre code d'implémentation python, il y a un fichier "/tmp/box_priors.txt", savez-vous comment générer ce fichier ? Ou comment les données de ce fichier ont été calculées ? Il n'y a aucun problème à faire une inférence pour l'image de taille 300X300, mais la précision de l'inférence diminuera lors de l'inférence pour l'image de taille 224X224

@freedomtan , @andrewharp , le modèle précédent en suivant ces instructions ne peut pas fonctionner dans la dernière démo TFLite , qu'il soit quantifié ou flottant, car le modèle tflite dans la dernière démo TFLite nécessite 4 sorties, mais le modèle précédent n'a que 2 sorties ( concat, concat1).

S'il vous plaît aider, merci!

Ces instructions sont actuellement mises à jour. Fournira un lien pour les instructions mises à jour la semaine prochaine.

@frontword Qu'est-ce que dans /tmp/box_priors.txt sont les boîtes pour le post-traitement. Si vous utilisez le plus récent mentionné par @WenguoLi , vous n'en avez pas besoin. Cependant, pour autant que je sache, ces opérations de post-traitement sont implémentées en tant qu'opérations personnalisées TF Lite. Cela signifie que vous ne pouvez pas les accélérer avec des accélérateurs NNAPI sans efforts supplémentaires.

Pour les problèmes de taille d'image, oui, je pense que l'alimentation d'images 224x224 sur SSD300 (les modèles publiés par Google ont été entraînés avec des images 300x300) et une détérioration de la précision n'est pas inattendue.

@WenguoLi Il me semble que le modèle mis à jour que vous avez mentionné est assez facile à manipuler. Voir mon script de mise à jour . La figure suivante est générée par

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

image

Pour fixer le score du résultat d'inférence supérieur à 1, il est possible d'utiliser la méthode Java TrackedObject.getCurrentCorrelation() car cela semble toujours renvoyer quelque chose de moins que 1 (pas sûr si c'est correct ou non). L'exemple Android TFLite utilise Recognition.getConfidence() qui semble toujours renvoyer quelque chose de supérieur à 1

@mpeniak Vous avez exécuté le modèle ssd mobilenet tflite sur Movidius. Je prévois également de faire quelque chose de similaire. Pouvez-vous s'il vous plaît guider un peu sur la façon dont vous l'avez fait?

@achowdhery Salut, j'ai vu quelques mises à jour des instructions de construction pour la dernière démo Android ici (https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite/examples/android/app), mais il n'a pas indiqué comment nous pouvons réellement convertir le modèle pb gelé en modèle tflite (le detect.tflite quantifié qui a été utilisé dans la dernière démo). D'autres instructions sur le flux de conversion du modèle quantifié ? De plus, je pense que nous devrions d'abord exécuter une formation quantifiée avec de fausses opérations de quantification comme indiqué ici (https://www.tensorflow.org/performance/quantization), puis effectuer la conversion du modèle, n'est-ce pas ? Aussi, est-il possible d'activer NNAPI dans la dernière démo Android ? J'ai essayé d'utiliser tfLite.setUseNNAPI(true) dans TFLiteObjectDetectionAPIModel.java mais il s'est écrasé sur mon Pixel 2 sous Android 8.1 (il peut bien fonctionner sans NNAPI). Aucune suggestion? Merci!

@tenoyart La réponse courte à "est-il possible d'activer NNAPI dans la dernière démo Android?" devrait être NON. La réponse pas si courte est que c'est un peu possible si vous modifiez l'interpréteur TF Lite, faites quelque chose comme diviser le modèle ou ajouter des opérations personnalisées correspondantes à NNAPI.

@achowdhery J'ai vu un article de votre blog TensorFlow. Est-ce les instructions que vous avez mentionnées ou d'autres sont à venir ?

Oui. Voici les instructions pour former et servir le modèle de détection d'objet sur Android.

@freedomtan Merci d'avoir partagé le script.
Dans votre dernier script avec post-traitement , quel fichier de modèle utilisez-vous ?
Avez-vous spécifié l'argument d'optimize_for_inference.py comme
--input_names="Préprocesseur/sous"
--output_names="detection_boxes,detection_scores,num_detections,detection_classes"

Voyez-vous une différence avec/sans post-traitement ?

Merci!

Existe-t-il un moyen de convertir les modèles SqueezeNet à 4 sorties en tflite ?

@chanchanzhang Veuillez suivre les nouvelles instructions vers la fin du didacticiel dans https://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpus -b78971cf1193
Notez que cela utilise un flux de travail différent de l'utilisation d'optimize_for_inference.py

@ashwaniag Si vous souhaitez remplacer Mobilenet par le classificateur SqueezeNet tout en conservant le SSD après cela pour la détection, cela convient au flux de travail actuel.

@achowdhery Super de voir le modèle TF Lite sur ssd mobilenet v1. TF Lite prend-il entièrement en charge ssdlite mobilenet v2 ?

@tenoyart Oui. Tout SSD Mobilenet fonctionnera via ce pipeline. Nous n'avons pas publié les fichiers tflite correspondants en open source. Si vous rencontrez des problèmes, veuillez signaler un bogue.

@chanchanzhang comme @achowdhery l' a dit, veuillez utiliser object_detection/export_tflite_ssd_graph.py plutôt que optimized_for_inference.py . Et le fichier de modèle tflite que j'ai utilisé provient de celui utilisé par l'exemple Android. Vous pouvez l'obtenir ici .

@achowdhery Je pense qu'il n'y a pas de nœuds et de tenseurs FakeQuant dans les points de contrôle de ssd_mobilenet_v1_quantized_coco et ssd_mobilenet_v1_0.75_depth_quantized_coco . Pourriez-vous les vérifier ?

@freedomtan Je vois les nœuds weight_quant et act_quant dans le graphique exporté après avoir utilisé object_detection/export_tflite_ssd_graph.py.
Veuillez donner une capture d'écran ou des instructions exactes sur la façon dont vous avez vérifié qu'il n'y a pas de nœuds Fakequant.
Je suis également capable de convertir avec succès les points de contrôle

@achowdhery Merci d'avoir vérifié. Lorsque j'ai exécuté export_tflite_ssd_graph.py sur ces deux modèles, je n'ai pas pu obtenir de modèles tflite, j'ai donc inspecté les points de contrôle. Ce que j'ai fait est quelque chose comme

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

Rien ne s'affiche.

@andrewharp Merci beaucoup pour votre classe d'inférence cutosm TFLiteObjectDetectionAPIModel.java , je l'ai essayé avec votre ssd mobilenet v1 tflite mobilenet_ssd_tflite_v1.zip mais au démarrage de l'application, il semble qu'il y ait un problème dans la fonction de reconnaissance de l'image (bitmap Bitmap final) lorsque j'appelle tfLite.runForMultipleInputsOutputs(inputArray, outputMap); il lève cette exception

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

l'erreur indique que la longueur du tableau des sorties est supérieure à la longueur du tableau des entrées
Voici la condition dans 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();
            }
       }
}

et voici mes tableaux d'entrées et de sorties :

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

Le tableau des sorties :

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

Et l'Inférence :

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

Je n'ai pas compris la signification de cette erreur car j'ai fait exactement la même chose que votre classe TFLiteObjectDetectionAPIModel.java.
Merci pour l'aide

@achowdhery Bonjour, suite à votre blog j'ai converti le modèle de ssd_mobilenet_v1_coco_2017_11_17. Cependant, lorsque j'ai utilisé le mobilenet_ssd.tflite converti dans tflite_demo.apk, j'ai eu l'erreur suivante :

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

Des idées pourquoi je l'ai eu? Merci.

Il s'agit d'une incompatibilité de forme car le tenseur de sortie attendu est de taille 1,10,4 et non 1,1917,4. Pour l'ancien fichier de modèle, vous devrez revenir à la version de l'application de démonstration de mai. Sinon, veuillez utiliser les derniers modèles publiés pour la conversion.

@achowdhery J'ai converti mon propre modèle en tflite et quand je l'exécute. L'appel interpreter->invoke() génère une erreur de segmentation. Une idée de ce qui ne va pas?

@ashwaniag Faites les modèles téléchargés sur https://medium.com/tensorflow/training-and-serving-a-realtime-mobile-object-detector-in-30-minutes-with-cloud-tpus-b78971cf1193
compiler pour vous ?
Si oui, veuillez fournir les nouvelles instructions que vous utilisez maintenant lorsque vous obtenez une erreur de segment ?
Il peut y avoir une incompatibilité dans le type/taille d'entrée, etc.

@achowdhery Cela a fonctionné. Je donnais le mauvais input_arrays. Merci quand même!

mis à jour ssd_mobilenet_v1_quantized_coco et ssd_mobilenet_v1_0.75_depth_quantized_coco fonctionnent, si vous avez suivi le tutoriel. Merci @achowdhery.

Je regardais TFLiteObjectDetectionAPIModel.java dans l'exemple d'application de démonstration. Y a-t-il une raison pour laquelle outputLocations , outputClasses , outputScores et numDetections sont alloués à chaque appel recognizeImage ici ? Il semble qu'ils soient censés être préalloués.
J'ai essayé d'exécuter le code avec la préallocation et cela semble bien fonctionner, mais je voulais juste m'assurer qu'il n'y avait rien sous les couvertures qui poserait des problèmes plus tard.

La préallocation est probablement plus efficace. Où préaffectez-vous que vous pouvez prévoir des problèmes ?

merci pour la réponse @achowdhery. Je laisse la préallocation dans la méthode statique create telle quelle. Ma seule préoccupation était que le code semble être écrit pour utiliser la préallocation (la méthode statique préalloue les tableaux), mais pour une raison quelconque, les tableaux sont réalloués à chaque appel.

salut @achowdhery , j'ai testé la nouvelle démo de l'application Android tflite. Cela fonctionne parfaitement pour ssd_mobilenet_v1_coco, ssd_mobilenet_v1_0.75_depth_coco, ssd_mobilenet_v1_quantized_coco .
Mais j'ai cette exception pour les autres modèles 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)

Le modèle tflite a produit un mauvais index de classe. L'exception fait planter l'application après une bonne détection pendant quelques secondes.
ssd_mobilenet_v1_ppn_coco produit une mauvaise boîte englobante désordonnée, ainsi qu'une étiquette.

PPN est un modèle flottant : convertissez-vous le modèle TFLITE à l'aide de commandes de conversion flottantes.
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
Ensuite, vous devez également modifier les éléments suivants dans DetectorActivity.java :
booléen final statique privé TF_OD_API_IS_QUANTIZED = true ;

Je connaissais cette configuration. En fait, lorsque cette configuration est incorrecte, l'application ne peut pas fonctionner du tout.
Pourriez-vous voir l'exception ArrayIndexOutOfBounds ? J'ai aussi essayé le docker de votre tutoriel, mais c'est pareil.

D'accord. veuillez déposer un nouveau problème GitHub avec des instructions de reproduction exactes. Le modèle PPN est une nouvelle demande de fonctionnalité pour l'application Java - Nous vous répondrons lorsque nous pourrons lui donner la priorité

Merci. L'ArrayIndexOutOfBoundsException arrive également à ssd_mobilenet_v1_0.75_depth_quantized_coco, ssdlite_mobilenet_v2_coco. La différence avec PPN est que les résultats sont corrects avant que l'application ne plante à cause de cette exception.

@achowdhery Existe-t-il un moyen de former un modèle de quantification avec 4 sorties pour tflite en utilisant legacy/train.py puisque le nouveau model_main.py a des bogues ?
https://github.com/tensorflow/models/issues/4798

@ashwaniag Vous pouvez différencier les deux codes et ajouter la partie qui ajoute la quantification : notez que la fonction graph_rewriter est l'endroit où les opérations de quantification sont ajoutées.

@achowdhery : https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_mobile_tensorflowlite.md
existe-t-il un exemple ou un exemple de code expliquant comment faire la même chose dans iOS. Jusqu'à présent, la chose la plus proche que j'ai trouvée a été cette https://github.com/YijinLiu/tf-cpu/blob/master/benchmark/obj_detect_lite.cc qui ne fonctionne pas toujours.

l'application de démonstration iOS actuelle ne fonctionne pas avec le modèle ssd et float.

@achowdhery J'ai formé mon modèle à l'aide de tensorflow v1.9. Converti en tflite en suivant les étapes du blog. Je n'obtiens aucune détection. Avez-vous une idée à propos de ceci?

@ashwaniag COCO ou animaux de compagnie ? Veuillez ouvrir un nouveau bogue avec des instructions de reproduction exactes. D'autres utilisateurs de GitHub ont confirmé son fonctionnement avec Tensorflow 1.10

@achowdhery C'est mon propre ensemble de données. Je me suis formé à l'architecture mobilenetv2. Lorsque j'exécute le modèle .pb (modèle tensorflow), j'obtiens
Non trouvé : le type d'opération n'est pas enregistré "NonMaxSuppressionV3" dans le binaire exécuté sur VAL5-04. Assurez-vous que l'op et le noyau sont enregistrés dans le binaire en cours d'exécution dans ce processus.

Vous pensez que c'est lié ?

@ashwaniag Veuillez ouvrir un nouveau bogue et fournir des instructions reproductibles exactes

@ashwaniag vérifie ces deux problèmes, j'ai eu un problème similaire : #10254 et #19854

@achraf-boussaada Merci ! Je l'ai corrigé. C'était un problème d'incompatibilité de version.
@achowdhery Maintenant, le problème est que le modèle tensorflow complet me donne d'excellents résultats mais le modèle tflite donne de très mauvais résultats.

@ashwaniag Veuillez définir les très mauvais résultats. Vous avez de petits objets ? Veuillez joindre un point de contrôle de modèle, une configuration de pipeline et un fichier d'étiquette, ainsi qu'un exemple d'image pour nous aider à reproduire le problème. Merci

@oopsodd bonjour, je reçois un mauvais index de classe non plus. il s'est plaint "java.lang.ArrayIndexOutOfBoundsException: length=10; index=-739161663", Pouvez-vous m'aider ?

Remarque J'ai créé des exemples de travail minimaux TensorFlow Lite SSD (Détection d'objets) pour iOS et Android ; https://github.com/baxterai/tfliteSSDminimalWorkingExample. La version iOS est basée sur obj_detect_lite.cc par YijinLiu (avec fonction nms par WeiboXu), et la version Android est basée sur https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/examples/ android tflDetect. Il supprime tous les frais généraux comme la caméra interne et isole le code de base requis pour détecter les objets et afficher les boîtes de détection.

@baxterai excellent travail ! merci je vais tester.

Merci pour votre travail incroyable à tous! J'ai une autre question concernant l'opération de post-traitement récemment ajoutée.

La sortie du pré-formé ssd_mobilenet_v1_quantized_coco
est actuellement limité aux 10 premières détections dans le cadre, même si les configurations par défaut dans models/research/object_detection/samples/configs/ comme
ssd_mobilenet_v1_quantized_300x300_coco14_sync.config spécifient tous une limite plus élevée de détections totales.

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 }

est-ce résolu en réentraînant le réseau avec cette configuration de pipeline ou est-ce la dimensionnalité de
'TFLite_Detection_PostProcess' fixé à 10 par d'autres configurations ?

@Georg-W Vous devrez également modifier la détection maximale dans export_tflite_ssd_graph.py. Il existe une option de ligne de commande.

@achowdhery ah merci ! C'est ce que j'ai raté.

@andrewharp Merci beaucoup pour votre classe d'inférence cutosm TFLiteObjectDetectionAPIModel.java , je l'ai essayé avec votre ssd mobilenet v1 tflite mobilenet_ssd_tflite_v1.zip mais au démarrage de l'application, il semble qu'il y ait un problème dans la fonction de reconnaissance de l'image (bitmap Bitmap final) lorsque j'appelle tfLite.runForMultipleInputsOutputs(inputArray, outputMap); il lève cette exception

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

l'erreur indique que la longueur du tableau des sorties est supérieure à la longueur du tableau des entrées
Voici la condition dans 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();
            }
       }
}

et voici mes tableaux d'entrées et de sorties :

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();
pour (int je = 0; je < inputSize; ++i) {
pour (int j = 0; j < inputSize; ++j) {
int pixelValue = intValues[i * inputSize + j] ;
si (estModèleQuantisé) {
// Modèle quantifié
imgData.put((byte) ((pixelValue >> 16) & 0xFF));
imgData.put((byte) ((pixelValue >> 8) & 0xFF));
imgData.put((byte) (pixelValue & 0xFF));
} else { // Modèle flottant
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 :

// Copiez les données d'entrée dans TensorFlow.
Trace.beginSection("flux");
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 :

// Exécute l'appel d'inférence.
Trace.beginSection("exécuter");
Log.d("TAG_INPUT",""+String.valueOf(inputArray.length));
Log.d("TAG_OUTPUT",""+String.valueOf(outputMap.size()));

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

```
Je n'ai pas compris la signification de cette erreur car j'ai fait exactement la même chose que votre classe TFLiteObjectDetectionAPIModel.java.
Merci pour l'aide

j'ai le même problème.. avez-vous une solution?
Merci..

@Georg-W Vous devrez également modifier la détection maximale dans export_tflite_ssd_graph.py. Il existe une option de ligne de commande.

salut

J'essaie de détecter plus de 10 objets dans l'image (ce qui est par défaut)
J'utilise les commandes suivantes :
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

j'ai aussi modifié
export_tflite_ssd_graph.py
flags.DEFINE_integer('max_detections', 500 <--- au lieu de 10,
'Nombre maximum de détections (cases) à afficher.')
flags.DEFINE_integer('max_classes_per_detection', 1,
'Nombre de classes à afficher par case de détection.')

mais donnant toujours 10 objets en sortie dans l'androïde [1,10,4].

une idée?

Je serais également intéressé par la solution du problème @KaviSanth .

Cette solution de @Stevelb devrait fonctionner. Vous pouvez visualiser le graphique gelé pour vous assurer que max_detections est défini correctement.

@achowdhery Merci pour votre réponse. J'ai essayé d'exécuter les commandes écrites par @andrewharp mais j'obtiens l'erreur suivante. En effet, toco n'est pas situé à cet endroit. J'utilise la version principale et la version r1.95 du référentiel github.

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
INFORMATION : ID d'appel : 0e58a5ef-9fee-4619-b760-aeb1c83c9661
ERREUR : Ignorer 'tensorflow/contrib/lite/ toco:toco ' : aucun package de ce type 'tensorflow/contrib/lite/toco' : fichier BUILD introuvable sur le chemin du package
AVERTISSEMENT : Échec de l'analyse du modèle cible.
ERREUR : aucun package de ce type 'tensorflow/contrib/lite/toco' : fichier BUILD introuvable sur le chemin du package
INFO : Temps écoulé : 0.179s
INFO : 0 processus.
ÉCHEC : la construction ne s'est PAS terminée avec succès (0 paquets chargés)
ÉCHEC : la construction ne s'est PAS terminée avec succès (0 paquets chargés)
Je dois modifier le fait que j'exécute ces commandes à partir de mon dossier tensorflow local qui a été extrait de git.

Je pourrais trouver un toco sous tensorflow/lite/toco et je teste juste si cela fonctionne.
ok, cela semble fonctionner en utilisant ce toco et à part cela, vous devez changer le chemin $DETECT_FB en $PWD/ssd_mobilenet.tflite puisque dans le dossier contrib/lite seul un python se trouve et rien d'autre.

Une erreur d'exécution apparaît lors de l'ajout du fichier .tflite dans DetectorActivity à partir de 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) avec la ligne

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

E/AndroidRuntime : EXCEPTION FATALE : principal
Processus : myProcess, PID : 32611
java.lang.RuntimeException : Impossible de trouver le nœud d'entrée 'image_tensor'
à myPackage.myClass.TensorFlowObjectDetectionAPIModel.create(TensorFlowObjectDetectionAPIModel.java:106)

N'est-il pas possible d'utiliser des modèles .tflite dans cette application ?

@ defaultUser3214 , vous utilisez un modèle de classificateur dans l'application de détection. MobileNet v1 est un modèle de classification. Veuillez utiliser le modèle MobileNet SSD

@achowdhery Merci ! L'utilisation du modèle de wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz a entraîné cette erreur. Mais je pensais que c'était la version ssd ?

Mais l'utilisation de ssd_mobilenet_v1_android_export.pb converti en .tflite qui fonctionnait auparavant comme .pb produit la même erreur.

@defaultUser3214 C'est une ancienne version du modèle qui ne fonctionnera pas dans la dernière application de démonstration publiée en juillet 2018. Veuillez télécharger les derniers modèles en juillet 2018 dans le zoo du modèle de détection : ils fonctionnent dans l'application. Veuillez ouvrir un nouveau sujet si celui-ci est toujours bloqué.

@SteveIb Vous devez également modifier NUM_DETECTIONS = 500 dans TFLiteObjectDetectionAPIModel.java

impossible de convertir ssdmobilenet v1 .pb en .tflite
pb généré via l'api de détection d'objets Tensorflow @aselle @achowdhery

Des progrès à ce sujet? Essayer de convertir frozen_inference_graph.pb en fichier .TFLITE mais obtenir une erreur

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

Pour la détection d'objets personnalisés dans Android. Des idées sur les différentes méthodes de conversion ? Transférer les ssd_mobilenet_v1_pets appris sur Windows 10 en suivant le tutoriel ici : https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

Des progrès à ce sujet? Essayer de convertir frozen_inference_graph.pb en fichier .TFLITE mais obtenir une erreur

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

Pour la détection d'objets personnalisés dans Android. Des idées sur les différentes méthodes de conversion ? Transférer les ssd_mobilenet_v1_pets appris sur Windows 10 en suivant le tutoriel ici : https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

Juste pour donner suite à cela et pour aider tous ceux qui rencontraient la même erreur - cela est dû à l'utilisation d'un point de contrôle de modèle incorrect à partir duquel s'entraîner. Pour fonctionner sur Android avec .tflite, le modèle initial doit MobileNet et doit également être quantifié et aura cette section de code ou quelque chose de similaire dans le fichier .config :

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

Il est désormais en ligne sur tensorflow/contrib/lite/examples/android ! Il s'agit d'un portage plus complet de la démo Android TF originale (il ne manque que l'exemple Stylize) et remplacera l'autre démo dans tensorflow/contrib/lite/java/demo à l'avenir.

Un flatbuffer TF Lite converti se trouve dans mobilenet_ssd_tflite_v1.zip , et vous pouvez trouver l'implémentation d'inférence Java dans TFLiteObjectDetectionAPIModel.java . Notez que cela diffère de l'implémentation TF d'origine en ce que les boîtes doivent être décodées manuellement en Java, et un fichier txt de boîte préalable doit être empaqueté dans les actifs de l'application (je pense que celui inclus dans le modèle zip ci-dessus devrait être valide pour la plupart graphiques).

Lors de la conversion TOCO, un nœud d'entrée différent (préprocesseur/sous-processeur) est utilisé, ainsi que différents nœuds de sortie (concat, concat_1). Cela ignore certaines parties qui posent problème pour tflite, jusqu'à ce que le graphique soit restructuré ou que TF Lite atteigne la parité TF.

Voici les étapes rapides pour convertir un modèle SSD MobileNet au format tflite et créer la démo pour l'utiliser :

# 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

Ça fonctionne super bien!

Cette page vous a été utile?
0 / 5 - 0 notes