Skip to content

Commit dea272e

Browse files
committed
add integration tests for per-class pathways
1 parent 08fd135 commit dea272e

43 files changed

Lines changed: 1061 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

inference_models/tests/integration_tests/models/test_deep_lab_v3_segmentation_predictions_onnx.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,3 +707,32 @@ def test_onnx_package_with_static_crop_center_crop_batch_torch_list(
707707
assert (
708708
13700 <= torch.sum(predictions[1].segmentation_map.cpu() == 3).item() <= 13900
709709
)
710+
711+
712+
@pytest.mark.slow
713+
@pytest.mark.onnx_extras
714+
def test_onnx_per_class_confidence_reduces_balloon_pixels(
715+
balloons_deep_lab_v3_onnx_stretch_package: str,
716+
balloons_image_numpy: np.ndarray,
717+
) -> None:
718+
"""Baseline (see `test_onnx_package_with_stretch_numpy` above) has class 3
719+
(balloon) occupying ~16600 pixels. Setting a 0.99 per-class threshold on
720+
class 3 reassigns below-threshold pixels to background, reducing the
721+
class 3 pixel count."""
722+
from inference_models.models.deep_lab_v3_plus.deep_lab_v3_plus_segmentation_onnx import (
723+
DeepLabV3PlusForSemanticSegmentationOnnx,
724+
)
725+
from inference_models.weights_providers.entities import RecommendedParameters
726+
727+
model = DeepLabV3PlusForSemanticSegmentationOnnx.from_pretrained(
728+
model_name_or_path=balloons_deep_lab_v3_onnx_stretch_package,
729+
onnx_execution_providers=["CUDAExecutionProvider", "CPUExecutionProvider"],
730+
)
731+
class_names = list(model.class_names)
732+
model.recommended_parameters = RecommendedParameters(
733+
confidence=0.5,
734+
per_class_confidence={class_names[3]: 0.99},
735+
)
736+
predictions = model(balloons_image_numpy, confidence="best")
737+
balloon_pixels = torch.sum(predictions[0].segmentation_map.cpu() == 3).item()
738+
assert balloon_pixels < 16600

inference_models/tests/integration_tests/models/test_deep_lab_v3_segmentation_predictions_torch.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,3 +649,29 @@ def test_torch_package_with_static_crop_center_crop_batch_torch_list(
649649
assert (
650650
13700 <= torch.sum(predictions[1].segmentation_map.cpu() == 3).item() <= 13900
651651
)
652+
653+
654+
@pytest.mark.slow
655+
@pytest.mark.torch_models
656+
def test_torch_per_class_confidence_reduces_balloon_pixels(
657+
balloons_deep_lab_v3_torch_stretch_package: str,
658+
balloons_image_numpy: np.ndarray,
659+
) -> None:
660+
"""Baseline (see `test_torch_package_with_stretch_numpy` above) has class 3
661+
(balloon) occupying ~16600 pixels. Setting a 0.99 per-class threshold on
662+
class 3 reassigns below-threshold pixels to background, reducing the
663+
class 3 pixel count."""
664+
from inference_models.weights_providers.entities import RecommendedParameters
665+
666+
model = DeepLabV3PlusForSemanticSegmentationTorch.from_pretrained(
667+
model_name_or_path=balloons_deep_lab_v3_torch_stretch_package,
668+
device=DEFAULT_DEVICE,
669+
)
670+
class_names = list(model.class_names)
671+
model.recommended_parameters = RecommendedParameters(
672+
confidence=0.5,
673+
per_class_confidence={class_names[3]: 0.99},
674+
)
675+
predictions = model(balloons_image_numpy, confidence="best")
676+
balloon_pixels = torch.sum(predictions[0].segmentation_map.cpu() == 3).item()
677+
assert balloon_pixels < 16600

inference_models/tests/integration_tests/models/test_dinov3_classifier_predictions_onnx.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,3 +691,33 @@ def test_multi_label_onnx_static_package_batch_torch_tensor_list(
691691
predictions[1].class_ids.cpu(),
692692
torch.tensor([8], dtype=torch.int64).cpu(),
693693
)
694+
695+
696+
@pytest.mark.slow
697+
@pytest.mark.onnx_extras
698+
def test_multi_label_onnx_per_class_confidence_blocks_specific_class(
699+
dinov3_multi_label_onnx_static_package: str,
700+
chess_set_image_numpy: np.ndarray,
701+
) -> None:
702+
"""Baseline (see `test_multi_label_onnx_static_package_numpy` above) returns
703+
class_ids=[0..11] (12 classes). Setting a 0.99 per-class threshold on class 0
704+
leaves class_ids=[1..11]."""
705+
from inference_models.models.dinov3.dinov3_classification_onnx import (
706+
DinoV3ForMultiLabelClassificationOnnx,
707+
)
708+
from inference_models.weights_providers.entities import RecommendedParameters
709+
710+
model = DinoV3ForMultiLabelClassificationOnnx.from_pretrained(
711+
model_name_or_path=dinov3_multi_label_onnx_static_package,
712+
onnx_execution_providers=["CUDAExecutionProvider", "CPUExecutionProvider"],
713+
)
714+
class_names = list(model.class_names)
715+
model.recommended_parameters = RecommendedParameters(
716+
confidence=0.5,
717+
per_class_confidence={class_names[0]: 0.99},
718+
)
719+
predictions = model(chess_set_image_numpy, confidence="best")
720+
assert torch.equal(
721+
predictions[0].class_ids.cpu(),
722+
torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], dtype=torch.int64),
723+
)

inference_models/tests/integration_tests/models/test_dinov3_classifier_predictions_torch.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,3 +678,25 @@ def test_multi_label_torch_static_package_batch_torch_tensor_list(
678678
predictions[1].class_ids.cpu(),
679679
torch.tensor([8], dtype=torch.int64).cpu(),
680680
)
681+
682+
683+
@pytest.mark.slow
684+
@pytest.mark.torch_models
685+
def test_multi_label_torch_per_class_confidence_filters_classes(
686+
dinov3_multi_label_torch_static_package: str,
687+
chess_set_image_numpy: np.ndarray,
688+
) -> None:
689+
from inference_models.models.dinov3.dinov3_classification_torch import (
690+
DinoV3ForMultiLabelClassificationTorch,
691+
)
692+
from inference_models.weights_providers.entities import RecommendedParameters
693+
694+
model = DinoV3ForMultiLabelClassificationTorch.from_pretrained(
695+
model_name_or_path=dinov3_multi_label_torch_static_package,
696+
)
697+
model.recommended_parameters = RecommendedParameters(
698+
confidence=0.5,
699+
per_class_confidence={name: 0.99 for name in model.class_names},
700+
)
701+
predictions = model(chess_set_image_numpy, confidence="best")
702+
assert predictions[0].class_ids.numel() == 0

inference_models/tests/integration_tests/models/test_mediapipe_face_detector_predictions.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,3 +175,26 @@ def test_face_detector_predictions_for_torch_list(
175175
),
176176
atol=3,
177177
)
178+
179+
180+
@pytest.mark.torch_models
181+
def test_per_class_confidence_filters_faces(
182+
mediapipe_face_detector_package: str,
183+
man_image_numpy: np.ndarray,
184+
) -> None:
185+
from inference_models.models.mediapipe_face_detection.face_detection import (
186+
MediaPipeFaceDetector,
187+
)
188+
from inference_models.weights_providers.entities import RecommendedParameters
189+
190+
model = MediaPipeFaceDetector.from_pretrained(mediapipe_face_detector_package)
191+
baseline = model(man_image_numpy, confidence=0.25)
192+
baseline_count = baseline[1][0].xyxy.shape[0]
193+
assert baseline_count > 0
194+
195+
model.recommended_parameters = RecommendedParameters(
196+
confidence=0.25,
197+
per_class_confidence={name: 0.99 for name in model.class_names},
198+
)
199+
filtered = model(man_image_numpy, confidence="best")
200+
assert filtered[1][0].xyxy.shape[0] < baseline_count

inference_models/tests/integration_tests/models/test_resnet_classifier_predictions_onnx.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,3 +798,30 @@ def test_multi_class_onnx_static_bs_package_batch_torch_list(
798798
predictions.class_id.cpu(),
799799
torch.tensor([2, 2], dtype=torch.int64).cpu(),
800800
)
801+
802+
803+
@pytest.mark.slow
804+
@pytest.mark.onnx_extras
805+
def test_multi_label_onnx_per_class_confidence_blocks_specific_class(
806+
flowers_multi_label_resnet_onnx_dynamic_bs_package: str,
807+
flowers_image_numpy: np.ndarray,
808+
) -> None:
809+
"""Baseline (see `test_multi_label_onnx_dynamic_bs_package_numpy` above)
810+
returns class_ids=[2] (class 2 at conf 0.794). Setting a 0.99 per-class
811+
threshold on class 2 leaves no classes above threshold."""
812+
from inference_models.models.resnet.resnet_classification_onnx import (
813+
ResNetForMultiLabelClassificationOnnx,
814+
)
815+
from inference_models.weights_providers.entities import RecommendedParameters
816+
817+
model = ResNetForMultiLabelClassificationOnnx.from_pretrained(
818+
model_name_or_path=flowers_multi_label_resnet_onnx_dynamic_bs_package,
819+
onnx_execution_providers=["CUDAExecutionProvider", "CPUExecutionProvider"],
820+
)
821+
class_names = list(model.class_names)
822+
model.recommended_parameters = RecommendedParameters(
823+
confidence=0.5,
824+
per_class_confidence={class_names[2]: 0.99},
825+
)
826+
predictions = model(flowers_image_numpy, confidence="best")
827+
assert predictions[0].class_ids.numel() == 0

inference_models/tests/integration_tests/models/test_resnet_classifier_predictions_torch.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,3 +363,23 @@ def test_multi_class_torch_package_batch_torch_list(
363363
predictions.class_id.cpu(),
364364
torch.tensor([2, 2], dtype=torch.int64).cpu(),
365365
)
366+
367+
368+
@pytest.mark.slow
369+
@pytest.mark.torch_models
370+
def test_multi_label_torch_per_class_confidence_filters_classes(
371+
flowers_multi_label_resnet_torch_package: str,
372+
flowers_image_numpy: np.ndarray,
373+
) -> None:
374+
from inference_models.weights_providers.entities import RecommendedParameters
375+
376+
model = ResNetForMultiLabelClassificationTorch.from_pretrained(
377+
model_name_or_path=flowers_multi_label_resnet_torch_package,
378+
device=DEFAULT_DEVICE,
379+
)
380+
model.recommended_parameters = RecommendedParameters(
381+
confidence=0.5,
382+
per_class_confidence={name: 0.99 for name in model.class_names},
383+
)
384+
predictions = model(flowers_image_numpy, confidence="best")
385+
assert predictions[0].class_ids.numel() == 0

inference_models/tests/integration_tests/models/test_resnet_classifier_predictions_trt.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,3 +285,26 @@ def test_multi_label_trt_package_torch_batch(
285285
# then
286286
assert abs(predictions[0].confidence[2].item() - 0.99951171875) < 1e-3
287287
assert abs(predictions[1].confidence[2].item() - 0.99951171875) < 1e-3
288+
289+
290+
@pytest.mark.slow
291+
@pytest.mark.trt_extras
292+
def test_multi_label_trt_per_class_confidence_filters_classes(
293+
resnet_multi_label_cls_trt_package: str,
294+
dog_image_numpy: np.ndarray,
295+
) -> None:
296+
from inference_models.models.resnet.resnet_classification_trt import (
297+
ResNetForMultiLabelClassificationTRT,
298+
)
299+
from inference_models.weights_providers.entities import RecommendedParameters
300+
301+
model = ResNetForMultiLabelClassificationTRT.from_pretrained(
302+
model_name_or_path=resnet_multi_label_cls_trt_package,
303+
engine_host_code_allowed=True,
304+
)
305+
model.recommended_parameters = RecommendedParameters(
306+
confidence=0.5,
307+
per_class_confidence={name: 0.99 for name in model.class_names},
308+
)
309+
predictions = model(dog_image_numpy, confidence="best")
310+
assert predictions[0].class_ids.numel() == 0

inference_models/tests/integration_tests/models/test_rfdetr_predictions_onnx.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,3 +1225,31 @@ def test_onnx_package_with_nonsquare_letterbox_torch_list(
12251225
assert torch.allclose(
12261226
pred.xyxy.cpu(), _NONSQUARE_LETTERBOX_ONNX_EXPECTED_XYXY, atol=2
12271227
)
1228+
1229+
1230+
@pytest.mark.slow
1231+
@pytest.mark.onnx_extras
1232+
def test_onnx_per_class_confidence_blocks_specific_class(
1233+
coin_counting_rfdetr_nano_onnx_cs_stretch_package: str,
1234+
coins_counting_image_numpy: np.ndarray,
1235+
) -> None:
1236+
"""RFDETR OD: Group B direct-indexing + DETR no-object handling.
1237+
Other tests in this file (e.g. center-crop runs) return all class_id=1 for
1238+
coin counting. Setting a 0.99 per-class threshold on class 1 leaves no
1239+
detections."""
1240+
from inference_models.models.rfdetr.rfdetr_object_detection_onnx import (
1241+
RFDetrForObjectDetectionONNX,
1242+
)
1243+
from inference_models.weights_providers.entities import RecommendedParameters
1244+
1245+
model = RFDetrForObjectDetectionONNX.from_pretrained(
1246+
model_name_or_path=coin_counting_rfdetr_nano_onnx_cs_stretch_package,
1247+
onnx_execution_providers=["CUDAExecutionProvider", "CPUExecutionProvider"],
1248+
)
1249+
class_names = list(model.class_names)
1250+
model.recommended_parameters = RecommendedParameters(
1251+
confidence=0.3,
1252+
per_class_confidence={class_names[1]: 0.99},
1253+
)
1254+
predictions = model(coins_counting_image_numpy, confidence="best")
1255+
assert 1 not in predictions[0].class_id.cpu().tolist()

inference_models/tests/integration_tests/models/test_rfdetr_predictions_torch.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,3 +1394,22 @@ def test_torch_package_with_nonsquare_letterbox_torch_list(
13941394
assert torch.allclose(
13951395
pred.xyxy.cpu(), _NONSQUARE_LETTERBOX_TORCH_EXPECTED_XYXY_TORCH, atol=2
13961396
)
1397+
1398+
1399+
@pytest.mark.slow
1400+
@pytest.mark.torch_models
1401+
def test_torch_per_class_confidence_filters_detections(
1402+
coin_counting_rfdetr_nano_torch_cs_stretch_package: str,
1403+
coins_counting_image_numpy: np.ndarray,
1404+
) -> None:
1405+
from inference_models.weights_providers.entities import RecommendedParameters
1406+
1407+
model = RFDetrForObjectDetectionTorch.from_pretrained(
1408+
model_name_or_path=coin_counting_rfdetr_nano_torch_cs_stretch_package,
1409+
)
1410+
model.recommended_parameters = RecommendedParameters(
1411+
confidence=0.3,
1412+
per_class_confidence={name: 0.99 for name in model.class_names},
1413+
)
1414+
predictions = model(coins_counting_image_numpy, confidence="best")
1415+
assert predictions[0].class_id.numel() == 0

0 commit comments

Comments
 (0)