【问题标题】:Tensorflow.lite model produces wrong (different) results in Android app?Tensorflow.lite 模型在 Android 应用程序中产生错误(不同)结果?
【发布时间】:2021-05-02 09:06:39
【问题描述】:

我制作了一个图像分类模型并将其转换为 tflite 格式。 然后我使用 tf.lite.Interpreter 在 Python 中验证了 tflite 模型——它为我的测试图像产生了与原始模型相同的结果。这是colab link to verify

然后我使用 Android Studio ML Model Binding 和来自 Android Studio 的确切示例代码将其嵌入到示例 Android 应用程序中。 这是main activity code,您也可以使用此链接导航到完整的android项目。

val assetManager = this.assets
val istr = assetManager.open("test_image.JPG") //The same image
val b = BitmapFactory.decodeStream(istr)

val model = Model2.newInstance(this) //Model definition generated by Android Studio

// Creates inputs for reference.
val image = TensorImage.fromBitmap(b)

// Runs model inference and gets result.
val outputs = model.process(image)
val probability = outputs.probabilityAsCategoryList
probability.sortByDescending { it.score }
val top9 = probability.take(9)

this.findViewById<TextView>(R.id.results_text).text = top9.toString()

然后我在 Android 上对于相同的模型和相同的输入图像得到完全不同的结果。

以下是与我在 Python 中的初始模型匹配的结果:

这是我在 Android 应用中得到的错误结果:

两个示例中都有指向模型和测试图像的链接,但我会再次将它们发布到问题中:

tflite model

test image

我猜这与模型的输入/输出格式有关。或者图像在 python 和 android 中的解释不同。或者metadata I added to the model 有点错误。无论如何,我已经尝试了一切来定位问题,现在我被卡住了。

如何修复我的模型或 Android 代码,使其产生与我的 python 代码相同的结果?

【问题讨论】:

  • 您的 python/colab 环境和您的 Android 设置之间的输入图像大小是否匹配?如果您只提供 JPG 而不调整大小,那可能是个问题。
  • @MorrisonChang 在这两种情况下,图像都使用最近邻算法调整为 32x32px,我在调试器中检查了 Android 代码。
  • @MorrisonChang 我再次尝试使用 32x32px PNG 作为两种情况的输入,以避免任何调整大小,结果仍然相同。
  • 你打印了位数组并检查它在python上是否相同?此外,我建议使用 ImageClassifier 类如下:github.com/tensorflow/examples/blob/master/lite/examples/…

标签: android tensorflow kotlin tensorflow-lite


【解决方案1】:

我已经设法找到并解决了这个问题: 我来自this tutorial 的模型包含一个内置的图像标准化层。图像标准化是将标准 0-255 图像颜色值转换为 0.0-1.0 浮点值,适用于机器学习。

但我用于 tflite 模型的元数据包括 2 个用于外部标准化的参数:均值和标准差。 每个值的公式为:normalized_value = (value - mean) / std 由于我的模型自己处理标准化,我需要通过设置 mean = 0std = 1 来关闭外部标准化。 这样我会得到 normalized_value = value

因此,将 tflite 元数据参数设置为:

    image_min=0,
    image_max=255.0,
    mean=[0.0],
    std=[1.0]

修复了双重标准化问题,我的模型现在在 Android 应用中生成 correct results

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多