diff --git a/test/detection/test_lmm_florence_2.py b/test/detection/test_lmm_florence_2.py index 4a5a0094..46d333c9 100644 --- a/test/detection/test_lmm_florence_2.py +++ b/test/detection/test_lmm_florence_2.py @@ -1,5 +1,5 @@ -from typing import List, Optional, Tuple from contextlib import ExitStack as DoesNotRaise +from typing import Optional, Tuple import numpy as np import pytest @@ -10,280 +10,489 @@ from supervision.detection.lmm import from_florence_2 @pytest.mark.parametrize( "florence_result, resolution_wh, expected_results, exception", [ - ( # Object detection: empty - {"":{ - "bboxes": [], - "labels": [] - }}, + ( # Object detection: empty + {"": {"bboxes": [], "labels": []}}, (10, 10), - ( - np.array([], dtype=np.float32), - np.array([]), - None, - None - ), - DoesNotRaise() + (np.array([], dtype=np.float32), np.array([]), None, None), + DoesNotRaise(), ), - ( # Object detection: two detections - {"":{ - "bboxes": [[4, 4, 6, 6], [5, 5, 7, 7]], - "labels": ["car", "door"] - }}, + ( # Object detection: two detections + { + "": { + "bboxes": [[4, 4, 6, 6], [5, 5, 7, 7]], + "labels": ["car", "door"], + } + }, (10, 10), ( np.array([[4, 4, 6, 6], [5, 5, 7, 7]], dtype=np.float32), np.array(["car", "door"]), None, - None + None, ), - DoesNotRaise() + DoesNotRaise(), ), - - ( # Caption: unsupported - {"": 'A green car parked in front of a yellow building.'}, + ( # Caption: unsupported + {"": "A green car parked in front of a yellow building."}, (10, 10), None, - pytest.raises(ValueError) + pytest.raises(ValueError), ), - ( # Detailed Caption: unsupported - {"": 'The image shows a blue Volkswagen Beetle parked ' - 'in front of a yellow building with two brown doors, surrounded by ' - 'trees and a clear blue sky.'}, - (10, 10), - None, - pytest.raises(ValueError) - ), - ( # More Detailed Caption: unsupported + ( # Detailed Caption: unsupported { - "": 'The image shows a vintage Volkswagen ' - 'Beetle car parked on a ' - 'cobblestone street in front of a yellow building with two wooden ' - 'doors. The car is painted in a bright turquoise color and has a ' - 'white stripe running along the side. It has two doors on either side ' - 'of the car, one on top of the other, and a small window on the ' - 'front. The building appears to be old and dilapidated, with peeling ' - 'paint and crumbling walls. The sky is blue and there are trees in ' - 'the background.' + "": "The image shows a blue Volkswagen Beetle parked " + "in front of a yellow building with two brown doors, surrounded by " + "trees and a clear blue sky." }, (10, 10), None, - pytest.raises(ValueError) + pytest.raises(ValueError), ), - - ( # Caption to Phrase Grounding: empty - {"":{ - "bboxes": [], - "labels": [] - }}, - (10, 10), - ( - np.array([], dtype=np.float32), - np.array([]), - None, - None - ), - DoesNotRaise() - ), - ( # Caption to Phrase Grounding: two detections - {"":{ - "bboxes": [[4, 4, 6, 6], [5, 5, 7, 7]], - "labels": ["a green car", "a yellow building"] - }}, - (10, 10), - ( - np.array([[4, 4, 6, 6], [5, 5, 7, 7]], dtype=np.float32), - np.array(["a green car", "a yellow building"]), - None, - None - ), - DoesNotRaise() - ), - - ( # Dense Region caption: empty - {"":{ - "bboxes": [], - "labels": [] - }}, - (10, 10), - ( - np.array([], dtype=np.float32), - np.array([]), - None, - None - ), - DoesNotRaise() - ), - ( # Caption to Phrase Grounding: two detections - {"":{ - "bboxes": [[4, 4, 6, 6], [5, 5, 7, 7]], - "labels": ["a green car", "a yellow building"] - }}, - (10, 10), - ( - np.array([[4, 4, 6, 6], [5, 5, 7, 7]], dtype=np.float32), - np.array(["a green car", "a yellow building"]), - None, - None - ), - DoesNotRaise() - ), - - ( # Region proposal - {"":{ - "bboxes": [[4, 4, 6, 6], [5, 5, 7, 7]], - "labels": ["", ""] - }}, - (10, 10), - ( - np.array([[4, 4, 6, 6], [5, 5, 7, 7]], dtype=np.float32), - None, - None, - None - ), - DoesNotRaise() - ), - - ( # Referring Expression Segmentation - {"":{ - "polygons": [[[1, 1, 2, 1, 2, 2, 1, 2]]], - "labels": [""] - }}, - (10, 10), - ( - np.array([[1., 1., 2., 2.]], dtype=np.float32), - None, - np.array([[ - [False, False, False, False, False, False, False, False, False, False], - [False, True, True, False, False, False, False, False, False, False], - [False, True, True, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False] - ]]), - None - ), - DoesNotRaise() - ), - - ( # Referring Expression Segmentation - {"":{ - "polygons": [[[1, 1, 2, 1, 2, 2, 1, 2]]], - "labels": [""] - }}, - (10, 10), - ( - np.array([[1., 1., 2., 2.]], dtype=np.float32), - None, - np.array([[ - [False, False, False, False, False, False, False, False, False, False], - [False, True, True, False, False, False, False, False, False, False], - [False, True, True, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False], - [False, False, False, False, False, False, False, False, False, False] - ]]), - None - ), - DoesNotRaise() - ), - - ( # OCR: unsupported - {"": 'A'}, + ( # More Detailed Caption: unsupported + { + "": "The image shows a vintage Volkswagen " + "Beetle car parked on a " + "cobblestone street in front of a yellow building with two wooden " + "doors. The car is painted in a bright turquoise color and has a " + "white stripe running along the side. It has two doors on either side " + "of the car, one on top of the other, and a small window on the " + "front. The building appears to be old and dilapidated, with peeling " + "paint and crumbling walls. The sky is blue and there are trees in " + "the background." + }, (10, 10), None, - pytest.raises(ValueError) + pytest.raises(ValueError), ), - - ( # OCR with Region: obb boxes - {"":{ - "quad_boxes": [[2, 2, 6, 4, 5, 6, 1, 5], [4, 4, 5, 5, 4, 6, 3, 5]], - "labels": ["some text", "other text"] - }}, + ( # Caption to Phrase Grounding: empty + {"": {"bboxes": [], "labels": []}}, + (10, 10), + (np.array([], dtype=np.float32), np.array([]), None, None), + DoesNotRaise(), + ), + ( # Caption to Phrase Grounding: two detections + { + "": { + "bboxes": [[4, 4, 6, 6], [5, 5, 7, 7]], + "labels": ["a green car", "a yellow building"], + } + }, + (10, 10), + ( + np.array([[4, 4, 6, 6], [5, 5, 7, 7]], dtype=np.float32), + np.array(["a green car", "a yellow building"]), + None, + None, + ), + DoesNotRaise(), + ), + ( # Dense Region caption: empty + {"": {"bboxes": [], "labels": []}}, + (10, 10), + (np.array([], dtype=np.float32), np.array([]), None, None), + DoesNotRaise(), + ), + ( # Caption to Phrase Grounding: two detections + { + "": { + "bboxes": [[4, 4, 6, 6], [5, 5, 7, 7]], + "labels": ["a green car", "a yellow building"], + } + }, + (10, 10), + ( + np.array([[4, 4, 6, 6], [5, 5, 7, 7]], dtype=np.float32), + np.array(["a green car", "a yellow building"]), + None, + None, + ), + DoesNotRaise(), + ), + ( # Region proposal + { + "": { + "bboxes": [[4, 4, 6, 6], [5, 5, 7, 7]], + "labels": ["", ""], + } + }, + (10, 10), + ( + np.array([[4, 4, 6, 6], [5, 5, 7, 7]], dtype=np.float32), + None, + None, + None, + ), + DoesNotRaise(), + ), + ( # Referring Expression Segmentation + { + "": { + "polygons": [[[1, 1, 2, 1, 2, 2, 1, 2]]], + "labels": [""], + } + }, + (10, 10), + ( + np.array([[1.0, 1.0, 2.0, 2.0]], dtype=np.float32), + None, + np.array( + [ + [ + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + True, + True, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + True, + True, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + ] + ] + ), + None, + ), + DoesNotRaise(), + ), + ( # Referring Expression Segmentation + { + "": { + "polygons": [[[1, 1, 2, 1, 2, 2, 1, 2]]], + "labels": [""], + } + }, + (10, 10), + ( + np.array([[1.0, 1.0, 2.0, 2.0]], dtype=np.float32), + None, + np.array( + [ + [ + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + True, + True, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + True, + True, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + [ + False, + False, + False, + False, + False, + False, + False, + False, + False, + False, + ], + ] + ] + ), + None, + ), + DoesNotRaise(), + ), + ( # OCR: unsupported + {"": "A"}, + (10, 10), + None, + pytest.raises(ValueError), + ), + ( # OCR with Region: obb boxes + { + "": { + "quad_boxes": [[2, 2, 6, 4, 5, 6, 1, 5], [4, 4, 5, 5, 4, 6, 3, 5]], + "labels": ["some text", "other text"], + } + }, (10, 10), ( np.array([[1, 2, 6, 6], [3, 4, 5, 6]], dtype=np.float32), np.array(["some text", "other text"]), None, - np.array([[[2, 2], [6, 4], [5, 6], [1, 5]], [[4, 4], [5, 5], [4, 6], [3, 5]]]) + np.array( + [[[2, 2], [6, 4], [5, 6], [1, 5]], [[4, 4], [5, 5], [4, 6], [3, 5]]] + ), ), - DoesNotRaise() + DoesNotRaise(), ), - - ( # Open Vocabulary Detection - {"":{ - "bboxes": [[4, 4, 6, 6], [5, 5, 7, 7]], - "bboxes_labels": ["cat", "cat"], - "polygon": [], - "polygons_labels": [] - }}, + ( # Open Vocabulary Detection + { + "": { + "bboxes": [[4, 4, 6, 6], [5, 5, 7, 7]], + "bboxes_labels": ["cat", "cat"], + "polygon": [], + "polygons_labels": [], + } + }, (10, 10), ( np.array([[4, 4, 6, 6], [5, 5, 7, 7]], dtype=np.float32), np.array(["cat", "cat"]), None, - None - ), - DoesNotRaise() - ), - - ( # Region to Category: empty - {'': 'No object detected.'}, - (10, 10), - ( - np.empty((0, 4), dtype=np.float32), - np.array([]), None, - None ), - DoesNotRaise() + DoesNotRaise(), ), - ( # Region to Category: detected - {'': 'some object category'}, + ( # Region to Category: empty + {"": "No object detected."}, + (10, 10), + (np.empty((0, 4), dtype=np.float32), np.array([]), None, None), + DoesNotRaise(), + ), + ( # Region to Category: detected + { + "": "some object category" + }, (10, 10), ( np.array([[3, 4, 5, 6]], dtype=np.float32), np.array(["some object category"]), None, - None - ), - DoesNotRaise() - ), - ( # Region to Description: empty - {'': 'No object detected.'}, - (10, 10), - ( - np.empty((0, 4), dtype=np.float32), - np.array([]), None, - None ), - DoesNotRaise() + DoesNotRaise(), ), - ( # Region to Description: detected - {'': 'some description'}, + ( # Region to Description: empty + {"": "No object detected."}, + (10, 10), + (np.empty((0, 4), dtype=np.float32), np.array([]), None, None), + DoesNotRaise(), + ), + ( # Region to Description: detected + {"": "some description"}, (10, 10), ( np.array([[3, 4, 5, 6]], dtype=np.float32), np.array(["some description"]), None, - None + None, ), - DoesNotRaise() - ) - ]) + DoesNotRaise(), + ), + ], +) def test_florence_2( florence_result: dict, resolution_wh: Tuple[int, int], - expected_results: Tuple[np.ndarray, Optional[np.ndarray], Optional[np.ndarray], Optional[np.ndarray]], - exception: Exception + expected_results: Tuple[ + np.ndarray, Optional[np.ndarray], Optional[np.ndarray], Optional[np.ndarray] + ], + exception: Exception, ) -> None: with exception: result = from_florence_2(florence_result, resolution_wh)