【问题标题】:how to load a tflite model in Java using AssetManager and Play Asset Delivery?如何使用 AssetManager 和 Play Asset Delivery 在 Java 中加载 tflite 模型?
【发布时间】:2021-05-04 10:01:25
【问题描述】:

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

我遵循了here: 中提到的指南,并能够构建我的.aab 文件。我已将我的助理添加为install-time,因此我不必检查它的可用性,它应该与应用程序一起安装。

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

我可以完美地从 assets 文件夹中加载模型:

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,正如 here 所解释的那样。

所以我重写了上面的函数使用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 模型?

【问题讨论】:

    标签: java android assets tensorflow-lite android-assetmanager


    【解决方案1】:

    所以事实证明我上面的函数是使用AssetManager加载tflite模型的正确方法。

    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 时,install-time 资产只有在从 Play 商店下载的播放包中安装 后才能使用。 p>

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

    【讨论】:

      猜你喜欢
      • 2021-12-16
      • 2018-10-30
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2022-07-11
      • 2021-10-06
      • 1970-01-01
      相关资源
      最近更新 更多