Skip to content

Commit 6bb8327

Browse files
committed
Enable parsing resize parameters from model config
1 parent ddda762 commit 6bb8327

File tree

9 files changed

+70
-36
lines changed

9 files changed

+70
-36
lines changed

src/cpp/include/tasks/detection/ssd.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class SSD {
5555
std::vector<std::string> filterOutXai(const std::vector<std::string>&);
5656

5757
std::vector<std::string> output_names = {};
58-
utils::RESIZE_MODE resize_mode = utils::RESIZE_FILL;
58+
utils::RESIZE_MODE resize_mode = utils::RESIZE_MODE::RESIZE_FILL;
5959
ov::Layout layout;
6060
cv::InterpolationFlags interpolation_mode;
6161
cv::Size input_shape;

src/cpp/include/utils/config.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,37 @@ inline bool get_from_any_maps(const std::string& key,
4242
return low_priority;
4343
}
4444

45+
enum class RESIZE_MODE {
46+
RESIZE_FILL,
47+
RESIZE_KEEP_ASPECT,
48+
RESIZE_KEEP_ASPECT_LETTERBOX,
49+
RESIZE_CROP,
50+
NO_RESIZE,
51+
};
52+
53+
inline RESIZE_MODE get_from_any_maps(const std::string& key,
54+
const ov::AnyMap& top_priority,
55+
const ov::AnyMap& mid_priority,
56+
RESIZE_MODE low_priority) {
57+
std::string resize_type = "standard";
58+
resize_type = utils::get_from_any_maps("resize_type", top_priority, mid_priority, resize_type);
59+
RESIZE_MODE resize = RESIZE_MODE::RESIZE_FILL;
60+
if ("crop" == resize_type) {
61+
resize = RESIZE_MODE::RESIZE_CROP;
62+
} else if ("standard" == resize_type) {
63+
resize = RESIZE_MODE::RESIZE_FILL;
64+
} else if ("fit_to_window" == resize_type) {
65+
resize = RESIZE_MODE::RESIZE_KEEP_ASPECT;
66+
} else if ("fit_to_window_letterbox" == resize_type) {
67+
resize = RESIZE_MODE::RESIZE_KEEP_ASPECT_LETTERBOX;
68+
} else {
69+
throw std::runtime_error("Unknown value for resize_type model parameter: " + resize_type);
70+
}
71+
72+
return resize;
73+
}
74+
75+
4576
ov::AnyMap get_config_from_onnx(const std::string& model_path);
4677

4778
void add_ov_model_info(std::shared_ptr<ov::Model> model, const ov::AnyMap& config);

src/cpp/include/utils/preprocessing.h

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,9 @@
88
#include <opencv2/opencv.hpp>
99
#include <openvino/openvino.hpp>
1010

11+
#include "utils/config.h"
12+
1113
namespace utils {
12-
enum RESIZE_MODE {
13-
RESIZE_FILL,
14-
RESIZE_KEEP_ASPECT,
15-
RESIZE_KEEP_ASPECT_LETTERBOX,
16-
RESIZE_CROP,
17-
NO_RESIZE,
18-
};
1914

2015
std::shared_ptr<ov::Model> embedProcessing(std::shared_ptr<ov::Model>& model,
2116
const std::string& inputName,
@@ -34,14 +29,6 @@ ov::preprocess::PostProcessSteps::CustomPostprocessOp createResizeGraph(RESIZE_M
3429
const cv::InterpolationFlags interpolationMode,
3530
uint8_t pad_value);
3631

37-
cv::Mat resizeImageExt(const cv::Mat& mat,
38-
int width,
39-
int height,
40-
RESIZE_MODE resizeMode = RESIZE_FILL,
41-
cv::InterpolationFlags interpolationMode = cv::INTER_LINEAR,
42-
cv::Rect* roi = nullptr,
43-
cv::Scalar BorderConstant = cv::Scalar(0, 0, 0));
44-
4532
ov::Output<ov::Node> resizeImageGraph(const ov::Output<ov::Node>& input,
4633
const ov::Shape& size,
4734
bool keep_aspect_ratio,

src/cpp/src/tasks/anomaly.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,16 @@ void Anomaly::serialize(std::shared_ptr<ov::Model>& ov_model) {
2020
const ov::Shape& shape = input.get_partial_shape().get_max_shape();
2121

2222
auto interpolation_mode = cv::INTER_LINEAR;
23-
utils::RESIZE_MODE resize_mode = utils::RESIZE_FILL;
23+
utils::RESIZE_MODE resize_mode = utils::RESIZE_MODE::RESIZE_FILL;
2424
uint8_t pad_value = 0;
2525
bool reverse_input_channels = false;
2626

2727
std::vector<float> scale_values;
2828
std::vector<float> mean_values;
2929
if (ov_model->has_rt_info("model_info")) {
3030
auto config = ov_model->get_rt_info<ov::AnyMap>("model_info");
31+
resize_mode = utils::get_from_any_maps("resize_type", config, ov::AnyMap{}, resize_mode);
32+
pad_value = utils::get_from_any_maps("pad_value", config, ov::AnyMap{}, pad_value);
3133
reverse_input_channels =
3234
utils::get_from_any_maps("reverse_input_channels", config, ov::AnyMap{}, reverse_input_channels);
3335
scale_values = utils::get_from_any_maps("scale_values", config, ov::AnyMap{}, scale_values);

src/cpp/src/tasks/classification.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,18 @@ void Classification::serialize(std::shared_ptr<ov::Model>& ov_model) {
105105
const ov::Layout& inputLayout = utils::getInputLayout(input, inputsLayouts);
106106

107107
auto interpolation_mode = cv::INTER_LINEAR;
108-
utils::RESIZE_MODE resize_mode = utils::RESIZE_FILL;
108+
utils::RESIZE_MODE resize_mode = utils::RESIZE_MODE::RESIZE_FILL;
109+
resize_mode = utils::get_from_any_maps("resize_type", config, ov::AnyMap{}, resize_mode);
109110

110111
std::vector<float> scale_values;
111112
std::vector<float> mean_values;
112113
scale_values = utils::get_from_any_maps("scale_values", config, ov::AnyMap{}, scale_values);
113114
mean_values = utils::get_from_any_maps("mean_values", config, ov::AnyMap{}, mean_values);
114115
uint8_t pad_value = 0;
116+
pad_value = utils::get_from_any_maps("pad_value", config, ov::AnyMap{}, pad_value);
115117
bool reverse_input_channels = false;
118+
reverse_input_channels =
119+
utils::get_from_any_maps("reverse_input_channels", config, ov::AnyMap{}, reverse_input_channels);
116120

117121
auto input_shape =
118122
ov::Shape{inputShape[ov::layout::width_idx(inputLayout)], inputShape[ov::layout::height_idx(inputLayout)]};

src/cpp/src/tasks/detection/ssd.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,22 +81,26 @@ void SSD::serialize(std::shared_ptr<ov::Model>& ov_model) {
8181
layout = utils::getLayoutFromShape(input_tensor.get_partial_shape());
8282
}
8383

84+
auto config = ov_model->has_rt_info("model_info") ? ov_model->get_rt_info<ov::AnyMap>("model_info") : ov::AnyMap{};
85+
8486
auto interpolation_mode = cv::INTER_LINEAR;
85-
utils::RESIZE_MODE resize_mode = utils::RESIZE_FILL;
87+
utils::RESIZE_MODE resize_mode = utils::RESIZE_MODE::RESIZE_FILL;
88+
resize_mode = utils::get_from_any_maps("resize_type", config, ov::AnyMap{}, resize_mode);
8689

8790
auto shape = input_tensor.get_partial_shape().get_max_shape();
8891

8992
auto input_shape = ov::Shape{shape[ov::layout::width_idx(layout)], shape[ov::layout::height_idx(layout)]};
9093
uint8_t pad_value = 0;
91-
92-
auto config = ov_model->has_rt_info("model_info") ? ov_model->get_rt_info<ov::AnyMap>("model_info") : ov::AnyMap{};
94+
pad_value = utils::get_from_any_maps("pad_value", config, ov::AnyMap{}, pad_value);
9395

9496
std::vector<float> scale_values;
9597
std::vector<float> mean_values;
9698
scale_values = utils::get_from_any_maps("scale_values", config, ov::AnyMap{}, scale_values);
9799
mean_values = utils::get_from_any_maps("mean_values", config, ov::AnyMap{}, mean_values);
98100

99101
bool reverse_input_channels = false;
102+
reverse_input_channels =
103+
utils::get_from_any_maps("reverse_input_channels", config, ov::AnyMap{}, reverse_input_channels);
100104

101105
ov_model = utils::embedProcessing(ov_model,
102106
input_tensor.get_any_name(),
@@ -204,9 +208,9 @@ DetectionResult SSD::postprocessMultipleOutputs(InferenceResult& infResult) {
204208
float invertedScaleX = floatInputImgWidth / input_shape.width,
205209
invertedScaleY = floatInputImgHeight / input_shape.height;
206210
int padLeft = 0, padTop = 0;
207-
if (utils::RESIZE_KEEP_ASPECT == resize_mode || utils::RESIZE_KEEP_ASPECT_LETTERBOX == resize_mode) {
211+
if (utils::RESIZE_MODE::RESIZE_KEEP_ASPECT == resize_mode || utils::RESIZE_MODE::RESIZE_KEEP_ASPECT_LETTERBOX == resize_mode) {
208212
invertedScaleX = invertedScaleY = std::max(invertedScaleX, invertedScaleY);
209-
if (utils::RESIZE_KEEP_ASPECT_LETTERBOX == resize_mode) {
213+
if (utils::RESIZE_MODE::RESIZE_KEEP_ASPECT_LETTERBOX == resize_mode) {
210214
padLeft = (input_shape.width - int(std::round(floatInputImgWidth / invertedScaleX))) / 2;
211215
padTop = (input_shape.height - int(std::round(floatInputImgHeight / invertedScaleY))) / 2;
212216
}

src/cpp/src/tasks/instance_segmentation.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,15 @@ void InstanceSegmentation::serialize(std::shared_ptr<ov::Model>& ov_model) {
141141
}
142142

143143
auto interpolation_mode = cv::INTER_LINEAR;
144-
utils::RESIZE_MODE resize_mode = utils::RESIZE_FILL;
144+
utils::RESIZE_MODE resize_mode = utils::RESIZE_MODE::RESIZE_FILL;
145+
resize_mode = utils::get_from_any_maps("resize_type", config, ov::AnyMap{}, resize_mode);
145146

146147
std::vector<float> scale_values;
147148
std::vector<float> mean_values;
148149
scale_values = utils::get_from_any_maps("scale_values", config, ov::AnyMap{}, scale_values);
149150
mean_values = utils::get_from_any_maps("mean_values", config, ov::AnyMap{}, mean_values);
150151
uint8_t pad_value = 0;
152+
pad_value = utils::get_from_any_maps("pad_value", config, ov::AnyMap{}, pad_value);
151153
bool reverse_input_channels = false;
152154
reverse_input_channels =
153155
utils::get_from_any_maps("reverse_input_channels", config, ov::AnyMap{}, reverse_input_channels);
@@ -232,10 +234,10 @@ InstanceSegmentationResult InstanceSegmentation::postprocess(InferenceResult& in
232234
float invertedScaleX = floatInputImgWidth / input_shape.width,
233235
invertedScaleY = floatInputImgHeight / input_shape.height;
234236
int padLeft = 0, padTop = 0;
235-
auto resizeMode = utils::RESIZE_FILL;
236-
if (utils::RESIZE_KEEP_ASPECT == resizeMode || utils::RESIZE_KEEP_ASPECT_LETTERBOX == resizeMode) {
237+
auto resizeMode = utils::RESIZE_MODE::RESIZE_FILL;
238+
if (utils::RESIZE_MODE::RESIZE_KEEP_ASPECT == resizeMode || utils::RESIZE_MODE::RESIZE_KEEP_ASPECT_LETTERBOX == resizeMode) {
237239
invertedScaleX = invertedScaleY = std::max(invertedScaleX, invertedScaleY);
238-
if (utils::RESIZE_KEEP_ASPECT_LETTERBOX == resizeMode) {
240+
if (utils::RESIZE_MODE::RESIZE_KEEP_ASPECT_LETTERBOX == resizeMode) {
239241
padLeft = (input_shape.width - int(std::round(floatInputImgWidth / invertedScaleX))) / 2;
240242
padTop = (input_shape.height - int(std::round(floatInputImgHeight / invertedScaleY))) / 2;
241243
}

src/cpp/src/tasks/semantic_segmentation.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,16 @@ void SemanticSegmentation::serialize(std::shared_ptr<ov::Model>& ov_model) {
8080
throw std::runtime_error("No output containing segmentation masks found");
8181
}
8282

83+
auto config = ov_model->has_rt_info("model_info") ? ov_model->get_rt_info<ov::AnyMap>("model_info") : ov::AnyMap{};
84+
8385
auto interpolation_mode = cv::INTER_LINEAR;
84-
utils::RESIZE_MODE resize_mode = utils::RESIZE_FILL;
86+
utils::RESIZE_MODE resize_mode = utils::RESIZE_MODE::RESIZE_FILL;
87+
resize_mode = utils::get_from_any_maps("resize_type", config, ov::AnyMap{}, resize_mode);
8588
uint8_t pad_value = 0;
89+
pad_value = utils::get_from_any_maps("pad_value", config, ov::AnyMap{}, pad_value);
8690
bool reverse_input_channels = false;
87-
88-
auto config = ov_model->has_rt_info("model_info") ? ov_model->get_rt_info<ov::AnyMap>("model_info") : ov::AnyMap{};
91+
reverse_input_channels =
92+
utils::get_from_any_maps("reverse_input_channels", config, ov::AnyMap{}, reverse_input_channels);
8993

9094
std::vector<float> scale_values;
9195
std::vector<float> mean_values;

src/cpp/src/utils/preprocessing.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ std::shared_ptr<ov::Model> embedProcessing(std::shared_ptr<ov::Model>& model,
3232

3333
ppp.input(inputName).tensor().set_layout(ov::Layout("NHWC")).set_color_format(ov::preprocess::ColorFormat::BGR);
3434

35-
if (resize_mode != NO_RESIZE) {
35+
if (resize_mode != RESIZE_MODE::NO_RESIZE) {
3636
ppp.input(inputName).tensor().set_spatial_dynamic_shape();
3737
// Doing resize in u8 is more efficient than FP32 but can lead to slightly different results
3838
ppp.input(inputName).preprocess().custom(
@@ -65,28 +65,28 @@ ov::preprocess::PostProcessSteps::CustomPostprocessOp createResizeGraph(RESIZE_M
6565
const cv::InterpolationFlags interpolationMode,
6666
uint8_t pad_value) {
6767
switch (resizeMode) {
68-
case RESIZE_FILL:
68+
case RESIZE_MODE::RESIZE_FILL:
6969
return [=](const ov::Output<ov::Node>& node) {
7070
return resizeImageGraph(node, size, false, interpolationMode, pad_value);
7171
};
7272
break;
73-
case RESIZE_KEEP_ASPECT:
73+
case RESIZE_MODE::RESIZE_KEEP_ASPECT:
7474
return [=](const ov::Output<ov::Node>& node) {
7575
return resizeImageGraph(node, size, true, interpolationMode, pad_value);
7676
};
7777
break;
78-
case RESIZE_KEEP_ASPECT_LETTERBOX:
78+
case RESIZE_MODE::RESIZE_KEEP_ASPECT_LETTERBOX:
7979
return [=](const ov::Output<ov::Node>& node) {
8080
return fitToWindowLetterBoxGraph(node, size, interpolationMode, pad_value);
8181
};
8282
break;
83-
case RESIZE_CROP:
83+
case RESIZE_MODE::RESIZE_CROP:
8484
return [=](const ov::Output<ov::Node>& node) {
8585
return cropResizeGraph(node, size, interpolationMode);
8686
};
8787
break;
8888
default:
89-
throw std::runtime_error("Unsupported resize mode: " + resizeMode);
89+
throw std::runtime_error("Unsupported resize mode");
9090
break;
9191
}
9292
}

0 commit comments

Comments
 (0)