AutoML TfLite Android Edge Device Tutorial: как разрешить исключение BufferOverflowException в коде руководства

Я тестирую видение Google Cloud AutoML, я прошел процесс обучения, у меня есть экспортированная tflite модель периферийного устройства, более 100 тыс. Изображений, 25 этикеток.

Следуя инструкциям этих двух руководств и коду из репозитория ниже: https://cloud.google.com/vision/automl/docs/edge-quickstart https://cloud.google.com/vision/automl/docs/tflite-android-tutorial https://github.com/googlecodelabs/tensorflow-for-poets-2/tree/master/android/tflite

Я предполагаю, что проблема не в пользовательской проблеме tflite, а в какой-то проблеме совместимости, которую не учитывает руководство (либо по ошибке, либо потому, что оно устарело?)

Пример приложения с предварительно обученной моделью, включенный в репозиторий github выше, работает без каких-либо изменений. Когда я заменяю пакеты tflite и вношу изменения кода, запрошенные в руководстве, я обнаруживаю исключение BufferOverflowException.

Я предполагаю, что проблема не в пользовательской проблеме tflite, а в какой-то проблеме совместимости, которую не учитывает руководство (либо по ошибке, либо потому, что оно устарело?)

Пример приложения с предварительно обученной моделью, включенный в репозиторий github выше, работает без каких-либо изменений. Когда я заменяю пакеты tflite и вношу изменения кода, запрошенные в руководстве, я обнаруживаю исключение BufferOverflowException.

Сбой кода в блоке try / catch (добавлен мной, чтобы узнать больше о том, что происходит)

'''
private void convertBitmapToByteBuffer(Bitmap bitmap) {
if (imgData == null) {
  return;
}
imgData.rewind();
bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
// Convert the image to floating point.
int pixel = 0;
long startTime = SystemClock.uptimeMillis();
for (int i = 0; i < DIM_IMG_SIZE_X; ++i) {
  for (int j = 0; j < DIM_IMG_SIZE_Y; ++j) {
    final int val = intValues[pixel++];
    try
    {
      imgData.putFloat((((val >> 16) & 0xFF))/IMAGE_STD);
      imgData.putFloat((((val >> 8) & 0xFF))/IMAGE_STD);
      imgData.putFloat((((val) & 0xFF))/IMAGE_STD);
    }
    catch (BufferOverflowException e)
    {
      Log.e("TfLiteCameraDemo", "Exception caught: ", e);
    }
  }
}
long endTime = SystemClock.uptimeMillis();
Log.d(TAG, "Timecost to put values into ByteBuffer: " + Long.toString(endTime - startTime));
}
'''

Импортированная модель tflite, следуя инструкциям по руководствам по ссылке выше, дает сбой.


person tvanfossen    schedule 09.05.2019    source источник
comment
Учитывая, что первая ссылка гласит *Beta* This product or feature is in a pre-release state and might change or have limited support. For more information, see Product launch stages., я бы отправил отзыв на странице и / или создал бы тикет проблемы.   -  person Morrison Chang    schedule 09.05.2019
comment
Я уже открыл для него проблему в репозитории git, просто надеясь, что найдется кто-то, кто лучше разбирается в проблеме.   -  person tvanfossen    schedule 09.05.2019


Ответы (1)


Я понимаю, что это более старый пост, но я столкнулся с той же проблемой и нашел решение. Возможно, публикация поможет кому-то другому в будущем.

Размер буфера, который требуется части Tensorflow, составляет 150528 байт. Используя putFloat () выше, код пытается поместить 4x (float = 4 байта) столько данных в буфер imgData. Я попытался просто увеличить буфер, и это привело к другой ошибке. В конечном итоге сработало преобразование данных из числа с плавающей запятой в байтовые. См. ниже.

Оригинал: (сбой из-за ошибки переполнения буфера)

imgData.putFloat((((val >> 16) & 0xFF)-IMAGE_MEAN)/IMAGE_STD);
imgData.putFloat((((val >> 8) & 0xFF)-IMAGE_MEAN)/IMAGE_STD);
imgData.putFloat((((val) & 0xFF)-IMAGE_MEAN)/IMAGE_STD);

Изменено: (это работает без сбоев на моем Galaxy Note9. Однако он не очень хорошо справляется с точной идентификацией.)

imgData.put((byte) ((byte) (((val >> 16) & 0xFF)- IMAGE_MEAN)/IMAGE_STD));
imgData.put((byte) ((byte) (((val >> 8) & 0xFF)-IMAGE_MEAN)/IMAGE_STD));
imgData.put((byte) (((byte) ((val) & 0xFF)-IMAGE_MEAN)/IMAGE_STD));
person Steven Fletcher    schedule 06.12.2019