0
votes

Détection d'objets sur Android avec Tensorflow Lite

Tentative d'implémentation d'un modèle de détection d'objets personnalisé avec Tensorflow Lite, à l'aide d'Android Studio. Je suis les conseils fournis ici: Fonctionnement sur mobile avec TensorFlow Lite , mais sans succès. L'exemple de modèle s'exécute correctement et affiche toutes les étiquettes détectées. Néanmoins, lorsque j'essaye avec mon modèle personnalisé, je ne reçois aucune étiquette . J'ai également essayé avec d'autres modèles (sur Internet mais le résultat est le même). C'est comme si les étiquettes ne sont pas passées en écriture. J'ai copié mon detect.tflite et labelmap.txt , j'ai changé le TF_OD_API_INPUT_SIZE et le TF_OD_API_IS_QUANTIZED dans DetectorActivity.java mais je n'obtiens toujours pas de résultats (classe détectée avec une boîte englobante et un score).

Le Logcat montre ce qui suit:

2020-10-11 18:37:54.315 31681-31681/org.tensorflow.lite.examples.detection E/HAL: PATH3 /odm/lib64/hw/gralloc.qcom.so
2020-10-11 18:37:54.315 31681-31681/org.tensorflow.lite.examples.detection E/HAL: PATH2 /vendor/lib64/hw/gralloc.qcom.so
2020-10-11 18:37:54.315 31681-31681/org.tensorflow.lite.examples.detection E/HAL: PATH1 /system/lib64/hw/gralloc.qcom.so
2020-10-11 18:37:54.315 31681-31681/org.tensorflow.lite.examples.detection E/HAL: PATH3 /odm/lib64/hw/gralloc.msm8953.so
2020-10-11 18:37:54.315 31681-31681/org.tensorflow.lite.examples.detection E/HAL: PATH2 /vendor/lib64/hw/gralloc.msm8953.so
2020-10-11 18:37:54.315 31681-31681/org.tensorflow.lite.examples.detection E/HAL: PATH1 /system/lib64/hw/gralloc.msm8953.so
2020-10-11 18:37:54.859 31681-31681/org.tensorflow.lite.examples.detection E/tensorflow: CameraActivity: Exception!
    java.lang.IllegalStateException: This model does not contain associated files, and is not a Zip file.
        at org.tensorflow.lite.support.metadata.MetadataExtractor.assertZipFile(MetadataExtractor.java:325)
        at org.tensorflow.lite.support.metadata.MetadataExtractor.getAssociatedFile(MetadataExtractor.java:165)
        at org.tensorflow.lite.examples.detection.tflite.TFLiteObjectDetectionAPIModel.create(TFLiteObjectDetectionAPIModel.java:118)
        at org.tensorflow.lite.examples.detection.DetectorActivity.onPreviewSizeChosen(DetectorActivity.java:96)
        at org.tensorflow.lite.examples.detection.CameraActivity.onPreviewFrame(CameraActivity.java:200)
        at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1157)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:165)
        at android.app.ActivityThread.main(ActivityThread.java:6375)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)

Comment puis-je effectuer la détection? Ai-je besoin d'un fichier supplémentaire (métadonnées) relatif aux étiquettes ou je fais autre chose mal? Le cas ci-dessus est testé avec un appareil Android 7. Merci!


3 commentaires

Avez-vous résolu le problème. Je suis confronté au même problème.


Oui, le problème a été résolu, compte tenu de la réponse de Gusthema. J'ai suivi les instructions du lien (métadonnées) donné, en créant le fichier de métadonnées et en le joignant au modèle principal. C'était suffisant pour gérer les erreurs susmentionnées et exécuter avec succès mon application. @KARUNESHPALEKAR


Pouvez-vous s'il vous plaît partager le script que vous avez utilisé pour générer des métadonnées


3 Réponses :


0
votes

Cela ressemble à une régression là-bas. Pourriez-vous l'essayer avec ce qui suit?

<at your TF example repo>
$ git checkout de42482b453de6f7b6488203b20e7eec61ee722e^


0 commentaires

0
votes

Il s'agit d'un problème avec cette documentation spécifiquement qui n'a pas été mis à jour.

Le principal problème est que l'échantillon a été mis à jour pour utiliser des modèles avec des métadonnées attachées, en particulier avec les étiquettes incorporées en tant qu'actif du modèle.

Lorsque vous ajoutez votre fichier d'étiquettes au modèle, tout devrait fonctionner.


1 commentaires

Salut..J'ai essayé de faire un modèle avec des métadonnées..Mais, toujours pas de détection .... Le lien pour créer des métadonnées que vous avez donné est une erreur de lancement "le tenseur de sortie devrait poinçonner le métadat du tenseur de sortie". Alors j'utilise de cette façon . Ensuite, j'ai pu créer TFlite avec des métadonnées. Cependant, il n'y a toujours pas de détection.



0
votes

Pour mieux comprendre la solution proposée par Gusthema, je vous fournit le code qui a fonctionné dans mon cas:

displayer = _metadata.MetadataDisplayer.with_model_file('/content/gdrive/My Drive/models/research/object_detection/exported_model/detect.tflite')
export_json_file = os.path.join('/content/gdrive/My Drive/models/research/object_detection/exported_model',
                    os.path.splitext('detect.tflite')[0] + ".json")
json_file = displayer.get_metadata_json()
# Optional: write out the metadata as a json file
with open(export_json_file, "w") as f:
  f.write(json_file)

Finalement, si vous souhaitez créer un fichier json pour afficher le résultat (le fichier de métadonnées), vous pouvez utiliser:

pip install tflite-support

from tflite_support import flatbuffers
from tflite_support import metadata as _metadata
from tflite_support import metadata_schema_py_generated as _metadata_fb


# Creates model info.
model_meta = _metadata_fb.ModelMetadataT()
model_meta.name = "MobileNetV1 image classifier"
model_meta.description = ("Identify Unesco Monuments Route"
                          "image from a set of 18 categories")
model_meta.version = "v1"
model_meta.author = "TensorFlow"
model_meta.license = ("Apache License. Version 2.0 "
                      "http://www.apache.org/licenses/LICENSE-2.0.")


# Creates input info.
input_meta = _metadata_fb.TensorMetadataT()

# Creates output info.
output_meta = _metadata_fb.TensorMetadataT()


input_meta.name = "image"
input_meta.description = (
    "Input image to be classified. The expected image is {0} x {1}, with "
    "three channels (red, blue, and green) per pixel. Each value in the "
    "tensor is a single byte between 0 and 255.".format(300, 300))
input_meta.content = _metadata_fb.ContentT()
input_meta.content.contentProperties = _metadata_fb.ImagePropertiesT()
input_meta.content.contentProperties.colorSpace = (
    _metadata_fb.ColorSpaceType.RGB)
input_meta.content.contentPropertiesType = (
    _metadata_fb.ContentProperties.ImageProperties)
input_normalization = _metadata_fb.ProcessUnitT()
input_normalization.optionsType = (
    _metadata_fb.ProcessUnitOptions.NormalizationOptions)
input_normalization.options = _metadata_fb.NormalizationOptionsT()
input_normalization.options.mean = [127.5]
input_normalization.options.std = [127.5]
input_meta.processUnits = [input_normalization]
input_stats = _metadata_fb.StatsT()
input_stats.max = [255]
input_stats.min = [0]
input_meta.stats = input_stats



# Creates output info.
output_meta = _metadata_fb.TensorMetadataT()
output_meta.name = "probability"
output_meta.description = "Probabilities of the 18 labels respectively."
output_meta.content = _metadata_fb.ContentT()
output_meta.content.content_properties = _metadata_fb.FeaturePropertiesT()
output_meta.content.contentPropertiesType = (
    _metadata_fb.ContentProperties.FeatureProperties)
output_stats = _metadata_fb.StatsT()
output_stats.max = [1.0]
output_stats.min = [0.0]
output_meta.stats = output_stats
label_file = _metadata_fb.AssociatedFileT()
label_file.name = os.path.basename('/content/gdrive/My Drive/models/research/deploy/labelmap.txt')
label_file.description = "Labels for objects that the model can recognize."
label_file.type = _metadata_fb.AssociatedFileType.TENSOR_AXIS_LABELS
output_meta.associatedFiles = [label_file]


# Creates subgraph info.
subgraph = _metadata_fb.SubGraphMetadataT()
subgraph.inputTensorMetadata = [input_meta]
subgraph.outputTensorMetadata = 4*[output_meta]
model_meta.subgraphMetadata = [subgraph]

b = flatbuffers.Builder(0)
b.Finish(
    model_meta.Pack(b),
    _metadata.MetadataPopulator.METADATA_FILE_IDENTIFIER)
metadata_buf = b.Output()


# metadata and the label file are written into the TFLite file
populator = _metadata.MetadataPopulator.with_model_file('/content/gdrive/My Drive/models/research/object_detection/exported_model/detect.tflite')
populator.load_metadata_buffer(metadata_buf)
populator.load_associated_files(['/content/gdrive/My Drive/models/research/deploy/labelmap.txt'])
populator.populate()

PS: Veillez à modifier les quelques parties de code, afin d'être compatible avec vos besoins. (par exemple, si vous utilisez des images de 512x512, vous devez la modifier à partir de la variable "input_meta.description").


0 commentaires