问题
在html中使用ort.js通过路径的方式加载onnx模型时,如果项目不使用代理直接本地运行,会报以下错误;
Fetch API cannot load file:///storage/……/html/js/Onnxmodel/FSC.onnx. URL scheme "file" is not supported. at /html/js/ort.min.js:4502
11:46:39.103 Uncaught (in promise) TypeError: Failed to fetch at /html/js/ort.min.js:4502
另外,在uniapp中使用webview运行本地html项目并加载onnx模型时,也会出现此错误。
分析
由于使用代理的情况下,通过路径加载模型是没有问题的,初步分析是ort.js文件加载机制原因,具体不做深入探究;所以先通过ort.js文档查看create方法:InferenceSessionFactory Create
通过文档我们可以发现,create方法不仅支持通过路径加载模型,还可以通过buffer的形式
解决
由于create方法支持buffer,我们就可以通过获取模型的buffer值的方式来加载模型,具体代码如下
可以参考文档:Sending and Receiving Binary Data
var session; var oReq = new XMLHttpRequest(); oReq.open("GET", "../js/Onnxmodel/test.onnx", true); // 加载模型,传入路径 oReq.responseType = "arraybuffer"; // 设置加载的文件返回类型 oReq.onload = function () { var arrayBuffer = oReq.response; // 加载完模型文件后获取到对应buffer ort.InferenceSession.create(arrayBuffer).then(function (model) { session = model; // 加载模型后返回会话 }).catch((err)=>{ console.log("errrrrrrrrrrrrrrrrrrrr", err) }); } oReq.send(null);