Я тестирую Google Cloud AutoML vision, я завершил учебный процесс, у меня есть модель 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, следуя инструкциям из учебных пособий по ссылке выше, вылетает.