位图仅保存整数值 (0-255)。我需要将每个像素值除以 255。位图被转换为 TensorImage,然后在将其传递给预测输出的解释器时调用 getBuffer()。(tflite.run()) 在中间的某个地方,我必须将每个 RGB 像素除以 255。恐怕还有另一个缺点,因为 getBuffer() 函数返回一个字节缓冲区。 我找不到太多有关 TensorFlow lite 函数的文档。所以我不确定 tflite.run() 是否只能接受字节缓冲区。 我正在使用 Java 进行编码,并且是 Android AppD 的新手。 请提供帮助,因为这种标准化对于预测正确的值至关重要。
这是调整大小后将位图转换为张量图像的代码。在这里我需要将每个像素值除以 255,但我被难住了。
private TensorImage resizePic(Bitmap bp) {
ImageProcessor imageProcessor =
new ImageProcessor.Builder()
.add(new ResizeOp(60, 60, ResizeOp.ResizeMethod.BILINEAR))
.build();
TensorImage tImage = new TensorImage(DataType.FLOAT32);
tImage.load(bp);
tImage = imageProcessor.process(tImage);
return tImage;
}
这是运行模型的行
tflite.run(tImage.getBuffer(), probabilityBuffer.getBuffer());
probabilityBuffer 保存输出。
最佳答案
我能够使用以下链接构建合适的函数-
第二个链接是 Kotlin 语言。这是代码:
private ByteBuffer convertBitmapToByteBuffer(Bitmap bp) {
ByteBuffer imgData = ByteBuffer.allocateDirect(Float.BYTES*60*60*3);
imgData.order(ByteOrder.nativeOrder());
Bitmap bitmap = Bitmap.createScaledBitmap(bp,60,60,true);
int [] intValues = new int[60*60];
bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
// Convert the image to floating point.
int pixel = 0;
for (int i = 0; i < 60; ++i) {
for (int j = 0; j < 60; ++j) {
final int val = intValues[pixel++];
imgData.putFloat(((val>> 16) & 0xFF) / 255.f);
imgData.putFloat(((val>> 8) & 0xFF) / 255.f);
imgData.putFloat((val & 0xFF) / 255.f);
}
}
return imgData;
}
这里,60是我所需的输入图像高度和宽度。此外,此方法不需要使用 TensorImage。所以 tflite.run() 的最终调用如下所示:
tflite.run(convertBitmapToByteBuffer(bp), probabilityBuffer.getBuffer());
这里,bp是位图图像。
关于java - 我需要标准化位图并将其存储在 TensorImage 中。有什么办法可以做到这一点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62371665/