Сбой модели обнаружения объектов Google Cloud Vision на Android
Недавно я обучил модель обнаружения объектов в Google Cloud Vision. Я экспортировал файл jason с метаданными, текстовый файл метки и файл tflite модели обученной модели и намереваюсь запустить его на Android. Однако я не могу запустить эту модель с помощью демонстрационного приложения для Android, поскольку оно каждый раз дает сбой.
Используемое демонстрационное приложение совместимо с локально обученной и преобразованной моделью tflite, но не с моделью, экспортированной из Google Cloud.
Что здесь может быть не так и как это решить?
Благодарность
Ссылка: демонстрационное приложение: https://github.com/tensorflow/examples/tree/master/lite/examples/object_detection
Частичный журнал:
2020-01-24 11:29:11.628 18071-18071/org.tensorflow.lite.examples.detection E/libc: Access denied finding property "persist.camera.privapp.list"
2020-01-24 11:29:11.732 18071-18101/org.tensorflow.lite.examples.detection I/tensorflow: CameraConnectionFragment: Opening camera preview: 640x480
2020-01-24 11:29:11.769 18071-18102/org.tensorflow.lite.examples.detection D/vndksupport: Loading /vendor/lib/hw/android.hardware.graphics.mapper@2.0-impl.so from current namespace instead of sphal namespace.
2020-01-24 11:29:11.770 18071-18102/org.tensorflow.lite.examples.detection D/vndksupport: Loading /vendor/lib/hw/gralloc.msm8937.so from current namespace instead of sphal namespace.
2020-01-24 11:29:11.803 18071-18071/org.tensorflow.lite.examples.detection I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@5ab1c5e time:332335506
2020-01-24 11:29:12.198 18071-18101/org.tensorflow.lite.examples.detection D/tensorflow: CameraActivity: Initializing buffer 0 at size 307200
2020-01-24 11:29:12.201 18071-18101/org.tensorflow.lite.examples.detection D/tensorflow: CameraActivity: Initializing buffer 1 at size 153599
2020-01-24 11:29:12.203 18071-18101/org.tensorflow.lite.examples.detection D/tensorflow: CameraActivity: Initializing buffer 2 at size 153599
2020-01-24 11:29:12.204 18071-18101/org.tensorflow.lite.examples.detection I/tensorflow: DetectorActivity: Preparing image 1 for detection in bg thread.
2020-01-24 11:29:12.311 18071-18100/org.tensorflow.lite.examples.detection I/tensorflow: DetectorActivity: Running detection on image 1
2020-01-24 11:29:12.475 18071-18100/org.tensorflow.lite.examples.detection E/AndroidRuntime: FATAL EXCEPTION: inference
Process: org.tensorflow.lite.examples.detection, PID: 18071
java.lang.IllegalArgumentException: Cannot convert between a TensorFlowLite buffer with 307200 bytes and a Java Buffer with 270000 bytes.
at org.tensorflow.lite.Tensor.throwIfShapeIsIncompatible(Tensor.java:332)
at org.tensorflow.lite.Tensor.throwIfDataIsIncompatible(Tensor.java:305)
at org.tensorflow.lite.Tensor.setTo(Tensor.java:123)
at org.tensorflow.lite.NativeInterpreterWrapper.run(NativeInterpreterWrapper.java:148)
at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:296)
at org.tensorflow.lite.examples.detection.tflite.TFLiteObjectDetectionAPIModel.recognizeImage(TFLiteObjectDetectionAPIModel.java:193)
at org.tensorflow.lite.examples.detection.DetectorActivity$2.run(DetectorActivity.java:183)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:175)
at android.os.HandlerThread.run(HandlerThread.java:65)
=========================================================
Обновление: теперь мы знаем, что это потому, что изображение, подаваемое в модель, и входная форма модели не совпадают. Форма ввода / вывода моделей, обученных в Google Cloud Vision, не кажется согласованной. Я недавно получил один из [ 1 320 320 3] вход и [ 1 20 4] выход, а другой из [ 1 512 512 3] вход и [ 1 20 4] выход.
Демонстрационное приложение предназначено для работы с моделями [ 1 300 300 3] на входе и [ 1 10 4] на выходе.
Как мне назначить формы модели перед обучением в Google Cloud Vision или как сделать демонстрационное приложение способным обрабатывать модель определенной формы?
=========================================================
В качестве попытки включить демонстрационное приложение для обработки модели определенной формы, я изменил TF_OD_API_INPUT_SIZE
от 300 до 320, что, похоже, решило проблему формы входных данных. Однако проблемы возникают на стороне вывода.
В новом журнале ошибок говорится:
java.lang.IllegalArgumentException: Cannot copy between a TensorFlowLite tensor with shape [1, 20, 4] and a Java object with shape [1, 10, 4].
Изменение TEXT_SIZE_DIP
от 10 до 20 не помогает.
1 ответ
Причина сбоя заключается в том, что входная форма не совпадает с формой модели, после решения которой возникает еще один сбой из-за несоответствия выходной формы.
Решение этой проблемы - настроить форму ввода-вывода демонстрационного приложения в соответствии с метаданными модели, предоставленными AutoML в Google Cloud.