Beispiel #1
0
def preannotations_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 (SuperAnnotate format) or JSON path (COCO format) from which to upload'
    )
    parser.add_argument('--format',
                        required=False,
                        default="SuperAnnotate",
                        help='Input preannotations format.')
    parser.add_argument(
        '--dataset-name',
        required=False,
        help='Input annotations dataset name for COCO projects')
    parser.add_argument(
        '--task',
        required=False,
        help=
        'Task type for COCO projects can be panoptic_segmentation (Pixel), instance_segmentation (Pixel), instance_segmentation (Vector), keypoint_detection (Vector)'
    )

    args = parser.parse_args(args)
    project_metadata, folder_metadata = sa.get_project_and_folder_metadata(
        args.project)

    if args.format != "SuperAnnotate":
        if args.format != "COCO":
            raise sa.SABaseException(
                0, "Not supported annotations format " + args.format)
        if args.dataset_name is None:
            raise sa.SABaseException(
                0, "Dataset name should be present for COCO format upload.")
        if args.task is None:
            raise sa.SABaseException(
                0, "Task name should be present for COCO format upload.")

        logger.info("Annotations in format %s.", args.format)
        project_type = project_metadata["type"]

        tempdir = tempfile.TemporaryDirectory()
        tempdir_path = Path(tempdir.name)
        sa.import_annotation(args.folder, tempdir_path, "COCO",
                             args.dataset_name, project_type, args.task)
        args.folder = tempdir_path

    sa.create_annotation_classes_from_classes_json(
        project_metadata,
        Path(args.folder) / "classes" / "classes.json")

    if "pre" not in command_name:
        sa.upload_annotations_from_folder_to_project(
            (project_metadata, folder_metadata), folder_path=args.folder)
    else:
        sa.upload_preannotations_from_folder_to_project(
            (project_metadata, folder_metadata), folder_path=args.folder)
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 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)
Beispiel #4
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)
def test_missing_preannotation_upload(tmpdir):
    name = "Example Project test vector missing preannotation 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_preannotations_from_folder_to_project(
        project, from_folder)
    print(uploaded, couldnt_upload)
    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
Beispiel #6
0
def test_preannotation_folder_upload_download(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")
    sa.upload_preannotations_from_folder_to_project(project, from_folder)
    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