Bitmap содержит только целые значения (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());

ВероятностьBuffer содержит вывод.

2
Rukia394 14 Июн 2020 в 14:08

2 ответа

Лучший ответ

Мне удалось построить подходящие функции, используя следующие ссылки:

  1. Преобразование растрового изображения в ByteBuffer (float) в Tensorflow-lite Android

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

Вторая ссылка находится в Котлине. Вот код:

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 - это растровое изображение.

2
Rukia394 14 Июн 2020 в 12:43

Когда вы тренируете модель, не нормализируйте изображение. Поэтому при развертывании приложения нет необходимости нормализовать растровое изображение.

0
Ankit 23 Мар 2021 в 14:07