Node.js加载本地TensorFlow.js模型报错:仅支持HTTP(S)协议
解决Node环境加载本地TensorFlow.js模型时的
Only HTTP(S) protocols are supported报错 为啥会出这个错?
你这问题本质上是两个原因:一是你用了file://协议的路径,但你引入的node-fetch本身不支持file协议;二是你没充分利用@tensorflow/tfjs-node的能力——其实它内置了专门给Node环境用的本地文件读取逻辑,根本不需要额外靠node-fetch来加载本地模型。
一步步修复
先把导入逻辑理清楚
@tensorflow/tfjs-node已经包含了tfjs的全部核心功能,完全没必要单独导入@tensorflow/tfjs,重复导入反而容易搞出环境冲突。改完的导入代码应该是这样:const tf = require('@tensorflow/tfjs-node'); // 删掉单独导入@tensorflow/tfjs和node-fetch的代码(本地加载用不上)用绝对路径加载模型才靠谱
别用相对的file://models/...这种路径,Node环境下用相对路径很容易出问题。我们可以用Node自带的path模块生成绝对路径,再转成file://格式给tfjs-node用:const path = require('path'); // 生成model.json的绝对路径,__dirname是当前脚本所在的目录 const modelJsonAbsolutePath = path.resolve(__dirname, 'models/ssd_model/model.json'); // 转成tfjs-node能识别的file://格式 const ssd_model_path = `file://${modelJsonAbsolutePath}`; // 加载模型 this.model = await tf.loadLayersModel(ssd_model_path);要是你用的tfjs-node版本稍新一点,甚至可以直接传绝对路径字符串(不用手动拼file://),不过保险起见还是加上更稳妥。
老版本的特殊处理
你的依赖版本有点老(tfjs-node 1.2.3是好几年前的版本了),如果上面的方法不好使,试试用Node专属的加载APItf.node.loadLayersModel:const modelJsonAbsolutePath = path.resolve(__dirname, 'models/ssd_model/model.json'); this.model = await tf.node.loadLayersModel(`file://${modelJsonAbsolutePath}`);
最后提个醒
- 确保你的模型文件(
model.json和对应的权重文件)都在指定路径里,而且Node进程有读取这个目录的权限。 - 要是你非得保留
node-fetch,其实也能配置它支持file协议,但真的没必要——tfjs-node已经把本地加载的事情处理得很到位了,完全不用绕这个弯。
内容的提问来源于stack exchange,提问作者BradleyB19
相关产品推荐
相关产品推荐

