java - 我需要标准化位图并将其存储在 TensorImage 中。有什么办法可以做到这一点吗?

标签 java android tensorflow-lite

位图仅保存整数值 (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 保存输出。

最佳答案

我能够使用以下链接构建合适的函数-

  1. Converting Bitmap to ByteBuffer (float) in Tensorflow-lite Android

  2. https://heartbeat.fritz.ai/image-classification-on-android-with-tensorflow-lite-and-camerax-4f72e8fdca79

第二个链接是 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/

相关文章:

python - 如何在脚本中加载 tflite 模型?

java - 如何开始在 gradle 项目中使用 tensorflow-lite?

java - 我可以使用同步到最终字段吗?

java - 将 PFX 证书转换为 JKS 会出现 "Duplicate extensions not allowed"异常

android - Google map 在哪里保存缓存的 map 文件?

python - TFLIte 无法设置张量 : Dimension mismatch on model conversion

java - 将位图数组设置为 imageview 时发生主线程网络异常

java - Project$$EnhancerByCGLIB$$67a694bd 出现在 Hibernate 中

android - 如何在子 Activity 中获取名称父 Activity

php - Android 和 PHP 服务器 : encrypt and decrypt data