# Copyright (c) 2024 PaddlePaddle Authors. All Rights Reserved # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import numpy as np import tensorrt as trt from paddle.tensorrt.converter_utils import ( WithFp16, get_trt_plugin, set_layer_name, unary_op_converter, ) from paddle.tensorrt.register import converter_registry from paddle.tensorrt.util import ( TensorRTConstantManager, ) @converter_registry.register("pd_op.sqrt") @converter_registry.register("pd_op.sqrt_") @converter_registry.register("pd_op.floor") @converter_registry.register("pd_op.exp") @converter_registry.register("pd_op.abs") @converter_registry.register("pd_op.abs_") @converter_registry.register("pd_op.sin") @converter_registry.register("pd_op.cos") @converter_registry.register("pd_op.sinh") @converter_registry.register("pd_op.cosh") @converter_registry.register("pd_op.asinh") @converter_registry.register("pd_op.acosh") @converter_registry.register("pd_op.atanh") @converter_registry.register("pd_op.ceil") @converter_registry.register("pd_op.tan") @converter_registry.register("pd_op.asin") @converter_registry.register("pd_op.acos") @converter_registry.register("pd_op.atan") @converter_registry.register("pd_op.reciprocal") @converter_registry.register("pd_op.erf") @converter_registry.register("pd_op.rsqrt") @converter_registry.register("pd_op.sign", trt_version="trt_version_ge=8.2") @converter_registry.register("pd_op.round", trt_version="trt_version_ge=8.2") def UnaryOpConverter(network, paddle_op, inputs): layer_output = unary_op_converter(network, paddle_op, inputs) return layer_output @converter_registry.register("pd_op.roi_align") def roi_align_converter(network, paddle_op, inputs): x = inputs[0] rois = inputs[1] pooled_height = paddle_op.attrs().get("pooled_height") pooled_width = paddle_op.attrs().get("pooled_width") spatial_scale = paddle_op.attrs().get("spatial_scale") sampling_ratio = paddle_op.attrs().get("sampling_ratio") aligned = paddle_op.attrs().get("aligned") type_id = int(WithFp16()) plugin_fields = [ trt.PluginField( "type_id", np.array([type_id], dtype=np.int32), trt.PluginFieldType.INT32, ), trt.PluginField( "pooled_height", np.array(pooled_height, dtype=np.int32), trt.PluginFieldType.INT32, ), trt.PluginField( "pooled_width", np.array(pooled_width, dtype=np.int32), trt.PluginFieldType.INT32, ), trt.PluginField( "spatial_scale", np.array(spatial_scale, dtype=np.float32), trt.PluginFieldType.FLOAT32, ), trt.PluginField( "sampling_ratio", np.array(sampling_ratio, dtype=np.int32), trt.PluginFieldType.INT32, ), trt.PluginField( "aligned", np.array(aligned, dtype=np.bool_), trt.PluginFieldType.INT32, ), ] plugin_field_collection = trt.PluginFieldCollection(plugin_fields) plugin_name = "pir_roi_align_plugin_dynamic" plugin_version = "2" plugin = get_trt_plugin( plugin_name, plugin_field_collection, plugin_version ) roi_align_inputs = [x, rois] roi_align_layer = network.add_plugin_v2(roi_align_inputs, plugin) set_layer_name(roi_align_layer, paddle_op) return roi_align_layer.get_output(0) @converter_registry.register("pd_op.yolo_box") def YoloBoxOpConverter(network, paddle_op, inputs): x, imgSize = inputs class_num = paddle_op.attrs().get("class_num") anchors = paddle_op.attrs().get("anchors") downsample_ratio = paddle_op.attrs().get("downsample_ratio") conf_thresh = paddle_op.attrs().get("conf_thresh") clip_bbox = paddle_op.attrs().get("clip_bbox") scale_x_y = paddle_op.attrs().get("scale_x_y") iou_aware = paddle_op.attrs().get("iou_aware") iou_aware_factor = paddle_op.attrs().get("iou_aware_factor") type_id = int(WithFp16()) anchors = np.array(anchors, dtype=np.int32) plugin_fields = [ trt.PluginField( "type_id", np.array([type_id], dtype=np.int32), trt.PluginFieldType.INT32, ), trt.PluginField( "anchors", anchors, trt.PluginFieldType.INT32, ), trt.PluginField( "class_num", np.array(class_num, dtype=np.int32), trt.PluginFieldType.INT32, ), trt.PluginField( "conf_thresh", np.array(conf_thresh, dtype=np.float32), trt.PluginFieldType.FLOAT32, ), trt.PluginField( "downsample_ratio", np.array(downsample_ratio, dtype=np.int32), trt.PluginFieldType.INT32, ), trt.PluginField( "clip_bbox", np.array(clip_bbox, dtype=np.bool_), trt.PluginFieldType.INT32, ), trt.PluginField( "scale_x_y", np.array(scale_x_y, dtype=np.float32), trt.PluginFieldType.FLOAT32, ), trt.PluginField( "iou_aware", np.array(iou_aware, dtype=np.bool_), trt.PluginFieldType.INT32, ), trt.PluginField( "iou_aware_factor", np.array(iou_aware_factor, dtype=np.float32), trt.PluginFieldType.FLOAT32, ), ] plugin_field_collection = trt.PluginFieldCollection(plugin_fields) plugin_name = "yolo_box_plugin_dynamic" plugin_version = "1" plugin = get_trt_plugin( plugin_name, plugin_field_collection, plugin_version ) yolo_box_inputs = [x, imgSize] yolo_box_layer = network.add_plugin_v2(yolo_box_inputs, plugin) set_layer_name(yolo_box_layer, paddle_op) out0 = yolo_box_layer.get_output(0) out1 = yolo_box_layer.get_output(1) return (out0, out1) @converter_registry.register( "pd_op.deformable_conv", trt_version="trt_version_ge=8.5" ) def deformable_conv_converter(network, paddle_op, inputs): input = inputs[0] constant_manager = TensorRTConstantManager() offset = inputs[1] filter = inputs[2] mask = inputs[3] if isinstance(filter, trt.ITensor): filter_name = ( paddle_op.operands()[2] .source() .get_defining_op() .attrs()['parameter_name'] ) filter = constant_manager.get_constant_value(filter_name) else: filter = filter.numpy() groups = paddle_op.attrs().get("groups") deformable_groups = paddle_op.attrs().get("deformable_groups") im2col_step = paddle_op.attrs().get("im2col_step") strides = paddle_op.attrs().get("strides") paddings = paddle_op.attrs().get("paddings") dilations = paddle_op.attrs().get("dilations") kernel_dims = paddle_op.operands()[2].source().shape plugin_fields = [ trt.PluginField( "with_fp16", np.array([False], dtype=np.bool_), trt.PluginFieldType.INT32, ), trt.PluginField( "weights", filter, trt.PluginFieldType.FLOAT32, ), trt.PluginField( "kernel_dims", np.array(kernel_dims, dtype=np.int32), trt.PluginFieldType.INT32, ), trt.PluginField( "strides", np.array(strides, dtype=np.int32), trt.PluginFieldType.INT32, ), trt.PluginField( "paddings", np.array(paddings, dtype=np.int32), trt.PluginFieldType.INT32, ), trt.PluginField( "dilations", np.array(dilations, dtype=np.int32), trt.PluginFieldType.INT32, ), trt.PluginField( "groups", np.array(groups, dtype=np.int32), trt.PluginFieldType.INT32, ), trt.PluginField( "deformable_groups", np.array(deformable_groups, dtype=np.int32), trt.PluginFieldType.INT32, ), trt.PluginField( "im2col_step", np.array(im2col_step, dtype=np.int32), trt.PluginFieldType.INT32, ), ] plugin_field_collection = trt.PluginFieldCollection(plugin_fields) plugin_name = "pir_deformable_conv_plugin" plugin_version = "1" plugin = get_trt_plugin( plugin_name, plugin_field_collection, plugin_version ) deformable_conv_layer = network.add_plugin_v2( [inputs[0], inputs[1], inputs[3]], plugin ) set_layer_name(deformable_conv_layer, paddle_op) return deformable_conv_layer.get_output(0)