Tensorflow Node-js, TypeError: поддерживаются только протоколы HTTP(S)
Я пытаюсь загрузить локальную модель tensorflowjs на свой сервер Node, но получаю сообщение об ошибке:
UnhandledPromiseRejectionWarning: TypeError: Only HTTP(S) protocols are supported.
Вот как я импортирую пакеты Tensorflowjs:
const tf = require('@tensorflow/tfjs');
require('@tensorflow/tfjs-node');
global.fetch = require('node-fetch')
и загружаем модель так:
const ssd_model_path =
'file://models/ssd_model/model.json'
this.model = await tf.loadLayersModel(ssd_model_path);
Мои зависимости следующие:
"dependencies": {
"@tensorflow/tfjs": "^1.5.2",
"@tensorflow/tfjs-core": "^1.2.11",
"@tensorflow/tfjs-node": "^1.2.3",
"electron-reload": "^1.5.0",
"esm": "^3.2.25",
"jimp": "^0.9.3",
"node-fetch": "^2.6.0"
}
2 ответа
Я думаю tfjs-node
для NodeJS, а tfjs
для веб-браузера. Вы не должны использовать оба одновременно, потому чтоtfjs-node
есть все как зависимости для NodeJS.
Если вы посмотрите на пример NodeJS, то увидите, что он не использует tfjs
https://github.com/tensorflow/tfjs-examples/tree/master/mnist-node
Не уверен, что это точно отвечает на ваш вопрос, но это может быть немного связано. Для нас проблема заключалась в том, что у нас была библиотека, скажем, LIB, которая вызывала файлы . Мы использовали LIB в БРАУЗЕРЕ (код браузера) и СЕРВЕРЕ (внутренний сервер). По сути, мы хотели использовать как tfjs, так и tfjs-node «одновременно», то есть мы хотели создать общую библиотеку для внешнего и внутреннего интерфейса, которая использовала бы tfjs.
Обратите внимание, что мы вызывали только
код в LIB только через браузер.
Чтобы сделать LIB --- более конкретно tfjs --- совместимым с БРАУЗЕРОМ и СЕРВЕРОМ , мы решили эту проблему, добавив следующий условный импорт:
// Only use tfjs-node env in node env
// Note, due to webpack? checks we
// put the string outside of the import
// to take advantage of lazy loading.
if (typeof window === 'undefined') {
const tfjsNode = '@tensorflow/tfjs-node'
await import(tfjsNode)
}
Это позволило нам иметь в LIB код загрузки слоев
this.model = await tf.loadLayersModel('file://modelsPath/model.json');
А затем вызовите его на СЕРВЕРЕ для загрузки из файловой системы.