使用ONNX.js加载ONNX模型报Cast算子无法解析错误如何解决
报错现象
使用onnxjs加载ONNX模型时,控制台抛出如下错误:
Uncaught (in promise) TypeError: cannot resolve operator 'Cast' with opsets: ai.onnx v11
对应使用的页面代码如下:
<html> <head> </head> <body> <!-- Load ONNX.js --> <script src="https://cdn.jsdelivr.net/npm/onnxjs/dist/onnx.min.js"></script> <!-- Code that consume ONNX.js --> <script> async function test(){ const sess = new onnx.InferenceSession() await sess.loadModel('./onnx_model.onnx') } test() </script> </body> </html>
报错原因
当前引入的onnxjs版本最高仅支持ai.onnx算子集v10版本,你加载的ONNX模型是基于opset v11及以上版本导出的。v11版本中Cast算子的实现规则、参数定义和低版本不兼容,onnxjs没有内置对应版本的算子实现,因此加载失败。
解决方法
方案1:将模型转换为opset v10版本
如果你要继续使用onnxjs,把模型的算子版本降到v10即可兼容。- 如果你是自行从PyTorch/TensorFlow等框架导出ONNX模型,导出时显式指定opset版本为10,以PyTorch为例:
torch.onnx.export( model, sample_input, "./onnx_model.onnx", opset_version=10, # 其余原有导出参数保持不变 ) - 如果你已经有导出完成的ONNX文件,可以直接通过onnx官方库做版本转换,执行如下Python代码即可:
import onnx from onnx import version_converter original_model = onnx.load("./onnx_model.onnx") converted_model = version_converter.convert_version(original_model, 10) onnx.save(converted_model, "./onnx_model_opset10.onnx")
转换完成后,将前端代码中加载的模型路径替换为转换后的opset10版本模型,即可正常加载。
- 如果你是自行从PyTorch/TensorFlow等框架导出ONNX模型,导出时显式指定opset版本为10,以PyTorch为例:
方案2:替换推理库为onnxruntime-web
onnxjs已经停止维护多年,最高支持的opset版本停留在v10,对新算子、新特性都没有适配。如果不想降级模型opset版本,可以直接替换为微软官方持续维护的onnxruntime-web,该库对高版本opset、各类常用算子的支持完善度远高于旧版onnxjs,替换后无需调整模型版本即可正常加载包含v11及以上版本Cast算子的模型。
内容的提问来源于stack exchange,提问作者FND FYP
相关产品推荐
相关产品推荐

