我第一次发帖提问。我一直在使用适用于 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 类。 如果您知道如何处理这个问题,请告诉我。
你检查过包装里的方法
TensorImage.fromBitmap(Bitmap)
吗org.tensorflow.lite.support.image
?
我不是图像专家,因此可能需要计算确切的格式,该文档不是很详细(也许就足够了)。