예제 #1
0
    def test_get_sessions_length(self):
        dataset1 = backend.get_dataset('dataset1')
        dataset2 = backend.get_dataset('dataset2')

        sessions.create_categorical_image_session(db.session, 'session1',
                                                  'prompt', dataset1,
                                                  ['l1', 'l2', 'l3'])
        sessions.create_categorical_image_session(db.session, 'session2',
                                                  'prompt', dataset1,
                                                  ['l1', 'l2', 'l3'])
        sessions.create_categorical_image_session(db.session, 'session3',
                                                  'prompt', dataset1,
                                                  ['l1', 'l2', 'l3'])
        sessions.create_categorical_image_session(db.session, 'session4',
                                                  'prompt', dataset2,
                                                  ['l1', 'l2', 'l3'])

        dataset1_sessions = sessions.get_sessions(db.session, dataset1)
        dataset1_sessions_count = len(dataset1_sessions)

        dataset2_sessions = sessions.get_sessions(db.session, dataset2)
        dataset2_sessions_count = len(dataset2_sessions)

        self.assertEqual(dataset1_sessions_count, 3)
        self.assertEqual(dataset2_sessions_count, 1)
예제 #2
0
    def test_get_images_names(self):
        dataset = backend.get_dataset('dataset1')
        images = backend.get_images(dataset)

        self.assertEqual(images[0].name, 'img1.nii.gz')
        self.assertEqual(images[1].name, 'img2.nii')
        self.assertEqual(images[2].name, 'img3')
예제 #3
0
    def test_get_images_datasets(self):
        dataset = backend.get_dataset('dataset1')
        images = backend.get_images(dataset)

        self.assertEqual(images[0].dataset, dataset)
        self.assertEqual(images[1].dataset, dataset)
        self.assertEqual(images[2].dataset, dataset)
예제 #4
0
    def test_get_image_by_index_path(self):
        dataset = backend.get_dataset('dataset1')
        image, num_images = backend.get_image_by_index(dataset, 0)

        self.assertEqual(
            image.path,
            os.path.join(backend.DATASETS_PATH, 'dataset1', 'img1.nii.gz'))
예제 #5
0
    def test_get_image_path(self):
        dataset = backend.get_dataset('dataset1')
        image = backend.get_image(dataset, 'img1.nii.gz')

        self.assertEqual(
            image.path,
            os.path.join(backend.DATASETS_PATH, 'dataset1', 'img1.nii.gz'))
예제 #6
0
def session_overview(session_id: int):
    label_session = sessions.get_session_by_id(db.session, session_id)
    dataset = backend.get_dataset(label_session.dataset)

    has_thumbs = thumbnails.has_thumbnails(label_session)

    resume_point = None
    for session_element in label_session.elements:
        if len(session_element.labels) == 0:
            resume_point = session_element.element_index
            break

    if label_session.session_type == LabelSessionType.CATEGORICAL_IMAGE.name:
        images = backend.get_images(dataset)
        return render_template('session_overview_categorical.html',
                               label_session=label_session,
                               dataset=dataset,
                               images=images,
                               resume_point=resume_point,
                               has_thumbs=has_thumbs)

    elif label_session.session_type == LabelSessionType.CATEGORICAL_SLICE.name:
        return render_template('session_overview_categorical_slice.html',
                               label_session=label_session,
                               dataset=dataset,
                               resume_point=resume_point,
                               has_thumbs=has_thumbs)
    else:  # COMPARISON_SLICE
        return render_template('session_overview_comparison.html',
                               label_session=label_session,
                               dataset=dataset,
                               resume_point=resume_point,
                               has_thumbs=has_thumbs)
예제 #7
0
def viewer():
    dataset_name = request.args.get('dataset', type=str, default=None)
    image_name = request.args.get('image', type=str, default=None)

    if dataset_name is None or image_name is None:
        abort(400)

    dataset = backend.get_dataset(dataset_name)
    if dataset is None:
        abort(400)

    image = backend.get_image(dataset, image_name)
    if image is None:
        abort(400)

    slice_counts, max_value = backend.get_image_info(image)

    return render_template('viewer.html',
                           viewer_mode='viewer',
                           dataset=dataset,
                           image=image,
                           image_count=0,
                           image_index=0,
                           slice_counts=slice_counts,
                           image_max=max_value)
예제 #8
0
    def test_get_slices_from_session_invalid_type(self):
        dataset = backend.get_dataset('dataset1')
        sessions.create_categorical_image_session(db.session, 'session1', 'prompt', dataset, ['l1', 'l2', 'l3'])
        label_session = sessions.get_session_by_id(db.session, 1)

        with self.assertRaises(ValueError):
            sampling.get_slices_from_session(label_session)
예제 #9
0
    def test_create_comparison_slice_session_elements_metadata(self):
        dataset = backend.get_dataset('dataset1')
        comparisons = [(ImageSlice('img1.nii.gz', 0, SliceType.SAGITTAL),
                        ImageSlice('img3', 1, SliceType.CORONAL)),
                       (ImageSlice('img2.nii', 0, SliceType.SAGITTAL),
                        ImageSlice('img3', 1, SliceType.AXIAL)),
                       (ImageSlice('img2.nii', 255, SliceType.CORONAL),
                        ImageSlice('img1.nii.gz', 100, SliceType.AXIAL))]
        sessions.create_comparison_slice_session(db.session, 'session1',
                                                 'test_prompt', dataset,
                                                 ['l1', 'l2', 'l3'],
                                                 comparisons)
        label_session = sessions.get_session_by_id(db.session, 1)
        session_elements = label_session.elements

        self.assertEqual(session_elements[0].image_1_name, 'img1.nii.gz')
        self.assertEqual(session_elements[0].image_2_name, 'img3')

        self.assertEqual(session_elements[1].slice_1_index, 0)
        self.assertEqual(session_elements[1].slice_2_index, 1)

        self.assertEqual(session_elements[2].slice_1_type,
                         SliceType.CORONAL.name)
        self.assertEqual(session_elements[2].slice_2_type,
                         SliceType.AXIAL.name)
예제 #10
0
def label_categorical_slice():
    label_session_id = request.args.get('label_session', type=int, default=None)
    element_index = request.args.get('i', type=int, default=None)

    if label_session_id is None or element_index is None:
        abort(400)

    label_session = sessions.get_session_by_id(db.session, label_session_id)
    if label_session is None or label_session.session_type != LabelSessionType.CATEGORICAL_SLICE.name:
        abort(400)

    dataset = backend.get_dataset(label_session.dataset)
    if dataset is None:
        abort(400)

    element = labels.get_element_by_index(db.session, label_session, element_index)
    image = backend.get_image(dataset, element.image_1_name)
    if image is None:
        abort(400)

    im_slice = backend.ImageSlice(element.image_1_name, element.slice_1_index, backend.SliceType[element.slice_1_type])

    _, max_value = backend.get_image_info(image)

    slice_label_value = element.current_label_value()
    return render_template('label_categorical_slice.html',
                           label_session=label_session,
                           dataset=dataset,
                           element_id=element.id,
                           image_slice=im_slice,
                           slice_label_value=slice_label_value,
                           image_max=max_value,
                           previous_index=max(0, element_index - 1),
                           next_index=min(label_session.element_count - 1, element_index + 1))
예제 #11
0
def export_slices(session_id: int):
    with application.app_context():
        label_session = sessions.get_session_by_id(db.session, session_id)
        if label_session is None:
            print('Session with id {} not found'.format(session_id))
            return

        session_slices_dir_path = os.path.join(
            EXPORTED_SLICES_DIR_PATH, label_session.session_name + ' Slices')
        session_slices_dir_path = inc_dir_name(session_slices_dir_path)

        os.makedirs(session_slices_dir_path, exist_ok=True)

        slices = sampling.get_slices_from_session(label_session)
        dataset = backend.get_dataset(label_session.dataset)

        for sl in slices:
            d_img = backend.get_image(dataset, sl.image_name)
            sl_max = backend.get_image_info(d_img)[1]
            sl_img = backend.get_slice(d_img, sl.slice_index, sl.slice_type, 0,
                                       sl_max)

            save_name = '{}_{}_{}.png'.format(sl.image_name,
                                              sl.slice_type.name,
                                              sl.slice_index)
            save_path = os.path.join(session_slices_dir_path, save_name)

            sl_img.save(save_path)
            print('Saved {}'.format(save_path))
예제 #12
0
    def test_import_session_elements_length(self):
        dataset = backend.get_dataset('dataset1')
        session_json = {
            'dataset':
            'dataset1',
            'session_name':
            'session1',
            'session_type':
            LabelSessionType.CATEGORICAL_IMAGE.name,
            'prompt':
            'test_prompt',
            'label_values_str':
            'l1,l2,l3',
            'elements': [
                '0,img1.nii.gz,None,None,None,None,None',
                '1,img2.nii,None,None,None,None,None',
                '2,img3,None,None,None,None,None',
            ]
        }
        sessions.import_session_json(db.session, dataset, 'session1',
                                     session_json)
        label_session = sessions.get_session_by_id(db.session, 1)

        element_count = len(label_session.elements)
        self.assertEqual(element_count, 3)
예제 #13
0
def create_categorical_slice_session(dataset_name: str):
    dataset = backend.get_dataset(dataset_name)
    if dataset is None:
        abort(400)

    current_sessions = sessions.get_sessions(db.session, dataset)
    label_session_count = len(current_sessions)

    form = CreateCategoricalSliceSessionForm(meta={'csrf': False})

    comparison_sessions = sessions.get_sessions(db.session, dataset, LabelSessionType.COMPARISON_SLICE)
    for sess in comparison_sessions:
        form.comparisons.choices.append((str(sess.id), sess.session_name))

    if form.validate_on_submit():
        if form.session_name.data in [se.session_name for se in current_sessions]:
            form.session_name.errors.append('Session name already in use.')
        else:
            label_values = [v.strip() for v in form.label_values.data.split(',')]

            from_session = sessions.get_session_by_id(db.session, int(form.comparisons.data))
            slices = sampling.get_slices_from_session(from_session)

            sessions.create_categorical_slice_session(db.session, form.session_name.data, form.prompt.data,
                                                      dataset, label_values, slices)
            return redirect(url_for('dataset_overview', dataset_name=dataset.name))

    return render_template('create_categorical_slice_session.html',
                           dataset=dataset,
                           label_session_count=label_session_count,
                           form=form)
예제 #14
0
    def test_get_element_by_id(self):
        dataset = backend.get_dataset('dataset1')
        sessions.create_categorical_image_session(db.session, 'session1',
                                                  'prompt', dataset,
                                                  ['l1', 'l2', 'l3'])

        element = labels.get_element_by_id(db.session, 1)
        self.assertEqual(element.image_1_name, 'img1.nii.gz')
예제 #15
0
    def test_get_session_by_id(self):
        dataset = backend.get_dataset('dataset1')
        sessions.create_categorical_image_session(db.session, 'session1',
                                                  'prompt', dataset,
                                                  ['l1', 'l2', 'l3'])
        label_session = sessions.get_session_by_id(db.session, 1)

        self.assertEqual(label_session.session_name, 'session1')
예제 #16
0
    def test_get_all_labels_elements_metadata(self):
        dataset = backend.get_dataset('dataset1')
        sessions.create_categorical_image_session(db.session, 'session1',
                                                  'prompt', dataset,
                                                  ['l1', 'l2', 'l3'])
        label_session = sessions.get_session_by_id(db.session, 1)
        all_labels = labels.get_all_labels(label_session)

        check_elements = list(all_labels.keys())
        self.assertEqual(check_elements, label_session.elements)
예제 #17
0
    def test_get_all_labels_elements_length(self):
        dataset = backend.get_dataset('dataset1')
        sessions.create_categorical_image_session(db.session, 'session1',
                                                  'prompt', dataset,
                                                  ['l1', 'l2', 'l3'])
        label_session = sessions.get_session_by_id(db.session, 1)
        all_labels = labels.get_all_labels(label_session)

        element_count = len(all_labels)
        self.assertEqual(element_count, 3)
예제 #18
0
    def test_export_session_json_elements_length(self):
        dataset = backend.get_dataset('dataset1')
        sessions.create_categorical_image_session(db.session, 'session1',
                                                  'test_prompt', dataset,
                                                  ['l1', 'l2', 'l3'])

        label_session = sessions.get_session_by_id(db.session, 1)
        session_json = sessions.export_session_json(label_session)

        element_count = len(session_json['elements'])
        self.assertEqual(element_count, 3)
예제 #19
0
def get_thumbnails(
        label_session: LabelSession) -> Dict[backend.ImageSlice, ThumbData]:
    d_path = get_dataset_thumbnails_path(
        backend.get_dataset(label_session.dataset))
    slices = sampling.get_slices_from_session(label_session)

    thumbs_data = {}
    for sl in slices:
        path = os.path.join(d_path, get_thumbnail_name(sl))
        thumbs_data[sl] = ThumbData(path, os.path.exists(path))
    return thumbs_data
예제 #20
0
def slice_rankings(session_id: int):
    label_session = sessions.get_session_by_id(db.session, session_id)
    dataset = backend.get_dataset(label_session.dataset)

    ranked_slices = ranking.rank_slices(label_session)
    thumbnail_names = thumbnails.get_thumbnail_names(label_session)

    return render_template('slice_rankings.html',
                           label_session=label_session,
                           ranked_slices=ranked_slices,
                           thumbnail_names=thumbnail_names)
예제 #21
0
    def test_get_images_paths(self):
        dataset = backend.get_dataset('dataset1')
        images = backend.get_images(dataset)

        self.assertEqual(
            images[0].path,
            os.path.join(backend.DATASETS_PATH, 'dataset1', 'img1.nii.gz'))
        self.assertEqual(
            images[1].path,
            os.path.join(backend.DATASETS_PATH, 'dataset1', 'img2.nii'))
        self.assertEqual(
            images[2].path,
            os.path.join(backend.DATASETS_PATH, 'dataset1', 'img3'))
예제 #22
0
    def test_create_categorical_image_session_metadata(self):
        dataset = backend.get_dataset('dataset1')
        sessions.create_categorical_image_session(db.session, 'session1',
                                                  'test_prompt', dataset,
                                                  ['l1', 'l2', 'l3'])
        label_session = sessions.get_session_by_id(db.session, 1)

        self.assertEqual(label_session.session_name, 'session1')
        self.assertEqual(label_session.session_type,
                         LabelSessionType.CATEGORICAL_IMAGE.name)
        self.assertEqual(label_session.prompt, 'test_prompt')
        self.assertEqual(label_session.dataset, 'dataset1')
        self.assertEqual(label_session.label_values_str, 'l1,l2,l3')
예제 #23
0
    def test_get_slices_from_session_categorical_slice(self):
        dataset = backend.get_dataset('dataset1')
        slices = [
            ImageSlice('img1.nii.gz', 0, SliceType.SAGITTAL),
            ImageSlice('img1.nii.gz', 100, SliceType.SAGITTAL),
            ImageSlice('img2.nii', 1, SliceType.CORONAL),
            ImageSlice('img3', 255, SliceType.AXIAL)
        ]
        sessions.create_categorical_slice_session(db.session, 'session1', 'prompt', dataset, ['l1', 'l2', 'l3'], slices)
        label_session = sessions.get_session_by_id(db.session, 1)

        check_slices = sampling.get_slices_from_session(label_session)
        self.assertEqual(check_slices, slices)
예제 #24
0
    def test_create_comparison_slice_session_metadata(self):
        dataset = backend.get_dataset('dataset1')
        sessions.create_comparison_slice_session(db.session, 'session1',
                                                 'test_prompt', dataset,
                                                 ['l1', 'l2', 'l3'], [])
        label_session = sessions.get_session_by_id(db.session, 1)

        self.assertEqual(label_session.session_name, 'session1')
        self.assertEqual(label_session.session_type,
                         LabelSessionType.COMPARISON_SLICE.name)
        self.assertEqual(label_session.prompt, 'test_prompt')
        self.assertEqual(label_session.dataset, 'dataset1')
        self.assertEqual(label_session.label_values_str, 'l1,l2,l3')
예제 #25
0
def create_comparison_session(dataset_name: str):
    dataset = backend.get_dataset(dataset_name)
    if dataset is None:
        abort(400)

    current_sessions = sessions.get_sessions(db.session, dataset)
    label_session_count = len(current_sessions)

    images = backend.get_images(dataset)
    total_image_count = len(images)

    form = CreateComparisonSessionForm(meta={'csrf': False})

    comparison_sessions = sessions.get_sessions(db.session, dataset, LabelSessionType.COMPARISON_SLICE)
    for sess in comparison_sessions:
        form.comparisons.choices.append((str(sess.id), sess.session_name))

    form.image_count.validators = [
        ComparisonNumberRange(min=1, max=total_image_count,
                              message='Must be between %(min)s and %(max)s (the dataset size).')
    ]

    if form.validate_on_submit():
        if form.session_name.data in [se.session_name for se in current_sessions]:
            form.session_name.errors.append('Session name already in use.')
        elif form.comparisons.data == 'create' and form.min_slice_percent.data >= form.max_slice_percent.data:
            form.max_slice_percent.errors.append('Max must be greater than min.')
        else:
            slice_type = backend.SliceType[form.slice_type.data]
            if form.comparisons.data == 'create':
                slices = sampling.sample_slices(dataset, slice_type, form.image_count.data, form.slice_count.data,
                                                form.min_slice_percent.data, form.max_slice_percent.data)
                if form.comparison_count.data is None:
                    comparisons = sampling.all_comparisons(slices)
                else:
                    comparisons = sampling.sample_comparisons(slices, form.comparison_count.data,
                                                              form.max_comparisons_per_slice.data)
            else:
                from_session = sessions.get_session_by_id(db.session, int(form.comparisons.data))
                comparisons = sampling.get_comparisons_from_session(from_session)
            label_values = [v.strip() for v in form.label_values.data.split(',')]
            sessions.create_comparison_slice_session(db.session, form.session_name.data, form.prompt.data,
                                                     dataset, label_values, comparisons)
            return redirect(url_for('dataset_overview', dataset_name=dataset.name))

    return render_template('create_comparison_session.html',
                           dataset=dataset,
                           label_session_count=label_session_count,
                           total_image_count=total_image_count,
                           form=form)
예제 #26
0
def create_thumbnails(label_session: LabelSession):
    dataset = backend.get_dataset(label_session.dataset)
    slices = sampling.get_slices_from_session(label_session)

    session_thumbs_dir_path = get_session_thumbnails_dir_path(label_session)
    os.makedirs(session_thumbs_dir_path, exist_ok=True)

    for sl in slices:
        d_img = backend.get_image(dataset, sl.image_name)
        slice_thumb_path = os.path.join(session_thumbs_dir_path,
                                        backend.slice_name(sl) + '.jpg')
        backend.get_slice(d_img, sl.slice_index, sl.slice_type, 0,
                          None).save(slice_thumb_path)
    print('Created {} thumbnails for session {}'.format(
        len(slices), label_session.session_name))
예제 #27
0
    def test_get_ranking_contains_slices(self):
        dataset = backend.get_dataset('dataset1')
        comparisons = [
            (ImageSlice('img1.nii.gz', 0, SliceType.SAGITTAL), ImageSlice('img3', 1, SliceType.CORONAL)),
            (ImageSlice('img2.nii', 0, SliceType.SAGITTAL), ImageSlice('img3', 1, SliceType.AXIAL)),
            (ImageSlice('img2.nii', 255, SliceType.CORONAL), ImageSlice('img1.nii.gz', 100, SliceType.AXIAL))
        ]
        sessions.create_comparison_slice_session(db.session, 'session1', 'prompt', dataset,
                                                 ['l1', 'l2'], comparisons)
        label_session = sessions.get_session_by_id(db.session, 1)

        ranked_slices = ranking.rank_slices(label_session)
        check_slices = sampling.get_slices_from_session(label_session)

        self.assertEqual(set(ranked_slices), set(check_slices))
예제 #28
0
    def test_set_label(self):
        dataset = backend.get_dataset('dataset1')
        sessions.create_categorical_image_session(db.session, 'session1',
                                                  'prompt', dataset,
                                                  ['l1', 'l2', 'l3'])
        element = labels.get_element_by_id(db.session, 1)

        labels.set_label(db.session, element, 'l1', 1000)

        label_count = len(element.labels)
        self.assertEqual(label_count, 1)

        element_label = element.labels[0]
        self.assertEqual(element_label.label_value, 'l1')
        self.assertEqual(element_label.milliseconds, 1000)
예제 #29
0
def dataset_overview(dataset_name: str):
    dataset = backend.get_dataset(dataset_name)
    if dataset is None:
        abort(404)

    images = backend.get_images(dataset)
    label_sessions = sessions.get_sessions(db.session, dataset)

    sessions_by_type: Dict[LabelSessionType, List[LabelSession]] = {st: [] for st in LabelSessionType}
    for sess in label_sessions:
        sessions_by_type[LabelSessionType[sess.session_type]].append(sess)

    return render_template('dataset_overview.html',
                           dataset=dataset,
                           images=images,
                           label_sessions=sessions_by_type)
예제 #30
0
    def test_create_categorical_slice_session_elements_length(self):
        dataset = backend.get_dataset('dataset1')
        slices = [
            ImageSlice('img1.nii.gz', 0, SliceType.SAGITTAL),
            ImageSlice('img1.nii.gz', 100, SliceType.SAGITTAL),
            ImageSlice('img2.nii', 1, SliceType.CORONAL),
            ImageSlice('img3', 255, SliceType.AXIAL)
        ]
        sessions.create_categorical_slice_session(db.session, 'session1',
                                                  'test_prompt', dataset,
                                                  ['l1', 'l2', 'l3'], slices)
        label_session = sessions.get_session_by_id(db.session, 1)
        session_elements = label_session.elements

        session_element_count = len(session_elements)
        self.assertEqual(session_element_count, 4)