20#include <NvInferVersion.h>
31#ifdef NV_TENSORRT_MAJOR
32#if NV_TENSORRT_MAJOR != 8
33class RPNProposalSSDPlugin :
public nvinfer1::IPlugin {
36 const BBoxRegParameter &bbox_reg_param,
37 const DetectionOutputSSDParameter &detection_output_ssd_param,
38 nvinfer1::Dims *in_dims) {
39 height_ = in_dims[0].d[1];
40 width_ = in_dims[0].d[2];
42 for (
int i = 0; i < 4; ++i) {
43 bbox_mean_[i] = bbox_reg_param.bbox_mean(i);
44 bbox_std_[i] = bbox_reg_param.bbox_std(i);
47 GenAnchorParameter gen_anchor_param =
48 detection_output_ssd_param.gen_anchor_param();
49 num_anchor_per_point_ = std::min(gen_anchor_param.anchor_width().size(),
50 gen_anchor_param.anchor_height().size());
51 anchor_heights_ =
new float[num_anchor_per_point_]();
52 anchor_widths_ =
new float[num_anchor_per_point_]();
53 for (
int i = 0; i < num_anchor_per_point_; ++i) {
54 anchor_heights_[i] = gen_anchor_param.anchor_height(i);
55 anchor_widths_[i] = gen_anchor_param.anchor_width(i);
58 heat_map_a_ = detection_output_ssd_param.heat_map_a();
61 static_cast<int>(detection_output_ssd_param.min_size_mode());
62 min_size_h_ = detection_output_ssd_param.min_size_h();
63 min_size_w_ = detection_output_ssd_param.min_size_w();
65 threshold_objectness_ = detection_output_ssd_param.threshold_objectness();
66 refine_out_of_map_bbox_ =
67 detection_output_ssd_param.refine_out_of_map_bbox();
69 NMSSSDParameter nms_param = detection_output_ssd_param.nms_param();
70 max_candidate_n_ = nms_param.max_candidate_n(0);
71 overlap_ratio_ = nms_param.overlap_ratio(0);
72 top_n_ = nms_param.top_n(0);
82 int nbInputDims)
override {
85 return nvinfer1::Dims4(top_n_ * 1, 5, 1, 1);
88 void configure(
const nvinfer1::Dims *inputDims,
int nbInputs,
89 const nvinfer1::Dims *outputDims,
int nbOutputs,
90 int maxBatchSize)
override {}
94 virtual int enqueue(
int batchSize,
const void *
const *inputs,
void **outputs,
95 void *workspace, cudaStream_t stream);
100 char *d =
reinterpret_cast<char *
>(buffer), *a = d;
102 CHECK_EQ(d, a + size);
106 const int thread_size_ = 512;
107 bool refine_out_of_map_bbox_ =
true;
111 float min_size_h_ = 0.0f;
112 float min_size_w_ = 0.0f;
113 float threshold_objectness_ = 0.2f;
114 float overlap_ratio_ = 0.7f;
117 int max_candidate_n_ = 3000;
118 int min_size_mode_ = 0;
119 int num_anchor_per_point_;
123 float *anchor_heights_;
124 float *anchor_widths_;
128class RPNProposalSSDPlugin :
public nvinfer1::IPluginV2Ext {
131 const BBoxRegParameter &bbox_reg_param,
132 const DetectionOutputSSDParameter &detection_output_ssd_param,
133 nvinfer1::Dims *in_dims) {
134 height_ = in_dims[0].d[1];
135 width_ = in_dims[0].d[2];
137 for (
int i = 0; i < 4; ++i) {
138 bbox_mean_[i] = bbox_reg_param.bbox_mean(i);
139 bbox_std_[i] = bbox_reg_param.bbox_std(i);
142 GenAnchorParameter gen_anchor_param =
143 detection_output_ssd_param.gen_anchor_param();
144 num_anchor_per_point_ = std::min(gen_anchor_param.anchor_width().size(),
145 gen_anchor_param.anchor_height().size());
146 anchor_heights_ =
new float[num_anchor_per_point_]();
147 anchor_widths_ =
new float[num_anchor_per_point_]();
148 for (
int i = 0; i < num_anchor_per_point_; ++i) {
149 anchor_heights_[i] = gen_anchor_param.anchor_height(i);
150 anchor_widths_[i] = gen_anchor_param.anchor_width(i);
153 heat_map_a_ = detection_output_ssd_param.heat_map_a();
156 static_cast<int>(detection_output_ssd_param.min_size_mode());
157 min_size_h_ = detection_output_ssd_param.min_size_h();
158 min_size_w_ = detection_output_ssd_param.min_size_w();
160 threshold_objectness_ = detection_output_ssd_param.threshold_objectness();
161 refine_out_of_map_bbox_ =
162 detection_output_ssd_param.refine_out_of_map_bbox();
164 NMSSSDParameter nms_param = detection_output_ssd_param.nms_param();
165 max_candidate_n_ = nms_param.max_candidate_n(0);
166 overlap_ratio_ = nms_param.overlap_ratio(0);
167 top_n_ = nms_param.top_n(0);
173 virtual int initialize() noexcept {
return 0; }
175 int32_t
getNbOutputs() const noexcept
override {
return 1; }
178 const nvinfer1::Dims *inputs, int32_t nbInputDims)
182 return nvinfer1::Dims4(top_n_ * 1, 5, 1, 1);
185 void configureWithFormat(
const nvinfer1::Dims *inputDims, int32_t nbInputs,
186 const nvinfer1::Dims *outputDims, int32_t nbOutputs,
187 nvinfer1::DataType type, nvinfer1::PluginFormat format,
188 int32_t maxBatchSize)
noexcept override {}
191 const noexcept override {
return 0; }
193 int32_t
enqueue(int32_t batchSize,
const void *
const *inputs,
194 void *
const *outputs,
void *workspace,
195 cudaStream_t stream)
noexcept override;
199 void serialize(
void *buffer)
const noexcept override {
200 char *d =
reinterpret_cast<char *
>(buffer), *a = d;
202 CHECK_EQ(d, a + size);
205 nvinfer1::AsciiChar
const* getPluginType()
206 const noexcept
override {
210 nvinfer1::AsciiChar
const* getPluginVersion()
211 const noexcept
override {
212 return plugin_version;
215 void setPluginNamespace(
const nvinfer1::AsciiChar* libNamespace)
217 plugin_namespace =
const_cast<nvinfer1::AsciiChar*
>(libNamespace);
220 nvinfer1::AsciiChar
const* getPluginNamespace()
221 const noexcept
override {
222 return const_cast<nvinfer1::AsciiChar*
>(plugin_namespace);
225 bool supportsFormat(nvinfer1::DataType type,
226 nvinfer1::PluginFormat format)
const noexcept override {
230 void destroy() noexcept
override {
234 nvinfer1::IPluginV2Ext* clone() const noexcept
override {
236 p->refine_out_of_map_bbox_ = refine_out_of_map_bbox_;
238 for (
int i = 0; i < 4; i++) {
239 p->bbox_mean_[i] = bbox_mean_[i];
241 for (
int i = 0; i < 4; i++) {
242 p->bbox_std_[i] = bbox_std_[i];
245 p->heat_map_a_ = heat_map_a_;
246 p->min_size_h_ = min_size_h_;
247 p->min_size_w_ = min_size_w_;
248 p->threshold_objectness_ = threshold_objectness_;
249 p->overlap_ratio_ = overlap_ratio_;
250 p->height_ = height_;
252 p->max_candidate_n_ = max_candidate_n_;
253 p->min_size_mode_ = min_size_mode_;
254 p->num_anchor_per_point_ = num_anchor_per_point_;
256 p->out_rois_num_ = out_rois_num_;
258 p->anchor_heights_ =
new float[num_anchor_per_point_]();
259 p->anchor_widths_ =
new float[num_anchor_per_point_]();
260 for (
int i = 0; i < num_anchor_per_point_; ++i) {
261 p->anchor_heights_[i] = anchor_heights_[i];
262 p->anchor_widths_[i] = anchor_widths_[i];
264 p->plugin_namespace = plugin_namespace;
268 bool isOutputBroadcastAcrossBatch(int32_t outputIndex,
269 bool const *inputIsBroadcasted, int32_t nbInputs)
270 const noexcept override {
274 bool canBroadcastInputAcrossBatch(int32_t inputIndex)
275 const noexcept override {
279 nvinfer1::DataType getOutputDataType(int32_t index,
280 nvinfer1::DataType
const *inputTypes, int32_t nbInputs)
const noexcept {
281 return nvinfer1::DataType::kFLOAT;
284 void configurePlugin(
285 nvinfer1::Dims
const *inputDims, int32_t nbInputs,
286 nvinfer1::Dims
const *outputDims, int32_t nbOutputs,
287 nvinfer1::DataType
const *inputTypes, nvinfer1::DataType
const *outputTypes,
288 bool const *inputIsBroadcast,
bool const *outputIsBroadcast,
289 nvinfer1::PluginFormat floatFormat, int32_t maxBatchSize)
noexcept {}
292 const int thread_size_ = 512;
293 bool refine_out_of_map_bbox_ =
true;
297 float min_size_h_ = 0.0f;
298 float min_size_w_ = 0.0f;
299 float threshold_objectness_ = 0.2f;
300 float overlap_ratio_ = 0.7f;
303 int max_candidate_n_ = 3000;
304 int min_size_mode_ = 0;
305 int num_anchor_per_point_;
309 float *anchor_heights_;
310 float *anchor_widths_;
311 nvinfer1::AsciiChar* plugin_namespace;
312 const nvinfer1::AsciiChar* plugin_type =
"";
313 const nvinfer1::AsciiChar* plugin_version =
"";
Dims getOutputDimensions(int index, const Dims *inputs, int nbInputDims) override
int getNbOutputs() const override
void serialize(void *buffer) override
virtual ~RPNProposalSSDPlugin()
RPNProposalSSDPlugin(const BBoxRegParameter &bbox_reg_param, const DetectionOutputSSDParameter &detection_output_ssd_param, Dims *in_dims)
int enqueue(int batchSize, const void *const *inputs, void **outputs, void *workspace, cudaStream_t stream) override
void terminate() override
void configure(const Dims *inputDims, int nbInputs, const Dims *outputDims, int nbOutputs, int maxBatchSize) override
int initialize() override
size_t getSerializationSize() override
size_t getWorkspaceSize(int maxBatchSize) const override