Растровое изображение назначается нулевым, хотя байтовый массив присутствует - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь преобразовать данные кадра в растровое изображение и отправить его интерпретатору Firebase для распознавания изображения. Но растровое изображение сохраняется как ноль. Когда я нажимаю кнопку «Пуск», добавляется процессор камеры, который отправляет кадры, и я добавляю модель tflite и файл label.txt в папку ресурсов

CameraView camera;
FirebaseModelInterpreter interpreter;
FirebaseModelInputOutputOptions inputOutputOptions;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    camera = findViewById(R.id.camera);
    camera.setLifecycleOwner(this);
    Button start = findViewById(R.id.startCamera);
    start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startCamera();
        }
    });
    Button stop = findViewById(R.id.stopCamera);
    stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            stopCamera();
        }
    });
}
private void startCamera(){
    camera.addFrameProcessor(new FrameProcessor() {
        @Override
        public void process(@NonNull Frame frame) {
            long time = frame.getTime();
            Size size = frame.getSize();
            int format = frame.getFormat();
            int userRotation = frame.getRotationToUser();
            int viewRotation = frame.getRotationToView();
            if (frame.getDataClass() == byte[].class) {
                Log.v("Frame",""+frame.getData());
                byte[] data = frame.getData();
                Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
                if(bmp==null) {
                    Log.v("Null check ", "null bitmap");
                }
                loadModel(bmp);
            } else if (frame.getDataClass() == Image.class) {
                Image data = frame.getData();
                // Process android.media.Image...
            }
        }
    });
}

private void stopCamera(){
    camera.removeFrameProcessor(new FrameProcessor() {
        @Override
        public void process(@NonNull Frame frame) {

        }
    });
}

@Override
protected void onResume() {
    super.onResume();
    camera.open();
}

@Override
protected void onPause() {
    super.onPause();
    camera.close();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    camera.destroy();
}

private void loadModel(Bitmap bitmap) {

    FirebaseCustomLocalModel localModel = new FirebaseCustomLocalModel.Builder()
            .setAssetFilePath("model2.tflite")
            .build();


    try {
        FirebaseModelInterpreterOptions options =
                new FirebaseModelInterpreterOptions.Builder(localModel).build();
        interpreter = FirebaseModelInterpreter.getInstance(options);
    } catch (FirebaseMLException e) {
        Log.v("Firebase Exception", "" + e.getMessage());
    }
    try {
        inputOutputOptions =
                new FirebaseModelInputOutputOptions.Builder()
                        .setInputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 200, 200, 3})
                        .setOutputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 29})
                        .build();
    } catch (FirebaseMLException e) {
        e.printStackTrace();
    }
    int batchNum = 0;
    float[][][][] input = new float[1][200][200][3];
    for (int x = 0; x < 200; x++) {
        for (int y = 0; y < 200; y++) {
            int pixel = bitmap.getPixel(x, y);

            input[batchNum][x][y][0] = (Color.red(pixel) - 127) / 128.0f;
            input[batchNum][x][y][1] = (Color.green(pixel) - 127) / 128.0f;
            input[batchNum][x][y][2] = (Color.blue(pixel) - 127) / 128.0f;
        }
    }
    inputImage(input);

}

private void inputImage(float[][][][] input) {
    FirebaseModelInputs inputs = null;
    try {
        inputs = new FirebaseModelInputs.Builder()
                .add(input)  // add() as many input arrays as your model requires
                .build();
        interpreter.run(inputs, inputOutputOptions)
                .addOnSuccessListener(
                        new OnSuccessListener<FirebaseModelOutputs>() {
                            @Override
                            public void onSuccess(FirebaseModelOutputs result) {
                                float[][] output = result.getOutput(0);
                                float[] probabilities = output[0];
                                Log.v("outputs"," "+ Arrays.toString(output[0]));
                                try{
                                    BufferedReader reader = new BufferedReader(
                                            new InputStreamReader(getAssets().open("labels.txt")));
                                    for (float probability : probabilities) {
                                        String label = reader.readLine();

                                        Log.i("MLKit", String.format("%s: %1.4f", label, probability));
                                    }
                                }catch(IOException e){
                                    e.printStackTrace();
                                }
                            }
                        })
                .addOnFailureListener(
                        new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                // Task failed with an exception
                                // ...
                                Log.v("Result", "" + e.getMessage());
                            }
                        });
    } catch (FirebaseMLException e) {
        e.printStackTrace();
    }

}
...