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