【问题标题】:Custom model [MLKit] - FirebaseMLException: Internal error has occured when executing Firebase ML tastks自定义模型 [MLKit] - FirebaseException:执行 Firebase ML 任务时发生内部错误
【发布时间】:2019-08-06 08:21:36
【问题描述】:

我想使用 MLKit 在 Android 中使用自定义 ML 模型,但使用本地或远程模型都不起作用。由于我有 FirebaseMLException,因此我将重点放在本地。

我已经尝试一步一步地跟随official documentation

我相信错误出在输入/输出格式中,但我不知道它是什么。有143 由整数标记的类。以下是我构建输入/输出的方式:

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()

在stacktrace下面找到洞:

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)

【问题讨论】:

  • 尝试将 inputFormat 和 outputFormat 都设为FirebaseModelDataType.FLOAT32
  • 是的,谢谢,这就是问题所在。问题是我一开始就是这样做的,但后来我将其更改为FirebaseModelDataType.INT32,然后将其设置回FirebaseModelDataType.FLOAT32,现在它可以工作了,不知道第一次问题出在哪里。

标签: android kotlin local firebase-mlkit


【解决方案1】:

我发现问题出在哪里,面对 MLKit 等待一组概率作为输出,这意味着 [0.0, 1.0] 范围内的一组 float 值。这意味着这个 sn-p(包含错误的行):

.setOutputFormat(
    0,
    FirebaseModelDataType.INT32, // Wrong line
    intArrayOf(1, 143)
)

应该换成这个:

.setOutputFormat(
    0,
    FirebaseModelDataType.FLOAT32, // <== Expected array type is a float
    intArrayOf(1, 143)
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2017-06-24
    • 2017-03-29
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多