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)
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)
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)