【问题标题】:"Internal error: Unexpected failure when preparing tensor allocations" - Firebase MLKIT - Android - Local Model load failed“内部错误:准备张量分配时意外失败” - Firebase MLKIT - Android - 本地模型加载失败
【发布时间】:2020-05-14 11:21:42
【问题描述】:

我正在使用 Firebase MLKIT 在应用内本地实现“.tflite”模型。 model.tflite 文件大小约为 132 MB。 它显示了错误原因:

onFailure:java.lang.IllegalStateException:内部错误:准备张量分配时发生意外失败:此解释器不支持常规 TensorFlow 操作。确保在推理之前调用 Flex 委托。节点号 17 (Flex) 未能准备好。

和错误信息:

本地模型加载失败,模型选项:本地模型路径:model.tflite。远程模型名称:未指定。

该模型被用于将一张普通图像转换为黑白图像[出于某种目的]。

我也列出了依赖项,

  • 实施 'com.google.firebase:firebase-ml-model-interpreter:22.0.3'
  • 实现 'org.tensorflow:tensorflow-lite:1.13.1'

我也访问了该链接,但无法理解在我的情况下如何处理此问题:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/java/src/test/java/org/tensorflow/lite/InterpreterFlexTest.java

我也附上代码 sn-p:

'''

FirebaseCustomLocalModel localModel = null;
                try {
                    localModel = new FirebaseCustomLocalModel.Builder()
                            .setAssetFilePath("model.tflite")
                            .build();
                } catch (Exception e) {

                    e.printStackTrace();
                    Log.d(TAG, "onClick: "+e);
                }
                FirebaseModelInterpreter interpreter;
                FirebaseModelInterpreterOptions options =
                        new FirebaseModelInterpreterOptions.Builder(localModel).build();
                try {

                    interpreter = FirebaseModelInterpreter.getInstance(options);

                    FirebaseModelInputOutputOptions inputOutputOptions =
                            new FirebaseModelInputOutputOptions.Builder()
                                    .setInputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 256, 256, 3})
                                    .setOutputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{420, 580})
                                    .build();
                    Bitmap bitmap = getYourInputImage();
                    bitmap = Bitmap.createScaledBitmap(bitmap, 256, 256, true);

                    int batchNum = 0;
                    float[][][][] input = new float[1][256][256][3];
                    for (int x = 0; x < 256; x++) {
                        for (int y = 0; y < 256; y++) {
                            int pixel = bitmap.getPixel(x, y);
                            // Normalize channel values to [-1.0, 1.0]. This requirement varies by
                            // model. For example, some models might require values to be normalized
                            // to the range [0.0, 1.0] instead.
                            input[batchNum][x][y][0] = (Color.red(pixel) - 127) / 128.0f;
                            input[batchNum][x][y][1] = (Color.green(pixel) - 127) / 128.0f;
                            input[batchNum][x][y][2] = (Color.blue(pixel) - 127) / 128.0f;
                        }
                    }
                    FirebaseModelInputs inputs = new FirebaseModelInputs.Builder()
                            .add(input)  // add() as many input arrays as your model requires
                            .build();
                   // Log.d(TAG, "onClick: "+inputs.toString()+"\n"+inputOutputOptions.toString());
                    interpreter.run(inputs, inputOutputOptions)
                            .addOnSuccessListener(
                                    new OnSuccessListener<FirebaseModelOutputs>() {
                                        @Override
                                        public void onSuccess(FirebaseModelOutputs result) {
                                            // ...
                                            float[][] output = result.getOutput(0);
                                            float[] probabilities = output[0];
                                            Log.d(TAG, "onSuccess: "+result.getOutput(0).toString());
                                        }
                                    })
                            .addOnFailureListener(
                                    new OnFailureListener() {
                                        @Override
                                        public void onFailure(@NonNull Exception e) {
                                            // Task failed with an exception
                                            // ...
                                            Log.d(TAG, "onFailure: "+e.getCause()+"\n\n"+e.getLocalizedMessage()+"\n\n"+e.getMessage());
                                        }
                                    });

                } catch (FirebaseMLException e) {
                    Log.d(TAG, "onClick: "+e);
                    // ...
                }

'''

让我知道需要做什么。

【问题讨论】:

    标签: java android firebase firebase-mlkit google-mlkit


    【解决方案1】:

    FirebaseModelInterpreter 不支持 Flex 操作。您应该直接使用 tflite 解释器 (org.tensorflow.Interpreter)。

    使用 FirebaseModelManager 下载 tflite 文件:

        Task<File> fileTask = FirebaseModelManager.getInstance()
                  .getLatestModelFile(remoteModel);
        File modelFile = fileTask.getResult();
    

    将 flex 的 aar 依赖项与 Firebase 依赖项一起添加到您的 build.gradle 中: https://www.tensorflow.org/lite/guide/ops_select#android_aar

    从那时起,您可以按照https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/java/src/test/java/org/tensorflow/lite/InterpreterFlexTest.java 中的要点的一般路径进行操作

        FlexDelegate delegate = new FlexDelegate();
        Interpreter.Options options = new Interpreter.Options().addDelegate(delegate);
        Interpreter interpreter = new Interpreter(fileBuffer, options);
        interpreter.run(inputs, outputs)
    

    希望有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 2011-12-12
      相关资源
      最近更新 更多