android - 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 上得到了完全不同的结果。
这是我在 Android 应用程序中得到的错误结果:
两个示例中都有指向模型和测试图像的链接,但我将再次将它们发布到问题中:
我想这与模型的输入/输出格式有关。或者图像在 python 和 android 中的解释不同。或者我添加到模型中的元数据在某种程度上是错误的。无论如何,我已经尝试了一切来定位问题,现在我被卡住了。
如何修复我的模型或 Android 代码,使其产生与我的 python 代码相同的结果?
解决方案
我已经设法找到并解决了这个问题:本教程中的模型包含一个内置的图像规范化层。图像标准化是将标准的0-255图像颜色值转换为0.0-1.0浮点值,适用于机器学习。
但我用于 tflite 模型的元数据包括 2 个用于外部标准化的参数:均值和标准差。每个值的公式为:normalized_value = (value - mean) / std由于我的模型处理自己的标准化,我需要通过设置mean = 0和std = 1 来关闭外部标准化。这样我会得到normalized_value = value。
因此,将 tflite 元数据参数设置为:
image_min=0,
image_max=255.0,
mean=[0.0],
std=[1.0]
修复了双重标准化问题,我的模型现在在 Android 应用程序中产生了正确的结果。
推荐阅读
- flutter - 如何在颤动的画布圆圈内插入/绘制图像/文本
- java - Springboot 2.5.1 service doesn't stop on System.exit(0)
- laravel - Illuminate\Database\Eloquent\Relations\HasOne 类型的对象不可调用”,...
- python - 在烧瓶中管理 rethinkdb 连接
- boolean - 序列的自定义前缀 - OdooV14
- sql - 如何按 SQL 中具有特定值的字段进行分组?
- javascript - 使用 CodeceptJs 关闭当前选项卡时会话 ID 无效
- python - 如何加载waymo场景数据?
- c# - 实体框架 - 查询只返回一个结果
- json - 如何在 Jmeter 中执行 ForEach 循环 100 次?