如何在 Android 上将位图图像转换为 TensorImage?

问题描述 投票:0回答:1

我第一次发帖提问。我一直在使用适用于 Android 设备(Java)的tensorflow lite 构建对象分类程序。我已经使用 Python 和 Keras 制作了相同的功能程序,因此我将模型转换为 tflite 形式,并在 android 上使用它。但结果与我在 Python 中得到的结果有很大不同。我怀疑推理前的图像处理方法不正确。

在Python中,推理前的图像处理如下:

img = cv2.imread(image_dir)/255.  
img = cv2.resize(img, (64,64), interpolation = cv2.INTER_AREA)
img_list.append(img)
img_list = np.array(img_list).astype(np.float32)

model.predict(img_list, batch_size=512, verbose=0)

在Android(Java)中,推理前的图像流程如下:

Mat img = new Mat();
Utils.bitmapToMat(bitmap, img, true);

Imgproc.cvtColor(img, img, Imgproc.COLOR_RGB2GRAY); //to grayscale

Size size = new Size(64,64);
Imgproc.resize(img, img, size, Imgproc.INTER_AREA); //resize

Bitmap dst = Bitmap.createBitmap(img.width(), img.height(), Bitmap.Config.ARGB_8888);

Utils.matToBitmap(img, dst); //convert to bitmap

int imageTensorIndex = 0;
DataType imageDataType = tensorFlowLiteModel.getInputTensor(imageTensorIndex).dataType(); //tensorFlowLiteModel is interpreter which also inferences (loaded from XXXX.tflite)

TensorImage tfImage = new TensorImage(imageDataType);
tfImage.load(dst);

int probabilityTensorIndex = 0;
int[] probabilityShape =
                tensorFlowLiteModel.getOutputTensor(probabilityTensorIndex).shape();
DataType probabilityDataType = tensorFlowLiteModel.getOutputTensor(probabilityTensorIndex).dataType();
outputProbabilityBuffer = TensorBuffer.createFixedSize(probabilityShape, probabilityDataType);

tensorFlowLiteModel.run(tfImage.getBuffer(),  outputProbabilityBuffer.getBuffer().rewind())

它确实有效并显示了结果,但结果与Python(Keras)不同。 我猜推理之前的图像处理是错误的。 我也知道使用 ByteBuffer 进行图像处理,但由于 OOM(内存不足)而无法工作,所以我想使用 TensorImage 类。 如果您知道如何处理这个问题,请告诉我。

java android tensorflow keras tensorflow-lite
1个回答
0
投票

你检查过包装里的方法

TensorImage.fromBitmap(Bitmap)
org.tensorflow.lite.support.image

我不是图像专家,因此可能需要计算确切的格式,该文档不是很详细(也许就足够了)。

© www.soinside.com 2019 - 2024. All rights reserved.