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