【发布时间】: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 上对于相同的模型和相同的输入图像得到完全不同的结果。
这是我在 Android 应用中得到的错误结果:
两个示例中都有指向模型和测试图像的链接,但我会再次将它们发布到问题中:
我猜这与模型的输入/输出格式有关。或者图像在 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