Skip to content

Commit bc35360

Browse files
committed
Add an iterator through detections
1 parent 4c0b786 commit bc35360

File tree

3 files changed

+54
-29
lines changed

3 files changed

+54
-29
lines changed

examples/cpp/synchronous_api/main.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,11 @@ int main(int argc, char* argv[]) try {
3535
auto result = model->infer(image);
3636

3737
// Process detections
38-
for (auto& obj : result->objects) {
38+
for (auto obj : *result) {
3939
std::cout << " " << std::left << std::setw(9) << obj.label << " | " << std::setw(10) << obj.confidence << " | "
4040
<< std::setw(4) << int(obj.x) << " | " << std::setw(4) << int(obj.y) << " | " << std::setw(4)
4141
<< int(obj.x + obj.width) << " | " << std::setw(4) << int(obj.y + obj.height) << "\n";
4242
}
43-
44-
// could be improved with an iterator
45-
for (size_t i = 0; i < result->size(); ++i) {
46-
std::cout << result->getDetection(i) << "\n";
47-
}
48-
4943
} catch (const std::exception& error) {
5044
std::cerr << error.what() << '\n';
5145
return 1;

src/cpp/models/include/models/results.h

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,20 +165,45 @@ struct DetectionResult : public ResultBase {
165165
DetectionResult(int64_t frameId = -1, const std::shared_ptr<MetaData>& metaData = nullptr)
166166
: ResultBase(frameId, metaData) {}
167167

168-
// memory to forward as np.array
169168
cv::Mat_<float> scores;
170169
cv::Mat_<float> bboxes;
171170
cv::Mat_<int> labels;
172171
std::vector<std::string> label_names;
173-
174-
std::vector<DetectedObject> objects; // to remove
175172
ov::Tensor saliency_map, feature_vector; // Contain "saliency_map" and "feature_vector" model outputs if such exist
176173

174+
struct DetectionIterator {
175+
const DetectionResult& result;
176+
size_t index;
177+
178+
DetectionIterator(const DetectionResult& result, size_t index) : result(result), index(index) {}
179+
180+
bool operator!=(const DetectionIterator& other) const {
181+
return index != other.index;
182+
}
183+
184+
DetectionIterator& operator++() {
185+
++index;
186+
return *this;
187+
}
188+
189+
DetectedObject operator*() const {
190+
return result.getObject(index);
191+
}
192+
};
193+
194+
DetectionIterator begin() const {
195+
return DetectionIterator(*this, 0);
196+
}
197+
198+
DetectionIterator end() const {
199+
return DetectionIterator(*this, size());
200+
}
201+
177202
size_t size() const {
178203
return label_names.size();
179204
}
180205

181-
DetectedObject getDetection(size_t idx) {
206+
DetectedObject getObject(size_t idx) const {
182207
DetectedObject result(bboxes.at<cv::Rect2f>(idx));
183208
result.labelID = labels.at<size_t>(idx);
184209
result.label = label_names[idx];
@@ -187,7 +212,7 @@ struct DetectionResult : public ResultBase {
187212
}
188213

189214
friend std::ostream& operator<<(std::ostream& os, const DetectionResult& prediction) {
190-
for (const DetectedObject& obj : prediction.objects) {
215+
for (const DetectedObject obj : prediction) {
191216
os << obj << "; ";
192217
}
193218
try {

src/cpp/models/src/detection_model_ssd.cpp

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)