Paddle2ONNX
Paddle2ONNX copied to clipboard
paddle2onnx导出ppyoloe
使用命令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都不是很正常。
你好,ONNX模型可用ONNXRuntime或者TensorRT进行预测。
- ONNXRuntime预测步骤简单,可以自行百度,你可以用ONNXRuntime检测ONNX推理是否满足预期
- TensorRT预测可以参考:https://github.com/PaddlePaddle/Paddle2ONNX/tree/model_zoo/hardwares/tensorrt
- 也可以通过PaddleInference使用paddle模型进行预测:https://www.paddlepaddle.org.cn/inference/v2.1/product_introduction/inference_intro.html
为什么会有两个输入呢?
Constant那个node是一个多余的node,不是输入,输入就是image,你可以点击一下image,会具体显示有几个输入,几个输出。
确实是有两个输入,不知道什么情况。
两个输入分别含义
-
image
: 输入的预处理后的图像数据 -
scale_factor
: width和height在预处理中被缩放的系数 具体参数含义参考此目录下yolov3/picodet在推理时的预处理代码 https://github.com/PaddlePaddle/Paddle2ONNX/tree/model_zoo/model_zoo/detection
感谢,已经跑通!
onnxruntime已经跑通,上面tensorrt部署的链接还没有试,请问能够将onxx转化成.engine模型吗,看了教程好像每次都得转化,无法加载转换好的模型。
报错,是有算子不支持吗?
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?"
两个输入分别含义
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]
报错,是有算子不支持吗?
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,这个能解决吗?
这个的原因如下
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)
我用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的输入好像有限制,这个能解决吗?
试下onnxsimplifier再处理下
已经时处理过后的了
我去掉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 )
这是什么原因呢?
如果去掉nms,后面还得加上,感觉很麻烦,topk算子这个怎么处理一下才能支持?onnxsimplifier处理之后也没用。