Недопустимый выходной Tensor index: 1 при запуске пользовательской модели yolov3-tiny в примере Google TFLite Object Detection - PullRequest
0 голосов
/ 26 мая 2020

Я столкнулся с ошибкой при попытке запустить модель tiny-yolov3 на Обнаружении объектов TensorFlow Lite Android Демо . Когда я пытаюсь запустить приложение на мобильном телефоне, оно вылетает со следующей ошибкой:

E/AndroidRuntime: FATAL EXCEPTION: inference
    Process: org.tensorflow.lite.examples.detection, PID: 5535
    java.lang.IllegalArgumentException: Invalid output Tensor index: 1
        at org.tensorflow.lite.NativeInterpreterWrapper.getOutputTensor(NativeInterpreterWrapper.java:292)
        at org.tensorflow.lite.NativeInterpreterWrapper.run(NativeInterpreterWrapper.java:166)
        at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:314)
        at org.tensorflow.lite.examples.detection.tflite.TFLiteObjectDetectionAPIModel.recognizeImage(TFLiteObjectDetectionAPIModel.java:204)
        at org.tensorflow.lite.examples.detection.DetectorActivity$2.run(DetectorActivity.java:181)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.os.HandlerThread.run(HandlerThread.java:65)

Здесь мой tflite и файл метки.

Я изменил следующее на DetectorActivity. java, чтобы избежать this error

TF_OD_API_INPUT_SIZE from 300 to 416
TF_OD_API_IS_QUANTIZED from true to false

Затем я изменил следующее в TFLiteObjectDetectionAPIModel. java

NUM_DETECTIONS from 10 to 2535
d.outputLocations = new float[1][NUM_DETECTIONS][4] to d.outputLocations = new float[1][NUM_DETECTIONS][7];

Здесь - это DetectorActivity. java и TFLiteObjectDetectionAPIModel. java, которые я использую

Здесь - это моя модель .weight, cfg и .pb при необходимости

Любая помощь будет оценена

1 Ответ

0 голосов
/ 27 мая 2020

Я могу воспроизвести проблему, используя вашу пользовательскую модель и исходный код. Спасибо за их предоставление.

Основная проблема заключается в том, что ваша нестандартная модель detect.tflite имеет выходной spe c, который отличается от ожидаемого приложением примера обнаружения объектов.

Вы можно увидеть разницу с помощью визуализатора модели, такого как netron .

Исходная модель, используемая в примере приложения (mobilenet_ssd), выглядит следующим образом:

enter image description here

Как видите, имеется 4 скалярных выхода float32, которые по существу отделены от последнего узла TFLite_Detection_PostProcess.

enter image description here

С другой стороны, ваша модель имеет единственный выходной тензор в форме [1,2535,7].

enter image description here

Итак, когда код Java приложения запускает tfLite.runForMultipleInputsOutputs(inputArray, outputMap), он пытается назначить несколько выходов на основе того, что вы поместили в outputMap. Однако, поскольку в вашей модели есть только один тензор вывода, когда он пытается назначить вывод с индексом 1 в массив outputClasses, он выдает сообщение об ошибке.

Я не знаю достаточно подробностей о модель yolov3, чтобы помочь вам с точной командой, используемой для преобразования модели, но это do c должно дать более подробную информацию о том, как была преобразована исходная модель.

...