Exemple #1
0
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 == {}
Exemple #2
0
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"])
Exemple #3
0
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"])
Exemple #4
0
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
Exemple #8
0
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)
Exemple #16
0
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):