20#include <NvInferVersion.h>
29#ifdef NV_TENSORRT_MAJOR
30#if NV_TENSORRT_MAJOR != 8
31class RCNNProposalPlugin :
public nvinfer1::IPlugin {
34 const BBoxRegParameter &bbox_reg_param,
35 const DetectionOutputSSDParameter &detection_output_ssd_param,
36 nvinfer1::Dims *in_dims) {
37 num_rois_ = in_dims[2].d[0];
39 for (
int i = 0; i < 4; ++i) {
40 bbox_mean_[i] = bbox_reg_param.bbox_mean(i);
41 bbox_std_[i] = bbox_reg_param.bbox_std(i);
45 static_cast<int>(detection_output_ssd_param.min_size_mode());
46 min_size_h_ = detection_output_ssd_param.min_size_h();
47 min_size_w_ = detection_output_ssd_param.min_size_w();
49 num_class_ = detection_output_ssd_param.num_class();
50 refine_out_of_map_bbox_ =
51 detection_output_ssd_param.refine_out_of_map_bbox();
52 regress_agnostic_ = detection_output_ssd_param.regress_agnostic();
53 rpn_proposal_output_score_ =
54 detection_output_ssd_param.rpn_proposal_output_score();
56 threshold_objectness_ = detection_output_ssd_param.threshold_objectness();
57 for (
int i = 0; i < num_class_; ++i) {
58 thresholds_.push_back(detection_output_ssd_param.threshold(i));
61 NMSSSDParameter nms_param = detection_output_ssd_param.nms_param();
62 max_candidate_n_ = nms_param.max_candidate_n(0);
63 overlap_ratio_ = nms_param.overlap_ratio(0);
64 top_n_ = nms_param.top_n(0);
66 out_channel_ = rpn_proposal_output_score_ ? 9 : 5;
76 int nbInputDims)
override {
79 return nvinfer1::Dims4(top_n_ * 1, out_channel_, 1, 1);
82 void configure(
const nvinfer1::Dims *inputDims,
int nbInputs,
83 const nvinfer1::Dims *outputDims,
int nbOutputs,
84 int maxBatchSize)
override {}
88 virtual int enqueue(
int batchSize,
const void *
const *inputs,
void **outputs,
89 void *workspace, cudaStream_t stream);
94 char *d =
reinterpret_cast<char *
>(buffer), *a = d;
96 CHECK_EQ(d, a + size);
100 const int thread_size_ = 512;
101 bool refine_out_of_map_bbox_ =
true;
103 bool regress_agnostic_ =
false;
104 bool rpn_proposal_output_score_ =
true;
110 float threshold_objectness_;
111 float overlap_ratio_;
114 int max_candidate_n_;
120 std::vector<float> thresholds_{};
124class RCNNProposalPlugin :
public nvinfer1::IPluginV2Ext {
127 const BBoxRegParameter &bbox_reg_param,
128 const DetectionOutputSSDParameter &detection_output_ssd_param,
129 nvinfer1::Dims *in_dims) {
130 num_rois_ = in_dims[2].d[0];
132 for (
int i = 0; i < 4; ++i) {
133 bbox_mean_[i] = bbox_reg_param.bbox_mean(i);
134 bbox_std_[i] = bbox_reg_param.bbox_std(i);
138 static_cast<int>(detection_output_ssd_param.min_size_mode());
139 min_size_h_ = detection_output_ssd_param.min_size_h();
140 min_size_w_ = detection_output_ssd_param.min_size_w();
142 num_class_ = detection_output_ssd_param.num_class();
143 refine_out_of_map_bbox_ =
144 detection_output_ssd_param.refine_out_of_map_bbox();
145 regress_agnostic_ = detection_output_ssd_param.regress_agnostic();
146 rpn_proposal_output_score_ =
147 detection_output_ssd_param.rpn_proposal_output_score();
149 threshold_objectness_ = detection_output_ssd_param.threshold_objectness();
150 for (
int i = 0; i < num_class_; ++i) {
151 thresholds_.push_back(detection_output_ssd_param.threshold(i));
154 NMSSSDParameter nms_param = detection_output_ssd_param.nms_param();
155 max_candidate_n_ = nms_param.max_candidate_n(0);
156 overlap_ratio_ = nms_param.overlap_ratio(0);
157 top_n_ = nms_param.top_n(0);
159 out_channel_ = rpn_proposal_output_score_ ? 9 : 5;
165 virtual int initialize() noexcept {
return 0; }
167 int32_t
getNbOutputs() const noexcept
override {
return 1; }
170 const nvinfer1::Dims *inputs, int32_t nbInputDims)
174 return nvinfer1::Dims4(top_n_ * 1, out_channel_, 1, 1);
177 void configureWithFormat(
const nvinfer1::Dims *inputDims, int32_t nbInputs,
178 const nvinfer1::Dims *outputDims, int32_t nbOutputs,
179 nvinfer1::DataType type, nvinfer1::PluginFormat format,
180 int32_t maxBatchSize)
noexcept override {}
183 const noexcept override {
return 0; }
185 int32_t
enqueue(int32_t batchSize,
const void *
const *inputs,
186 void *
const *outputs,
void *workspace, cudaStream_t stream)
191 void serialize(
void *buffer)
const noexcept override {
192 char *d =
reinterpret_cast<char *
>(buffer), *a = d;
194 CHECK_EQ(d, a + size);
197 nvinfer1::AsciiChar
const* getPluginType()
198 const noexcept
override {
202 nvinfer1::AsciiChar
const* getPluginVersion()
203 const noexcept
override {
204 return plugin_version;
207 void setPluginNamespace(
const nvinfer1::AsciiChar* libNamespace)
209 plugin_namespace =
const_cast<nvinfer1::AsciiChar*
>(libNamespace);
212 nvinfer1::AsciiChar
const* getPluginNamespace()
213 const noexcept
override {
214 return const_cast<nvinfer1::AsciiChar*
>(plugin_namespace);
217 bool supportsFormat(nvinfer1::DataType type,
218 nvinfer1::PluginFormat format)
219 const noexcept override {
223 void destroy() noexcept
override {
227 nvinfer1::IPluginV2Ext* clone() const noexcept
override {
229 p->refine_out_of_map_bbox_ = refine_out_of_map_bbox_;
230 p->regress_agnostic_ = regress_agnostic_;
231 p->rpn_proposal_output_score_ = rpn_proposal_output_score_;
233 for (
int i = 0; i < 4; i++) {
234 p->bbox_mean_[i] = bbox_mean_[i];
236 for (
int i = 0; i < 4; i++) {
237 p->bbox_std_[i] = bbox_std_[i];
240 p->min_size_h_ = min_size_h_;
241 p->min_size_w_ = min_size_w_;
242 p->threshold_objectness_ = threshold_objectness_;
243 p->overlap_ratio_ = overlap_ratio_;
244 p->num_class_ = num_class_;
245 p->num_rois_ = num_rois_;
246 p->max_candidate_n_ = max_candidate_n_;
247 p->min_size_mode_ = min_size_mode_;
249 p->out_channel_ = out_channel_;
250 p->acc_box_num_ = acc_box_num_;
252 for (
size_t i = 0; i < thresholds_.size(); i++) {
253 p->thresholds_.push_back(thresholds_[i]);
256 p->plugin_namespace = plugin_namespace;
260 nvinfer1::DataType getOutputDataType(int32_t index,
261 nvinfer1::DataType
const *inputTypes, int32_t nbInputs)
263 return nvinfer1::DataType::kFLOAT;
266 bool isOutputBroadcastAcrossBatch(int32_t outputIndex,
267 bool const *inputIsBroadcasted, int32_t nbInputs)
268 const noexcept override {
272 bool canBroadcastInputAcrossBatch(int32_t inputIndex)
273 const noexcept override {
277 void configurePlugin(
278 nvinfer1::Dims
const *inputDims, int32_t nbInputs,
279 nvinfer1::Dims
const *outputDims, int32_t nbOutputs,
280 nvinfer1::DataType
const *inputTypes,
281 nvinfer1::DataType
const *outputTypes,
bool const *inputIsBroadcast,
282 bool const *outputIsBroadcast,
283 nvinfer1::PluginFormat floatFormat,
284 int32_t maxBatchSize)
noexcept {}
287 const int thread_size_ = 512;
288 bool refine_out_of_map_bbox_ =
true;
290 bool regress_agnostic_ =
false;
291 bool rpn_proposal_output_score_ =
true;
297 float threshold_objectness_;
298 float overlap_ratio_;
301 int max_candidate_n_;
307 std::vector<float> thresholds_{};
309 nvinfer1::AsciiChar* plugin_namespace;
310 const nvinfer1::AsciiChar* plugin_type =
"";
311 const nvinfer1::AsciiChar* plugin_version =
"";
int getNbOutputs() const override
size_t getWorkspaceSize(int maxBatchSize) const override
void configure(const Dims *inputDims, int nbInputs, const Dims *outputDims, int nbOutputs, int maxBatchSize) override
size_t getSerializationSize() override
Dims getOutputDimensions(int index, const Dims *inputs, int nbInputDims) override
int enqueue(int batchSize, const void *const *inputs, void **outputs, void *workspace, cudaStream_t stream) override
int initialize() override
void terminate() override
void serialize(void *buffer) override
RCNNProposalPlugin(const BBoxRegParameter &bbox_reg_param, const DetectionOutputSSDParameter &detection_output_ssd_param, Dims *in_dims)
virtual ~RCNNProposalPlugin()