Apollo 11.0
自动驾驶开放平台
argmax_plugin.h
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2018 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
17#pragma once
18
19#include <limits>
20#include <NvInferVersion.h>
21
22#include "modules/perception/common/proto/rt.pb.h"
23
25
26namespace apollo {
27namespace perception {
28namespace inference {
29
30#ifdef NV_TENSORRT_MAJOR
31#if NV_TENSORRT_MAJOR != 8
32class ArgMax1Plugin : public nvinfer1::IPlugin {
33 public:
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];
41 }
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;
49 if (out_max_val_) {
50 // Produces max_ind and max_val
51 output_dims_.d[0] = 2;
52 }
53 }
54
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,
68 int nbInputDims) {
69 input_dims_ = inputs[0];
70 for (int i = 1; i < input_dims_.nbDims; i++) {
71 output_dims_.d[i] = input_dims_.d[i];
72 }
73 return output_dims_;
74 }
75
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];
82 }
83 }
84
85 size_t getWorkspaceSize(int maxBatchSize) const override { return 0; }
86
87 virtual int enqueue(int batchSize, const void *const *inputs, void **outputs,
88 void *workspace, cudaStream_t stream);
89
90 size_t getSerializationSize() override { return 0; }
91
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);
96 }
97
98 virtual ~ArgMax1Plugin() {}
99
100 private:
101 bool out_max_val_;
102 size_t top_k_;
103 int axis_;
104 float float_min_;
105 nvinfer1::Dims input_dims_;
106 nvinfer1::Dims output_dims_;
107};
108
109#else
110class ArgMax1Plugin : public nvinfer1::IPluginV2Ext {
111 public:
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];
118 }
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;
126 if (out_max_val_) {
127 // Produces max_ind and max_val
128 output_dims_.d[0] = 2;
129 }
130 }
131
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];
148 }
149 return output_dims_;
150 }
151
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];
159 }
160 }
161
162 size_t getWorkspaceSize(int32_t maxBatchSize)
163 const noexcept override { return 0; }
164
165 int32_t enqueue(int32_t batchSize, const void *const *inputs,
166 void *const *outputs, void *workspace,
167 cudaStream_t stream) noexcept override;
168
169 size_t getSerializationSize() const noexcept override { return 0; }
170
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);
175 }
176
177 ArgMax1Plugin() {}
178 virtual ~ArgMax1Plugin() {}
179
180 nvinfer1::AsciiChar const* getPluginType()
181 const noexcept override {
182 return plugin_type;
183 }
184
185 nvinfer1::AsciiChar const* getPluginVersion()
186 const noexcept override {
187 return plugin_version;
188 }
189
190 void setPluginNamespace(const nvinfer1::AsciiChar* libNamespace)
191 noexcept override {
192 plugin_namespace = const_cast<nvinfer1::AsciiChar*>(libNamespace);
193 }
194
195 nvinfer1::AsciiChar const* getPluginNamespace()
196 const noexcept override {
197 return const_cast<nvinfer1::AsciiChar*>(plugin_namespace);
198 }
199
200 bool supportsFormat(nvinfer1::DataType type,
201 nvinfer1::PluginFormat format) const noexcept override {
202 return true;
203 }
204
205 void destroy() noexcept override {
206 delete this;
207 }
208
209 nvinfer1::IPluginV2Ext* clone() const noexcept override {
210 ArgMax1Plugin* p = new ArgMax1Plugin();
211 p->out_max_val_ = out_max_val_;
212 p->top_k_ = top_k_;
213 p->axis_ = axis_;
214 p->float_min_ = float_min_;
215
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];
219 }
220 p->output_dims_ = p->input_dims_;
221 p->output_dims_.d[0] = 1;
222 if (p->out_max_val_) {
223 // Produces max_ind and max_val
224 p->output_dims_.d[0] = 2;
225 }
226
227 p->plugin_namespace = plugin_namespace;
228 return p;
229 }
230
231 bool isOutputBroadcastAcrossBatch(int32_t outputIndex,
232 bool const *inputIsBroadcasted, int32_t nbInputs)
233 const noexcept override {
234 return false;
235 }
236
237 bool canBroadcastInputAcrossBatch(int32_t inputIndex)
238 const noexcept override {
239 return false;
240 }
241
242 nvinfer1::DataType getOutputDataType(int32_t index,
243 nvinfer1::DataType const *inputTypes,
244 int32_t nbInputs) const noexcept {
245 return nvinfer1::DataType::kFLOAT;
246 }
247
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 {}
254
255 private:
256 bool out_max_val_;
257 size_t top_k_;
258 int axis_;
259 float float_min_;
260 nvinfer1::Dims input_dims_;
261 nvinfer1::Dims output_dims_;
262
263 nvinfer1::AsciiChar* plugin_namespace;
264 const nvinfer1::AsciiChar* plugin_type = "";
265 const nvinfer1::AsciiChar* plugin_version = "";
266};
267
268#endif
269#endif
270
271} // namespace inference
272} // namespace perception
273} // namespace apollo
class register implement
Definition arena_queue.h:37
Definition future.h:29