def test_transform4(): # Test w/ 1 overlapping boxes boxes, confidences, labels, bbids = setup_tests.setup_test_case() boxes, confidences, labels, bbids = setup_tests.jitter_boxes( bounding_boxes=boxes, confidences=confidences, labels=labels, bbids=bbids, range_n_new_boxes=(5, 5)) bb = od.BoundingBoxArray(bounding_boxes=boxes, confidences=confidences, labels=labels, bounding_box_ids=bbids) metric, selector = setup_tests.get_default_sector_suppressor_components() suppressor = od.nms.suppression.CartesianProductSuppression( metric=metric, selector=selector) resulting_bb = suppressor.transform(bb) assert len(resulting_bb.bounding_box_ids) == 2 assert resulting_bb.bounding_boxes.shape[0] == 2 resulting_box1 = resulting_bb.bounding_boxes[0, :, :] resulting_box2 = resulting_bb.bounding_boxes[1, :, :] assert not metric.overlap(resulting_box1, resulting_box2)
def test_evaluate_overlap3(): # Test method 5 overlapping boxes each boxes, confidences, labels, bbids = setup_tests.setup_test_case() boxes, confidences, labels, bbids = setup_tests.jitter_boxes( bounding_boxes=boxes, confidences=confidences, labels=labels, bbids=bbids, range_n_new_boxes=(5, 5)) bb = od.BoundingBoxArray(bounding_boxes=boxes, confidences=confidences, labels=labels, bounding_box_ids=bbids) bbid_cp = itertools.product(bb.bounding_box_ids.tolist(), bb.bounding_box_ids.tolist()) metric, selector = setup_tests.get_default_sector_suppressor_components() suppressor = od.nms.suppression.CartesianProductSuppression( metric=metric, selector=selector) selected_bids, _ = suppressor._evaluate_overlap(bb, bbid_cp, symmetric=True) assert len(selected_bids) == 2 resulting_box1 = bb.lookup_box(int(selected_bids[0])) resulting_box2 = bb.lookup_box(int(selected_bids[1])) assert not metric.overlap(resulting_box1, resulting_box2)
def test_handle_boundaries7(): # Handle boundaries - two sets of boxes (5 overlap each) on boundaries w/ 2 division boxes, confidences, labels, bbids = setup_tests.setup_test_case_on_boundary() boxes, confidences, labels, bbids = setup_tests.jitter_boxes( bounding_boxes=boxes, confidences=confidences, labels=labels, bbids=bbids, range_n_new_boxes=(5, 5) ) bb = od.BoundingBoxArray( bounding_boxes=boxes, confidences=confidences, labels=labels, bounding_box_ids=bbids ) bb.check() sector_divisions = 2 metric, selector = setup_tests.get_default_sector_suppressor_components() suppressor = od.nms.suppression.SectorSuppression(metric=metric, selector=selector, sector_divisions=sector_divisions) _, dividing_lines = suppressor._create_sectors() result = suppressor._handle_boundaries(bb, dividing_lines) assert len(result) == 2
def test_evaluate_overlap1(): # Tests method without any overlapping boxes boxes, confidences, labels, bbids = setup_tests.setup_test_case() bb = od.BoundingBoxArray(bounding_boxes=boxes, confidences=confidences, labels=labels, bounding_box_ids=bbids) bbid_cp = itertools.product(bb.bounding_box_ids.tolist(), bb.bounding_box_ids.tolist()) metric, selector = setup_tests.get_default_sector_suppressor_components() suppressor = od.nms.suppression.CartesianProductSuppression( metric=metric, selector=selector) selected_bids, _ = suppressor._evaluate_overlap(bb, bbid_cp) assert len(selected_bids) == 2
def test_handle_boundaries2(): # Handle boundaries - two non-overlapping boxes on boundaries w/ 1 division. boxes, confidences, labels, bbids = setup_tests.setup_test_case_on_boundary() bb = od.BoundingBoxArray( bounding_boxes=boxes, confidences=confidences, labels=labels, bounding_box_ids=bbids ) sector_divisions = 1 metric, selector = setup_tests.get_default_sector_suppressor_components() suppressor = od.nms.suppression.SectorSuppression(metric=metric, selector=selector, sector_divisions=sector_divisions) _, dividing_lines = suppressor._create_sectors() result = suppressor._handle_boundaries(bb, dividing_lines) assert len(result) == 1
def test_handle_boundaries1(): # Handle boundaries - no boxes on boundaries. boxes, confidences, labels, bbids = setup_tests.setup_test_case() bb = od.BoundingBoxArray( bounding_boxes=boxes, confidences=confidences, labels=labels, bounding_box_ids=bbids ) sector_divisions = 1 metric, selector = setup_tests.get_default_sector_suppressor_components() suppressor = od.nms.suppression.SectorSuppression(metric=metric, selector=selector, sector_divisions=sector_divisions) _, dividing_lines = suppressor._create_sectors() result = suppressor._handle_boundaries(bb, dividing_lines) assert result is None
def test_consensus_aggregator(): bboxes = [od.BoundingBoxArray(*x) for x in setup_test_case_multi()] suppressor_metric = od.nms.metrics.DefaultIntersectionOverTheUnion( threshold=0.05, direction="gte") suppressor_selector = od.nms.selection.RandomSelector() suppressor = od.nms.suppression.CartesianProductSuppression( metric=suppressor_metric, selector=suppressor_selector) aggregator_metric = od.nms.metrics.DefaultIntersectionOverTheUnion( threshold=0.05, direction="gte") aggregator = od.nms.aggregators.ConsensusAggregator( suppressor=suppressor, metric=aggregator_metric) result = aggregator.transform(bboxes) assert result.shape[0] == 2
def run_test_end_to_end(n_boxes: int, suppressor: od.nms.suppression.Suppressor): bounding_boxes, confidences, labels, bbids = setup_test_case() n = copy(bounding_boxes.shape[0]) bounding_boxes, confidences, labels, _ = jitter_boxes( bounding_boxes, confidences, labels, bbids, range_n_new_boxes=(n_boxes, n_boxes), ) data_payload = od.BoundingBoxArray(bounding_boxes=bounding_boxes, confidences=confidences, labels=labels) filtered_boxes = suppressor.transform(bounding_box_array=data_payload) assert len(filtered_boxes) == n