From fc6b7622556830c5eb1431cb7f97bd3560514f99 Mon Sep 17 00:00:00 2001 From: Feynman Liang Date: Wed, 12 Sep 2018 13:56:20 -0700 Subject: [PATCH 1/3] Simplify path by default, change API to num points --- labelbox/predictions/__init__.py | 14 ++++++++------ tests/test_predictions.py | 19 +++++++++++++++++-- tests/test_predictions/dog_prediction.png | Bin 0 -> 49002 bytes 3 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 tests/test_predictions/dog_prediction.png diff --git a/labelbox/predictions/__init__.py b/labelbox/predictions/__init__.py index 409b914dd..a3651a150 100644 --- a/labelbox/predictions/__init__.py +++ b/labelbox/predictions/__init__.py @@ -9,7 +9,7 @@ def vectorize_to_v4_label( segmentation_map, legend: Dict[int, str], - epsilon: Optional[float] = None) -> DefaultDict[str, List[dict]]: + max_num_points: Optional[int] = 50) -> DefaultDict[str, List[dict]]: """Converts a segmentation map into polygons. Given a raster pixel wise array of predictions in `segmentation_map`, @@ -25,10 +25,8 @@ def vectorize_to_v4_label( legend: A dictonary mapping pixel values used in `segmentation_map` to semantic class names. - epsilon: An optional argument, if present - controls the amount of path simplification. - Start with 1.0 and decrease to 0.01, 0.001. - No simplification occurs if absent. + max_num_points: The maximum number of points in the simplified path. + If `None`, then no path simplification is performed. Returns: A dictionary suitable for use as a `prediction` @@ -43,8 +41,12 @@ class names. if pixel_value in legend and pixel_value is not 0: xy_list = polygon['coordinates'][0] - if epsilon: + if max_num_points: + epsilon = 0.001 xy_list = simplify_coords(xy_list, epsilon) + while len(xy_list) > max_num_points: + epsilon *= 2 + xy_list = simplify_coords(xy_list, epsilon) geometry = [] for point in xy_list: diff --git a/tests/test_predictions.py b/tests/test_predictions.py index 415577627..ee83bae36 100644 --- a/tests/test_predictions.py +++ b/tests/test_predictions.py @@ -52,8 +52,23 @@ def test_vectorize_simplify(): } segmentation_map = np.asarray(segmentation_map) - label = lbpreds.vectorize_to_v4_label(segmentation_map, legend, epsilon=None) - label_simple = lbpreds.vectorize_to_v4_label(segmentation_map, legend, epsilon=1.0) + label = lbpreds.vectorize_to_v4_label(segmentation_map, legend, max_num_points=None) + label_simple = lbpreds.vectorize_to_v4_label(segmentation_map, legend, max_num_points=10) # simplification reduces the number of points assert len(label['CLASS'][0]['geometry']) > len(label_simple['CLASS'][0]['geometry']) + +def test_vectorize_simplify_defaults(datadir): + with open(datadir.join('dog_prediction.png'), 'rb') as fp: + im = np.array(Image.open(fp)) + legend = { + 65535: 'Dog', + } + label = lbpreds.vectorize_to_v4_label(im, legend, max_num_points=None) + + # a huge label with no simplification + assert len(label['Dog'][0]['geometry']) > 5000 + + # by default, simplifies to <= 50 points + label_simple = lbpreds.vectorize_to_v4_label(im, legend) + assert len(label_simple['Dog'][0]['geometry']) <= 50 diff --git a/tests/test_predictions/dog_prediction.png b/tests/test_predictions/dog_prediction.png new file mode 100644 index 0000000000000000000000000000000000000000..aeda58e1cc8f8c4eeadb6c0293412b5067798671 GIT binary patch literal 49002 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 ynCdzM|2a%>aBy{Sa1TB~% Date: Wed, 12 Sep 2018 14:05:05 -0700 Subject: [PATCH 2/3] Fix linter --- MANIFEST.in | 1 + tests/test_predictions.py | 1 + 2 files changed, 2 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index 9209ed065..4bfa6f178 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -13,4 +13,5 @@ recursive-include docs *.rst recursive-include labelbox *.py include labelbox/exporters/pascal_voc_writer/templates/annotation.xml recursive-include tests *.json +recursive-include tests *.png recursive-include tests *.py diff --git a/tests/test_predictions.py b/tests/test_predictions.py index ee83bae36..0e21d8b20 100644 --- a/tests/test_predictions.py +++ b/tests/test_predictions.py @@ -58,6 +58,7 @@ def test_vectorize_simplify(): # simplification reduces the number of points assert len(label['CLASS'][0]['geometry']) > len(label_simple['CLASS'][0]['geometry']) + def test_vectorize_simplify_defaults(datadir): with open(datadir.join('dog_prediction.png'), 'rb') as fp: im = np.array(Image.open(fp)) From b085640a651264603ebb8dfedbdcaefcecdc0e23 Mon Sep 17 00:00:00 2001 From: Feynman Liang Date: Wed, 12 Sep 2018 14:10:17 -0700 Subject: [PATCH 3/3] Version bump --- labelbox/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/labelbox/__init__.py b/labelbox/__init__.py index c201ceba4..704a5efcc 100644 --- a/labelbox/__init__.py +++ b/labelbox/__init__.py @@ -1,3 +1,3 @@ "The Labelbox python package." -__version__ = '0.0.2' +__version__ = '0.0.3'