0

I am trying to make an android app for monument recognition. The input changes on every run but output returned is always same.

Below are the code snippets

to load tflite model stored in assets directory

private ByteBuffer loadModelFile(String filename) throws IOException {
        AssetFileDescriptor fileDescriptor = this.getAssets().openFd(filename);
        FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
        FileChannel fileChannel = inputStream.getChannel();
        long startOffset = fileDescriptor.getStartOffset();
        long declaredLength = fileDescriptor.getDeclaredLength();
        return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
    }

to initialize tflite interpreter

predict.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.O)
            @Override
            public void onClick(View v) {
                try {
                    tflite = new Interpreter(loadModelFile("converted_model.tflite"));
                    Log.println(7,"tflite", "tflite init");
                    doInference(picFile);

                } catch (Exception e) {
                    System.out.println(e);
                }

            }
        });

to run the model

@RequiresApi(api = Build.VERSION_CODES.O)
    public void doInference(File photo) throws IOException {
        img = findViewById(R.id.imgToDisp);
        Bitmap bitmapImg = BitmapFactory.decodeFile(pathToFile);
        img.setImageBitmap(bitmapImg);

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmapImg.compress(Bitmap.CompressFormat.JPEG, 50, stream);
        byte[] arr = stream.toByteArray();

        changedim = new float[1][150][150][3];
        outputval = new float[1][28];

        int m = 0;
        for (int i = 0; i < 1; i++) {
            for (int j = 0; j < 150; j++) {
                for (int k = 0; k < 150; k++) {
                    for (int l = 0; l < 3; l++) {
                        byte a = arr[m++];
                        changedim[i][j][k][l] = Byte.toUnsignedLong(a);
                    }
                }
            }
        }

        tflite.run(changedim, outputval);

        for(int i=0;i<28;i++) {
            Log.println(7,"outputval",i+" "+outputval[0][i]);
        }

        path = findViewById(R.id.path);
        String out = "";

        float[] op = outputval[0];
        int ind = 0;

        float max = op[0];

        while (op[ind] != 1) {
            ind++;
            //Log.println(7,"op", " "+op[ind]+" "+ind);
        }

        for (float f : op) {
            out += Float.toString(f) + ",";
        }

        predict.setText("result: " + labels.get(ind));
        Log.println(7, "label", ind + " " + labels.get(ind));
        //path.setText(""+pathToFile);
    }

input to the model must be an image of size 150*150 converted to 4d float32 array of shape 1*150*150*3

1 Answer 1

0

Input to the model is the color values of individual pixels. Which can be extracted using

 int p = bitmapImg.getPixel(j, k);
 int R = (p >> 16) & 0xff;
 int G = (p >> 8) & 0xff;
 int B = p & 0xff;

change that and your model will work correctly!

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.