@@ -131,7 +131,18 @@ std::unique_ptr<ResultBase> ModelSSD::postprocessSingleOutput(InferenceResult& i
131131 }
132132 }
133133
134- result->label_names .reserve (numAndStep.detectionsNum );
134+ size_t detections_num = 0 ;
135+ for (size_t i = 0 ; i < numAndStep.detectionsNum ; i++) {
136+ float confidence = detections[i * numAndStep.objectSize + 2 ];
137+ if (confidence > confidence_threshold) {
138+ ++detections_num;
139+ }
140+ }
141+ result->label_names .reserve (detections_num);
142+ result->labels = cv::Mat (1 , detections_num, CV_32S);
143+ result->scores = cv::Mat (1 , detections_num, CV_32F);
144+ result->bboxes = cv::Mat (1 , detections_num, CV_32FC4);
145+
135146 for (size_t i = 0 ; i < numAndStep.detectionsNum ; i++) {
136147 float image_id = detections[i * numAndStep.objectSize + 0 ];
137148 if (image_id < 0 ) {
@@ -142,11 +153,7 @@ std::unique_ptr<ResultBase> ModelSSD::postprocessSingleOutput(InferenceResult& i
142153
143154 /* * Filtering out objects with confidence < confidence_threshold probability **/
144155 if (confidence > confidence_threshold) {
145- DetectedObject desc;
146-
147- desc.confidence = confidence;
148- desc.labelID = static_cast <size_t >(detections[i * numAndStep.objectSize + 1 ]);
149- desc.label = getLabelName (desc.labelID );
156+ cv::Rect2f desc;
150157 desc.x =
151158 clamp (round ((detections[i * numAndStep.objectSize + 3 ] * netInputWidth - padLeft) * invertedScaleX),
152159 0 .f ,
@@ -165,12 +172,12 @@ std::unique_ptr<ResultBase> ModelSSD::postprocessSingleOutput(InferenceResult& i
165172 0 .f ,
166173 floatInputImgHeight) -
167174 desc.y ;
168- result->objects .push_back (desc);
169175
176+ size_t det_idx = result->label_names .size ();
170177 auto label_idx = static_cast <int >(detections[i * numAndStep.objectSize + 1 ]);
171- result->labels .at <int >(i ) = label_idx;
172- result->scores .at <float >(i ) = confidence;
173- result->bboxes .at <cv::Rect2f>(i ) = cv::Rect2f ( desc. x , desc. y , desc. width , desc. height ) ;
178+ result->labels .at <int >(det_idx ) = label_idx;
179+ result->scores .at <float >(det_idx ) = confidence;
180+ result->bboxes .at <cv::Rect2f>(det_idx ) = desc;
174181 result->label_names .push_back (getLabelName (label_idx));
175182 }
176183 }
@@ -224,11 +231,8 @@ std::unique_ptr<ResultBase> ModelSSD::postprocessMultipleOutputs(InferenceResult
224231
225232 /* * Filtering out objects with confidence < confidence_threshold probability **/
226233 if (confidence > confidence_threshold) {
227- DetectedObject desc;
234+ cv::Rect2f desc;
228235
229- desc.confidence = confidence;
230- desc.labelID = labels[i];
231- desc.label = getLabelName (desc.labelID );
232236 desc.x = clamp_and_round ((boxes[i * numAndStep.objectSize ] * widthScale - padLeft) * invertedScaleX,
233237 0 .f ,
234238 floatInputImgWidth);
@@ -248,10 +252,12 @@ std::unique_ptr<ResultBase> ModelSSD::postprocessMultipleOutputs(InferenceResult
248252 if (desc.width * desc.height >= box_area_threshold) {
249253 result->objects .push_back (desc);
250254 }
255+
256+ size_t det_idx = result->label_names .size ();
251257 auto label_idx = static_cast <int >(labels[i]);
252- result->labels .at <int >(i ) = label_idx;
253- result->scores .at <float >(i ) = confidence;
254- result->bboxes .at <cv::Rect2f>(i ) = cv::Rect2f ( desc. x , desc. y , desc. width , desc. height ) ;
258+ result->labels .at <int >(det_idx ) = label_idx;
259+ result->scores .at <float >(det_idx ) = confidence;
260+ result->bboxes .at <cv::Rect2f>(det_idx ) = desc;
255261 result->label_names .push_back (getLabelName (label_idx));
256262 }
257263 }
0 commit comments