Tensorflow Lite模型推断的准确性非常低

时间:2019-06-26 14:21:35

标签: android tensorflow keras tensorflow-lite

我想创建一个预测年龄和性别的模型,并将其集成到Android应用中。

我在Ubuntu 16上使用Python 3.6,Tensorflow 1.13.1和Keras 2.2.4。

首先,我使用来自keras的IMDB数据集Mobilenet V1V2训练了不同的模型,并编写了自己的VGG。 对于两个移动网络,我使用了图像网络权重来初始化模型。

准确性很高,性别超过90%。

培训结束后,我尝试了几种方法在tflite中转换模型:

  • 直接从.h5文件转换的三种方法:
converter = tf.lite.TFLiteConverter.from_keras_model_file(model_to_convert)
tflite_model = converter.convert()
open(model_converted, "wb").write(tflite_model)
converter = tf.contrib.lite.TFLiteConverter.from_keras_model_file(model_to_convert)
tflite_model = converter.convert()
open(model_converted, "wb").write(tflite_model)
converter = tf.contrib.lite.TocoConverter.from_keras_model_file(model_to_convert)
tflite_model = converter.convert()
open(model_converted, "wb").write(tflite_model)
  • 我首先按照this example
  • 中的说明将模型转换为tf图

我还尝试在转换之前使用以下代码:

tf.keras.backend.set_learning_phase(0)

最后,我将.tflite文件加载到Android Studio中:

private ByteBuffer convertBitmapToByteBuffer(Bitmap bitmap) {
        int SIZE_IMAGE = 96;
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4*1*SIZE_IMAGE*SIZE_IMAGE*3);
        byteBuffer.order(ByteOrder.nativeOrder());
        int[] pixels = new int[SIZE_IMAGE * SIZE_IMAGE];
        bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
        int pixel = 0;
        for(int i=0; i < SIZE_IMAGE; i++){
            for(int j=0; j<SIZE_IMAGE;j++){
                final int val = pixels[pixel++];
                byteBuffer.putFloat((float) (((val >> 16) & 0xFF)/255));
                byteBuffer.putFloat((float) (((val >> 8) & 0xFF)/255));
                byteBuffer.putFloat((float) ((val & 0xFF)/255));

            }
        }    

public String recognizeImage(Bitmap bitmap) {
        ByteBuffer byteBuffer = convertBitmapToByteBuffer(bitmap);
        Map<Integer, Object> cnnOutputs = new HashMap<>();
        float[][] gender=new float[1][2];
        cnnOutputs.put(0,gender);
        float[][]age=new float[1][21];
        cnnOutputs.put(1,age);
        Object[] inputs = {byteBuffer};
        interpreter.runForMultipleInputsOutputs(inputs, cnnOutputs);
        String result = convertToResults(gender[0], age[0]);
        return result;
    }

在最终推断期间,无论使用哪种模型,准确性都非常低。要么解释者总是预测出完全相同的结果,要么预测的年龄有所变化,但是预测的性别始终是“女人”。

我该怎么办?

谢谢!

1 个答案:

答案 0 :(得分:0)

尝试使用您的keras模型和tflite模型来处理一个输入数据并比较推断结果。可能输出不匹配。您可以从那里调试。