自定义模型 [MLKit] - Firebase MException:执行 Firebase ML 任务时发生内部错误
Custom model [MLKit] - FirebaseMLException: Internal error has occured when executing Firebase ML tastks
我想使用 MLKit 在 Android 中使用自定义 ML 模型,但无论是使用本地模型还是远程模型都不起作用。因为我有一个 FirebaseMLException,所以我在这里专注于本地的。
我试着一步一步地遵循 official documentation。
我认为错误是在 input/output 格式中,但我不知道它是什么。用整数标记 143
类。这是我构建 input/output 的方式:
inputOutputOptions = FirebaseModelInputOutputOptions.Builder()
.setInputFormat(
0,
FirebaseModelDataType.FLOAT32,
intArrayOf(
DIM_BATCH_SIZE,
DIM_IMG_SIZE_X,
DIM_IMG_SIZE_Y,
DIM_PIXEL_SIZE
)
)
.setOutputFormat(
0,
FirebaseModelDataType.INT32,
intArrayOf(1, 143)
)
.build()
在漏洞堆栈跟踪下方找到:
W/System.err: com.google.firebase.ml.common.FirebaseMLException: Internal error has occurred when executing Firebase ML tasks
W/System.err: at com.google.firebase.ml.common.internal.zze.zza(com.google.firebase:firebase-ml-common@@20.0.1:38)
at com.google.firebase.ml.common.internal.zzh.run(Unknown Source:4)
W/System.err: at android.os.Handler.handleCallback(Handler.java:873)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
at com.google.android.gms.internal.firebase_ml.zzf.dispatchMessage(com.google.firebase:firebase-ml-common@@20.0.1:6)
W/System.err: at android.os.Looper.loop(Looper.java:193)
at android.os.HandlerThread.run(HandlerThread.java:65)
W/System.err: Caused by: java.lang.IllegalArgumentException: Cannot convert between a TensorFlowLite tensor with type FLOAT32 and a Java object of type [[I (which is compatible with the TensorFlowLite type INT32).
W/System.err: at org.tensorflow.lite.Tensor.throwExceptionIfTypeIsIncompatible(Tensor.java:233)
W/System.err: at org.tensorflow.lite.Tensor.copyTo(Tensor.java:116)
at org.tensorflow.lite.NativeInterpreterWrapper.run(NativeInterpreterWrapper.java:157)
W/System.err: at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:250)
at com.google.android.gms.internal.firebase_ml.zzpz.runForMultipleInputsOutputs(com.google.firebase:firebase-ml-model-interpreter@@20.0.1:4)
W/System.err: at com.google.android.gms.internal.firebase_ml.zzpu.zza(com.google.firebase:firebase-ml-model-interpreter@@20.0.1:85)
W/System.err: at com.google.android.gms.internal.firebase_ml.zzpu.zza(com.google.firebase:firebase-ml-model-interpreter@@20.0.1:145)
at com.google.firebase.ml.common.internal.zzi.zza(com.google.firebase:firebase-ml-common@@20.0.1:33)
at com.google.firebase.ml.common.internal.zzk.call(Unknown Source:8)
W/System.err: at com.google.firebase.ml.common.internal.zze.zza(com.google.firebase:firebase-ml-common@@20.0.1:32)
... 6 more
我不知道如何解释这一行:
Cannot convert between a TensorFlowLite tensor with type FLOAT32 and a Java object of type [[I (which is compatible with the TensorFlowLite type INT32)
我发现问题出在哪里,面对 MLKit 等待概率数组作为输出,这意味着 [0.0, 1.0]
范围内的一组 float
值。这意味着这个片段(包含错误行):
.setOutputFormat(
0,
FirebaseModelDataType.INT32, // Wrong line
intArrayOf(1, 143)
)
应该换成这个:
.setOutputFormat(
0,
FirebaseModelDataType.FLOAT32, // <== Expected array type is a float
intArrayOf(1, 143)
)
我想使用 MLKit 在 Android 中使用自定义 ML 模型,但无论是使用本地模型还是远程模型都不起作用。因为我有一个 FirebaseMLException,所以我在这里专注于本地的。
我试着一步一步地遵循 official documentation。
我认为错误是在 input/output 格式中,但我不知道它是什么。用整数标记 143
类。这是我构建 input/output 的方式:
inputOutputOptions = FirebaseModelInputOutputOptions.Builder()
.setInputFormat(
0,
FirebaseModelDataType.FLOAT32,
intArrayOf(
DIM_BATCH_SIZE,
DIM_IMG_SIZE_X,
DIM_IMG_SIZE_Y,
DIM_PIXEL_SIZE
)
)
.setOutputFormat(
0,
FirebaseModelDataType.INT32,
intArrayOf(1, 143)
)
.build()
在漏洞堆栈跟踪下方找到:
W/System.err: com.google.firebase.ml.common.FirebaseMLException: Internal error has occurred when executing Firebase ML tasks
W/System.err: at com.google.firebase.ml.common.internal.zze.zza(com.google.firebase:firebase-ml-common@@20.0.1:38)
at com.google.firebase.ml.common.internal.zzh.run(Unknown Source:4)
W/System.err: at android.os.Handler.handleCallback(Handler.java:873)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
at com.google.android.gms.internal.firebase_ml.zzf.dispatchMessage(com.google.firebase:firebase-ml-common@@20.0.1:6)
W/System.err: at android.os.Looper.loop(Looper.java:193)
at android.os.HandlerThread.run(HandlerThread.java:65)
W/System.err: Caused by: java.lang.IllegalArgumentException: Cannot convert between a TensorFlowLite tensor with type FLOAT32 and a Java object of type [[I (which is compatible with the TensorFlowLite type INT32).
W/System.err: at org.tensorflow.lite.Tensor.throwExceptionIfTypeIsIncompatible(Tensor.java:233)
W/System.err: at org.tensorflow.lite.Tensor.copyTo(Tensor.java:116)
at org.tensorflow.lite.NativeInterpreterWrapper.run(NativeInterpreterWrapper.java:157)
W/System.err: at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:250)
at com.google.android.gms.internal.firebase_ml.zzpz.runForMultipleInputsOutputs(com.google.firebase:firebase-ml-model-interpreter@@20.0.1:4)
W/System.err: at com.google.android.gms.internal.firebase_ml.zzpu.zza(com.google.firebase:firebase-ml-model-interpreter@@20.0.1:85)
W/System.err: at com.google.android.gms.internal.firebase_ml.zzpu.zza(com.google.firebase:firebase-ml-model-interpreter@@20.0.1:145)
at com.google.firebase.ml.common.internal.zzi.zza(com.google.firebase:firebase-ml-common@@20.0.1:33)
at com.google.firebase.ml.common.internal.zzk.call(Unknown Source:8)
W/System.err: at com.google.firebase.ml.common.internal.zze.zza(com.google.firebase:firebase-ml-common@@20.0.1:32)
... 6 more
我不知道如何解释这一行:
Cannot convert between a TensorFlowLite tensor with type FLOAT32 and a Java object of type [[I (which is compatible with the TensorFlowLite type INT32)
我发现问题出在哪里,面对 MLKit 等待概率数组作为输出,这意味着 [0.0, 1.0]
范围内的一组 float
值。这意味着这个片段(包含错误行):
.setOutputFormat(
0,
FirebaseModelDataType.INT32, // Wrong line
intArrayOf(1, 143)
)
应该换成这个:
.setOutputFormat(
0,
FirebaseModelDataType.FLOAT32, // <== Expected array type is a float
intArrayOf(1, 143)
)