首页 > 解决方案 > Tensorflow.lite 模型在 Android 应用程序中产生错误(不同)结果?

问题描述

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

然后,我使用Android Studio ML 模型绑定和来自 Android Studio 的确切示例代码将其嵌入到示例 Android 应用程序中。这是主要的活动代码,您也可以使用此链接导航到完整的 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 中的初始模型匹配的结果: Python中的正确结果

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

Android上的错误结果

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

tflite模型

测试图像

我想这与模型的输入/输出格式有关。或者图像在 python 和 android 中的解释不同。或者我添加到模型中的元数据在某种程度上是错误的。无论如何,我已经尝试了一切来定位问题,现在我被卡住了。

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

标签: androidtensorflowkotlintensorflow-lite

解决方案


我已经设法找到并解决了这个问题:本教程中的模型包含一个内置的图像规范化层。图像标准化是将标准的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 应用程序中产生了正确的结果。


推荐阅读