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