示例#1
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)
示例#2
0
def test_upload_from_s3(tmpdir):
    projects_found = sa.search_projects(TEST_PROJECT1, return_metadata=True)
    for pr in projects_found:
        sa.delete_project(pr)

    project = sa.create_project(TEST_PROJECT1, "hk_test", project_type="Pixel")

    f = urlparse(f"s3://superannotate-python-sdk-test/{TEST_PROJECT_PIXEL}")
    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) == 3

    sa.upload_annotations_from_folder_to_project(project,
                                                 TEST_PROJECT_PIXEL,
                                                 from_s3_bucket=f.netloc)

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

    assert len(list(Path(tmpdir).glob("*.*"))) == 6
    sa.delete_project(project)
def test_annotation_folder_upload_download_cli_vector_COCO(tmpdir):
    project_type = "Vector"
    name = "Example Project test vector2 annotation 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-annotations --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_annotations(project, image_name, tmpdir)

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

    assert count_in == count_out
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)

    project = upload_project(from_folder, name, description, project_type)

    image = sa.search_images(project)[0]
    paths = sa.download_image_annotations(project, image, tmpdir)

    input_annotation_paths_after = sa.image_path_to_annotation_paths(
        tmpdir / image, project_type)

    assert paths[0] == str(input_annotation_paths_after[0])
    if project_type == "Pixel":
        assert paths[1] == str(input_annotation_paths_after[1])
    else:
        assert len(paths) == 1

    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["instances"]:
        i.pop("classId", None)
        for j in i["attributes"]:
            j.pop("groupId", None)
            j.pop("id", None)
    for i in json2["instances"]:
        i.pop("classId", None)
        for j in i["attributes"]:
            j.pop("groupId", None)
            j.pop("id", None)
    assert json1 == json2
    if project_type == "Pixel":
        assert filecmp.cmp(input_annotation_paths[1],
                           anns_mask_in_folder[0],
                           shallow=False)
示例#5
0
def test_basic_images(project_type, name, description, from_folder, tmpdir):
    tmpdir = Path(tmpdir)

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

    projects_found = sa.search_projects(name, return_metadata=True)
    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")
    images = sa.search_images(project, "example_image_1")
    assert len(images) == 1

    image_name = images[0]
    sa.download_image(project, image_name, tmpdir, True)
    assert sa.get_image_preannotations(
        project, image_name)["preannotation_json_filename"] is None
    assert sa.get_image_annotations(
        project, image_name)["annotation_json_filename"] is None
    sa.download_image_annotations(project, image_name, tmpdir)
    assert len(list(Path(tmpdir).glob("*"))) == 1
    sa.download_image_preannotations(project, image_name, tmpdir)
    assert len(list(Path(tmpdir).glob("*"))) == 1

    assert (Path(tmpdir) / image_name).is_file()

    sa.upload_annotations_from_json_to_image(
        project, image_name,
        sa.image_path_to_annotation_paths(from_folder / image_name,
                                          project_type)[0],
        None if project_type == "Vector" else
        sa.image_path_to_annotation_paths(from_folder /
                                          image_name, project_type)[1])
    assert sa.get_image_annotations(
        project, image_name)["annotation_json_filename"] is not None

    sa.download_image_annotations(project, image_name, tmpdir)
    annotation = list(Path(tmpdir).glob("*.json"))
    assert len(annotation) == 1
    annotation = json.load(open(annotation[0]))

    sa.download_annotation_classes_json(project, tmpdir)
    downloaded_classes = json.load(open(tmpdir / "classes.json"))

    for a in annotation:
        if "className" not in a:
            continue
        for c1 in downloaded_classes:
            if a["className"] == c1["name"] or a[
                    "className"] == "Personal vehicle1":  # "Personal vehicle1" is not existing class in annotations
                break
        else:
            assert False

    input_classes = json.load(open(from_folder / "classes" / "classes.json"))
    assert len(downloaded_classes) == len(input_classes)
    for c1 in downloaded_classes:
        found = False
        for c2 in input_classes:
            if c1["name"] == c2["name"]:
                found = True
                break
        assert found

    sa.delete_project(project)