Example #1
0
def test_project_folder_image_count(tmpdir):
    PROJECT_NAME = "test folder image count"
    tmpdir = Path(tmpdir)

    projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
    project = project["name"]
    sa.upload_images_from_folder_to_project(project,
                                            FROM_FOLDER,
                                            annotation_status="InProgress")
    num_images = sa.get_project_image_count(project)
    assert num_images == 4

    sa.create_folder(project, "folder1")

    sa.upload_images_from_folder_to_project(project + "/folder1",
                                            FROM_FOLDER,
                                            annotation_status="InProgress")
    num_images = sa.get_project_image_count(project)
    assert num_images == 4

    num_images = sa.get_project_image_count(project + "/folder1")
    assert num_images == 4

    num_images = sa.get_project_image_count(project, with_all_subfolders=True)
    assert num_images == 8
Example #2
0
def test_delete_images(tmpdir):
    PROJECT_NAME = "test delete folder images"
    tmpdir = Path(tmpdir)

    projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
    sa.create_folder(project, "folder1")
    project = project["name"] + "/folder1"
    sa.upload_images_from_folder_to_project(project,
                                            FROM_FOLDER,
                                            annotation_status="InProgress")
    num_images = sa.get_project_image_count(project)
    assert num_images == 4

    sa.delete_images(project, ["example_image_2.jpg", "example_image_3.jpg"])

    num_images = sa.get_project_image_count(project)
    assert num_images == 2

    sa.delete_images(project, None)
    num_images = sa.get_project_image_count(project)
    assert num_images == 0
Example #3
0
def image_upload(args):
    parser = argparse.ArgumentParser()
    parser.add_argument('--project',
                        required=True,
                        help='Project name to upload')
    parser.add_argument('--folder',
                        required=True,
                        help='Folder from which to upload')
    parser.add_argument('--recursive',
                        default=False,
                        action='store_true',
                        help='Enables recursive subfolder upload.')
    parser.add_argument(
        '--extensions',
        default=None,
        type=_list_str,
        help='List of image extensions to include. Default is jpg,png')
    parser.add_argument(
        '--set-annotation-status',
        required=False,
        default="NotStarted",
        help=
        'Set images\' annotation statuses after upload. Default is NotStarted')
    args = parser.parse_args(args)

    sa.upload_images_from_folder_to_project(
        project=args.project,
        folder_path=args.folder,
        extensions=args.extensions,
        annotation_status=args.set_annotation_status,
        recursive_subfolders=args.recursive)
Example #4
0
def test_basic_export(tmpdir):
    tmpdir = Path(tmpdir)

    projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(PROJECT_NAME, "t", "Vector")
    sa.upload_images_from_folder_to_project(
        project, PROJECT_FOLDER, annotation_status="InProgress"
    )
    len_orig = len(sa.search_images(project))

    sa.create_annotation_classes_from_classes_json(
        project, PROJECT_FOLDER / "classes" / "classes.json"
    )
    sa.upload_annotations_from_folder_to_project(project, PROJECT_FOLDER)

    export = sa.prepare_export(project, include_fuse=True)

    sa.download_export(project, export, tmpdir)

    projects_found = sa.search_projects(
        PROJECT_NAME + " import", return_metadata=True
    )
    for pr in projects_found:
        sa.delete_project(pr)
    project_new = sa.create_project(PROJECT_NAME + " import", "f", "Vector")
    sa.upload_images_from_folder_to_project(
        project_new, tmpdir, annotation_status="InProgress"
    )
    len_new = len(sa.search_images(project_new))

    assert len_new == len_orig
def test_preannotation_folder_upload_download_cli_vector_COCO(tmpdir):
    project_type = "Vector"
    name = "Example Project test vector2 preannotation cli upload coco vector"
    description = "test"
    from_folder = "./tests/converter_test/COCO/input/toSuperAnnotate/keypoint_detection"
    task = "keypoint_detection"
    dataset_name = "person_keypoints_test"

    projects_found = sa.search_projects(name, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(name, description, project_type)
    sa.upload_images_from_folder_to_project(project,
                                            from_folder,
                                            annotation_status="InProgress")
    subprocess.run(
        f'superannotatecli upload-preannotations --project "{name}" --folder "{from_folder}" --format COCO --task {task} --dataset-name {dataset_name}',
        check=True,
        shell=True)
    time.sleep(5)
    count_in = 2

    images = sa.search_images(project)
    for image_name in images:
        sa.download_image_preannotations(project, image_name, tmpdir)

    count_out = len(list(Path(tmpdir).glob("*.json")))

    assert count_in == count_out
Example #6
0
def test_copy_images3(tmpdir):
    PROJECT_NAME = "test copy3 folder images"
    tmpdir = Path(tmpdir)

    projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
    sa.upload_images_from_folder_to_project(project,
                                            FROM_FOLDER,
                                            annotation_status="InProgress")
    sa.create_folder(project, "folder1")
    project = PROJECT_NAME + "/folder1"

    sa.copy_images(PROJECT_NAME,
                   ["example_image_2.jpg", "example_image_3.jpg"],
                   project,
                   include_annotations=False,
                   copy_annotation_status=False,
                   copy_pin=False)

    num_images = sa.get_project_image_count(project)
    assert num_images == 2

    num_images = sa.get_project_image_count(PROJECT_NAME)
    assert num_images == 4
Example #7
0
def test_annotation_download_upload(project_type, name, description,
                                    from_folder, tmpdir):
    projects = sa.search_projects(name, return_metadata=True)
    for project in projects:
        sa.delete_project(project)
    project = sa.create_project(name, description, project_type)
    sa.upload_images_from_folder_to_project(project,
                                            from_folder,
                                            annotation_status="NotStarted")
    sa.create_annotation_classes_from_classes_json(
        project, from_folder / "classes" / "classes.json")
    sa.upload_annotations_from_folder_to_project(project, from_folder)
    image = sa.search_images(project)[2]
    sa.download_image_annotations(project, image, tmpdir)
    anns_json_in_folder = list(Path(tmpdir).glob("*.json"))
    anns_mask_in_folder = list(Path(tmpdir).glob("*.png"))
    assert len(anns_json_in_folder) == 1
    assert len(anns_mask_in_folder) == (1 if project_type == "Pixel" else 0)

    input_annotation_paths = sa.image_path_to_annotation_paths(
        from_folder / image, project_type)

    json1 = json.load(open(input_annotation_paths[0]))
    json2 = json.load(open(anns_json_in_folder[0]))
    for i in json1:
        i.pop("classId", None)
    for i in json2:
        i.pop("classId", None)
    assert json1 == json2
    if project_type == "Pixel":
        assert filecmp.cmp(input_annotation_paths[1],
                           anns_mask_in_folder[0],
                           shallow=False)
Example #8
0
def coco_desktop_object(tmpdir):
    out_dir = tmpdir / "coco_from_desktop"
    final_dir = tmpdir / "coco_to_Web"

    sa.export_annotation_format(
        "tests/converter_test/COCO/input/fromSuperAnnotate/cats_dogs_desktop",
        str(out_dir), "COCO", "object_test", "Vector", "object_detection",
        "Desktop")

    image_list = glob(str(out_dir / 'train_set' / '*.jpg'))

    for image in image_list:
        shutil.copy(image, out_dir / Path(image).name)
    shutil.rmtree(out_dir / 'train_set')

    sa.import_annotation_format(str(out_dir), str(final_dir), "COCO",
                                "object_test_train", "Vector",
                                "object_detection", "Web")

    project_name = "coco2sa_object_pipline"

    projects = sa.search_projects(project_name, True)
    if projects:
        sa.delete_project(projects[0])
    project = sa.create_project(project_name, "converter vector", "Vector")

    sa.create_annotation_classes_from_classes_json(
        project, final_dir / "classes" / "classes.json")
    sa.upload_images_from_folder_to_project(project, final_dir)
    sa.upload_annotations_from_folder_to_project(project, final_dir)

    return 0
def test_recursive_preannotations_folder(tmpdir):
    tmpdir = Path(tmpdir)
    projects_found = sa.search_projects(
        TEMP_PROJECT_NAME + "2", return_metadata=True
    )
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(TEMP_PROJECT_NAME + "2", "test", "Vector")

    sa.upload_images_from_folder_to_project(
        project,
        "./tests/sample_recursive_test",
        annotation_status="QualityCheck",
        recursive_subfolders=True
    )

    assert len(sa.search_images(project)) == 2

    sa.create_annotation_classes_from_classes_json(
        project, "./tests/sample_recursive_test/classes/classes.json"
    )

    sa.upload_preannotations_from_folder_to_project(
        project, "./tests/sample_recursive_test", recursive_subfolders=True
    )

    for image in sa.search_images(project):
        sa.download_image_preannotations(project, image, tmpdir)

    assert len(list(tmpdir.glob("*.json"))) == 2
def upload_project(project_path,
                   project_name,
                   description,
                   ptype,
                   from_s3_bucket=None,
                   annotation_status='NotStarted',
                   image_quality_in_editor=None):
    if isinstance(project_path, str):
        project_path = Path(project_path)

    projects = sa.search_projects(project_name, return_metadata=True)
    for project in projects:
        sa.delete_project(project)

    project = sa.create_project(project_name, description, ptype)

    sa.create_annotation_classes_from_classes_json(
        project,
        project_path / "classes" / "classes.json",
        from_s3_bucket=from_s3_bucket)
    sa.upload_images_from_folder_to_project(
        project,
        project_path,
        annotation_status=annotation_status,
        from_s3_bucket=from_s3_bucket,
        image_quality_in_editor=image_quality_in_editor)
    sa.upload_annotations_from_folder_to_project(project,
                                                 project_path,
                                                 from_s3_bucket=from_s3_bucket)

    return project
def test_missing_annotation_upload(tmpdir):
    name = "Example Project test vector missing annotation upload"
    project_type = "Vector"
    description = "test vector"
    from_folder = Path("./tests/sample_project_vector_for_checks")
    projects = sa.search_projects(name, return_metadata=True)
    for project in projects:
        sa.delete_project(project)

    project = sa.create_project(name, description, project_type)

    sa.upload_images_from_folder_to_project(project,
                                            from_folder,
                                            annotation_status="NotStarted")
    sa.create_annotation_classes_from_classes_json(
        project, from_folder / "classes" / "classes.json")
    uploaded, couldnt_upload, missing_images = sa.upload_annotations_from_folder_to_project(
        project, from_folder)
    print(uploaded, couldnt_upload, missing_images)
    assert len(uploaded) == 1
    assert len(couldnt_upload) == 2
    assert len(missing_images) == 1

    assert "tests/sample_project_vector_for_checks/example_image_1.jpg___objects.json" in uploaded
    assert "tests/sample_project_vector_for_checks/example_image_2.jpg___objects.json" in couldnt_upload
    assert "tests/sample_project_vector_for_checks/example_image_4.jpg___objects.json" in couldnt_upload
    assert "tests/sample_project_vector_for_checks/example_image_5.jpg___objects.json" in missing_images
Example #12
0
def test_preannotation_folder_upload_download_cli(project_type, name,
                                                  description, from_folder,
                                                  tmpdir):
    projects_found = sa.search_projects(name, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(name, description, project_type)
    sa.upload_images_from_folder_to_project(project,
                                            from_folder,
                                            annotation_status="InProgress")
    sa.create_annotation_classes_from_classes_json(
        project, from_folder / "classes" / "classes.json")
    subprocess.run([
        f"superannotate upload-preannotations --project '{name}' --folder '{from_folder}'"
    ],
                   check=True,
                   shell=True)
    time.sleep(5)
    count_in = len(list(from_folder.glob("*.json")))

    images = sa.search_images(project)
    for image_name in images:
        sa.download_image_preannotations(project, image_name, tmpdir)

    count_out = len(list(Path(tmpdir).glob("*.json")))

    assert count_in == count_out
Example #13
0
def test_move_images2(tmpdir):
    PROJECT_NAME = "test move folder images2"
    tmpdir = Path(tmpdir)

    projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
    sa.create_folder(project, "folder1")
    project = PROJECT_NAME + "/folder1"
    sa.upload_images_from_folder_to_project(project,
                                            FROM_FOLDER,
                                            annotation_status="InProgress")
    num_images = sa.get_project_image_count(project)
    assert num_images == 4

    sa.create_folder(PROJECT_NAME, "folder2")
    project2 = PROJECT_NAME + "/folder2"
    num_images = sa.get_project_image_count(project2)
    assert num_images == 0

    sa.move_images(project, None, project2)

    num_images = sa.get_project_image_count(project2)
    assert num_images == 4

    num_images = sa.get_project_image_count(project)
    assert num_images == 0
def test_preannotations_nonrecursive_s3_folder(tmpdir):
    tmpdir = Path(tmpdir)
    projects_found = sa.search_projects(
        TEMP_PROJECT_NAME + "7", return_metadata=True
    )
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(TEMP_PROJECT_NAME + "7", "test", "Vector")

    sa.upload_images_from_folder_to_project(
        project,
        "sample_recursive_test",
        from_s3_bucket="superannotate-python-sdk-test",
        recursive_subfolders=True
    )

    assert len(sa.search_images(project)) == 2

    sa.create_annotation_classes_from_classes_json(
        project,
        "sample_recursive_test/classes/classes.json",
        from_s3_bucket="superannotate-python-sdk-test"
    )

    sa.upload_preannotations_from_folder_to_project(
        project,
        "sample_recursive_test",
        recursive_subfolders=False,
        from_s3_bucket="superannotate-python-sdk-test"
    )

    for image in sa.search_images(project):
        sa.download_image_preannotations(project, image, tmpdir)
Example #15
0
def image_upload(command_name, args):
    parser = argparse.ArgumentParser(prog=_CLI_COMMAND + " " + command_name)
    parser.add_argument('--project',
                        required=True,
                        help='Project name to upload')
    parser.add_argument('--folder',
                        required=True,
                        help='Folder from which to upload')
    parser.add_argument('--recursive',
                        default=False,
                        action='store_true',
                        help='Enables recursive subfolder upload.')
    parser.add_argument(
        '--extensions',
        default=common.DEFAULT_IMAGE_EXTENSIONS,
        type=_list_str,
        help=
        'List of image extensions to include. Default is jpg,jpeg,png,tif,tiff,webp,bmp'
    )
    parser.add_argument(
        '--set-annotation-status',
        required=False,
        default="NotStarted",
        help=
        'Set images\' annotation statuses after upload. Default is NotStarted')
    args = parser.parse_args(args)

    sa.upload_images_from_folder_to_project(
        project=args.project,
        folder_path=args.folder,
        extensions=args.extensions,
        annotation_status=args.set_annotation_status,
        recursive_subfolders=args.recursive)
def test_preannotation_folder_upload_download_cli_pixel_object_COCO_folder(
        tmpdir):
    project_type = "Pixel"
    name = "Example Project folder test pixel1 preannotation cli upload coco object pixel"
    description = "test"
    from_folder = "./tests/converter_test/COCO/input/toSuperAnnotate/panoptic_segmentation"
    task = "panoptic_segmentation"
    dataset_name = "panoptic_test"

    projects_found = sa.search_projects(name, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(name, description, project_type)
    sa.create_folder(project, "folder1")
    project_with_folder = project["name"] + "/folder1"
    sa.upload_images_from_folder_to_project(project_with_folder,
                                            from_folder,
                                            annotation_status="InProgress")
    subprocess.run(
        f'superannotatecli upload-preannotations --project "{project_with_folder}" --folder "{from_folder}" --format COCO --task {task} --dataset-name {dataset_name}',
        check=True,
        shell=True)
    time.sleep(5)
    count_in = 3

    images = sa.search_images(project_with_folder)
    for image_name in images:
        sa.download_image_preannotations(project_with_folder, image_name,
                                         tmpdir)

    count_out = len(list(Path(tmpdir).glob("*.json")))

    assert count_in == count_out
Example #17
0
def test_add_bbox_noinit(tmpdir):
    tmpdir = Path(tmpdir)

    projects_found = sa.search_projects(
        PROJECT_NAME_NOINIT, return_metadata=True
    )
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(
        PROJECT_NAME_NOINIT, PROJECT_DESCRIPTION, "Vector"
    )
    sa.upload_images_from_folder_to_project(
        project, PATH_TO_SAMPLE_PROJECT, annotation_status="InProgress"
    )
    sa.create_annotation_classes_from_classes_json(
        project, PATH_TO_SAMPLE_PROJECT / "classes" / "classes.json"
    )
    sa.create_annotation_class(project, "test_add", "#FF0000")
    images = sa.search_images(project, "example_image_1")

    image_name = images[0]
    sa.add_annotation_bbox_to_image(
        project, image_name, [10, 10, 500, 100], "test_add"
    )
    sa.add_annotation_polygon_to_image(
        project, image_name, [100, 100, 500, 500, 200, 300], "test_add"
    )
    annotations_new = sa.get_image_annotations(project,
                                               image_name)["annotation_json"]

    assert len(annotations_new) == 2
    export = sa.prepare_export(project, include_fuse=True)
    sa.download_export(project, export, tmpdir)
    assert len(list(Path(tmpdir).rglob("*.*"))) == 4
Example #18
0
def test_vector_preannotation_upload_from_s3(tmpdir):
    projects_found = sa.search_projects(TEST_PROJECT3, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)
    project = sa.create_project(TEST_PROJECT3,
                                "hk_test",
                                project_type="Vector")

    f = urlparse(f"s3://superannotate-python-sdk-test/{TEST_PROJECT_VECTOR}")
    sa.upload_images_from_folder_to_project(project,
                                            f.path[1:],
                                            annotation_status="NotStarted",
                                            from_s3_bucket=f.netloc)
    sa.create_annotation_classes_from_classes_json(project,
                                                   f.path[1:] +
                                                   '/classes/classes.json',
                                                   from_s3_bucket=f.netloc)
    assert sa.get_project_image_count(project) == 4

    sa.upload_preannotations_from_folder_to_project(project,
                                                    TEST_PROJECT_VECTOR,
                                                    from_s3_bucket=f.netloc)

    for image in sa.search_images(project):
        sa.download_image_preannotations(project, image, tmpdir)

    assert len(list(Path(tmpdir).glob("*.*"))) == 4
    sa.delete_project(project)
Example #19
0
def test_folder_annotations(tmpdir):
    PROJECT_NAME = "test folder annotations"
    tmpdir = Path(tmpdir)

    projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
    project = project["name"]
    sa.upload_images_from_folder_to_project(project,
                                            FROM_FOLDER,
                                            annotation_status="InProgress")
    sa.create_annotation_classes_from_classes_json(
        project, FROM_FOLDER / "classes" / "classes.json")
    folder_metadata = sa.create_folder(project, "folder1")
    assert folder_metadata["name"] == "folder1"

    folders = sa.search_folders(project, return_metadata=True)
    assert len(folders) == 1

    sa.upload_images_from_folder_to_project(project + "/" + folders[0]["name"],
                                            FROM_FOLDER,
                                            annotation_status="InProgress")
    sa.upload_annotations_from_folder_to_project(
        project + "/" + folders[0]["name"], FROM_FOLDER)
    annot = sa.get_image_annotations(project, "example_image_1.jpg")
    assert len(annot["annotation_json"]["instances"]) == 0

    annot = sa.get_image_annotations(project + "/folder1",
                                     "example_image_1.jpg")
    assert len(annot["annotation_json"]["instances"]) > 0
def test_duplicate_upload_images(tmpdir):
    tmpdir = Path(tmpdir)

    projects = sa.search_projects(PROJECT_NAME_VECTOR, return_metadata=True)
    for project in projects:
        sa.delete_project(project)

    project = sa.create_project(PROJECT_NAME_VECTOR, "test", "Vector")

    uploaded, could_not_upload, existing_images = sa.upload_images_from_folder_to_project(
        project, "./tests/sample_project_vector"
    )

    assert len(uploaded) == 4
    assert len(could_not_upload) == 0
    assert len(existing_images) == 0

    uploaded, could_not_upload, existing_images = sa.upload_images_to_project(
        project, ["./tests/sample_project_vector/dd.jpg"]
    )

    assert len(uploaded) == 0
    assert len(could_not_upload) == 1
    assert len(existing_images) == 0

    uploaded, could_not_upload, existing_images = sa.upload_images_from_folder_to_project(
        project, "./tests/sample_project_vector"
    )

    assert len(uploaded) == 0
    assert len(could_not_upload) == 0
    assert len(existing_images) == 4
Example #21
0
def test_df_to_annotations_full(tmpdir):
    tmpdir = Path(tmpdir)

    df = sa.aggregate_annotations_as_df(
        PROJECT_DIR,
        include_classes_wo_annotations=True,
        include_comments=True,
        include_tags=True
    )
    sa.df_to_annotations(df, tmpdir)
    df_new = sa.aggregate_annotations_as_df(
        tmpdir,
        include_classes_wo_annotations=True,
        include_comments=True,
        include_tags=True
    )
    for project in sa.search_projects("test df to annotations 4"):
        sa.delete_project(project)
    project = sa.create_project("test df to annotations 4", "test", "Vector")
    sa.upload_images_from_folder_to_project(project, PROJECT_DIR)
    sa.create_annotation_classes_from_classes_json(
        project, tmpdir / "classes" / "classes.json"
    )
    sa.upload_annotations_from_folder_to_project(project, tmpdir)
    # print(df_new["image_name"].value_counts())
    # print(df["image_name"].value_counts())
    for _index, row in enumerate(df.iterrows()):
        for _, row_2 in enumerate(df_new.iterrows()):
            if row_2[1].equals(row[1]):
                break
        else:
            assert False

    fil1 = sa.filter_annotation_instances(
        df_new,
        include=[
            {
                "className": "Personal vehicle",
                "attributes": [{
                    "name": "4",
                    "groupName": "Num doors"
                }]
            }
        ],
        exclude=[{
            "type": "polygon"
        }]
    )
    filtered_export = (tmpdir / "filtered")
    filtered_export.mkdir()
    sa.df_to_annotations(fil1, filtered_export)
    for project in sa.search_projects("test df to annotations 3"):
        sa.delete_project(project)
    project = sa.create_project("test df to annotations 3", "test", "Vector")
    sa.upload_images_from_folder_to_project(project, PROJECT_DIR)
    sa.create_annotation_classes_from_classes_json(
        project, filtered_export / "classes" / "classes.json"
    )
    sa.upload_annotations_from_folder_to_project(project, filtered_export)
def test_consensus():
    annot_types = ['polygon', 'bbox', 'point']
    folder_names = ['consensus_1', 'consensus_2', 'consensus_3']
    df_column_names = [
        'creatorEmail', 'imageName', 'instanceId', 'area', 'className',
        'attributes', 'folderName', 'score'
    ]
    export_path = test_root / 'consensus_benchmark' / 'consensus_test_data'
    if len(sa.search_projects(project_name)) != 0:
        sa.delete_project(project_name)

    sa.create_project(project_name, "test bench", "Vector")
    for i in range(1, 4):
        sa.create_folder(project_name, "consensus_" + str(i))
    sa.create_annotation_classes_from_classes_json(
        project_name, export_path / 'classes' / 'classes.json')
    sa.upload_images_from_folder_to_project(project_name,
                                            export_path / "images",
                                            annotation_status="Completed")
    for i in range(1, 4):
        sa.upload_images_from_folder_to_project(project_name + '/consensus_' +
                                                str(i),
                                                export_path / "images",
                                                annotation_status="Completed")
    sa.upload_annotations_from_folder_to_project(project_name, export_path)
    for i in range(1, 4):
        sa.upload_annotations_from_folder_to_project(
            project_name + '/consensus_' + str(i),
            export_path / ('consensus_' + str(i)))

    for annot_type in annot_types:
        res_df = sa.consensus(project_name,
                              folder_names,
                              annot_type=annot_type)
        #test content of projectName column
        assert sorted(res_df['folderName'].unique()) == folder_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.consensus(project_name,
                              folder_names,
                              export_root=export_path,
                              image_list=image_names)

    assert sorted(res_images['imageName'].unique()) == sorted(image_names)
Example #23
0
def test_copy_images(tmpdir):
    PROJECT_NAME = "test copy folder images"
    tmpdir = Path(tmpdir)

    projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
    sa.create_folder(project, "folder1")
    project = PROJECT_NAME + "/folder1"
    sa.upload_images_from_folder_to_project(project,
                                            FROM_FOLDER,
                                            annotation_status="InProgress")
    num_images = sa.get_project_image_count(project)
    assert num_images == 4

    im1 = sa.get_image_metadata(project, "example_image_2.jpg")
    assert im1["annotation_status"] == "InProgress"

    sa.create_folder(PROJECT_NAME, "folder2")
    project2 = PROJECT_NAME + "/folder2"
    num_images = sa.get_project_image_count(project2)
    assert num_images == 0

    sa.copy_images(project, ["example_image_2.jpg", "example_image_3.jpg"],
                   project2,
                   include_annotations=False,
                   copy_annotation_status=False,
                   copy_pin=False)

    im1_copied = sa.get_image_metadata(project2, "example_image_2.jpg")
    assert im1_copied["annotation_status"] == "NotStarted"

    ann2 = sa.get_image_annotations(project2, "example_image_2.jpg")

    assert len(ann2["annotation_json"]["instances"]) == 0

    num_images = sa.get_project_image_count(project2)
    assert num_images == 2

    res = sa.copy_images(project, None, project2)

    num_images = sa.get_project_image_count(project2)
    assert num_images == 4

    assert res == 2

    sa.copy_images(project, ["example_image_2.jpg", "example_image_3.jpg"],
                   PROJECT_NAME,
                   include_annotations=False,
                   copy_annotation_status=False,
                   copy_pin=False)
    num_images = sa.get_project_image_count(PROJECT_NAME)
    assert num_images == 2
Example #24
0
def test_folder_export(tmpdir):
    PROJECT_NAME = "test folder export"
    tmpdir = Path(tmpdir)

    projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
    sa.create_annotation_classes_from_classes_json(
        project, FROM_FOLDER / "classes" / "classes.json")
    sa.upload_images_from_folder_to_project(project,
                                            FROM_FOLDER,
                                            annotation_status="InProgress")
    sa.create_folder(project, "folder1")
    project = PROJECT_NAME + "/folder1"
    sa.upload_images_from_folder_to_project(project,
                                            FROM_FOLDER,
                                            annotation_status="InProgress")

    sa.upload_annotations_from_folder_to_project(project, FROM_FOLDER)
    num_images = sa.get_project_image_count(project)
    assert num_images == 4

    sa.create_folder(PROJECT_NAME, "folder2")
    project2 = PROJECT_NAME + "/folder2"
    num_images = sa.get_project_image_count(project2)
    assert num_images == 0

    sa.copy_images(project, ["example_image_2.jpg", "example_image_3.jpg"],
                   project2)

    export = sa.prepare_export(PROJECT_NAME, ["folder1", "folder2"])
    sa.download_export(project, export, tmpdir)

    assert len(list((tmpdir / "classes").rglob("*"))) == 1

    assert len(list((tmpdir / "folder1").rglob("*"))) == 4

    assert len(list((tmpdir / "folder2").rglob("*"))) == 2

    assert len(list((tmpdir).glob("*.*"))) == 0

    export = sa.prepare_export(PROJECT_NAME)
    sa.download_export(project, export, tmpdir)

    assert len(list((tmpdir / "classes").rglob("*"))) == 1

    assert len(list((tmpdir / "folder1").rglob("*"))) == 4

    assert len(list((tmpdir / "folder2").rglob("*"))) == 2

    assert len(list((tmpdir).glob("*.*"))) == 4
Example #25
0
def test_assign_images_folder(tmpdir):
    tmpdir = Path(tmpdir)

    projects = sa.search_projects(PROJECT_NAME_VECTOR2, return_metadata=True)
    for project in projects:
        sa.delete_project(project)

    project = sa.create_project(PROJECT_NAME_VECTOR2, "test", "Vector")
    email = sa.get_team_metadata()["users"][0]["email"]
    sa.share_project(project, email, "QA")
    sa.create_folder(project, FOLDER2)

    project_folder = project["name"] + "/" + FOLDER2

    sa.upload_images_from_folder_to_project(project_folder,
                                            "./tests/sample_project_vector")

    sa.assign_images(project_folder,
                     ["example_image_1.jpg", "example_image_2.jpg"], email)

    time.sleep(1)
    im1_metadata = sa.get_image_metadata(project_folder, "example_image_1.jpg")
    im2_metadata = sa.get_image_metadata(project_folder, "example_image_2.jpg")

    assert im1_metadata["qa_id"] == email
    assert im2_metadata["qa_id"] == email

    sa.unshare_project(project, email)

    time.sleep(1)

    im1_metadata = sa.get_image_metadata(project_folder, "example_image_1.jpg")
    im2_metadata = sa.get_image_metadata(project_folder, "example_image_2.jpg")

    assert im1_metadata["qa_id"] is None
    assert im2_metadata["qa_id"] is None
    assert im1_metadata["annotator_id"] is None
    assert im2_metadata["annotator_id"] is None

    sa.share_project(project, email, "Annotator")

    sa.assign_images(project_folder,
                     ["example_image_1.jpg", "example_image_2.jpg"], email)

    time.sleep(1)
    im1_metadata = sa.get_image_metadata(project_folder, "example_image_1.jpg")
    im2_metadata = sa.get_image_metadata(project_folder, "example_image_2.jpg")

    assert im1_metadata["annotator_id"] == email
    assert im2_metadata["annotator_id"] == email
    assert im1_metadata["qa_id"] is None
    assert im2_metadata["qa_id"] is None
Example #26
0
def test_upload_stress():
    project = sa.create_project("test_test_15", "hk", 1)
    sa.create_annotation_classes_from_classes_json(
        project, "tests/sample_project_vector/classes/classes.json"
    )

    sa.upload_images_from_folder_to_project(
        project,
        "/media/disc_drive/datasets/COCO/test2017",
        annotation_status="QualityCheck"
    )
    count = sa.get_project_image_count(project)
    assert count == 40670
def test_from_s3_upload():
    projects = sa.search_projects(PROJECT_NAME_UPLOAD, return_metadata=True)
    for project in projects:
        sa.delete_project(project)

    project = sa.create_project(PROJECT_NAME_UPLOAD, "hk", "Vector")
    sa.create_annotation_classes_from_classes_json(
        project, "frex9/classes/classes.json", S3_BUCKET)

    sa.upload_images_from_folder_to_project(project,
                                            S3_PREFIX, ["jpg"],
                                            annotation_status="QualityCheck",
                                            from_s3_bucket=S3_BUCKET)
    assert len(sa.search_images(project)) == 4
Example #28
0
def test_copy_images2(tmpdir):
    PROJECT_NAME = "test copy folder annotation images"
    tmpdir = Path(tmpdir)

    projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
    sa.create_annotation_classes_from_classes_json(
        project, FROM_FOLDER / "classes" / "classes.json")
    sa.create_folder(project, "folder1")
    project = PROJECT_NAME + "/folder1"
    sa.upload_images_from_folder_to_project(project,
                                            FROM_FOLDER,
                                            annotation_status="InProgress")

    sa.upload_annotations_from_folder_to_project(project, FROM_FOLDER)
    num_images = sa.get_project_image_count(project)
    assert num_images == 4

    sa.create_folder(PROJECT_NAME, "folder2")
    project2 = PROJECT_NAME + "/folder2"
    num_images = sa.get_project_image_count(project2)
    assert num_images == 0

    sa.pin_image(project, "example_image_2.jpg")

    im1 = sa.get_image_metadata(project, "example_image_2.jpg")
    assert im1["is_pinned"] == 1
    assert im1["annotation_status"] == "InProgress"

    sa.copy_images(project, ["example_image_2.jpg", "example_image_3.jpg"],
                   project2)

    num_images = sa.get_project_image_count(project2)
    assert num_images == 2

    ann1 = sa.get_image_annotations(project, "example_image_2.jpg")
    ann2 = sa.get_image_annotations(project2, "example_image_2.jpg")
    assert ann1 == ann2

    im1_copied = sa.get_image_metadata(project2, "example_image_2.jpg")
    assert im1_copied["is_pinned"] == 1
    assert im1_copied["annotation_status"] == "InProgress"

    im2_copied = sa.get_image_metadata(project2, "example_image_3.jpg")
    assert im2_copied["is_pinned"] == 0
    assert im2_copied["annotation_status"] == "InProgress"
def test_images_nonrecursive(tmpdir):
    tmpdir = Path(tmpdir)
    projects_found = sa.search_projects(
        TEMP_PROJECT_NAME + "9", return_metadata=True
    )
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(TEMP_PROJECT_NAME + "9", "test", "Vector")

    sa.upload_images_from_folder_to_project(
        project, "./tests/sample_recursive_test", recursive_subfolders=False
    )

    assert len(sa.search_images(project)) == 1
def test_annotations_nonrecursive_s3_folder(tmpdir):
    tmpdir = Path(tmpdir)
    projects_found = sa.search_projects(
        TEMP_PROJECT_NAME + "5", return_metadata=True
    )
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(TEMP_PROJECT_NAME + "5", "test", "Vector")

    sa.upload_images_from_folder_to_project(
        project,
        "sample_recursive_test",
        annotation_status="QualityCheck",
        from_s3_bucket="superannotate-python-sdk-test",
        recursive_subfolders=True
    )

    assert len(sa.search_images(project)) == 2

    sa.create_annotation_classes_from_classes_json(
        project,
        "sample_recursive_test/classes/classes.json",
        from_s3_bucket="superannotate-python-sdk-test"
    )

    sa.upload_annotations_from_folder_to_project(
        project,
        "sample_recursive_test",
        recursive_subfolders=False,
        from_s3_bucket="superannotate-python-sdk-test"
    )

    export = sa.prepare_export(project)

    time.sleep(1)
    sa.download_export(project, export, tmpdir)

    non_empty_annotations = 0
    json_files = tmpdir.glob("*.json")
    for json_file in json_files:
        json_ann = json.load(open(json_file))
        if "instances" in json_ann and len(json_ann["instances"]) > 0:
            non_empty_annotations += 1

    assert non_empty_annotations == 1