【发布时间】:2020-10-15 06:21:13
【问题描述】:
我做了什么?
我正在研究图像分类问题。我已经在 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 demo 分类器类。
我需要什么帮助?
- 现在我应该如何处理我应该成为相同输入的图像 在 python 中?
- 是否必须像在 python 中那样将其转换为数组?
- 我是否必须将其重塑为 (1, 137, 310, 3)?
- 我必须创建 4D 数组吗?
- 如何获取图像的像素值?
- 是否必须提取 RGB 像素值,然后将其更改为 3D 数组或其他内容?
我很困惑。我知道我在图像输入中犯了错误,但正确的方法是什么?实际上,我必须如何处理我的图像才能将其用作模型的输入?
【问题讨论】:
-
您看过所有 Classifier.java 文件吗?在底部有一个 loadImage 函数,它为将位图准备到 TensorImage 进行特定的计算。里面有裁剪,调整大小和旋转......如果其中有任何错误......那么你会得到奇怪的结果!所以回答我这个问题,我会发布一个如何正确操作的答案
-
是的,我已经看到了 loadimage 函数。我不需要标准化、旋转或裁剪我的图像,这就是我没有使用该功能的原因。
-
对不起,您没有提到不使用该方法。我认为你是在正确的点......位图未正确加载以运行推理。如果可以的话上传项目的链接进行调试。
-
我已经在一定程度上解决了我的问题。不,唯一的问题是准确性不完全相同。虽然它接近原始精度。如何解决?
-
我们必须重现....
标签: java python android machine-learning tensorflow-lite