繁体   English   中英

在javascript中从本地文件系统加载Tensorflow js模型

[英]Load Tensorflow js model from local file system in javascript

我已将 keras 模型转换为 tensorflow json 格式并将其保存在本地计算机中。 我正在尝试使用以下命令在 javascript 代码中加载该 json 模型

model = await tf.loadModel('web_model')

但是模型没有被加载。 有没有办法从本地文件系统加载 tensorflow json 模型?

我知道您正在尝试在浏览器中加载您的模型,但如果有人登陆这里并尝试在 Node 中执行此操作,方法如下:

const tf = require("@tensorflow/tfjs");
const tfn = require("@tensorflow/tfjs-node");
const handler = tfn.io.fileSystem("./path/to/your/model.json");
const model = await tf.loadLayersModel(handler);

LoadModel在后台使用fetch 并且 fetch 不能直接访问本地文件。 它旨在用于获取服务器提供的文件。 更多关于这个here 要使用浏览器加载本地文件,有两种方法,要求用户上传文件

<input type="file"/>

或由服务器提供文件。

在这两种情况下, tf.js提供了加载模型的方法。

  1. 通过要求用户上传文件来加载模型

html

<input type="file" id="upload-json"/>
<input type="file" id="upload-weights"/>

js

const uploadJSONInput = document.getElementById('upload-json');
const uploadWeightsInput = document.getElementById('upload-weights');
const model = await tfl.loadModel(tf.io.browserFiles(
 [uploadJSONInput.files[0], uploadWeightsInput.files[0]]));
  1. 使用服务器提供本地文件

为此,可以使用以下 npm 模块http-server来提供包含权重和模型的目录。 可以使用以下命令安装它:

 npm install http-server -g

在目录中,可以运行以下命令来启动服务器:

http-server -c1 --cors .

现在可以加载模型:

 // load model in js script
 (async () => {
   ...
   const model = await tf.loadFrozenModel('http://localhost:8080/model.pb', 'http://localhost:8080/weights.json')
 })()
const tf = require('@tensorflow/tfjs');
const tfnode = require('@tensorflow/tfjs-node');

async function loadModel(){
    const handler = tfnode.io.fileSystem('tfjs_model/model.json');
    const model = await tf.loadLayersModel(handler);
    console.log("Model loaded")
}


loadModel();

这在节点中对我有用。 感谢jafaircl

如果您将 React 与create-react-app一起使用,则可以将保存的模型文件保存在public folder中。

例如,假设您想使用blazeface 模型 你会

  1. 从该网页下载 .tar.gz 模型

  2. 将模型解压到应用的公共目录中。 因此,现在您在公共子目录中拥有 .tar.gz 文件中的文件:

     %YOUR_APP%/public/blazeface_1_default_1/model.json %YOUR_APP%/public/blazeface_1_default_1/group1-shard1of1.bin
  3. 使用在你的 React 应用程序中加载模型

    tf.loadGraphModel(process.env.PUBLIC_URL + 'blazeface_1_default_1/model.json'

你可以试试:

const model = await tf.models.modelFromJSON(myModelJSON)

这里是 tensorflow.org 文档

查看我们的加载模型文档: https ://js.tensorflow.org/api/latest/#Models-Loading

您可以使用tf.loadModel获取一个字符串,该字符串是您的模型定义的 URL,需要通过 HTTP 提供服务。 这意味着您需要启动一个 http-server 来提供这些文件(由于 CORS,它不允许您向文件系统发出请求)。

这个包可以为你做到这一点: npmjs.com/package/http-server

您可以使用不安全的 chrome 实例:

C:\Program Files (x86)\Google\Chrome\Application>chrome.exe --disable-web-security --disable-gpu --user-data-dir=C:/Temp

比你可以添加这个脚本来重新定义 fetch 函数

async function fetch(url) {
  return new Promise(function(resolve, reject) {
    var xhr = new XMLHttpRequest
    xhr.onload = function() {
      resolve(new Response(xhr.responseText, {status: 200}))
    }
    xhr.onerror = function() {
      reject(new TypeError('Local request failed'))
    }
    xhr.open('GET', url)
    xhr.send(null)
  })
}

之后请确保您使用正确的模型加载器我对加载器问题的评论

但是您的权重将不正确-据我所知,存在一些编码问题。

如果您尝试在服务器端加载它,请使用@tensorflow/tfjs-node而不是@tensorflow/tfjs并更新到0.2.1或更高版本来解决此问题。

我正在使用 React js 加载模型(用于图像分类和更多机器学习的东西)

Tensorflow.js 不支持 Api 读取先前训练的模型

    const file= new Blob()
    file.src=modelJSON
    const files= new Blob()
    files.src=modelWeights
    console.log(files)
    const model= await tf.loadLayersModel(tf.io.browserFiles([file, files]));

[![在此处输入图像描述][1]][1]

如果您使用 Web 应用程序(对于 tensorflow.lite,您可以使用 opencv.readTensorflowmodel(model.pb, weight. pbtxt)

参考: 如何使用 tf.loadLayersModel() 从 express 中加载 tensorflow-js 权重?

     const classifierModel = await tf.loadLayersModel(            
            "https://rp5u7.sse.codesandbox.io/api/pokeml/classify"
        ); 
        const im = new Image()
            im.src =imagenSample//'../../../../../Models/ShapesClassification/Samples/images (2).png';
        const abc= this.preprocessImage(im);
const preds = await classifierModel.predict(abc)//.argMax(-1);
            console.log('<Response>',preds,'Principal',preds.shape[0],'DATA',preds.dataSync())
            const responde=[...preds.dataSync()]
            console.log('Maxmimo Valor',Math.max.apply(Math, responde.map(function(o) { return o; })))
            let indiceMax = this.indexOfMax(responde)
            console.log(indiceMax)
            console.log('<<<LABEL>>>',this.labelsReturn(indiceMax))

如果你使用 Django,你应该:

  1. 在您的应用程序中创建一个静态目录并将您的模型放在那里。

  2. 将该静态目录加载到要使用模型的模板中:

     var modelPath = "{% static 'sampleModel.json' %}">

不要忘记加载tensorflow.js库:

<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
  1. 现在您可以加载模型:

     <script>model = await tf.loadGraphModel(modelPath)</script>

我找到了一个可行的解决方案。 您可以在 xampp 上将 url 替换为 localhost url,例如 (directory = model) http://localhost/model/model.json ,然后您必须禁用浏览器 CORS 策略。 对我来说,我为我的特定选项卡找到了一个镀铬扩展并删除了 cors,它起作用了。

晚点再谢我!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM