X2Paddle icon indicating copy to clipboard operation
X2Paddle copied to clipboard

onnx_decoder: 对于Optional的OP input应该如何处理

Open TaylorHere opened this issue 1 year ago • 2 comments

感谢您参与 X2Paddle 社区! 问题模版为了 X2Paddle 能更好的迭代,例如新功能发布、 RoadMaps 和错误跟踪. :smile_cat:

问题描述

  • 错误信息 https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Clip-13 Clip op 描述中提到 min 和 max 是 optional的, 默认值为numeric_limits::lowest() and numeric_limits::max(), 通过pytorch导出的onnx模型中会出现min或max不给设定值的情况

在修复了一些取op input的错误后, 遇到input不存在的情况应该如何在x2paddle框架上处理呢

diff --git a/x2paddle/decoder/onnx_decoder.py b/x2paddle/decoder/onnx_decoder.py
index 7fe4696..75e4325 100755
--- a/x2paddle/decoder/onnx_decoder.py
+++ b/x2paddle/decoder/onnx_decoder.py
@@ -329,10 +329,10 @@ class ONNXGraph(Graph):
 
     def get_input_node(self, node, idx=0, copy=False):
         if len(node.which_child) == 0:
-            ipt_node = super(ONNXGraph, self).get_node(node.inputs[idx], copy)
+            ipt_node = super(ONNXGraph, self).get_node(node.layer.input[idx], copy)
             return ipt_node
         else:
-            ipt_node = super(ONNXGraph, self).get_node(node.inputs[idx], copy)
+            ipt_node = super(ONNXGraph, self).get_node(node.layer.input[idx], copy)
             new_ipt_name = "{}/{}".format(ipt_node.layer_name, idx)
             if new_ipt_name in node.which_child:
                 ipt_node.index = node.which_child[new_ipt_name]
diff --git a/x2paddle/op_mapper/onnx2paddle/opset14.py b/x2paddle/op_mapper/onnx2paddle/opset14.py
index 0a4f18a..1ff533b 100644
--- a/x2paddle/op_mapper/onnx2paddle/opset14.py
+++ b/x2paddle/op_mapper/onnx2paddle/opset14.py
@@ -32,3 +32,4 @@ def print_mapping_info(func):
 class OpSet14(OpSet13):
     def __init__(self, decoder, paddle_graph):
         super(OpSet14, self).__init__(decoder, paddle_graph)
+        self.directly_map_ops['HardSwish'] = ['paddle.nn.Hardswish']
diff --git a/x2paddle/op_mapper/onnx2paddle/opset_legacy.py b/x2paddle/op_mapper/onnx2paddle/opset_legacy.py
index bdf532a..15d903b 100644
--- a/x2paddle/op_mapper/onnx2paddle/opset_legacy.py
+++ b/x2paddle/op_mapper/onnx2paddle/opset_legacy.py
@@ -1233,7 +1233,7 @@ class OpSet():
         val_x = self.graph.get_input_node(node, idx=0, copy=True)
         val_y = self.graph.get_node(node.layer.output[0], copy=True)
         max_value, min_value = None, None
-        if len(node.inputs) == 1:
+        if len(node.layer.input) == 1:
             max_value = node.get_attr('max')
             min_value = node.get_attr('min')
             layer_attrs = {
@@ -1247,7 +1247,7 @@ class OpSet():
                 outputs=[node.name],
                 **layer_attrs)
         else:
-            if len(node.inputs) == 2:
+            if len(node.layer.input) == 2:
                 val_ipt = self.graph.get_input_node(node, idx=1, copy=True)
 
                 index = node.get_input_index(val_ipt.name)
@@ -1268,7 +1268,7 @@ class OpSet():
                     outputs=[node.name],
                     **layer_attrs)
             else:
-                if len(node.inputs) == 3:
+                if len(node.layer.input) == 3:
                     min_ipt = self.graph.get_input_node(node, idx=1, copy=True)
                     max_ipt = self.graph.get_input_node(node, idx=2, copy=True)
                     self.paddle_graph.add_layer(
  • 错误截图

图片

图片

图片

具体信息

  • 转换模型后用处
    • [X] 使用 Paddle.js 运行在小程序上
    • [ ] 使用 Paddle 框架/ PaddleInference 推理预测
    • [ ] 使用 Paddle-Lite 做移动端推理
    • [ ] 转换预训练参数,再使用 Paddle 进行模型开发
  • 模型来源 SSDLite: https://pytorch.org/vision/main/models/generated/torchvision.models.detection.ssdlite320_mobilenet_v3_large.html#torchvision.models.detection.ssdlite320_mobilenet_v3_large
  • 应用场景 用于小程序业务下的检测业务
  • 版本信息 PaddlePaddle => daily build X2Paddle => 1.4.0 来源框架版本(PyTorch/TF/ONNX/Caffe) => PyTorch

联系方式: [email protected]

TaylorHere avatar Feb 28 '23 15:02 TaylorHere

@TaylorHere 麻烦提供一下ONNX模型吧

另外,可以描述一下以下两个问题吗: 1、具体业务场景 2、为什么有转到Paddle部署的需求呢?

感谢~

wjj19950828 avatar Mar 01 '23 06:03 wjj19950828

ssdlite320_mobilenet_v3_large.zip

  1. 运行在小程序上的目标检测模型
  2. 希望借助paddle.js和小程序插件在小程序上部署模型

TaylorHere avatar Mar 01 '23 08:03 TaylorHere