20#include <NvInferVersion.h>
22#include "modules/perception/common/proto/rt.pb.h"
30#ifdef NV_TENSORRT_MAJOR
31#if NV_TENSORRT_MAJOR != 8
32class ArgMax1Plugin :
public nvinfer1::IPlugin {
34 ArgMax1Plugin(
const ArgMaxParameter &argmax_param, nvinfer1::Dims in_dims)
35 : float_min_(
std::numeric_limits<float>::min()) {
36 input_dims_.nbDims = in_dims.nbDims;
37 CHECK_GT(input_dims_.nbDims, 0);
38 for (
int i = 0; i < in_dims.nbDims; i++) {
39 input_dims_.d[i] = in_dims.d[i];
40 input_dims_.type[i] = in_dims.type[i];
42 axis_ = argmax_param.axis();
43 out_max_val_ = argmax_param.out_max_val();
44 top_k_ = argmax_param.top_k();
45 CHECK_GE(top_k_,
static_cast<size_t>(1))
46 <<
"top k must not be less than 1.";
47 output_dims_ = input_dims_;
48 output_dims_.d[0] = 1;
51 output_dims_.d[0] = 2;
63 virtual int initialize() {
return 0; }
64 virtual void terminate() {}
65 int getNbOutputs()
const override {
return 1; }
66 virtual nvinfer1::Dims getOutputDimensions(
int index,
67 const nvinfer1::Dims *inputs,
69 input_dims_ = inputs[0];
70 for (
int i = 1; i < input_dims_.nbDims; i++) {
71 output_dims_.d[i] = input_dims_.d[i];
76 void configure(
const nvinfer1::Dims *inputDims,
int nbInputs,
77 const nvinfer1::Dims *outputDims,
int nbOutputs,
78 int maxBatchSize)
override {
79 input_dims_ = inputDims[0];
80 for (
int i = 1; i < input_dims_.nbDims; i++) {
81 output_dims_.d[i] = input_dims_.d[i];
85 size_t getWorkspaceSize(
int maxBatchSize)
const override {
return 0; }
87 virtual int enqueue(
int batchSize,
const void *
const *inputs,
void **outputs,
88 void *workspace, cudaStream_t stream);
90 size_t getSerializationSize()
override {
return 0; }
92 void serialize(
void *buffer)
override {
93 char *d =
reinterpret_cast<char *
>(buffer), *a = d;
94 size_t size = getSerializationSize();
95 CHECK_EQ(d, a + size);
98 virtual ~ArgMax1Plugin() {}
105 nvinfer1::Dims input_dims_;
106 nvinfer1::Dims output_dims_;
110class ArgMax1Plugin :
public nvinfer1::IPluginV2Ext {
112 ArgMax1Plugin(
const ArgMaxParameter &argmax_param, nvinfer1::Dims in_dims)
113 : float_min_(
std::numeric_limits<float>::min()) {
114 input_dims_.nbDims = in_dims.nbDims;
115 CHECK_GT(input_dims_.nbDims, 0);
116 for (
int i = 0; i < in_dims.nbDims; i++) {
117 input_dims_.d[i] = in_dims.d[i];
119 axis_ = argmax_param.axis();
120 out_max_val_ = argmax_param.out_max_val();
121 top_k_ = argmax_param.top_k();
122 CHECK_GE(top_k_,
static_cast<size_t>(1))
123 <<
"top k must not be less than 1.";
124 output_dims_ = input_dims_;
125 output_dims_.d[0] = 1;
128 output_dims_.d[0] = 2;
140 virtual int initialize() noexcept {
return 0; }
141 virtual void terminate() noexcept {}
142 int32_t getNbOutputs() const noexcept
override {
return 1; }
143 nvinfer1::Dims getOutputDimensions(int32_t index,
144 const nvinfer1::Dims *inputs, int32_t nbInputDims)
noexcept override {
145 input_dims_ = inputs[0];
146 for (
int i = 1; i < input_dims_.nbDims; i++) {
147 output_dims_.d[i] = input_dims_.d[i];
152 void configureWithFormat(
const nvinfer1::Dims *inputDims, int32_t nbInputs,
153 const nvinfer1::Dims *outputDims, int32_t nbOutputs,
154 nvinfer1::DataType type, nvinfer1::PluginFormat format,
155 int32_t maxBatchSize)
noexcept override {
156 input_dims_ = inputDims[0];
157 for (
int i = 1; i < input_dims_.nbDims; i++) {
158 output_dims_.d[i] = input_dims_.d[i];
162 size_t getWorkspaceSize(int32_t maxBatchSize)
163 const noexcept override {
return 0; }
165 int32_t enqueue(int32_t batchSize,
const void *
const *inputs,
166 void *
const *outputs,
void *workspace,
167 cudaStream_t stream)
noexcept override;
169 size_t getSerializationSize() const noexcept
override {
return 0; }
171 void serialize(
void *buffer)
const noexcept override {
172 char *d =
reinterpret_cast<char *
>(buffer), *a = d;
173 size_t size = getSerializationSize();
174 CHECK_EQ(d, a + size);
178 virtual ~ArgMax1Plugin() {}
180 nvinfer1::AsciiChar
const* getPluginType()
181 const noexcept
override {
185 nvinfer1::AsciiChar
const* getPluginVersion()
186 const noexcept
override {
187 return plugin_version;
190 void setPluginNamespace(
const nvinfer1::AsciiChar* libNamespace)
192 plugin_namespace =
const_cast<nvinfer1::AsciiChar*
>(libNamespace);
195 nvinfer1::AsciiChar
const* getPluginNamespace()
196 const noexcept
override {
197 return const_cast<nvinfer1::AsciiChar*
>(plugin_namespace);
200 bool supportsFormat(nvinfer1::DataType type,
201 nvinfer1::PluginFormat format)
const noexcept override {
205 void destroy() noexcept
override {
209 nvinfer1::IPluginV2Ext* clone() const noexcept
override {
210 ArgMax1Plugin* p =
new ArgMax1Plugin();
211 p->out_max_val_ = out_max_val_;
214 p->float_min_ = float_min_;
216 (p->input_dims_).nbDims = input_dims_.nbDims;
217 for (
int i = 0; i < input_dims_.nbDims; i++) {
218 (p->input_dims_).d[i] = input_dims_.d[i];
220 p->output_dims_ = p->input_dims_;
221 p->output_dims_.d[0] = 1;
222 if (p->out_max_val_) {
224 p->output_dims_.d[0] = 2;
227 p->plugin_namespace = plugin_namespace;
231 bool isOutputBroadcastAcrossBatch(int32_t outputIndex,
232 bool const *inputIsBroadcasted, int32_t nbInputs)
233 const noexcept override {
237 bool canBroadcastInputAcrossBatch(int32_t inputIndex)
238 const noexcept override {
242 nvinfer1::DataType getOutputDataType(int32_t index,
243 nvinfer1::DataType
const *inputTypes,
244 int32_t nbInputs)
const noexcept {
245 return nvinfer1::DataType::kFLOAT;
248 void configurePlugin(
249 nvinfer1::Dims
const *inputDims, int32_t nbInputs,
250 nvinfer1::Dims
const *outputDims, int32_t nbOutputs,
251 nvinfer1::DataType
const *inputTypes, nvinfer1::DataType
const *outputTypes,
252 bool const *inputIsBroadcast,
bool const *outputIsBroadcast,
253 nvinfer1::PluginFormat floatFormat, int32_t maxBatchSize)
noexcept {}
260 nvinfer1::Dims input_dims_;
261 nvinfer1::Dims output_dims_;
263 nvinfer1::AsciiChar* plugin_namespace;
264 const nvinfer1::AsciiChar* plugin_type =
"";
265 const nvinfer1::AsciiChar* plugin_version =
"";