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 ответа
Мне удалось построить подходящие функции, используя следующие ссылки:
Вторая ссылка находится в Котлине. Вот код:
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
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].