Почему точность модели tflite так отличается от модели keras?

#python #tensorflow #tensorflow-lite

#python #тензорный поток #tensorflow-lite

Вопрос:

Я создал модель, которая предсказывает символ на изображении, для распознавания номерных знаков. Это очень хорошо работает на моем компьютере, но мне нужно поместить эту работу в приложение для Android. Итак, я разработал небольшое приложение и преобразовал свою модель keras в tflite. И теперь он всегда предсказывает один и тот же символ.

Я преобразовал модель, используя :

 mod_path = "License_character_recognition.h5"

def load_model(path,custom_objects={},verbose=0):
    #from tf.keras.models import model_from_json

    path = splitext(path)[0]
    with open('MobileNets_character_recognition.json','r') as json_file:
        model_json = json_file.read()
    model = tf.keras.models.model_from_json(model_json, custom_objects=custom_objects)
    model.load_weights('%s.h5' % path)
    if verbose: print('Loaded from %s' % path)
    return model

keras_mod = load_model(mod_path)

converter = tf.lite.TFLiteConverter.from_keras_model(keras_mod)
tflite_model = converter.convert()

# Save the TF Lite model.
with tf.io.gfile.GFile('ocr.tflite', 'wb') as f:
    f.write(tflite_model)
  

Есть ли лучший способ преобразовать модель, или я что-то упускаю?

РЕДАКТИРОВАТЬ: Это то, что я сделал для управления растровым изображением

         try {
            Mat bis = Utils.loadResource(MainActivity.this, R.drawable.plaque, Imgcodecs.IMREAD_COLOR);
            cvtColor(bis, bis, COLOR_BGR2RGB);

            Mat m = Utils.loadResource(MainActivity.this, R.drawable.plaque,Imgcodecs.IMREAD_GRAYSCALE);

            blur(m, blur, new Size(2,2));

            threshold(blur, bin, 0, 255, THRESH_BINARY_INV   THRESH_OTSU);

            ArrayList<MatOfPoint> contours;
            contours = getContours(bin);

            //Try to sort from left to right
            Collections.sort(contours, new SortByTopLeft());
            Log.d("Contour", String.valueOf(contours.size()));
            int i = 0;
            for (MatOfPoint c : contours){
                Rect cont = boundingRect(c);
                float ratio = (float) (cont.height/cont.width);
                Log.d("Ratio", String.valueOf(ratio));
                float pourcent =  ((float) cont.height/ (float) bin.height());
                Log.d("pourcent", String.valueOf(pourcent));
                if (ratio >= 1 amp;amp; ratio <= 2.5){
                    if(pourcent >=0.5){
                        Log.d("Ui", String.valueOf(cont));
                        rectangle(bis, cont, new Scalar(0,255,0), 2);

                        //Separate numbers
                        Mat curr_num = new Mat(bin, cont);
                        Bitmap curbit = Bitmap.createBitmap(curr_num.cols(), curr_num.rows(), Bitmap.Config.ARGB_8888);
                        Utils.matToBitmap(curr_num, curbit);
                        images[i].setImageBitmap(curbit);
                        int charac = classifier.classify(curbit);
                        Log.d("Result", String.valueOf(charac));
                        result.setText(String.valueOf(charac));
                        if (i < 6){
                            i  ;
                        }
                    }

                }
  

Комментарии:

1. Если вы обвиняете Android, пожалуйста, поместите код Android, который выполняет манипуляции с растровым изображением, для проверки

2. Я отредактировал свой вопрос, если это может вам помочь

3. Пожалуйста, прочтите эту статью medium.com/@farmaker47 / … и посмотрите, может ли загрузка изображений и манипулирование ими с помощью библиотеки tensorflow решить вашу проблему…

4. Спасибо, вы были правы, управление изображением с помощью библиотеки Tensorflowsupport было ответом! Я воссоздал ввод и вывод с помощью этой части вашей статьи tensorflow_support_library.java

5. Хорошо! Я добавлю ответ, и если вы можете, пожалуйста, проголосуйте!

Ответ №1:

Вы можете использовать библиотеку поддержки Android TensorFlow Lite. Эта библиотека предназначена для обработки ввода и вывода моделей TensorFlow Lite и упрощения использования интерпретатора TensorFlow Lite.

Используйте это, как показано ниже, и узнайте больше в этой статье:

 
    Bitmap assetsBitmap = getBitmapFromAsset(mContext, "picture.jpg");
    // Initialization code
    // Create an ImageProcessor with all ops required. For more ops, please
    // refer to the ImageProcessor Architecture.
    ImageProcessor imageProcessor =
            new ImageProcessor.Builder()
                    .add(new ResizeOp(32, 32, ResizeOp.ResizeMethod.BILINEAR))
                    //.add(new NormalizeOp(127.5f, 127.5f))
                    .build();

    // Create a TensorImage object. This creates the tensor of the corresponding
    // tensor type (flot32 in this case) that the TensorFlow Lite interpreter needs.
    TensorImage tImage = new TensorImage(DataType.FLOAT32);

    // Analysis code for every frame
    // Preprocess the image
    tImage.load(assetsBitmap);
    tImage = imageProcessor.process(tImage);

    // Create a container for the result and specify that this is not a quantized model.
    // Hence, the 'DataType' is defined as FLOAT32
    TensorBuffer probabilityBuffer = TensorBuffer.createFixedSize(new int[]{1, 10}, DataType.FLOAT32);
    interpreter.run(tImage.getBuffer(), probabilityBuffer.getBuffer());

    Log.i("RESULT", Arrays.toString(probabilityBuffer.getFloatArray()));

    return getSortedResult(result);
}