首页 > 解决方案 > 如何在android中处理图像以进行tensorflow lite输入?

问题描述

我做了什么?

我正在研究图像分类问题。我已经在 python 中训练了我的 CNN 模型,然后将其转换为我的 android 应用程序的 Tensorflow-Lite。我已经在 python 中测试了我的 tensorflow-lite 模型,并将我的结果与我的 keras 模型结果进行了比较。两者都是相同的,这意味着我对 Tensorflow lite 的转换是正确的。

在 python 中,我用于读取图像的代码如下。我没有对此图像进行任何规范化或任何其他操作。只是调整它的大小并预测它。

image_array_abnormal = np.array([resize(imread('/content/path/abnormal2.png'), (137, 310, 3))])

image_array_shape 是:

(1, 137, 310, 3)

以下是我对 tensorflow lite 的输入和输出详细信息:

在此处输入图像描述

问题

但是当我尝试在 android 中使用我的模型时,它并没有给出预期的准确性。我认为我的图像或输入数据到 tensorflow lite 模型存在问题。在android中,我只是从drawable中读取图像,使用opencv,将其存储在Mat中,将其转换为位图并将其传递到tensorflow中进行预测,如下所示:

Mat src = Utils.loadResource(this, R.drawable.abnormal2);
Bitmap dst = Bitmap.createBitmap(src.width(), src.height(), Bitmap.Config.ARGB_8888);

classifier = new Classifier(activity, "model.tflite", "labels.txt");
results = classifier.recognizeImage(dst);

对于分类器类,我正在关注Tensorflow android 演示分类器类。

我需要什么帮助?

  1. 现在我应该如何处理我应该成为与 python 中相同的输入的图像?
  2. 我是否必须像在 python 中那样将其转换为数组?
  3. 我是否必须将其重塑为 (1, 137, 310, 3)?
  4. 我必须创建 4D 数组吗?
  5. 我将如何获得图像的像素值?
  6. 我是否必须提取 RGB 像素值,然后将其更改为 3D 数组或其他内容?

我很困扰。我知道我在图像输入中犯了错误,但正确的方法是什么?实际上,我必须如何处理我的图像才能将其用作模型的输入?

标签: javapythonandroidmachine-learningtensorflow-lite

解决方案


看起来你自己在 Python 中训练图像分类。如果您可以完全访问训练数据集,我建议您使用 TF Lite Model Maker 和 ML Model Binding 来训练 TF Lite 模型并将其集成到您的 Android 应用程序中。我会比目前的道路容易得多。看看这个视频。 https://www.youtube.com/watch?v=s_XOVkjXQbU&t=540s

回到您的问题,有几个原因可能导致问题:

  1. 不正确的归一化。从模型中不清楚它是浮点模型还是量化模型,以及是否需要标准化为 [-1, 1] 或 [0, 1] 或 [0, 255]。您可能需要更新此类的参数使其工作。

  2. 图像比例问题:您的图像非常宽,但大多数图像分类模型都是用方形图像训练的,因此随着图像大小的调整,准确率会下降。


推荐阅读