18
18
#include " plugin.h"
19
19
#include < cuda_runtime_api.h>
20
20
#include < iostream>
21
+ #include < algorithm>
21
22
#include < math.h>
22
23
23
24
#include < fstream>
@@ -43,6 +44,7 @@ MultilevelProposeROIPluginCreator::MultilevelProposeROIPluginCreator()
43
44
mPluginAttributes .emplace_back (PluginField (" keep_topk" , nullptr , PluginFieldType::kINT32 , 1 ));
44
45
mPluginAttributes .emplace_back (PluginField (" fg_threshold" , nullptr , PluginFieldType::kFLOAT32 , 1 ));
45
46
mPluginAttributes .emplace_back (PluginField (" iou_threshold" , nullptr , PluginFieldType::kFLOAT32 , 1 ));
47
+ mPluginAttributes .emplace_back (PluginField (" image_size" , nullptr , PluginFieldType::kINT32 , 3 ));
46
48
47
49
mFC .nbFields = mPluginAttributes .size ();
48
50
mFC .fields = mPluginAttributes .data ();
@@ -65,6 +67,7 @@ const PluginFieldCollection* MultilevelProposeROIPluginCreator::getFieldNames()
65
67
66
68
IPluginV2Ext* MultilevelProposeROIPluginCreator::createPlugin (const char * name, const PluginFieldCollection* fc)
67
69
{
70
+ auto image_size = TLTMaskRCNNConfig::IMAGE_SHAPE;
68
71
const PluginField* fields = fc->fields ;
69
72
for (int i = 0 ; i < fc->nbFields ; ++i)
70
73
{
@@ -89,20 +92,27 @@ IPluginV2Ext* MultilevelProposeROIPluginCreator::createPlugin(const char* name,
89
92
assert (fields[i].type == PluginFieldType::kFLOAT32 );
90
93
mIOUThreshold = *(static_cast <const float *>(fields[i].data ));
91
94
}
95
+ if (!strcmp (attrName, " image_size" ))
96
+ {
97
+ assert (fields[i].type == PluginFieldType::kINT32 );
98
+ const auto dims = static_cast <const int32_t *>(fields[i].data );
99
+ std::copy_n (dims, 3 , image_size.d );
100
+ }
92
101
}
93
- return new MultilevelProposeROI (mPreNMSTopK , mKeepTopK , mFGThreshold , mIOUThreshold );
102
+ return new MultilevelProposeROI (mPreNMSTopK , mKeepTopK , mFGThreshold , mIOUThreshold , image_size );
94
103
};
95
104
96
105
IPluginV2Ext* MultilevelProposeROIPluginCreator::deserializePlugin (const char * name, const void * data, size_t length)
97
106
{
98
107
return new MultilevelProposeROI (data, length);
99
108
};
100
109
101
- MultilevelProposeROI::MultilevelProposeROI (int prenms_topk, int keep_topk, float fg_threshold, float iou_threshold)
110
+ MultilevelProposeROI::MultilevelProposeROI (int prenms_topk, int keep_topk, float fg_threshold, float iou_threshold, const nvinfer1::Dims image_size )
102
111
: mPreNMSTopK(prenms_topk)
103
112
, mKeepTopK(keep_topk)
104
113
, mFGThreshold(fg_threshold)
105
114
, mIOUThreshold(iou_threshold)
115
+ , mImageSize(image_size)
106
116
{
107
117
mBackgroundLabel = -1 ;
108
118
assert (mPreNMSTopK > 0 );
@@ -121,7 +131,7 @@ MultilevelProposeROI::MultilevelProposeROI(int prenms_topk, int keep_topk, float
121
131
122
132
mFeatureCnt = TLTMaskRCNNConfig::MAX_LEVEL - TLTMaskRCNNConfig::MIN_LEVEL + 1 ;
123
133
124
- generate_pyramid_anchors ();
134
+ generate_pyramid_anchors (mImageSize );
125
135
};
126
136
127
137
int MultilevelProposeROI::getNbOutputs () const
@@ -224,7 +234,7 @@ const char* MultilevelProposeROI::getPluginNamespace() const
224
234
225
235
size_t MultilevelProposeROI::getSerializationSize () const
226
236
{
227
- return sizeof (int ) * 2 + sizeof (float ) * 2 + sizeof (int ) * (mFeatureCnt + 1 );
237
+ return sizeof (int ) * 2 + sizeof (float ) * 2 + sizeof (int ) * (mFeatureCnt + 1 ) + sizeof (nvinfer1::Dims) ;
228
238
};
229
239
230
240
void MultilevelProposeROI::serialize (void * buffer) const
@@ -239,6 +249,7 @@ void MultilevelProposeROI::serialize(void* buffer) const
239
249
{
240
250
write (d, mAnchorsCnt [i]);
241
251
}
252
+ write (d, mImageSize );
242
253
ASSERT (d == a + getSerializationSize ());
243
254
};
244
255
@@ -257,6 +268,7 @@ MultilevelProposeROI::MultilevelProposeROI(const void* data, size_t length)
257
268
{
258
269
mAnchorsCnt .push_back (read <int >(d));
259
270
}
271
+ mImageSize = read <nvinfer1::Dims3>(d);
260
272
ASSERT (d == a + length);
261
273
262
274
mBackgroundLabel = -1 ;
@@ -273,7 +285,7 @@ MultilevelProposeROI::MultilevelProposeROI(const void* data, size_t length)
273
285
274
286
mType = DataType::kFLOAT ;
275
287
276
- generate_pyramid_anchors ();
288
+ generate_pyramid_anchors (mImageSize );
277
289
};
278
290
279
291
void MultilevelProposeROI::check_valid_inputs (const nvinfer1::Dims* inputs, int nbInputDims)
@@ -329,9 +341,9 @@ Dims MultilevelProposeROI::getOutputDimensions(int index, const Dims* inputs, in
329
341
return proposals;
330
342
}
331
343
332
- void MultilevelProposeROI::generate_pyramid_anchors ()
344
+ void MultilevelProposeROI::generate_pyramid_anchors (const nvinfer1::Dims& image_size )
333
345
{
334
- const auto image_dims = TLTMaskRCNNConfig::IMAGE_SHAPE ;
346
+ const auto image_dims = image_size ;
335
347
336
348
const auto & anchor_scale = TLTMaskRCNNConfig::RPN_ANCHOR_SCALE;
337
349
const auto & min_level = TLTMaskRCNNConfig::MIN_LEVEL;
@@ -388,23 +400,18 @@ int MultilevelProposeROI::enqueue(
388
400
{
389
401
390
402
MultilevelProposeROIWorkSpace proposal_ws (batch_size, mAnchorsCnt [i], mPreNMSTopK , mParam , mType );
391
- status = MultilevelPropose (stream,
392
- batch_size,
393
- mAnchorsCnt [i],
394
- mPreNMSTopK ,
395
- static_cast <float *>(mRegWeightDevice ->mPtr ),
396
- static_cast <float >(TLTMaskRCNNConfig::IMAGE_SHAPE.d [1 ]), // Input Height
397
- static_cast <float >(TLTMaskRCNNConfig::IMAGE_SHAPE.d [2 ]),
398
- DataType::kFLOAT , // mType,
399
- mParam ,
400
- proposal_ws,
401
- workspace + kernel_workspace_offset,
402
- inputs[2 *i + 1 ], // inputs[object_score],
403
- inputs[2 *i], // inputs[bbox_delta]
404
- mValidCnt ->mPtr ,
405
- mAnchorBoxesDevice [i]->mPtr , // inputs[anchors]
406
- mTempScores [i]->mPtr , // temp scores [batch_size, topk, 1]
407
- mTempBboxes [i]->mPtr ); // temp
403
+ status = MultilevelPropose (stream, batch_size, mAnchorsCnt [i], mPreNMSTopK ,
404
+ static_cast <float *>(mRegWeightDevice ->mPtr ),
405
+ static_cast <float >(mImageSize .d [1 ]), // Input Height
406
+ static_cast <float >(mImageSize .d [2 ]),
407
+ DataType::kFLOAT , // mType,
408
+ mParam , proposal_ws, workspace + kernel_workspace_offset,
409
+ inputs[2 * i + 1 ], // inputs[object_score],
410
+ inputs[2 * i], // inputs[bbox_delta]
411
+ mValidCnt ->mPtr ,
412
+ mAnchorBoxesDevice [i]->mPtr , // inputs[anchors]
413
+ mTempScores [i]->mPtr , // temp scores [batch_size, topk, 1]
414
+ mTempBboxes [i]->mPtr ); // temp
408
415
assert (status == cudaSuccess);
409
416
kernel_workspace_offset += proposal_ws.totalSize ;
410
417
}
0 commit comments