def model_run(CLIENT): ds = CLIENT.create_dataset(TEST_DATASET_NAME) ds_items = [] for url in TEST_IMG_URLS[:2]: ds_items.append( DatasetItem( image_location=url, reference_id=reference_id_from_url(url), )) response = ds.append(ds_items) assert ERROR_PAYLOAD not in response.json() model = CLIENT.add_model(name=TEST_MODEL_NAME, reference_id="model_" + str(time.time())) run = model.create_run(name=TEST_MODEL_RUN, dataset=ds, predictions=[]) yield run response = CLIENT.delete_dataset(ds.id) assert response == {"message": "Beginning dataset deletion..."} response = CLIENT.delete_model(model.id) assert response == {}
def test_slice_append(dataset): # Dataset upload ds_items = [] for url in TEST_IMG_URLS: ds_items.append( DatasetItem( image_location=url, reference_id=reference_id_from_url(url), )) response = dataset.append(ds_items) assert ERROR_PAYLOAD not in response.json() # Slice creation slc = dataset.create_slice( name=TEST_SLICE_NAME, reference_ids=[ds_items[0].reference_id], ) # Insert duplicate first item slc.append(reference_ids=[item.reference_id for item in ds_items[:3]]) response = slc.info() assert len(response["dataset_items"]) == 3 for item in ds_items[:3]: assert (item.reference_id == response["dataset_items"][0]["ref_id"] or item.reference_id == response["dataset_items"][1]["ref_id"] or item.reference_id == response["dataset_items"][2]["ref_id"])
def test_slice_create_and_delete_and_list(dataset): # Dataset upload ds_items = [] for url in TEST_IMG_URLS: ds_items.append( DatasetItem( image_location=url, reference_id=reference_id_from_url(url), )) response = dataset.append(ds_items) assert ERROR_PAYLOAD not in response.json() # Slice creation slc = dataset.create_slice( name=TEST_SLICE_NAME, reference_ids=[item.reference_id for item in ds_items[:2]], ) dataset_slices = dataset.slices assert len(dataset_slices) == 1 assert slc.slice_id == dataset_slices[0] response = slc.info() assert response["name"] == TEST_SLICE_NAME assert response["dataset_id"] == dataset.id assert len(response["dataset_items"]) == 2 for item in ds_items[:2]: assert (item.reference_id == response["dataset_items"][0]["ref_id"] or item.reference_id == response["dataset_items"][1]["ref_id"])
def test_dataset_append_local(CLIENT, dataset): ds_items_local = [DatasetItem(image_location=LOCAL_FILENAME)] response = dataset.append(ds_items_local) assert isinstance(response, UploadResponse) resp_json = response.json() assert resp_json[DATASET_ID_KEY] == dataset.id assert resp_json[NEW_ITEMS] == 1 assert resp_json[UPDATED_ITEMS] == 0 assert resp_json[IGNORED_ITEMS] == 0 assert resp_json[ERROR_ITEMS] == 0 assert ERROR_PAYLOAD not in resp_json
def test_append_with_special_chars(dataset): url = TEST_IMG_URLS[0] ref_id = "test/reference/id" ds_items = [ DatasetItem( image_location=url, reference_id=ref_id, metadata={"test": "metadata"}, ), ] dataset.append(ds_items) dataset.refloc(ref_id)
def test_dataset_update_metadata(dataset): dataset.append([ DatasetItem( image_location=TEST_IMG_URLS[0], metadata={"snake_field": 0}, reference_id="test_image", ) ]) dataset.append( [ DatasetItem( image_location=TEST_IMG_URLS[0], metadata={"snake_field": 1}, reference_id="test_image", ) ], update=True, ) resulting_item = dataset.iloc(0)["item"] print(resulting_item) assert resulting_item.metadata["snake_field"] == 1
def test_dataset_append_local(CLIENT, dataset): ds_items_local_error = [ DatasetItem(image_location=LOCAL_FILENAME, metadata={"test": math.nan}) ] with pytest.raises(ValueError) as e: dataset.append(ds_items_local_error) assert "Out of range float values are not JSON compliant" in str( e.value) ds_items_local = [ DatasetItem(image_location=LOCAL_FILENAME, metadata={"test": 0}) ] response = dataset.append(ds_items_local) assert isinstance(response, UploadResponse) resp_json = response.json() assert resp_json[DATASET_ID_KEY] == dataset.id assert resp_json[NEW_ITEMS] == 1 assert resp_json[UPDATED_ITEMS] == 0 assert resp_json[IGNORED_ITEMS] == 0 assert resp_json[ERROR_ITEMS] == 0 assert ERROR_PAYLOAD not in resp_json
def test_dataset_append(dataset): def check_is_expected_response(response): assert isinstance(response, UploadResponse) resp_json = response.json() assert resp_json[DATASET_ID_KEY] == dataset.id assert resp_json[NEW_ITEMS] == len(TEST_IMG_URLS) assert resp_json[UPDATED_ITEMS] == 0 assert resp_json[IGNORED_ITEMS] == 0 assert resp_json[ERROR_ITEMS] == 0 assert ERROR_PAYLOAD not in resp_json # Plain image upload ds_items_plain = [] for url in TEST_IMG_URLS: ds_items_plain.append(DatasetItem(image_location=url)) response = dataset.append(ds_items_plain) check_is_expected_response(response) # With reference ids and metadata: ds_items_with_metadata = [] for i, url in enumerate(TEST_IMG_URLS): ds_items_with_metadata.append( DatasetItem( image_location=url, reference_id=reference_id_from_url(url), metadata={ "made_with_pytest": True, "example_int": i, "example_str": "hello", "example_float": 0.5, "example_dict": { "nested": True, }, "example_list": ["hello", i, False], }, )) response = dataset.append(ds_items_with_metadata) check_is_expected_response(response)
def dataset(CLIENT): ds = CLIENT.create_dataset(TEST_DATASET_NAME) ds_items = [] for url in TEST_IMG_URLS: ds_items.append( DatasetItem( image_location=url, reference_id=reference_id_from_url(url), )) response = ds.append(ds_items) assert ERROR_PAYLOAD not in response.json() yield ds response = CLIENT.delete_dataset(ds.id) assert response == {"message": "Beginning dataset deletion..."}
def test_append_and_export(dataset): # Dataset upload url = TEST_IMG_URLS[0] box_annotation = BoxAnnotation(**TEST_BOX_ANNOTATIONS[0]) segmentation_annotation = SegmentationAnnotation.from_json( TEST_SEGMENTATION_ANNOTATIONS[0]) polygon_annotation = PolygonAnnotation.from_json( TEST_POLYGON_ANNOTATIONS[0]) ds_items = [ DatasetItem( image_location=url, reference_id=reference_id_from_url(url), metadata={"test": "metadata"}, ), ] response = dataset.append(ds_items) assert ERROR_PAYLOAD not in response.json() dataset.annotate(annotations=[ box_annotation, polygon_annotation, segmentation_annotation, ]) # We don't export everything on the annotations in order to speed up export. def clear_fields(annotation): cleared_annotation = copy.deepcopy(annotation) cleared_annotation.annotation_id = None cleared_annotation.metadata = {} return cleared_annotation def sort_labelmap(segmentation_annotation): segmentation_annotation.annotations = sorted( segmentation_annotation.annotations, key=lambda x: x.index) exported = dataset.items_and_annotations() assert exported[0][ITEM_KEY] == ds_items[0] assert exported[0][ANNOTATIONS_KEY][BOX_TYPE][0] == clear_fields( box_annotation) assert sort_labelmap( exported[0][ANNOTATIONS_KEY][SEGMENTATION_TYPE]) == sort_labelmap( clear_fields(segmentation_annotation)) assert exported[0][ANNOTATIONS_KEY][POLYGON_TYPE][0] == clear_fields( polygon_annotation)
def make_dataset_items(): ds_items_with_metadata = [] for i, url in enumerate(TEST_IMG_URLS): ds_items_with_metadata.append( DatasetItem( image_location=url, reference_id=reference_id_from_url(url), metadata={ "made_with_pytest": True, "example_int": i, "example_str": "hello", "example_float": 0.5, "example_dict": { "nested": True, }, "example_list": ["hello", i, False], }, )) return ds_items_with_metadata
def test_slice_append(dataset): # Dataset upload ds_items = [] for url in TEST_IMG_URLS: ds_items.append( DatasetItem( image_location=url, reference_id=reference_id_from_url(url), )) response = dataset.append(ds_items) assert ERROR_PAYLOAD not in response.json() # Slice creation slc = dataset.create_slice( name=TEST_SLICE_NAME, reference_ids=[ds_items[0].reference_id], ) # Insert duplicate first item slc.append(reference_ids=[item.reference_id for item in ds_items[:3]]) response = slc.info() assert len(response["dataset_items"]) == 3 for item in ds_items[:3]: assert (item.reference_id == response["dataset_items"][0]["ref_id"] or item.reference_id == response["dataset_items"][1]["ref_id"] or item.reference_id == response["dataset_items"][2]["ref_id"]) all_stored_items = [_[ITEM_KEY] for _ in slc.items_and_annotations()] def sort_by_reference_id(items): # Remove the generated item_ids and standardize # empty metadata so we can do an equality check. for item in items: item.item_id = None if item.metadata == {}: item.metadata = None return sorted(items, key=lambda x: x.reference_id) assert sort_by_reference_id(all_stored_items) == sort_by_reference_id( ds_items[:3])
def test_reprs(): # Have to define here in order to have access to all relevant objects def test_repr(test_object: any): assert eval(str(test_object)) == test_object test_repr( DatasetItem( image_location="test_url", reference_id="test_reference_id", metadata={ "made_with_pytest": True, "example_int": 0, "example_str": "hello", "example_float": 0.5, "example_dict": { "nested": True, }, "example_list": ["hello", 1, False], }, )) test_repr(Dataset("test_dataset", NucleusClient(api_key="fake_key")))
def test_dataset_append(dataset): def check_is_expected_response(response): assert isinstance(response, UploadResponse) resp_json = response.json() assert resp_json[DATASET_ID_KEY] == dataset.id assert resp_json[NEW_ITEMS] == len(TEST_IMG_URLS) assert resp_json[UPDATED_ITEMS] == 0 assert resp_json[IGNORED_ITEMS] == 0 assert resp_json[ERROR_ITEMS] == 0 assert ERROR_PAYLOAD not in resp_json # Plain image upload ds_items_plain = [] for url in TEST_IMG_URLS: ds_items_plain.append(DatasetItem(image_location=url)) response = dataset.append(ds_items_plain) check_is_expected_response(response) # With reference ids and metadata: response = dataset.append(make_dataset_items()) check_is_expected_response(response)
def test_slice_send_to_labeling(dataset): # Dataset upload ds_items = [] for url in TEST_IMG_URLS: ds_items.append( DatasetItem( image_location=url, reference_id=reference_id_from_url(url), )) response = dataset.append(ds_items) assert ERROR_PAYLOAD not in response.json() # Slice creation slc = dataset.create_slice( name=(TEST_SLICE_NAME + str(uuid.uuid4())[-10:]), reference_ids=[ds_items[0].reference_id, ds_items[1].reference_id], ) response = slc.info() assert len(response["dataset_items"]) == 2 response = slc.send_to_labeling(TEST_PROJECT_ID) assert isinstance(response, AsyncJob)
TEST_SLICE_NAME = "[PyTest] Test Slice" TEST_MODEL_NAME = "[PyTest] Test Model Name" TEST_MODEL_REFERENCE = "[PyTest] Test Model Reference" TEST_MODEL_RUN = "[PyTest] Test Model Run Reference" TEST_DATASET_NAME = "[PyTest] Test Dataset" TEST_SLICE_NAME = "[PyTest] Test Slice" TEST_IMG_URLS = [ "s3://scaleapi-cust-lidar/Hesai/raw_data/2019-5-11/hesai_data_1557540003/undistorted/front_camera/1557540143.650423lf.jpg", "s3://scaleapi-cust-lidar/Hesai/raw_data/2019-5-11/hesai_data_1557540003/undistorted/back_camera/1557540143.600352lf.jpg", "s3://scaleapi-cust-lidar/Hesai/raw_data/2019-5-11/hesai_data_1557540003/undistorted/right_camera/1557540143.681730lf.jpg", "s3://scaleapi-cust-lidar/Hesai/raw_data/2019-5-11/hesai_data_1557540003/undistorted/front_left_camera/1557540143.639619lf.jpg", "s3://scaleapi-cust-lidar/Hesai/raw_data/2019-5-11/hesai_data_1557540003/undistorted/front_right_camera/1557540143.661212lf.jpg", ] TEST_DATASET_ITEMS = [ DatasetItem(TEST_IMG_URLS[0], "1"), DatasetItem(TEST_IMG_URLS[1], "2"), DatasetItem(TEST_IMG_URLS[2], "3"), DatasetItem(TEST_IMG_URLS[3], "4"), ] LOCAL_FILENAME = "tests/test_img.jpg" TEST_PREDS = [ BoxPrediction("[Pytest Box Prediction 1]", 0, 0, 100, 100, "1"), BoxPrediction("[Pytest Box Prediction 2]", 0, 0, 100, 100, "2"), BoxPrediction("[Pytest Box Prediction 3]", 0, 0, 100, 100, "3"), BoxPrediction("[Pytest Box Prediction 4]", 0, 0, 100, 100, "4"), ] def get_signed_url(url):