Apollo 11.0
自动驾驶开放平台
slice_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 <NvInferVersion.h>
20
21#include <algorithm>
22#include <string>
23#include <vector>
24
26
27namespace apollo {
28namespace perception {
29namespace inference {
30
31#ifdef NV_TENSORRT_MAJOR
32#if NV_TENSORRT_MAJOR != 8
33class SLICEPlugin : public nvinfer1::IPlugin {
34 public:
35 SLICEPlugin(const SliceParameter &param, const nvinfer1::Dims &in_dims) {
36 CHECK_GT(param.slice_point_size(), 0);
37 for (int i = 0; i < param.slice_point_size(); i++) {
38 slice_point_.push_back(param.slice_point(i));
39 }
40 axis_ = std::max(param.axis() - 1, 0);
41 input_dims_.nbDims = in_dims.nbDims;
42 CHECK_GT(input_dims_.nbDims, 0);
43 for (int i = 0; i < in_dims.nbDims; i++) {
44 input_dims_.d[i] = in_dims.d[i];
45 input_dims_.type[i] = in_dims.type[i];
46 }
47
48 for (size_t i = 0; i < slice_point_.size(); i++) {
49 if (i == 0) {
50 out_slice_dims_.push_back(slice_point_[i]);
51 } else {
52 out_slice_dims_.push_back(slice_point_[i] - slice_point_[i - 1]);
53 }
54 }
55 out_slice_dims_.push_back(input_dims_.d[axis_] -
56 slice_point_[slice_point_.size() - 1]);
57 }
58 SLICEPlugin() {}
59 ~SLICEPlugin() {}
60 virtual int initialize() { return 0; }
61 virtual void terminate() {}
62 int getNbOutputs() const override {
63 return static_cast<int>(slice_point_.size()) + 1;
64 }
65 nvinfer1::Dims getOutputDimensions(int index, const nvinfer1::Dims *inputs,
66 int nbInputDims) override {
67 nvinfer1::Dims out_dims = inputs[0];
68 out_dims.d[axis_] = out_slice_dims_[index];
69 return out_dims;
70 }
71
72 void configure(const nvinfer1::Dims *inputDims, int nbInputs,
73 const nvinfer1::Dims *outputDims, int nbOutputs,
74 int maxBatchSize) override {
75 input_dims_ = inputDims[0];
76 }
77
78 size_t getWorkspaceSize(int maxBatchSize) const override { return 0; }
79
80 virtual int enqueue(int batchSize, const void *const *inputs, void **outputs,
81 void *workspace, cudaStream_t stream);
82
83 size_t getSerializationSize() override { return 0; }
84
85 void serialize(void *buffer) override {
86 char *d = reinterpret_cast<char *>(buffer), *a = d;
87 size_t size = getSerializationSize();
88 CHECK_EQ(d, a + size);
89 }
90
91 private:
92 std::vector<int> slice_point_;
93 std::vector<int> out_slice_dims_;
94 int axis_;
95 nvinfer1::Dims input_dims_;
96};
97
98#else
99class SLICEPlugin : public nvinfer1::IPluginV2 {
100 public:
101 SLICEPlugin(const char *layer_name, const void *serial_data,
102 size_t serial_length) {
103 const char *p = reinterpret_cast<const char *>(serial_data);
104
105 input_dims_.nbDims = reinterpret_cast<const int *>(p)[0];
106 CHECK_GT(input_dims_.nbDims, 0);
107 p += sizeof(int);
108 for (int i = 0; i < input_dims_.nbDims; ++i) {
109 input_dims_.d[i] = reinterpret_cast<const int *>(p)[0];
110 p += sizeof(int);
111 }
112
113 {
114 size_t size = reinterpret_cast<const size_t *>(p)[0];
115 CHECK_GT(size, 0);
116 p += sizeof(size_t);
117 slice_point_.assign(reinterpret_cast<const int *>(p),
118 reinterpret_cast<const int *>(p) + size);
119 p += sizeof(int) * size;
120 }
121
122 {
123 size_t size = reinterpret_cast<const size_t *>(p)[0];
124 CHECK(size == slice_point_.size() + 1);
125 p += sizeof(size_t);
126 out_slice_dims_.assign(reinterpret_cast<const int *>(p),
127 reinterpret_cast<const int *>(p) + size);
128 p += sizeof(int) * size;
129 }
130
131 axis_ = reinterpret_cast<const int *>(p)[0];
132 p += sizeof(int);
133
134 CHECK(p == reinterpret_cast<const char *>(serial_data) + serial_length);
135 CHECK(getSerializationSize() == serial_length);
136 }
137
138 SLICEPlugin(const SliceParameter &param, const nvinfer1::Dims &in_dims) {
139 CHECK_GT(param.slice_point_size(), 0);
140 for (int i = 0; i < param.slice_point_size(); i++) {
141 slice_point_.push_back(param.slice_point(i));
142 }
143 axis_ = std::max(param.axis() - 1, 0);
144 input_dims_.nbDims = in_dims.nbDims;
145 CHECK_GT(input_dims_.nbDims, 0);
146 for (int i = 0; i < in_dims.nbDims; i++) {
147 input_dims_.d[i] = in_dims.d[i];
148 }
149
150 for (size_t i = 0; i < slice_point_.size(); i++) {
151 if (i == 0) {
152 out_slice_dims_.push_back(slice_point_[i]);
153 } else {
154 out_slice_dims_.push_back(slice_point_[i] - slice_point_[i - 1]);
155 }
156 }
157 out_slice_dims_.push_back(input_dims_.d[axis_] -
158 slice_point_[slice_point_.size() - 1]);
159 }
160
161 SLICEPlugin(const int axis, const std::vector<int> &slice_point,
162 const nvinfer1::Dims &in_dims) {
163 CHECK_GT(slice_point.size(), 0);
164 for (size_t i = 0; i < slice_point.size(); i++) {
165 slice_point_.push_back(slice_point[i]);
166 }
167 axis_ = std::max(axis - 1, 0);
168 input_dims_.nbDims = in_dims.nbDims;
169 CHECK_GT(input_dims_.nbDims, 0);
170 for (int i = 0; i < in_dims.nbDims; i++) {
171 input_dims_.d[i] = in_dims.d[i];
172 }
173
174 for (size_t i = 0; i < slice_point_.size(); i++) {
175 if (i == 0) {
176 out_slice_dims_.push_back(slice_point_[i]);
177 } else {
178 out_slice_dims_.push_back(slice_point_[i] - slice_point_[i - 1]);
179 }
180 }
181 out_slice_dims_.push_back(input_dims_.d[axis_] -
182 slice_point_[slice_point_.size() - 1]);
183 }
184 SLICEPlugin() {}
185 ~SLICEPlugin() {}
186 virtual int initialize() noexcept { return 0; }
187
188 virtual void terminate() noexcept {}
189
190 int getNbOutputs() const noexcept override { return slice_point_.size() + 1; }
191
192 nvinfer1::Dims getOutputDimensions(int index, const nvinfer1::Dims *inputs,
193 int nbInputDims) noexcept override {
194 nvinfer1::Dims out_dims = inputs[0];
195 out_dims.d[axis_] = out_slice_dims_[index];
196 return out_dims;
197 }
198
199 void configureWithFormat(const nvinfer1::Dims *inputDims, int nbInputs,
200 const nvinfer1::Dims *outputDims, int nbOutputs,
201 nvinfer1::DataType type,
202 nvinfer1::PluginFormat format,
203 int maxBatchSize) noexcept override {
204 input_dims_ = inputDims[0];
205 }
206
207 void configure(const nvinfer1::Dims *inputDims, int nbInputs,
208 const nvinfer1::Dims *outputDims, int nbOutputs,
209 int maxBatchSize) {
210 input_dims_ = inputDims[0];
211 }
212
213 size_t getWorkspaceSize(int maxBatchSize) const noexcept override {
214 return 0;
215 }
216
217 virtual int enqueue(int batchSize, void const *const *inputs,
218 void *const *outputs, void *workspace,
219 cudaStream_t stream) noexcept;
220
221 size_t getSerializationSize() const noexcept override {
222 /* return sizeof(size_t) + Name().size() + \ */
223 return sizeof(int) + sizeof(int) * 1 * input_dims_.nbDims + sizeof(size_t) +
224 slice_point_.size() * sizeof(slice_point_[0]) + sizeof(size_t) +
225 out_slice_dims_.size() * sizeof(out_slice_dims_[0]) + sizeof(axis_);
226 }
227
228 void serialize(void *buffer) const noexcept override {
229 char *p = reinterpret_cast<char *>(buffer);
230 // setPluginType(&p, Name());
231
232 reinterpret_cast<int *>(p)[0] = input_dims_.nbDims;
233 p += sizeof(int);
234 for (int i = 0; i < input_dims_.nbDims; ++i) {
235 reinterpret_cast<int *>(p)[0] = input_dims_.d[i];
236 p += sizeof(int);
237 // reinterpret_cast<int *>(p)[0] = static_cast<int>(input_dims_.type[i]);
238 // p += sizeof(int);
239 }
240
241 reinterpret_cast<size_t *>(p)[0] = slice_point_.size();
242 p += sizeof(size_t);
243 for (size_t i = 0; i < slice_point_.size(); ++i) {
244 reinterpret_cast<int *>(p)[0] = slice_point_[i];
245 p += sizeof(int);
246 }
247
248 reinterpret_cast<size_t *>(p)[0] = out_slice_dims_.size();
249 p += sizeof(size_t);
250 for (size_t i = 0; i < out_slice_dims_.size(); ++i) {
251 reinterpret_cast<int *>(p)[0] = out_slice_dims_[i];
252 p += sizeof(int);
253 }
254
255 reinterpret_cast<int *>(p)[0] = axis_;
256 p += sizeof(int);
257 }
258
259 std::string Name() const { return "slice_plugin"; }
260
261 const char *getPluginType() const noexcept override {
262 return "slice_plugin";
263 };
264
265 const char *getPluginVersion() const noexcept override { return "1"; }
266
267 bool supportsFormat(nvinfer1::DataType type,
268 nvinfer1::PluginFormat format) const noexcept override {
269 // if (format != PluginFormat::kNCHW) {
270 // return false;
271 // }
272 // if (type == nvinfer1::DataType::kINT32 ||
273 // type == nvinfer1::DataType::kINT8) {
274 // return false;
275 // }
276 return true;
277 }
278
279 void destroy() noexcept override {}
280
281 IPluginV2 *clone() const noexcept override {
282 return new SLICEPlugin(axis_ + 1, slice_point_, input_dims_);
283 }
284
285 const char *getPluginNamespace() const noexcept override { return "camera"; }
286
287 void setPluginNamespace(const char *s_name) noexcept override {
288 name_ = s_name;
289 }
290
291 private:
292 std::vector<int> slice_point_;
293 std::vector<int> out_slice_dims_;
294 int axis_;
295 const char *name_ = "camera";
296 nvinfer1::Dims input_dims_;
297 nvinfer1::Dims output_dims_;
298};
299
300class SLICEPluginCreator : public nvinfer1::IPluginCreator {
301 public:
302 SLICEPluginCreator() {}
303 ~SLICEPluginCreator() {
304 // terminae();
305 }
306 const char *getPluginName() const noexcept override {
307 return "slice_plugincamera";
308 }
309 const char *getPluginVersion() const noexcept override { return "1"; }
310
311 const nvinfer1::PluginFieldCollection *getFiledNames() { return nullptr; }
312 nvinfer1::IPluginV2 *createPlugin(
313 const char *name,
314 const nvinfer1::PluginFieldCollection *fc) noexcept override {
315 int axis;
316 std::vector<int> slice_point;
317 nvinfer1::Dims in_dims;
318 const nvinfer1::PluginField *fields = fc->fields;
319 for (int i = 0; i < fc->nbFields; ++i) {
320 const char *attrName = fields[i].name;
321 if (!strcmp(attrName, "axis")) {
322 // ASSERT(fields[i].type == nvinfer1::PluginFieldType::kINT32);
323 axis = *(static_cast<const int32_t *>(fields[i].data));
324 } else if (!strcmp(attrName, "slice_point")) {
325 // ASSERT(fields[i].type == nvinfer1::PluginFieldType::kINT32);
326 int num = fields[i].length;
327 slice_point.reserve(num);
328 const auto w = static_cast<const int32_t *>(fields[i].data);
329 for (int j = 0; j < num; ++j) {
330 slice_point.push_back(w[j]);
331 }
332 } else if (!strcmp(attrName, "in_dims")) {
333 // ASSERT(fields[i].type ==nvinfer1::PluginFieldType::kDIMS);
334 in_dims = *(static_cast<const nvinfer1::Dims *>(fields[i].data));
335 }
336 }
337 SLICEPlugin *obj = new SLICEPlugin(axis, slice_point, in_dims);
338 obj->setPluginNamespace(mNamespaces.c_str());
339 return obj;
340 }
341
342 nvinfer1::IPluginV2 *deserializePlugin(
343 const char *name, const void *serial_data,
344 size_t serial_length) noexcept override {
345 return new SLICEPlugin(name, serial_data, serial_length);
346 }
347 const char *getPluginNamespace() const noexcept override { return "camera"; }
348
349 void setPluginNamespace(const char *s_name) noexcept override {
350 mNamespaces = s_name;
351 }
352 const nvinfer1::PluginFieldCollection *getFieldNames() noexcept override {
353 return nullptr;
354 }
355
356 private:
357 std::string mNamespaces = "camera";
358};
359
360REGISTER_TENSORRT_PLUGIN(SLICEPluginCreator);
361#endif
362#endif
363} // namespace inference
364} // namespace perception
365} // namespace apollo
class register implement
Definition arena_queue.h:37