Skip to content

Commit 41c2026

Browse files
authored
Don't rely on outputs order from adapter in cls wrapper (#165)
* Filter cls outputs when using inference adapter * Add a cls model with unordered outputs to test data * Fix black * Fix mean values missing in embedProcessing
1 parent dd0fb53 commit 41c2026

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

model_api/cpp/models/src/classification_model.cpp

+27-1
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,20 @@ std::vector<std::string> get_non_xai_names(const std::vector<ov::Output<ov::Node
158158
return outputNames;
159159
}
160160

161+
std::vector<std::string> get_non_xai_names(const std::vector<std::string>& outputs) {
162+
std::vector<std::string> outputNames;
163+
outputNames.reserve(std::max(1, int(outputs.size()) - 2));
164+
for (const auto& output : outputs) {
165+
if (output.find(saliency_map_name) != std::string::npos) {
166+
continue;
167+
} if (output.find(feature_vector_name) != std::string::npos) {
168+
continue;
169+
}
170+
outputNames.push_back(output);
171+
}
172+
return outputNames;
173+
}
174+
161175
void append_xai_names(const std::vector<ov::Output<ov::Node>>& outputs, std::vector<std::string>& outputNames) {
162176
for (const ov::Output<ov::Node>& output : outputs) {
163177
if (output.get_names().count(saliency_map_name) > 0) {
@@ -167,6 +181,16 @@ void append_xai_names(const std::vector<ov::Output<ov::Node>>& outputs, std::vec
167181
}
168182
}
169183
}
184+
185+
void append_xai_names(const std::vector<std::string>& outputs, std::vector<std::string>& outputNames) {
186+
for (const auto& output : outputs) {
187+
if (output.find(saliency_map_name) != std::string::npos) {
188+
outputNames.emplace_back(saliency_map_name);
189+
} else if (output.find(feature_vector_name) != std::string::npos) {
190+
outputNames.push_back(feature_vector_name);
191+
}
192+
}
193+
}
170194
}
171195

172196
void ClassificationModel::init_from_config(const ov::AnyMap& top_priority, const ov::AnyMap& mid_priority) {
@@ -192,6 +216,8 @@ ClassificationModel::ClassificationModel(std::shared_ptr<ov::Model>& model, cons
192216

193217
ClassificationModel::ClassificationModel(std::shared_ptr<InferenceAdapter>& adapter)
194218
: ImageModel(adapter) {
219+
outputNames = get_non_xai_names(adapter->getOutputNames());
220+
append_xai_names(adapter->getOutputNames(), outputNames);
195221
init_from_config(adapter->getModelConfig(), ov::AnyMap{});
196222
}
197223

@@ -408,7 +434,7 @@ void ClassificationModel::prepareInputsOutputs(std::shared_ptr<ov::Model>& model
408434
inputShape[ov::layout::height_idx(inputLayout)]},
409435
pad_value,
410436
reverse_input_channels,
411-
{},
437+
mean_values,
412438
scale_values);
413439

414440
ov::preprocess::PrePostProcessor ppp = ov::preprocess::PrePostProcessor(model);

tests/python/accuracy/prepare_data.py

+3
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ async def main():
109109
download_otx_model(client, otx_models_dir, "anomaly_padim_bottle_mvtec"),
110110
download_otx_model(client, otx_models_dir, "anomaly_stfpm_bottle_mvtec"),
111111
download_otx_model(client, otx_models_dir, "deit-tiny"),
112+
download_otx_model(
113+
client, otx_models_dir, "cls_efficient_b0_shuffled_outputs"
114+
),
112115
)
113116

114117

tests/python/accuracy/public_scope.json

+10
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,16 @@
223223
}
224224
]
225225
},
226+
{
227+
"name": "otx_models/cls_efficient_b0_shuffled_outputs.xml",
228+
"type": "ClassificationModel",
229+
"test_data": [
230+
{
231+
"image": "coco128/images/train2017/000000000471.jpg",
232+
"reference": ["3 (Non-Rigid): 0.503, 4 (Circle): 0.943, 5 (Lion): 0.969, 6 (Panda): 0.988, [1,7,7,7], [1,7], [0]"]
233+
}
234+
]
235+
},
226236
{
227237
"name": "otx_models/cls_efficient_v2s_cars.xml",
228238
"type": "ClassificationModel",

0 commit comments

Comments
 (0)