예제 #1
0
def test_get_predefined_label_for_scan_in_task__predefined_label(
        prepare_environment: Any) -> None:
    """Test for fetching Predefined Label that exists."""
    # Step 1. Prepare a structure for the test
    dataset = DatasetsRepository.add_new_dataset('KIDNEYS', 'Kidneys')
    task = TasksRepository.add_task('MARK_KIDNEYS', 'Mark Kidneys',
                                    'path/to/image', ['KIDNEYS'], [])
    LabelTagsRepository.add_new_tag('EXAMPLE_TAG', 'Example Tag',
                                    [LabelTool.RECTANGLE], task.id)
    scan = ScansRepository.add_new_scan(dataset, 0)
    user_id = UsersRepository.add_new_user(
        User('user@medtagger', 'HASH', 'Admin', 'Admin'))
    user = UsersRepository.get_user_by_id(user_id)

    # Step 2. Add Label which is predefined
    label = LabelsRepository.add_new_label(scan.id,
                                           task.key,
                                           user,
                                           LabelingTime(0),
                                           is_predefined=True)

    # Step 3. Check if there is is Predefined Label
    predefined_label = LabelsRepository.get_predefined_label_for_scan_in_task(
        scan, task)
    assert predefined_label
    assert predefined_label.id == label.id
예제 #2
0
def test_get_predefined_brush_label_elements(prepare_environment: Any) -> None:
    """Test for fetching Predefined Brush Label Elements."""
    # Step 1. Prepare a structure for the test
    dataset = DatasetsRepository.add_new_dataset('KIDNEYS', 'Kidneys')
    task = TasksRepository.add_task('MARK_KIDNEYS', 'Mark Kidneys',
                                    'path/to/image', ['KIDNEYS'], [])
    label_tag = LabelTagsRepository.add_new_tag('EXAMPLE_TAG', 'Example Tag',
                                                [LabelTool.RECTANGLE], task.id)
    scan = ScansRepository.add_new_scan(dataset, 3)
    user_id = UsersRepository.add_new_user(
        User('user@medtagger', 'HASH', 'Admin', 'Admin'))
    user = UsersRepository.get_user_by_id(user_id)

    # Step 2. Add Label with Brush Elements
    label = LabelsRepository.add_new_label(scan.id,
                                           task.key,
                                           user,
                                           LabelingTime(0),
                                           is_predefined=True)
    LabelsRepository.add_new_brush_label_element(label.id, 0, 0, 0, b'',
                                                 label_tag)
    LabelsRepository.add_new_brush_label_element(label.id, 1, 0, 0, b'',
                                                 label_tag)
    LabelsRepository.add_new_brush_label_element(label.id, 2, 0, 0, b'',
                                                 label_tag)

    # Step 3. Check if there is is Predefined Label
    brush_label_elements = LabelsRepository.get_predefined_brush_label_elements(
        scan.id, task.id, 0, 3)
    assert len(brush_label_elements) == 3
    brush_label_elements = LabelsRepository.get_predefined_brush_label_elements(
        scan.id, task.id, 0, 1)
    assert len(brush_label_elements) == 1
예제 #3
0
def test_parsing_chain_label_elements(prepare_environment: Any) -> None:
    """Test parsing Chain Label Element to numpy array."""
    user_id = UsersRepository.add_new_user(
        models.User('user@medtagger', 'HASH', 'Admin', 'Admin'))
    user = UsersRepository.get_user_by_id(user_id)
    scan, label_tag = helpers.prepare_scan_and_tag_for_labeling()
    label = helpers.prepare_empty_label(scan, user)
    for slice_index in range(3):
        points = [
            Point(x=0, y=0),
            Point(x=1, y=0),
            Point(x=1, y=1),
            Point(x=0, y=1),
        ]
        LabelsRepository.add_new_chain_label_element(label.id,
                                                     slice_index,
                                                     label_tag,
                                                     points,
                                                     loop=True)

    query = models.ChainLabelElement.query.join(models.Label)
    query = query.filter(models.Label.scan_id == scan.id)
    label_elements = query.all()

    parser = chain.ChainLabelElementParser()
    data = parser.convert_to_numpy(label_elements)
    assert data.shape == (3, SLICE_WIDTH * SLICE_HEIGHT)
    assert data.sum(
    ) == 3 * SLICE_WIDTH * SLICE_HEIGHT  # Squares fill whole Slice
예제 #4
0
def test_data_set_generator(prepare_environment: Any) -> None:  # pylint: disable=too-many-locals
    """Test Data Set Generator against rectangular Label Elements from real database."""
    user_id = UsersRepository.add_new_user(
        models.User('user@medtagger', 'HASH', 'Admin', 'Admin'))
    user = UsersRepository.get_user_by_id(user_id)
    scan, label_tag = helpers.prepare_scan_and_tag_for_labeling()

    label_a = helpers.prepare_empty_label(scan, user)
    for slice_index in range(3):
        LabelsRepository.add_new_rectangular_label_element(
            label_a.id, LabelPosition(x=1, y=1, slice_index=slice_index),
            LabelShape(width=0, height=0), label_tag)
    label_b = helpers.prepare_empty_label(scan, user)
    for slice_index in range(3):
        LabelsRepository.add_new_rectangular_label_element(
            label_b.id, LabelPosition(x=0, y=0, slice_index=slice_index),
            LabelShape(width=1, height=1), label_tag)
    label_c = helpers.prepare_empty_label(scan, user)
    for slice_index in range(3):
        LabelsRepository.add_new_rectangular_label_element(
            label_c.id, LabelPosition(x=1, y=1, slice_index=slice_index),
            LabelShape(width=0, height=0), label_tag)

    algorithm = majority_voting.MajorityVotingAlgorithm()
    data_set_generator = generator.DataSetGenerator(algorithm)

    query = models.RectangularLabelElement.query.join(models.Label)
    query = query.filter(models.Label.scan_id == scan.id)
    label_elements = query.all()

    ground_truth_for_slice_id = data_set_generator.generate(label_elements)
    assert sorted(list(ground_truth_for_slice_id.keys())) == sorted(
        [_slice.id for _slice in scan.slices])

    example_slice_id = scan.slices[0].id
    expected_ground_truth = np.array([1, 1, 1, 1])
    assert ground_truth_for_slice_id[
        example_slice_id].shape == expected_ground_truth.shape

    ground_truth = ground_truth_for_slice_id[example_slice_id]
    for i in range(expected_ground_truth.shape[0]):
        assert math.isclose(ground_truth[i],
                            expected_ground_truth[i],
                            abs_tol=1e-5)
def test_get_predefined_label_for_scan_in_task__predefined_label_for_given_task(
        prepare_environment: Any) -> None:
    """Test for fetching Predefined Label only for specific Task."""
    # Step 1. Prepare a structure for the test
    dataset = DatasetsRepository.add_new_dataset('KIDNEYS', 'Kidneys')
    task_left = TasksRepository.add_task('MARK_LEFT', 'Mark Left',
                                         'path/to/image', ['KIDNEYS'], '', [],
                                         [])
    task_right = TasksRepository.add_task('MARK_RIGHT', 'Mark Right',
                                          'path/to/image', ['KIDNEYS'], '', [],
                                          [])
    LabelTagsRepository.add_new_tag('EXAMPLE_TAG', 'Example Tag',
                                    [LabelTool.RECTANGLE], task_left.id)
    scan = ScansRepository.add_new_scan(dataset, 0)
    user_id = UsersRepository.add_new_user(
        User('user@medtagger', 'HASH', 'Admin', 'Admin'))
    user = UsersRepository.get_user_by_id(user_id)

    # Step 2. Add Labels for each Task
    label_left = LabelsRepository.add_new_label(scan.id,
                                                task_left.key,
                                                user,
                                                LabelingTime(0),
                                                is_predefined=True)
    label_right = LabelsRepository.add_new_label(scan.id,
                                                 task_right.key,
                                                 user,
                                                 LabelingTime(0),
                                                 is_predefined=True)

    # Step 3. Check if there are these Predefined Labels
    predefined_label = LabelsRepository.get_predefined_label_for_scan_in_task(
        scan, task_left)
    assert predefined_label
    assert predefined_label.id == label_left.id
    predefined_label = LabelsRepository.get_predefined_label_for_scan_in_task(
        scan, task_right)
    assert predefined_label
    assert predefined_label.id == label_right.id
예제 #6
0
def test_parsing_rectangle_label_elements(prepare_environment: Any) -> None:
    """Test parsing Rectangle Label Element to numpy array."""
    user_id = UsersRepository.add_new_user(
        models.User('user@medtagger', 'HASH', 'Admin', 'Admin'))
    user = UsersRepository.get_user_by_id(user_id)
    scan, label_tag = helpers.prepare_scan_and_tag_for_labeling()
    label = helpers.prepare_empty_label(scan, user)
    for slice_index in range(3):
        LabelsRepository.add_new_rectangular_label_element(
            label.id, LabelPosition(x=1, y=1, slice_index=slice_index),
            LabelShape(width=0, height=0), label_tag)

    query = models.RectangularLabelElement.query.join(models.Label)
    query = query.filter(models.Label.scan_id == scan.id)
    label_elements = query.all()

    parser = rectangle.RectangleLabelElementParser()
    data = parser.convert_to_numpy(label_elements)
    assert data.shape == (3, 4)

    expected_data = (1, 1, 1, 1)
    for i in range(4):
        assert math.isclose(data[0][i], expected_data[i], abs_tol=1e-5)
예제 #7
0
def create_user(email: str, password: str, first_name: str,
                last_name: str) -> Tuple[int, str]:
    """Create user with the given user information. Password is being hashed.

    :param email: user email in string format
    :param password: user password in string format
    :param first_name: user first name in string format
    :param last_name: user last name in string format

    :return: tuple with user id and authentication token
    """
    user = UsersRepository.get_user_by_email(email)
    if user:
        raise InvalidArgumentsException('User with this email already exists')
    password_hash = hash_password(password)
    new_user = User(email, password_hash, first_name, last_name)
    role = RolesRepository.get_role_with_name('volunteer')
    if not role:
        raise InvalidArgumentsException('Role does not exist.')
    new_user.roles.append(role)
    user_id = UsersRepository.add_new_user(new_user)
    user_token = generate_auth_token(new_user)
    return user_id, user_token