19#include <NvInferVersion.h>
31#ifdef NV_TENSORRT_MAJOR
32#if NV_TENSORRT_MAJOR != 8
33class SLICEPlugin :
public nvinfer1::IPlugin {
35 SLICEPlugin(
const SliceParameter ¶m,
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));
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];
48 for (
size_t i = 0; i < slice_point_.size(); i++) {
50 out_slice_dims_.push_back(slice_point_[i]);
52 out_slice_dims_.push_back(slice_point_[i] - slice_point_[i - 1]);
55 out_slice_dims_.push_back(input_dims_.d[axis_] -
56 slice_point_[slice_point_.size() - 1]);
60 virtual int initialize() {
return 0; }
61 virtual void terminate() {}
62 int getNbOutputs()
const override {
63 return static_cast<int>(slice_point_.size()) + 1;
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];
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];
78 size_t getWorkspaceSize(
int maxBatchSize)
const override {
return 0; }
80 virtual int enqueue(
int batchSize,
const void *
const *inputs,
void **outputs,
81 void *workspace, cudaStream_t stream);
83 size_t getSerializationSize()
override {
return 0; }
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);
92 std::vector<int> slice_point_;
93 std::vector<int> out_slice_dims_;
95 nvinfer1::Dims input_dims_;
99class SLICEPlugin :
public nvinfer1::IPluginV2 {
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);
105 input_dims_.nbDims =
reinterpret_cast<const int *
>(p)[0];
106 CHECK_GT(input_dims_.nbDims, 0);
108 for (
int i = 0; i < input_dims_.nbDims; ++i) {
109 input_dims_.d[i] =
reinterpret_cast<const int *
>(p)[0];
114 size_t size =
reinterpret_cast<const size_t *
>(p)[0];
117 slice_point_.assign(
reinterpret_cast<const int *
>(p),
118 reinterpret_cast<const int *
>(p) + size);
119 p +=
sizeof(int) * size;
123 size_t size =
reinterpret_cast<const size_t *
>(p)[0];
124 CHECK(size == slice_point_.size() + 1);
126 out_slice_dims_.assign(
reinterpret_cast<const int *
>(p),
127 reinterpret_cast<const int *
>(p) + size);
128 p +=
sizeof(int) * size;
131 axis_ =
reinterpret_cast<const int *
>(p)[0];
134 CHECK(p ==
reinterpret_cast<const char *
>(serial_data) + serial_length);
135 CHECK(getSerializationSize() == serial_length);
138 SLICEPlugin(
const SliceParameter ¶m,
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));
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];
150 for (
size_t i = 0; i < slice_point_.size(); i++) {
152 out_slice_dims_.push_back(slice_point_[i]);
154 out_slice_dims_.push_back(slice_point_[i] - slice_point_[i - 1]);
157 out_slice_dims_.push_back(input_dims_.d[axis_] -
158 slice_point_[slice_point_.size() - 1]);
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]);
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];
174 for (
size_t i = 0; i < slice_point_.size(); i++) {
176 out_slice_dims_.push_back(slice_point_[i]);
178 out_slice_dims_.push_back(slice_point_[i] - slice_point_[i - 1]);
181 out_slice_dims_.push_back(input_dims_.d[axis_] -
182 slice_point_[slice_point_.size() - 1]);
186 virtual int initialize() noexcept {
return 0; }
188 virtual void terminate() noexcept {}
190 int getNbOutputs() const noexcept
override {
return slice_point_.size() + 1; }
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];
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];
207 void configure(
const nvinfer1::Dims *inputDims,
int nbInputs,
208 const nvinfer1::Dims *outputDims,
int nbOutputs,
210 input_dims_ = inputDims[0];
213 size_t getWorkspaceSize(
int maxBatchSize)
const noexcept override {
217 virtual int enqueue(
int batchSize,
void const *
const *inputs,
218 void *
const *outputs,
void *workspace,
219 cudaStream_t stream)
noexcept;
221 size_t getSerializationSize() const noexcept
override {
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_);
228 void serialize(
void *buffer)
const noexcept override {
229 char *p =
reinterpret_cast<char *
>(buffer);
232 reinterpret_cast<int *
>(p)[0] = input_dims_.nbDims;
234 for (
int i = 0; i < input_dims_.nbDims; ++i) {
235 reinterpret_cast<int *
>(p)[0] = input_dims_.d[i];
241 reinterpret_cast<size_t *
>(p)[0] = slice_point_.size();
243 for (
size_t i = 0; i < slice_point_.size(); ++i) {
244 reinterpret_cast<int *
>(p)[0] = slice_point_[i];
248 reinterpret_cast<size_t *
>(p)[0] = out_slice_dims_.size();
250 for (
size_t i = 0; i < out_slice_dims_.size(); ++i) {
251 reinterpret_cast<int *
>(p)[0] = out_slice_dims_[i];
255 reinterpret_cast<int *
>(p)[0] = axis_;
259 std::string Name()
const {
return "slice_plugin"; }
261 const char *getPluginType() const noexcept
override {
262 return "slice_plugin";
265 const char *getPluginVersion() const noexcept
override {
return "1"; }
267 bool supportsFormat(nvinfer1::DataType type,
268 nvinfer1::PluginFormat format)
const noexcept override {
279 void destroy() noexcept
override {}
281 IPluginV2 *clone() const noexcept
override {
282 return new SLICEPlugin(axis_ + 1, slice_point_, input_dims_);
285 const char *getPluginNamespace() const noexcept
override {
return "camera"; }
287 void setPluginNamespace(
const char *s_name)
noexcept override {
292 std::vector<int> slice_point_;
293 std::vector<int> out_slice_dims_;
295 const char *name_ =
"camera";
296 nvinfer1::Dims input_dims_;
297 nvinfer1::Dims output_dims_;
300class SLICEPluginCreator :
public nvinfer1::IPluginCreator {
302 SLICEPluginCreator() {}
303 ~SLICEPluginCreator() {
306 const char *getPluginName() const noexcept
override {
307 return "slice_plugincamera";
309 const char *getPluginVersion() const noexcept
override {
return "1"; }
311 const nvinfer1::PluginFieldCollection *getFiledNames() {
return nullptr; }
312 nvinfer1::IPluginV2 *createPlugin(
314 const nvinfer1::PluginFieldCollection *fc)
noexcept override {
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")) {
323 axis = *(
static_cast<const int32_t *
>(fields[i].data));
324 }
else if (!strcmp(attrName,
"slice_point")) {
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]);
332 }
else if (!strcmp(attrName,
"in_dims")) {
334 in_dims = *(
static_cast<const nvinfer1::Dims *
>(fields[i].data));
337 SLICEPlugin *obj =
new SLICEPlugin(axis, slice_point, in_dims);
338 obj->setPluginNamespace(mNamespaces.c_str());
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);
347 const char *getPluginNamespace() const noexcept
override {
return "camera"; }
349 void setPluginNamespace(
const char *s_name)
noexcept override {
350 mNamespaces = s_name;
352 const nvinfer1::PluginFieldCollection *getFieldNames() noexcept
override {
357 std::string mNamespaces =
"camera";
360REGISTER_TENSORRT_PLUGIN(SLICEPluginCreator);