Estoy tratando de importar un modelo ONNX usando onnxjs, pero aparece el siguiente error:
Uncaught (in promise) TypeError: cannot resolve operator 'Cast' with opsets: ai.onnx v11A continuación se muestra un fragmento de código de mi archivo html.
<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>¿Cómo resolver esto?
Esto cargará el modelo Resnet 50
const sess = new onnx.InferenceSession() async function test(){ console.time("loading model") await sess.loadModel('https://microsoft.github.io/onnxjs-demo/resnet50v2.onnx') console.timeEnd("loading model") console.log("model loaded"); } document.querySelector('#load').addEventListener('click', test); <script src="https://cdn.jsdelivr.net/npm/onnxjs/dist/onnx.min.js"></script> <button id="load">load model</button>El mensaje sugiere algo que ver con el operador Cast que no es compatible con opset 11, tal vez quieras usarCast-9 . Quizás tengas que generar un nuevo modelo.
Su modelo se carga usando onnxruntime python
sess = onnxruntime.InferenceSession('../../Downloads/onnx_model.onnx'); {i.name: i.shape for i in sess.get_inputs()} {o.name: o.shape for o in sess.get_outputs()} {'input_ids': ['batch', 'sequence'], 'attention_mask': ['batch', 'sequence'], 'token_type_ids': ['batch', 'sequence']} {'output_0': ['batch', 2]}Probablemente tendrá que depurarlo usted mismo, con suerte el único problema es el operador de transmisión.
Comience a buscar aquí el soporte del operador para onnxjs y reescriba partes del modelo donde aparece el operador.
Por ejemplo, el operador Cast aparece solo una vez, puede ubicarlo de la siguiente manera
import onnx model = onnx.load('../../Downloads/onnx_model.onnx') for node in model.graph.node: if 'cast' in node.op_type.lower(): print(node.name, node.op_type)eso imprimirá
Cast_2 Cast Usando https://netron.app/ (o la versión de escritorio) puede ver que es 
Entonces, simplemente debe reescribir cómo se procesa su máscara de atención en el modelo, una posible solución sería dejar que las operaciones de unsqueeze y conversión estén fuera del cast .