Java AutoML TfLite Android边缘设备教程:如何解决教程代码中的BufferOverflowException

Java AutoML TfLite Android边缘设备教程:如何解决教程代码中的BufferOverflowException,java,android,tensorflow-lite,automl,google-cloud-automl,Java,Android,Tensorflow Lite,Automl,Google Cloud Automl,我正在测试Google Cloud AutoML vision,我已经完成了培训过程,有一个导出的edge设备tflite模型,超过100k的图像,25个标签 遵循这两个教程中的说明和以下repo中的代码: 我假设问题不是自定义tflite的问题,而是教程没有考虑到的某种兼容性问题(要么是错误的,要么是因为它过时了?) 上述github回购协议中包含的具有预训练模型的示例应用程序可以正常工作,没有任何更改。当我交换tflite包并按照教程的要求更改代码时,我遇到了BufferOverflowE

我正在测试Google Cloud AutoML vision,我已经完成了培训过程,有一个导出的edge设备tflite模型,超过100k的图像,25个标签

遵循这两个教程中的说明和以下repo中的代码:

我假设问题不是自定义tflite的问题,而是教程没有考虑到的某种兼容性问题(要么是错误的,要么是因为它过时了?)

上述github回购协议中包含的具有预训练模型的示例应用程序可以正常工作,没有任何更改。当我交换tflite包并按照教程的要求更改代码时,我遇到了BufferOverflowException

我假设问题不是自定义tflite的问题,而是教程没有考虑到的某种兼容性问题(要么是错误的,要么是因为它过时了?)

上述github回购协议中包含的具有预训练模型的示例应用程序可以正常工作,没有任何更改。当我交换tflite包并按照教程的要求更改代码时,我遇到了BufferOverflowException

try/catch块的代码崩溃(由我添加以了解更多情况)

“”
私有void convertBitmapToByteBuffer(位图){
如果(imgData==null){
返回;
}
imgData.rewind();
位图.getPixels(intValues,0,bitmap.getWidth(),0,0,bitmap.getWidth(),bitmap.getHeight());
//将图像转换为浮点。
整数像素=0;
long startTime=SystemClock.uptimeMillis();
对于(整数i=0;i>16)和0xFF))/IMAGE_STD;
imgData.putFloat(((val>>8)和0xFF))/IMAGE_STD;
imgData.putFloat(((val)和0xFF))/IMAGE_STD;
}
捕获(BufferOverflowException e)
{
Log.e(“TfLiteCameraDemo”,“捕获异常:”,e);
}
}
}
long-endTime=SystemClock.uptimeMillis();
Log.d(标签,“将值放入ByteBuffer的时间成本:”+Long.toString(endTime-startTime));
}
'''

导入的tflite模型,按照上面链接中教程的说明,崩溃了。

我意识到这是一篇较旧的文章,但我只是遇到了同样的问题并找到了解决方案。也许发帖会在将来帮助别人

Tensorflow部分需要的缓冲区是150528字节。通过使用上面的putFloat(),代码试图将4倍(float=4字节)的数据放入imgData缓冲区。我试着让缓冲区变大,结果产生了不同的错误。最后的工作是将数据从浮点转换成字节。见下文

原始:(因缓冲区溢出错误而崩溃)

修改:(这在我的Galaxy Note9上运行,但在准确识别方面做得不好。)


我意识到这是一篇老文章,但我只是遇到了同样的问题并找到了解决办法。也许发帖会在将来帮助别人

Tensorflow部分需要的缓冲区是150528字节。通过使用上面的putFloat(),代码试图将4倍(float=4字节)的数据放入imgData缓冲区。我试着让缓冲区变大,结果产生了不同的错误。最后的工作是将数据从浮点转换成字节。见下文

原始:(因缓冲区溢出错误而崩溃)

修改:(这在我的Galaxy Note9上运行,但在准确识别方面做得不好。)


如果第一个链接显示
*Beta*,则此产品或功能处于预发布状态,可能会更改或支持有限。有关更多信息,请参阅产品发布阶段。
我会在页面上发送反馈和/或创建问题通知单。我已经在git repo上为其打开了一个问题,只是希望有人对这个问题有更好的了解,即使第一个链接说,
*Beta*此产品或功能处于预发布状态,可能会更改或支持有限。有关更多信息,请参阅产品发布阶段。
我会在页面上发送反馈和/或创建问题通知单。我已经在git repo上为它打开了一个问题,只是希望有人能够更好地了解这个问题
'''
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));
}
'''
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);
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));