当前位置: 首页 > 知识库问答 >
问题:

“内部错误:准备张量分配时意外失败”-Firebase MLKIT-Android-本地模型加载失败

孔梓
2023-03-14

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

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

和错误消息:

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

该模型用于[出于某种目的]将一幅正常图像转换为黑白图像。

我也列出了依赖项,

  • 实现“com.google.firebase:firebase ml模型解释器:22.0.3”
  • 实现“组织tensorflow:tensorflow lite:1.13.1”

我也访问了链接,但无法理解如何处理我的案例中的这个问题:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/java/src/test/java/org/tensorflow/lite/InterpreterFlexTest.java

我也附上了代码片段:

“”

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);
                    // ...
                }

“”

让我知道需要做什么。

共有1个答案

长孙星汉
2023-03-14

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

使用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)

希望那有帮助

 类似资料:
  • 我正在使用tflite进行语义分割。我有一个经过训练的模型,可以从背景中分割对象,这个模型是在深度实验室上训练的。 我已经使用下面的代码将这个模型(冻结的推理图)转换为tflite格式: 模型在Android上加载,但是当我尝试运行推理时,它会给我这个错误: 原因:java.lang.IllegalStateException:内部错误:准备张量分配时出现意外失败:third_party/tens

  • 问题内容: 我已经使用python 3.6在Windows机器上安装了opencv,没有任何问题,使用: 但是当我尝试导入cv2时,出现以下错误 我看过这篇文章 它说cv2不适用于python 3我在想这是否已修复或是否有解决方法 问题答案: 您可以从此非官方站点上在Windows 32位或64位计算机上下载最新的适用于Python 3.6的OpenCV 3.2.0,查找以开头的文件。然后键入以下

  • 亲爱的开发人员和NN爱好者,我已经量化了一个模型(8位训练后量化),我正在尝试使用tflite Interpter对得到的模型进行推理。 在某些情况下,解释器运行正常,我可以按预期对量化模型进行推理,输出与原始模型足够接近。因此,我的设置似乎是正确的。然而,根据具体的量化模型,我经常遇到以下运行时错误。 由于误差似乎与偏差的比例有关,我使用偏差正则化器重新训练了原始模型。但是,错误仍然存在。 你对

  • 大家好。有人能帮帮我吗?我只是创建react应用程序,然后我立即启动它。然后我得到了类似这样的错误。我不知道出了什么问题 编译失败。./src/index.js 1:68模块解析失败:使用以下加载程序处理了意外的令牌(1:68)文件: null

  • 问题内容: 节点版本为 崩溃期间的内存使用情况未超出 产生此错误的代码: 要检查是否存在递归堆栈大小问题,我使用–stack-size = 60000参数运行了下一个代码 并得到了 然后,我运行了导致严重错误的代码:CALL_AND_RETRY_LAST分配失败-使用相同的–stack-size = 60000参数处理内存不足,并且没有得到。 因此,我得出结论与递归堆栈大小没有共同之处。 我该如何