【问题标题】:How to process image in android for tensorflow lite input?如何在android中处理图像以进行tensorflow lite输入?
【发布时间】:2020-10-15 06:21:13
【问题描述】:

我做了什么?

我正在研究图像分类问题。我已经在 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 demo 分类器类。

我需要什么帮助?

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

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

【问题讨论】:

  • 您看过所有 Classifier.java 文件吗?在底部有一个 loadImage 函数,它为将位图准备到 TensorImage 进行特定的计算。里面有裁剪,调整大小和旋转......如果其中有任何错误......那么你会得到奇怪的结果!所以回答我这个问题,我会发布一个如何正确操作的答案
  • 是的,我已经看到了 loadimage 函数。我不需要标准化、旋转或裁剪我的图像,这就是我没有使用该功能的原因。
  • 对不起,您没有提到不使用该方法。我认为你是在正确的点......位图未正确加载以运行推理。如果可以的话上传项目的链接进行调试。
  • 我已经在一定程度上解决了我的问题。不,唯一的问题是准确性不完全相同。虽然它接近原始精度。如何解决?
  • 我们必须重现....

标签: java python android machine-learning tensorflow-lite


【解决方案1】:

看起来您自己在 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]。您可能需要更新此 class 上的参数才能使其正常工作。

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

【讨论】:

  • 它是一个浮动模型。我没有在 python 中标准化我的图像。在没有标准化的图像上训练我的模型。所以我认为在android中也不需要规范化。
  • 您可以尝试使用上面视频中的 Model Maker 和 ML 模型绑定,而不是编写自己的训练代码吗?训练模型时不规范化输入图像是不寻常的,因此我怀疑训练中的预处理与 Android 应用中的预处理之间存在差异。
  • 该版本的android studio 仅适用于MAC。我没有MAC。实际上,我的图像是信号。这些信号被转换成剪辑并被归一化。标准化后,我们保存了它们。图像已经标准化。我们不需要在 python 或 android 中对它们进行规范化。
  • Android Studio 是跨平台的。您可以下载适用于 Windows 或 Linux 的 Android Studio 4.1 Beta 1,它具有相同的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 2019-09-06
  • 2022-01-06
  • 1970-01-01
相关资源
最近更新 更多