Skip to content

Commit c553c10

Browse files
sovrasovGalina
andauthored
Prevent zero-sized saliency map in tiling if tile size is too big (#2452)
* Prevent zero-sized saliency map in tiling if tile size is too big * Prevent zero-sized saliency in tiling (PyTorch) * Add unit tests for Tiler merge features methods --------- Co-authored-by: Galina <[email protected]>
1 parent 9ebdad6 commit c553c10

File tree

3 files changed

+11
-4
lines changed

3 files changed

+11
-4
lines changed

src/otx/algorithms/detection/adapters/mmdet/datasets/tiling.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -527,8 +527,8 @@ def merge_maps(self, saliency_maps: Union[List[List[np.ndarray]], List[np.ndarra
527527

528528
for orig_image in self.cached_results:
529529
img_idx = orig_image["index"]
530-
ratios[img_idx] = np.array([feat_h, feat_w]) / self.tile_size
531530
image_h, image_w = orig_image["height"], orig_image["width"]
531+
ratios[img_idx] = np.array([feat_h / min(self.tile_size, image_h), feat_w / min(self.tile_size, image_w)])
532532

533533
image_map_h = int(image_h * ratios[img_idx][0])
534534
image_map_w = int(image_w * ratios[img_idx][1])

src/otx/api/utils/tiler.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,14 +325,13 @@ def merge_maps(self, features: List) -> np.ndarray:
325325
Returns:
326326
merged_maps (np.ndarray): Merged saliency maps for entire image.
327327
"""
328-
329328
(_, image_saliency_map), image_meta = features[0]
330329

331330
num_classes, feat_h, feat_w = image_saliency_map.shape
332331
dtype = image_saliency_map[0][0].dtype
333332

334333
image_h, image_w, _ = image_meta["original_shape"]
335-
ratio = np.array([feat_h, feat_w]) / self.tile_size
334+
ratio = np.array([feat_h / min(self.tile_size, image_h), feat_w / min(self.tile_size, image_w)])
336335

337336
image_map_h = int(image_h * ratio[0])
338337
image_map_w = int(image_w * ratio[1])

tests/unit/algorithms/detection/tiling/test_tiling_tile_classifier.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,12 @@ def test_openvino_sync(self, mocker):
7878
mocked_model.return_value = mocker.MagicMock(spec=OTXMaskRCNNModel, model_adapter=adapter_mock)
7979
params = DetectionConfig(header=self.hyper_parameters.header)
8080
ov_mask_inferencer = OpenVINOMaskInferencer(params, self.label_schema, "")
81+
original_shape = (self.dataset[0].media.width, self.dataset[0].media.height, 3)
8182
ov_mask_inferencer.model.resize_mask = False
82-
ov_mask_inferencer.model.preprocess.return_value = ({"foo": "bar"}, {"baz": "qux"})
83+
ov_mask_inferencer.model.preprocess.return_value = (
84+
{"foo": "bar"},
85+
{"baz": "qux", "original_shape": original_shape},
86+
)
8387
ov_mask_inferencer.model.postprocess.return_value = (
8488
np.array([], dtype=np.float32),
8589
np.array([], dtype=np.uint32),
@@ -93,6 +97,10 @@ def test_openvino_sync(self, mocker):
9397
mock_predict = mocker.patch.object(
9498
ov_inferencer.tiler.classifier, "infer_sync", return_value={"tile_prob": 0.5}
9599
)
100+
ov_inferencer.tiler.model.infer_sync.return_value = {
101+
"feature_vector": np.zeros((1, 5), dtype=np.float32),
102+
"saliency_map": np.zeros((1, 1, 2, 2), dtype=np.float32),
103+
}
96104
mocker.patch.object(OpenVINODetectionTask, "load_inferencer", return_value=ov_inferencer)
97105
ov_task = OpenVINODetectionTask(self.task_env)
98106
ov_task.inferencer.predict = partial(ov_task.inferencer.predict, mode="sync")

0 commit comments

Comments
 (0)