Firebase ML 套件:"Internal Error" 异常,但输入良好且配置良好

Firebase ML Kit : "Internal Error" Exception, but good input & good configuration

总结

  1. 上下文
  2. 问题
  3. 正在尝试解决问题
  4. 问题
  5. 相关问题

上下文

我使用保存在 Firebase 服务器 (https://firebase.google.com/docs/ml-kit/android/use-custom-models) 中的自定义 .tflite 模型。这是我自定义的超分辨率图像 GAN 生成器:我给它一个 32x32 的图像,它给了我超分辨率的 128x128 图像。我正在尝试在我的 Android 应用程序中使用它。

我遵循了我在上面给出 link 的文档。

问题

抛出以下异常:

I/System.out: com.google.firebase.ml.common.FirebaseMLException: Internal error has occurred when executing Firebase ML tasks

正在尝试解决问题

分析预期的输入和输出形状

根据 Google Colab Python 解释器,我预期的输入和输出如下:

[ 1 32 32 3]

class 'numpy.float32'>

[ 1 128 128 3]

class 'numpy.float32'>

所以我必须给我的生成器模型一个 32x32x3 的图像,它必须输出一个 128x128x3 的图像,这里一切正常:)。这是一个SRGAN生成器的正常工作。

正在分析 Android 应用程序来源

这是 Android 应用程序源代码...它包括我的生成器模型的配置和推理 运行。还显示了要发送的数据。

配置机器学习套件客户端

FirebaseModelDownloadConditions.Builder conditionsBuilder =
        new FirebaseModelDownloadConditions.Builder().requireWifi();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    // Enable advanced conditions on Android Nougat and newer.
    conditionsBuilder = conditionsBuilder
            .requireCharging();
}
FirebaseModelDownloadConditions conditions = conditionsBuilder.build();

cloudSource = new FirebaseRemoteModel.Builder("srgan")
        .enableModelUpdates(true)
        .setInitialDownloadConditions(conditions)
        .setUpdatesDownloadConditions(conditions)
        .build();
FirebaseModelManager.getInstance().registerRemoteModel(cloudSource);

FirebaseModelOptions options = new FirebaseModelOptions.Builder()
        .setRemoteModelName("srgan")
        .build();
FirebaseModelInterpreter firebaseInterpreter =
        FirebaseModelInterpreter.getInstance(options);

FirebaseModelInputOutputOptions inputOutputOptions =
        new FirebaseModelInputOutputOptions.Builder()
                .setInputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{32, 32, 3})
                .setOutputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{128, 128, 3})
                .build();

定义作为输入发送的数据,像素的 32x32x3 张量(定义 byte[][][] pixels

Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.parse("file://" + selected_image_uri));
Bitmap bitmapResized = Bitmap.createScaledBitmap(bitmap, 32, 32, false);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmapResized.compress(Bitmap.CompressFormat.PNG, 100, stream);
float[][][] pixels = new float[bitmapResized.getWidth()][bitmapResized.getHeight()][3];
for(int i = 0; i < bitmapResized.getWidth(); i++) {
    for(int j = 0; j < bitmapResized.getHeight(); j++) {
        pixels[i][j][0] = Color.red(bitmapResized.getPixel(i,j));
        pixels[i][j][1] = Color.green(bitmapResized.getPixel(i,j));
        pixels[i][j][2] = Color.blue(bitmapResized.getPixel(i,j));
    }
}

生成器模型的推断(使用之前定义的byte[][][] pixels

FirebaseModelInputs inputs = new FirebaseModelInputs.Builder()
        .add(pixels)
        .build();
firebaseInterpreter.run(inputs, inputOutputOptions)
        .addOnSuccessListener(
                new OnSuccessListener<FirebaseModelOutputs>() {
                    @Override
                    public void onSuccess(FirebaseModelOutputs result) {
                        SweetAlertDialog pDialog2 = new SweetAlertDialog(context, SweetAlertDialog.SUCCESS_TYPE);
                        pDialog2.setTitleText("GG!");
                        pDialog2.setContentText("Image treated!");
                        pDialog2.show();
                    }
                })
        .addOnFailureListener(
                new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        System.out.println(e);
                        SweetAlertDialog pDialog2 = new SweetAlertDialog(context, SweetAlertDialog.ERROR_TYPE);
                        pDialog2.setTitleText(context.getResources().getString(R.string.error_firebase_model_interpreter_running));
                        pDialog2.setContentText(context.getResources().getString(R.string.error_firebase_model_interpreter_running_contents));
                        pDialog2.show();
                    }
                });

问题

抛出的异常范围很广。输入似乎不错。我的客户端的配置也是如此。有什么问题吗?我完全不知道。

相关问题

通过更改几行解决了问题...愚蠢的错误!这里的关键是考虑第一个维度,它只包含一个值(第一个“1”)。仅 1 个值,因为我只发送(和接收)1 张图像。

1.

.setInputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 32, 32, 3})


.setOutputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 128, 128, 3})
  1. float[][][][] pixels = new float[1][bitmapResized.getWidth()][bitmapResized.getHeight()][3];

  2. pixels[0][i][j][0] = Color.red(bitmapResized.getPixel(i,j)); pixels[0][i][j][1] = Color.green(bitmapResized.getPixel(i,j)); pixels[0][i][j][2] = Color.blue(bitmapResized.getPixel(i,j));