From 9bed4fa6412ccc2ee7836417ad70d0c0c30ed126 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 3 Nov 2020 16:23:44 +0400 Subject: [PATCH 1/4] benchmark implemented --- superannotate/__init__.py | 1 + .../consensus_benchmark/benchmark.py | 127 ++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 superannotate/consensus_benchmark/benchmark.py diff --git a/superannotate/__init__.py b/superannotate/__init__.py index 20bc33658..69473be46 100644 --- a/superannotate/__init__.py +++ b/superannotate/__init__.py @@ -64,6 +64,7 @@ SANonExistingProjectNameException ) from .consensus_benchmark.consensus import consensus +from .consensus_benchmark.benchmark import benchmark from .input_converters.conversion import ( convert_platform, convert_project_type, export_annotation_format, import_annotation_format diff --git a/superannotate/consensus_benchmark/benchmark.py b/superannotate/consensus_benchmark/benchmark.py new file mode 100644 index 000000000..99d9f6111 --- /dev/null +++ b/superannotate/consensus_benchmark/benchmark.py @@ -0,0 +1,127 @@ +""" +Main module for benchmark computation +""" +import logging +import tempfile +import pandas as pd +from pathlib import Path + +from .helpers import image_consensus, consensus_plot +from ..db.exports import prepare_export, download_export +from ..analytics.common import aggregate_annotations_as_df + +logger = logging.getLogger("superannotate-python-sdk") + + +def benchmark( + gt_project_name, + project_names, + export_root=None, + image_list=None, + annot_type='bbox', + show_plots=False +): + """Computes benchmark score for each instance of given images that are present both gt_project_name project and projects in project_names list: + + :param gt_project_name: Project name that contains the ground truth annotations + :type gt_project_name: str + :param project_names: list of project names to aggregate through + :type project_names: list of str + :param export_root: root export path of the projects + :type export_root: Pathlike (str or Path) + :param image_list: List of image names from the projects list that must be used. If None, then all images from the projects list will be used. Default: None + :type image_list: list + :param annot_type: Type of annotation instances to consider. Available candidates are: ["bbox", "polygon", "point"] + :type annot_type: str + :param show_plots: If True, show plots based on results of consensus computation. Default: False + :type show_plots: bool + + """ + def aggregate_attributes(instance_df): + def attribute_to_list(attribute_df): + attribute_names = list(attribute_df["attributeName"]) + attribute_df["attributeNames"] = len(attribute_df) * [ + attribute_names + ] + return attribute_df + + attributes = None + if not instance_df["attributeGroupName"].isna().all(): + attrib_group_name = instance_df.groupby("attributeGroupName")[[ + "attributeGroupName", "attributeName" + ]].apply(attribute_to_list) + attributes = dict( + zip( + attrib_group_name["attributeGroupName"], + attrib_group_name["attributeNames"] + ) + ) + + instance_df.drop( + ["attributeGroupName", "attributeName"], axis=1, inplace=True + ) + instance_df.drop_duplicates( + subset=["imageName", "instanceId", "project"], inplace=True + ) + instance_df["attributes"] = [attributes] + return instance_df + + supported_types = ['polygon', 'bbox', 'point'] + if annot_type not in supported_types: + raise NotImplementedError + + if export_root is None: + with tempfile.TemporaryDirectory() as export_dir: + gt_project_meta = prepare_export(gt_project_name) + download_export(gt_project_name, gt_project_meta, export_dir) + gt_project_df = aggregate_annotations_as_df(export_dir) + else: + export_dir = Path(export_root) / gt_project_name + gt_project_df = aggregate_annotations_as_df(export_dir) + gt_project_df["project"] = gt_project_name + + benchmark_dfs = [] + for project_name in project_names: + if export_root is None: + with tempfile.TemporaryDirectory() as export_dir: + proj_export_meta = prepare_export(project_name) + download_export(project_name, proj_export_meta, export_dir) + project_df = aggregate_annotations_as_df(export_dir) + else: + export_dir = Path(export_root) / project_name + project_df = aggregate_annotations_as_df(export_dir) + + project_df["project"] = project_name + project_gt_df = pd.concat([project_df, gt_project_df]) + project_gt_df = project_gt_df[project_gt_df["instanceId"].notna()] + + if image_list is not None: + project_gt_df = project_gt_df.loc[ + project_gt_df["imageName"].isin(image_list)] + + project_gt_df.query("type == '" + annot_type + "'", inplace=True) + + project_gt_df = project_gt_df.groupby( + ["imageName", "instanceId", "project"] + ) + project_gt_df = project_gt_df.apply(aggregate_attributes).reset_index( + drop=True + ) + unique_images = set(project_gt_df["imageName"]) + all_benchmark_data = [] + for image_name in unique_images: + image_data = image_consensus(project_gt_df, image_name, annot_type) + all_benchmark_data.append(pd.DataFrame(image_data)) + + benchmark_project_df = pd.concat(all_benchmark_data, ignore_index=True) + benchmark_project_df = benchmark_project_df[ + benchmark_project_df["projectName"] == project_name] + + benchmark_dfs.append(benchmark_project_df) + + benchmark_df = pd.concat(benchmark_dfs, ignore_index=True) + + if show_plots: + consensus_plot(benchmark_df, project_names) + + return benchmark_df \ No newline at end of file From 17559602a664c7069c9e0b7040d100242806f66e Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 3 Nov 2020 16:23:44 +0400 Subject: [PATCH 2/4] benchmark implemented --- superannotate/__init__.py | 1 + .../consensus_benchmark/benchmark.py | 127 ++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 superannotate/consensus_benchmark/benchmark.py diff --git a/superannotate/__init__.py b/superannotate/__init__.py index 64e0498b3..f5587d450 100644 --- a/superannotate/__init__.py +++ b/superannotate/__init__.py @@ -22,6 +22,7 @@ project_type_str_to_int, user_role_str_to_int ) from .consensus_benchmark.consensus import consensus +from .consensus_benchmark.benchmark import benchmark from .dataframe_filtering import ( filter_annotation_instances, filter_images_by_comments, filter_images_by_tags diff --git a/superannotate/consensus_benchmark/benchmark.py b/superannotate/consensus_benchmark/benchmark.py new file mode 100644 index 000000000..99d9f6111 --- /dev/null +++ b/superannotate/consensus_benchmark/benchmark.py @@ -0,0 +1,127 @@ +""" +Main module for benchmark computation +""" +import logging +import tempfile +import pandas as pd +from pathlib import Path + +from .helpers import image_consensus, consensus_plot +from ..db.exports import prepare_export, download_export +from ..analytics.common import aggregate_annotations_as_df + +logger = logging.getLogger("superannotate-python-sdk") + + +def benchmark( + gt_project_name, + project_names, + export_root=None, + image_list=None, + annot_type='bbox', + show_plots=False +): + """Computes benchmark score for each instance of given images that are present both gt_project_name project and projects in project_names list: + + :param gt_project_name: Project name that contains the ground truth annotations + :type gt_project_name: str + :param project_names: list of project names to aggregate through + :type project_names: list of str + :param export_root: root export path of the projects + :type export_root: Pathlike (str or Path) + :param image_list: List of image names from the projects list that must be used. If None, then all images from the projects list will be used. Default: None + :type image_list: list + :param annot_type: Type of annotation instances to consider. Available candidates are: ["bbox", "polygon", "point"] + :type annot_type: str + :param show_plots: If True, show plots based on results of consensus computation. Default: False + :type show_plots: bool + + """ + def aggregate_attributes(instance_df): + def attribute_to_list(attribute_df): + attribute_names = list(attribute_df["attributeName"]) + attribute_df["attributeNames"] = len(attribute_df) * [ + attribute_names + ] + return attribute_df + + attributes = None + if not instance_df["attributeGroupName"].isna().all(): + attrib_group_name = instance_df.groupby("attributeGroupName")[[ + "attributeGroupName", "attributeName" + ]].apply(attribute_to_list) + attributes = dict( + zip( + attrib_group_name["attributeGroupName"], + attrib_group_name["attributeNames"] + ) + ) + + instance_df.drop( + ["attributeGroupName", "attributeName"], axis=1, inplace=True + ) + instance_df.drop_duplicates( + subset=["imageName", "instanceId", "project"], inplace=True + ) + instance_df["attributes"] = [attributes] + return instance_df + + supported_types = ['polygon', 'bbox', 'point'] + if annot_type not in supported_types: + raise NotImplementedError + + if export_root is None: + with tempfile.TemporaryDirectory() as export_dir: + gt_project_meta = prepare_export(gt_project_name) + download_export(gt_project_name, gt_project_meta, export_dir) + gt_project_df = aggregate_annotations_as_df(export_dir) + else: + export_dir = Path(export_root) / gt_project_name + gt_project_df = aggregate_annotations_as_df(export_dir) + gt_project_df["project"] = gt_project_name + + benchmark_dfs = [] + for project_name in project_names: + if export_root is None: + with tempfile.TemporaryDirectory() as export_dir: + proj_export_meta = prepare_export(project_name) + download_export(project_name, proj_export_meta, export_dir) + project_df = aggregate_annotations_as_df(export_dir) + else: + export_dir = Path(export_root) / project_name + project_df = aggregate_annotations_as_df(export_dir) + + project_df["project"] = project_name + project_gt_df = pd.concat([project_df, gt_project_df]) + project_gt_df = project_gt_df[project_gt_df["instanceId"].notna()] + + if image_list is not None: + project_gt_df = project_gt_df.loc[ + project_gt_df["imageName"].isin(image_list)] + + project_gt_df.query("type == '" + annot_type + "'", inplace=True) + + project_gt_df = project_gt_df.groupby( + ["imageName", "instanceId", "project"] + ) + project_gt_df = project_gt_df.apply(aggregate_attributes).reset_index( + drop=True + ) + unique_images = set(project_gt_df["imageName"]) + all_benchmark_data = [] + for image_name in unique_images: + image_data = image_consensus(project_gt_df, image_name, annot_type) + all_benchmark_data.append(pd.DataFrame(image_data)) + + benchmark_project_df = pd.concat(all_benchmark_data, ignore_index=True) + benchmark_project_df = benchmark_project_df[ + benchmark_project_df["projectName"] == project_name] + + benchmark_dfs.append(benchmark_project_df) + + benchmark_df = pd.concat(benchmark_dfs, ignore_index=True) + + if show_plots: + consensus_plot(benchmark_df, project_names) + + return benchmark_df \ No newline at end of file From af7fabe4010f3b77fb5e73b54af24c1ec21e2016 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 10 Nov 2020 21:43:27 +0400 Subject: [PATCH 3/4] added benchmark tutorial, added consensus/benchmark api reference --- docs/source/benchmark_annotators_box.png | Bin 0 -> 41554 bytes docs/source/benchmark_projects_box.png | Bin 0 -> 25861 bytes docs/source/benchmark_scatter.png | Bin 0 -> 61736 bytes docs/source/superannotate.sdk.rst | 2 ++ docs/source/tutorial.sdk.rst | 43 ++++++++++++++++++++++- 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 docs/source/benchmark_annotators_box.png create mode 100644 docs/source/benchmark_projects_box.png create mode 100644 docs/source/benchmark_scatter.png diff --git a/docs/source/benchmark_annotators_box.png b/docs/source/benchmark_annotators_box.png new file mode 100644 index 0000000000000000000000000000000000000000..4f037e571f70f08c50bde152dacfb71b9aec086a GIT binary patch literal 41554 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≦ih1;VB+$FJoa^&|E_c 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 literal 0 HcmV?d00001 diff --git a/docs/source/benchmark_projects_box.png b/docs/source/benchmark_projects_box.png new file mode 100644 index 0000000000000000000000000000000000000000..bdc60544059124b26b98dda7d76af319d17bf21e GIT binary patch literal 25861 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 A^#A|> literal 0 HcmV?d00001 diff --git a/docs/source/benchmark_scatter.png b/docs/source/benchmark_scatter.png new file mode 100644 index 0000000000000000000000000000000000000000..6ec2e1438870fa45ad7f4c38371c31749549be1e GIT binary patch literal 61736 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ⅈelbZ#hwEtc*LSoBWkkfkE1{3K~cI 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",[project_names], "", [image_list], "") + +Here pandas DataFrame with exactly same structure as in case of consensus computation is returned. + +Besides the pandas DataFrame there is an option to get the following plots by setting the show_plots flag to True: + +* Box plot of benchmark scores for each annotators +* Box plot of benchmark scores for each project +* Scatter plots of benchmark score vs instance area for each project + +.. code-block:: python + + sa.benchmark("", [project_names], "", [image_list], "", show_plots=True) + +To the left of each box plot the original score points of that annotator is depicted, the box plots are colored by annotator. + +.. image:: benchmark_annotators_box.png + +Analogically the box plots of benchmark scores for each project are colored according to project name. + +.. image:: benchmark_projects_box.png + +Scatter plot of benchmark score vs instance area is separated by projects. Hovering on a point reveals its annotator and image name. +The points are colored according to class name. Each annotator is represented with separate symbol. + +.. image:: benchmark_scatter.png \ No newline at end of file From 41d38341b48eac37a43c83c291f2c19ad9443a92 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 10 Nov 2020 22:02:24 +0400 Subject: [PATCH 4/4] implemented unit test for benchmark --- tests/consensus_benchmark/test_benchmark.py | 50 +++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 tests/consensus_benchmark/test_benchmark.py diff --git a/tests/consensus_benchmark/test_benchmark.py b/tests/consensus_benchmark/test_benchmark.py new file mode 100644 index 000000000..760751c86 --- /dev/null +++ b/tests/consensus_benchmark/test_benchmark.py @@ -0,0 +1,50 @@ +from pathlib import Path +import superannotate as sa + +sa.init(Path.home() / ".superannotate" / "config.json") + +test_root = Path().resolve() / 'tests' + + +def test_benchmark(): + annot_types = ['polygon', 'bbox', 'point'] + gt_project_name = 'consensus_1' + project_names = ['consensus_2', 'consensus_3'] + df_column_names = [ + 'creatorEmail', 'imageName', 'instanceId', 'area', 'className', + 'attributes', 'projectName', 'score' + ] + export_path = test_root / 'consensus_benchmark' + for annot_type in annot_types: + res_df = sa.benchmark( + gt_project_name, + project_names, + export_root=export_path, + annot_type=annot_type + ) + #test content of projectName column + assert sorted(res_df['projectName'].unique()) == project_names + + #test structure of resulting DataFrame + assert sorted(res_df.columns) == sorted(df_column_names) + + #test lower bound of the score + assert (res_df['score'] >= 0).all() + + #test upper bound of the score + assert (res_df['score'] <= 1).all() + + image_names = [ + 'bonn_000000_000019_leftImg8bit.png', + 'bielefeld_000000_000321_leftImg8bit.png' + ] + + #test filtering images with given image names list + res_images = sa.benchmark( + gt_project_name, + project_names, + export_root=export_path, + image_list=image_names + ) + + assert sorted(res_images['imageName'].unique()) == sorted(image_names)