我使用.tflite
保存在Firebase服务器中的自定义模型(https://firebase.google.com/docs/ml-kit/android/use-custom-models)。这是我自定义的超分辨率图像GAN生成器:我给它一个32x32的图像,它给了我超分辨率的128x128的图像。我正在尝试在我的Android应用中使用它。
我遵循了上面链接的文档。
引发以下异常:
I / System.out:com.google.firebase.ml.common.FirebaseMLException:执行Firebase ML任务时发生内部错误
根据Google Colab Python解释器,我的预期输入和输出如下:
[1 32 32 3]
类'numpy.float32'>
[1 128 128 3]
类'numpy.float32'>
因此,我必须给生成器模型一个32x32x3的图像,并且它必须输出一个128x128x3的图像,这里一切正常:)。这是SRGAN生成器的正常工作。
这是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();
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-执行Firebase ML任务时发生内部错误:但我的类型是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));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句