Как настроить демоверсию Android для обнаружения объектов Tensorflow для работы с Inception v2

Мы создали приложение для Android на основе демонстрационного приложения для Android для обнаружения объектов Tensorflow. Он работает при использовании сети Mobilenet, но дает сбой, если мы пытаемся использовать сеть на основе Inception v2.

Возможно ли, чтобы обнаружение объектов Tensorflow Inception v2 работало на Android?

https://github.com/tensorflow/models/tree/master/research/object_detection

Мы используем тот же код, что и демонстрация детектора Tensorflow. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/android/src/org/tensorflow/demo/TensorFlowObjectDetectionAPIModel.java

Модели из зоопарка здесь, https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

Использование API обнаружения объектов TF. Если мы используем сетевой файл pb, обученный с помощью ssd_mobilenet_v2_coco, демонстрационное приложение работает. Если мы используем сетевой pb-файл, обученный с помощью fast_rcnn_inception_v2_coco, он вылетает (см. Ниже)

Может ли приложение Android работать с моделью Inception v2? (точность мобильной сети очень плохая, но Inception намного лучше)

11-14 12:11:47.817 7122-7199/org.tensorflow.demo E/AndroidRuntime: FATAL EXCEPTION: inference
Process: org.tensorflow.demo, PID: 7122
java.nio.BufferOverflowException
at java.nio.FloatBuffer.put(FloatBuffer.java:444)
at org.tensorflow.Tensor.writeTo(Tensor.java:488)
at org.tensorflow.contrib.android.TensorFlowInferenceInterface.fetch(TensorFlowInferenceInterface.java:488)
at org.tensorflow.contrib.android.TensorFlowInferenceInterface.fetch(TensorFlowInferenceInterface.java:442)
at org.tensorflow.demo.TensorFlowObjectDetectionAPIModel.recognizeImage(TensorFlowObjectDetectionAPIModel.java:170)
at org.tensorflow.demo.DetectorActivity$3.run(DetectorActivity.java:288)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)

person James    schedule 08.11.2018    source источник
comment
Расскажите подробнее о самой проблеме? Почему приложение вылетает? Здесь есть какие-нибудь выходы? Какие рамки вы нам сделали? TFmobile или TFLite? Как сказал @Derek, теоретически должно быть возможно использовать inception на мобильном телефоне.   -  person Janikan    schedule 13.11.2018
comment
Обновленный пост с деталями и стеком.   -  person James    schedule 14.11.2018
comment
Вам нужно ограничить максимальное количество обнаружений для одного изображения, иначе это будет занимать память, и вы получите ошибки переполнения   -  person mlRocks    schedule 16.11.2018


Ответы (2)


Я однажды читал об этой проблеме.

Я думаю, проблема в этой строке вашего кода:

  private static final int MAX_RESULTS = 100;

Это создает массив для вывода с указанной длиной. Я думаю, что мобильная сеть SSD дает максимальное количество прогнозов, но более быстрый RCNN по умолчанию (без каких-либо конфигураций с вашей стороны) дает вам больше. Попробуйте увеличить это значение, например, до 500.

person Janikan    schedule 15.11.2018
comment
Спасибо, проблема решена. Сейчас он работает (но работает слишком медленно, поэтому вернемся к мобильной сети) - person James; 19.11.2018

Использование SSD Inception должно быть возможно, хотя и не рекомендуется. Inception довольно велик для мобильных устройств, и я не думаю, что у нас сейчас нет поддержки квантования для него.

person Derek Chow    schedule 12.11.2018
comment
Значит, вы имеете в виду, что fast_rcnn_inception_v2_coco не будет работать, но вы думаете, что ssd_inception_v2_coco будет работать? - person James; 14.11.2018
comment
Я думаю, что это не проверено, но у меня нет оснований полагать, что это не работает. Пока работает перезаписчик графа Tensorflow, который добавляет узлы FakeQuant, он будет обучаться с поддержкой диапазона для квантования. - person Derek Chow; 16.11.2018