Sus*_*Liu 3 java android tensorflow
我想知道是否可以从 Android 设备的内部存储而不是资产文件夹中存储和读取经过训练的 .tflite 模型?
下面是从资产文件夹加载模型的原始代码(有效)。
private MappedByteBuffer loadLocalModelFile() throws IOException {
AssetFileDescriptor fileDescriptor = getAssets().openFd(MODEL_PATH);
FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
long startOffset = fileDescriptor.getStartOffset();
long declaredLength = fileDescriptor.getDeclaredLength();
FileChannel fileChannel = inputStream.getChannel();
return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法从内部存储器加载模型,并且仍然获取 fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength) 的 startOffset 和 declaredLength ?如果没有,有没有办法在从内部存储读取原始二进制文件时计算新模型的 startOffset 及其声明的长度?
我尝试使用 AssetManager 中的 openNonAssetFd() 函数来获取位于内部存储中的文件的 AssetFileDescriptor。
private MappedByteBuffer loadOnlineModelFile() throws IOException {
FileInputStream inputStream = openFileInput(MODEL);
AssetManager manager = getAssets();
AssetFileDescriptor afd = manager.openNonAssetFd(getFilesDir() + "/graph.lite");
long startOffset = afd.getStartOffset();
long declaredLength = afd.getDeclaredLength();
FileChannel fileChannel = inputStream.getChannel();
return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
}
Run Code Online (Sandbox Code Playgroud)
但是,这将导致“java.lang.IllegalArgumentException:Model ByteBuffer 应该是模型文件的 MappedByteBuffer 或使用包含模型内容字节的 ByteOrder.nativeOrder() 的直接 ByteBuffer”和“java.io.FileNotFoundException”。
小智 5
嗯,我到处寻找,终于弄清楚了。这非常简单。
出于某种原因,我认为这AssetFileDescriptor与getStartOffset实际情况有关tflite model,但事实并非如此。我认为这getStartOffset给出了start应用程序资产中文件的要点。对于tflite model应该startOffset是0因为那是文件开始的地方,因为它只是一个文件。所以,代码应该是
File file = new File('path_to_model');
FileInputStream is = new FileInputStream(file);
return is.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2474 次 |
| 最近记录: |