Paddle2ONNX icon indicating copy to clipboard operation
Paddle2ONNX copied to clipboard

paddle2onnx导出ppyoloe

Open Monday-Leo opened this issue 2 years ago • 16 comments

使用命令paddle2onnx --model_dir output_inference/ppyoloe_crn_s_300e_voc --model_filename model.pdmodel --params_filename model.pdiparams --opset_version 11 --save_file ppyoloe_crn_s_300e_voc.onnx导出onnx,输入有两个,输出也有两个,这是否正常?该如何预测?感觉shape都不是很正常。 微信图片_20220331011216 微信图片_20220331011226

Monday-Leo avatar Mar 30 '22 17:03 Monday-Leo

你好,ONNX模型可用ONNXRuntime或者TensorRT进行预测。

  1. ONNXRuntime预测步骤简单,可以自行百度,你可以用ONNXRuntime检测ONNX推理是否满足预期
  2. TensorRT预测可以参考:https://github.com/PaddlePaddle/Paddle2ONNX/tree/model_zoo/hardwares/tensorrt
  3. 也可以通过PaddleInference使用paddle模型进行预测:https://www.paddlepaddle.org.cn/inference/v2.1/product_introduction/inference_intro.html

yeliang2258 avatar Mar 31 '22 02:03 yeliang2258

为什么会有两个输入呢?

Monday-Leo avatar Mar 31 '22 04:03 Monday-Leo

Constant那个node是一个多余的node,不是输入,输入就是image,你可以点击一下image,会具体显示有几个输入,几个输出。

yeliang2258 avatar Mar 31 '22 06:03 yeliang2258

QQ截图20220331142045 确实是有两个输入,不知道什么情况。

Monday-Leo avatar Mar 31 '22 06:03 Monday-Leo

两个输入分别含义

  • image: 输入的预处理后的图像数据
  • scale_factor: width和height在预处理中被缩放的系数 具体参数含义参考此目录下yolov3/picodet在推理时的预处理代码 https://github.com/PaddlePaddle/Paddle2ONNX/tree/model_zoo/model_zoo/detection

jiangjiajun avatar Mar 31 '22 07:03 jiangjiajun

感谢,已经跑通!

Monday-Leo avatar Mar 31 '22 11:03 Monday-Leo

onnxruntime已经跑通,上面tensorrt部署的链接还没有试,请问能够将onxx转化成.engine模型吗,看了教程好像每次都得转化,无法加载转换好的模型。

Monday-Leo avatar Mar 31 '22 13:03 Monday-Leo

报错,是有算子不支持吗?

Loading ONNX model...
=========type <class 'onnx.onnx_ml_pb2.ModelProto'>
[04/01/2022-00:18:48] [TRT] [W] onnx2trt_utils.cpp:366: Your ONNX model has been generated with INT64 weights, while TensorRT does not natively support INT64. Attempting to cast down to INT32.
ERROR: Failed to parse the ONNX file.
In node 947 (importFallbackPluginImporter): UNSUPPORTED_NODE: Assertion failed: creator && "Plugin not found, are the plugin name, version, and namespace correct?"

Monday-Leo avatar Mar 31 '22 16:03 Monday-Leo

两个输入分别含义

  • image: 输入的预处理后的图像数据
  • scale_factor: width和height在预处理中被缩放的系数 具体参数含义参考此目录下yolov3/picodet在推理时的预处理代码 https://github.com/PaddlePaddle/Paddle2ONNX/tree/model_zoo/model_zoo/detection

导出onnx模型能去掉吗 我想导出[1,255,13,13]【 1,255,26,26] [1,255,52,52] 这样的输出和 输入1,3,416,416]

yuexiayiren159aaa avatar Apr 01 '22 03:04 yuexiayiren159aaa

报错,是有算子不支持吗?

Loading ONNX model...
=========type <class 'onnx.onnx_ml_pb2.ModelProto'>
[04/01/2022-00:18:48] [TRT] [W] onnx2trt_utils.cpp:366: Your ONNX model has been generated with INT64 weights, while TensorRT does not natively support INT64. Attempting to cast down to INT32.
ERROR: Failed to parse the ONNX file.
In node 947 (importFallbackPluginImporter): UNSUPPORTED_NODE: Assertion failed: creator && "Plugin not found, are the plugin name, version, and namespace correct?"

排除出问题处在947处的node为NonZero,查阅了onnx-tensorrt中发现该算子暂不支持,请问这应该怎么修改把这个算子转换一下?排查发现是MultiClassNMS转成onnx时会产生nonzero,这个能解决吗?

Monday-Leo avatar Apr 01 '22 05:04 Monday-Leo

这个的原因如下

PaddleDetection的模型中,在做NMS时,会过滤掉某些类别的Box框, 即如下代码在做的事情 https://github.com/PaddlePaddle/Paddle2ONNX/blob/develop/paddle2onnx/op_mapper/detection/multiclass_nms.py#L158

因此在转ONNX后,生成了NonZero的操作,NonZero就是在过滤某些类别的Box框。 当然如果你不需要的话,你可以考虑不过滤,而改为模型推理完成后,在后处理里面你自己来做这个事情

因此,你可以将这里Paddle2ONNX这块代码改成,重新再安装Paddle2ONNX后导出即可

#        if background == 0:
#            nonzero = graph.make_node('NonZero', inputs=[squeezed_class_id])
#        else:
#            filter_cls_id = graph.make_node(
#                'Constant', dtype=dtypes.ONNX.INT32, value=[background])
#            cast = graph.make_node(
#                'Cast', inputs=[squeezed_class_id], to=dtypes.ONNX.INT32)
#            filter_index = graph.make_node('Sub', inputs=[cast, filter_cls_id])
#            nonzero = graph.make_node('NonZero', inputs=[filter_index])

#        class_id = graph.make_node('Gather', inputs=[class_id, nonzero], axis=0)
        class_id = graph.make_node(
            'Cast', inputs=[class_id], to=dtypes.ONNX.INT64)

#        bbox_id = graph.make_node('Gather', inputs=[bbox_id, nonzero], axis=0)
        bbox_id = graph.make_node(
            'Cast', inputs=[bbox_id], to=dtypes.ONNX.INT64)

jiangjiajun avatar Apr 01 '22 06:04 jiangjiajun

我用openvino中的案例导出已经去掉了这个nonzero,但是在topk算子上仍然支持报错 In node 424 (importTopK): UNSUPPORTED_NODE: Assertion failed: (inputs.at(1).is_weights()) && "This version of TensorRT only supports input K as an initializer." 对于topk的输入好像有限制,这个能解决吗?

Monday-Leo avatar Apr 01 '22 07:04 Monday-Leo

试下onnxsimplifier再处理下

jiangjiajun avatar Apr 01 '22 07:04 jiangjiajun

已经时处理过后的了

Monday-Leo avatar Apr 01 '22 07:04 Monday-Leo

我去掉nms之后,已经导出trt模型成功,输出的两个shape分别为(1, 8400, 4) (1, 42, 8400),之后的nms有没有现成的代码?还有每次预测都会报 [04/01/2022-17:10:55] [TRT] [E] 3: [executionContext.cpp::nvinfer1::rt::ExecutionContext::setBindingDimensions::929] Error Code 3: API Usage Error (Parameter check failed at: executionContext.cpp::nvinfer1::rt::ExecutionContext::setBindingDimensions::929, condition: engineDims.nbDims == dimensions.nbDims ) 这是什么原因呢?

Monday-Leo avatar Apr 01 '22 09:04 Monday-Leo

如果去掉nms,后面还得加上,感觉很麻烦,topk算子这个怎么处理一下才能支持?onnxsimplifier处理之后也没用。

Monday-Leo avatar Apr 01 '22 14:04 Monday-Leo