| 164 | } |
| 165 | |
| 166 | DimsExprs EfficientNMSPlugin::getOutputDimensions( |
| 167 | int32_t outputIndex, DimsExprs const* inputs, int32_t nbInputs, IExprBuilder& exprBuilder) noexcept |
| 168 | { |
| 169 | try |
| 170 | { |
| 171 | DimsExprs out_dim; |
| 172 | |
| 173 | // When pad per class is set, the output size may need to be reduced: |
| 174 | // i.e.: outputBoxes = min(outputBoxes, outputBoxesPerClass * numClasses) |
| 175 | // As the number of classes may not be static, numOutputBoxes must be a dynamic |
| 176 | // expression. The corresponding parameter can not be set at this time, so the |
| 177 | // value will be calculated again in configurePlugin() and the param overwritten. |
| 178 | IDimensionExpr const* numOutputBoxes = exprBuilder.constant(mParam.numOutputBoxes); |
| 179 | if (mParam.padOutputBoxesPerClass && mParam.numOutputBoxesPerClass > 0) |
| 180 | { |
| 181 | IDimensionExpr const* numOutputBoxesPerClass = exprBuilder.constant(mParam.numOutputBoxesPerClass); |
| 182 | IDimensionExpr const* numClasses = inputs[1].d[2]; |
| 183 | numOutputBoxes = exprBuilder.operation(DimensionOperation::kMIN, *numOutputBoxes, |
| 184 | *exprBuilder.operation(DimensionOperation::kPROD, *numOutputBoxesPerClass, *numClasses)); |
| 185 | } |
| 186 | |
| 187 | if (mParam.outputONNXIndices) |
| 188 | { |
| 189 | // ONNX NMS |
| 190 | PLUGIN_ASSERT(outputIndex == 0); |
| 191 | |
| 192 | // detection_indices |
| 193 | out_dim.nbDims = 2; |
| 194 | out_dim.d[0] = exprBuilder.operation(DimensionOperation::kPROD, *inputs[0].d[0], *numOutputBoxes); |
| 195 | out_dim.d[1] = exprBuilder.constant(3); |
| 196 | } |
| 197 | else |
| 198 | { |
| 199 | // Standard NMS |
| 200 | PLUGIN_ASSERT(outputIndex >= 0 && outputIndex <= 3); |
| 201 | |
| 202 | // num_detections |
| 203 | if (outputIndex == 0) |
| 204 | { |
| 205 | out_dim.nbDims = 2; |
| 206 | out_dim.d[0] = inputs[0].d[0]; |
| 207 | out_dim.d[1] = exprBuilder.constant(1); |
| 208 | } |
| 209 | // detection_boxes |
| 210 | else if (outputIndex == 1) |
| 211 | { |
| 212 | out_dim.nbDims = 3; |
| 213 | out_dim.d[0] = inputs[0].d[0]; |
| 214 | out_dim.d[1] = numOutputBoxes; |
| 215 | out_dim.d[2] = exprBuilder.constant(4); |
| 216 | } |
| 217 | // detection_scores: outputIndex == 2 |
| 218 | // detection_classes: outputIndex == 3 |
| 219 | else if (outputIndex == 2 || outputIndex == 3) |
| 220 | { |
| 221 | out_dim.nbDims = 2; |
| 222 | out_dim.d[0] = inputs[0].d[0]; |
| 223 | out_dim.d[1] = numOutputBoxes; |
nothing calls this directly
no test coverage detected