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