typescript - 如何从 firebase 存储中使用 tf.loadModel 加载模型?

标签 typescript ionic-framework firebase-storage tensorflow.js tensorflowjs-converter

我正在 ionic3 框架中开发一个用于识别绘制字符的应用程序,但我在导入模型时遇到了问题。我已将模型从 Keras(使用 tensorflowjs_converter 转换)以两种不同的方式导入到我的 ionic3 应用程序中:

  1. model.json 和权重文件(分片)放在文件夹 /assets/models 中。
  2. model.json 和权重文件(分片)托管在 firebase 存储中。

当使用第一种方法在浏览器中启动应用程序时,模型和权重已正确加载,我能够预测类别。但是当启动应用程序时,在我的 Android 设备中使用相同的方法 ionic cordova run android --device,模型似乎没有从权重文件中检索数据,因为它给出了以下错误:

根据提供的形状 [3, 3, 32, 64],张量应该有 18432 个值,但有 917 个值

现在,我尝试将文件托管在 firebase 存储中以尝试解决此问题。我从存储中检索了 model.json,但我仍然得到与上述相同的错误在浏览器和设备中

根据在应用程序中本地存储分片和模型的经验,我得出的结论是分片在设备中无法被两种方式识别。

此外,在设备中使用 firebase 存储方法时,当尝试从 url 获取模型时,我发现了以下错误:Failed to fetch

这是检索分片和模型的代码:

const modelURL: string = await this.db.getModel();
const shards: string[] = await this.db.getShards();

modelURLshards 包含来自 firebase 存储的下载 url。模型和分片保持在同一层级:

/* Firebase Storage hierarchy */

https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fmodel.json?alt=media&token=******
https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard1of4?alt=media&token=******
https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard2of4?alt=media&token=******
https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard3of4?alt=media&token=******
https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard4of4?alt=media&token=******

因此,我将模型的下载 url 传递到 tf.loadModel:

import * as tf from '@tensorflow/tfjs';    

await tf.loadModel(modelURL).then(model => {
    const output: any = model.predict(img);
});

那么,有没有什么方法可以将分片传递到 tf.loadModel(),从 firebase 存储中获取,这样我就可以在我的设备和浏览器中检索所需的所有数据,以便从模型预测?

感谢您的帮助。

最佳答案

tf.loadModel() 调用的 http 加载程序假定 model.json 和相应的权重文件(group1-shard1of1,...)共享相同的 url 路径前缀。例如: 给定的模型文件位于: https://foo.bar/path/model.json 加载程序尝试在以下位置检索权重文件: https://foo.bar/path/group1-shard1of1 , ...

你的情况 const modelURL: string = await this.db.getModel(); 常量分片:string[] = await this.db.getShards();

如果 modelUrl 和分片不共享相同的路径,您可能需要创建自己的 BrowserHttp IOHandler加载: const model = await tf.loadModel(new MyOwnHttpIOLoader(modelUrl, shards));

如果是这样,您可以通过手动编辑 model.json 文件来对齐它们。在model.json文件中,有一个权重文件路径数组。

对于 firebase 存储,问题是模型文件的 url 是:https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fmodel.json 有路径 firebasestorage.googleapis.com/v0/b/project-foo.com/o 加载程序将使用该路径并尝试加载位于 firebasestorage.googleapis.com/v0/b/project-foo.com/o/group1-shard1of4 的权重文件。但它与您的权重网址 firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard1of4 不匹配,它缺少 model%2F 前缀。

为了使加载器工作,您可以手动更新 model.json 以添加前缀。 在文件中搜索“weightsManifest”,将“paths”数组编辑为类似于 ["model%2Fgroup1-shard1of4", ...]

关于typescript - 如何从 firebase 存储中使用 tf.loadModel 加载模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54159886/

相关文章:

javascript - Dragula 和 Angular 5 - 通过删除来更新对象位置值

angular - 无法读取未定义的属性 'healthCarePlans' (angular5)

android - ionic 3 native : File : {code: 5, 消息: "ENCODING_ERR"}

android - 动态卡片 View 与 Firebase 相结合

android - 使用 kotlin for android 应用程序将 pdf 文件上传到 firebase 存储

javascript - 如何使用原型(prototype)更新粗箭头函数?

TypeScript - 为什么要使用打字?

android - Ionic-在 Android 中从相机或画廊上传图片

ios - Ionic2页脚工具栏文本在IOS上不占全宽

ios - 以正确的方式上传/下载多张图片?