Firebase ML 套件:"Internal Error" 异常,但输入良好且配置良好
Firebase ML Kit : "Internal Error" Exception, but good input & good configuration
总结
- 上下文
- 问题
- 正在尝试解决问题
- 问题
- 相关问题
上下文
我使用保存在 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();
}
});
问题
抛出的异常范围很广。输入似乎不错。我的客户端的配置也是如此。有什么问题吗?我完全不知道。
相关问题
Android MLKit - Internal error has occurred when executing Firebase ML tasks : 但我的类型是 FLOAT32,正如我配置的那样:这个配置错误与我无关
另一个 SO 问题,答案是检查输入形状,但我的正确是 32x32x3。
通过更改几行解决了问题...愚蠢的错误!这里的关键是考虑第一个维度,它只包含一个值(第一个“1”)。仅 1 个值,因为我只发送(和接收)1 张图像。
1.
.setInputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 32, 32, 3})
.setOutputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 128, 128, 3})
float[][][][] pixels = new float[1][bitmapResized.getWidth()][bitmapResized.getHeight()][3];
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));
总结
- 上下文
- 问题
- 正在尝试解决问题
- 问题
- 相关问题
上下文
我使用保存在 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();
}
});
问题
抛出的异常范围很广。输入似乎不错。我的客户端的配置也是如此。有什么问题吗?我完全不知道。
相关问题
Android MLKit - Internal error has occurred when executing Firebase ML tasks : 但我的类型是 FLOAT32,正如我配置的那样:这个配置错误与我无关
另一个 SO 问题,答案是检查输入形状,但我的正确是 32x32x3。
通过更改几行解决了问题...愚蠢的错误!这里的关键是考虑第一个维度,它只包含一个值(第一个“1”)。仅 1 个值,因为我只发送(和接收)1 张图像。
1.
.setInputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 32, 32, 3})
.setOutputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 128, 128, 3})
float[][][][] pixels = new float[1][bitmapResized.getWidth()][bitmapResized.getHeight()][3];
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));