java - 如何在android中处理图像以进行tensorflow lite输入?
问题描述
我做了什么?
我正在研究图像分类问题。我已经在 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 演示分类器类。
我需要什么帮助?
- 现在我应该如何处理我应该成为与 python 中相同的输入的图像?
- 我是否必须像在 python 中那样将其转换为数组?
- 我是否必须将其重塑为 (1, 137, 310, 3)?
- 我必须创建 4D 数组吗?
- 我将如何获得图像的像素值?
- 我是否必须提取 RGB 像素值,然后将其更改为 3D 数组或其他内容?
我很困扰。我知道我在图像输入中犯了错误,但正确的方法是什么?实际上,我必须如何处理我的图像才能将其用作模型的输入?
解决方案
看起来你自己在 Python 中训练图像分类。如果您可以完全访问训练数据集,我建议您使用 TF Lite Model Maker 和 ML Model Binding 来训练 TF Lite 模型并将其集成到您的 Android 应用程序中。我会比目前的道路容易得多。看看这个视频。 https://www.youtube.com/watch?v=s_XOVkjXQbU&t=540s
回到您的问题,有几个原因可能导致问题:
不正确的归一化。从模型中不清楚它是浮点模型还是量化模型,以及是否需要标准化为 [-1, 1] 或 [0, 1] 或 [0, 255]。您可能需要更新此类的参数以使其工作。
图像比例问题:您的图像非常宽,但大多数图像分类模型都是用方形图像训练的,因此随着图像大小的调整,准确率会下降。
推荐阅读
- reactjs - recharts 折线图在响应式容器内没有响应
- html - 如何在 Angular 上平滑地为(自制)旋转木马设置动画?
- wordpress - REST Api 401 的 Nginx Wordpress 问题
- visual-studio-code - VS Code,移除建议弹窗悬停项周围的虚线边框(IntelliSense)
- flask - Windows Server 上的 2 个 IIS Flask 站点 - 仅运行 1 个
- javascript - 解析错误:意外的令牌,预期的“...”
- sql - 如何将带有数组的普通值转换为 PostgreSQL 中的数据结构?
- php - Laravel - Eager Loading BelongsToMany 关系
- javascript - 当我切换垂直对齐的 100vh 框时,滚动停止在屏幕上框的位置,我想释放它
- arrays - 即使在C中执行程序后如何多次输入?