0

我有一个.tflite大小超过 200MB 的模型文件。由于它增加了 150MB 的 apk 最大大小,我不得不使用 Play Asset Delivery (PAD) 将其捆绑在应用程序包中。

我按照此处提到的指南进行操作:并且能够构建我的.aab文件。我已将我的助理添加为install-time,所以我不必检查它的可用性,它应该与应用程序一起安装。

但似乎无法访问我的tflite文件。

我可以使用以下方法完美地从资产文件夹中加载模型:

private MappedByteBuffer loadModelFile() throws Exception {
        AssetFileDescriptor fileDescriptor = this.getAssets().openFd("model.tflite");
        FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
        FileChannel fileChannel = inputStream.getChannel();
        long startOffset = fileDescriptor.getStartOffset();
        long declaredLength = fileDescriptor.getDeclaredLength();
        return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
    }

但这不适用于 PAD,因为我们需要使用AssetManager,如此所述。

所以我重写了上面的函数来使用AssetManager

Context context = createPackageContext("com.companyname.packagename", 0);
            AssetManager assetManager = context.getAssets();

private MappedByteBuffer loadModelFile(AssetManager assetManager, String modelPath) throws IOException {
        AssetFileDescriptor fileDescriptor = assetManager.openFd("model.tflite");
        FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
        FileChannel fileChannel = inputStream.getChannel();
        long startOffset = fileDescriptor.getStartOffset();
        long declaredLength = fileDescriptor.getDeclaredLength();
        return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
    }

但它似乎没有加载模型。在interpreter.run()方法上,我收到错误:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void org.tensorflow.lite.Interpreter.run(java.lang.Object, java.lang.Object)”

这表明模型未加载。

在这种情况下模型的路径是否不同?我将如何加载 tflite 模型?

4

1 回答 1

0

所以事实证明我上面的功能是使用AssetManager.

Context context = createPackageContext("com.companyname.packagename", 0);
            AssetManager assetManager = context.getAssets();

private MappedByteBuffer loadModelFile(AssetManager assetManager, String modelPath) throws IOException {
        AssetFileDescriptor fileDescriptor = assetManager.openFd("model.tflite");
        FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
        FileChannel fileChannel = inputStream.getChannel();
        long startOffset = fileDescriptor.getStartOffset();
        long declaredLength = fileDescriptor.getDeclaredLength();
        return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
    }

它没有加载模型的原因是因为在使用 Play Asset Delivery 时,资产只有在Play 商店下载的 play bundleinstall-time安装后才能使用。

由于install-time资产就像普通资产一样,资产的位置保持不变。

于 2021-02-03T23:35:14.723 回答