Я пытаюсь преобразовать данные кадра в растровое изображение и отправить его интерпретатору 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();
}
}