fbpx
  • MRNet: датасет МРТ-снимков коленных суставов

    коленный сустав

    Stanford ML Group выпустила свой третий публичный датасет медицинских обследований, названный MRNet, который можно найти здесь. Чтобы получить его, сначала вы должны зарегистрировать учетную запись в Stanford ML Group, а затем вам будет отправлена ​​ссылка на данные по электронной почте. Совместное использование данных категорически запрещено даже с товарищем по команде в соревновании.

    Датасет MRNet состоит из 1370 МРТ-снимков коленных суставов, сделанных в медицинском центре Стэнфордского университета. Он содержит 1 104 (80,6%) снимков с нарушениями, 319 (23,3%) с разрывами передней крестообразной связки и 508 (37,1%) с разрывами мениска. Данные были размечены путем ручного извлечения из клинических отчетов.

    Датасет сопровождается публикацией работы Stanford ML Group, которую можно найти здесь . В очередной раз они проводят соревнование для внедрения инноваций в автоматизированном анализе медицинских изображений.

    Заявки на участие в конкурсе оцениваются по тестовому набору данных со следующей метрикой: среднее значение AUC задач обнаружения нарушений, разрывов передней крестообразной связки и разрывов мениска.

    Обзор датасета

    После того, как вы загрузили и распаковали данные, у вас должно появиться это дерево каталогов:

    .
    ├── train
    │ ├── axial
    │ ├── coronal
    │ └── sagittal
    ├── train-abnormal.csv
    ├── train-acl.csv
    ├── train-meniscus.csv
    ├── valid
    │ ├── axial
    │ ├── coronal
    │ └── sagittal
    ├── valid-abnormal.csv
    ├── valid-acl.csv
    └── valid-meniscus.csv

    В *.csv файлах содержатся метки. *.npy файлы, содержащиеся в подкаталогах train и valid — это Numpy-массивы размерности (slices, x, y). Размерности x и y 256х256 во всех снимках с целочисленным значением в диапазоне от 0 до 255. Это означает, что пиксельные данные уже нормированы Stanford ML Group.

    Примечание. «Стопка» изображений для каждого коленного сустава может содержать разное количество изображений, и каждый снимок может иметь различное количество срезов для любой заданной плоскости. Это совершенно нормально для данных медицинской визуализации.

    Уместно отметить следующее:

    1. Есть много снимков с нарушениями, которые не содержат
    разрыва передней крестообразной связки или разрыв мениска.

    2. Есть гораздо больше снимков, которые содержат как разрыв передней крестообразной связки, так и разрыв мениска, чем случаев с разрывом передней крестообразной связки.

    Эти результаты показывают, что датасет, вероятно, достаточно реалистичен для данных, которые могут встретиться в реальном мире.

    Причины этого следующие:

    • МРТ коленного сустава обычно не назначают бессимптомным пациентам.
    • Наиболее распространенные нарушения на МРТ-исследованиях коленного сустава находятся в хряще и под костью.
    • Из-за механизмов травмы и сил, необходимых для разрыва
      передней крестообразной связки, мениски также очень часто получают травмы.

    Просмотр снимков

    Следующий код загрузит данные о снимках одного коленного сустава в словарь NumPy-массивов, который затем используется классом KneePlot для создания интерактивного изображения.

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from ipywidgets import interact, Dropdown, IntSlider
    %matplotlib notebook
    plt.style.use('grayscale')
    
    train_abnl = pd.read_csv(data_path/'train-abnormal.csv', header=None,
                           names=['Case', 'Abnormal'], 
                           dtype={'Case': str, 'Abnormal': np.int64})
    
    # data loading functions
    def load_one_stack(case, data_path=train_path, plane='coronal'):
        fpath = data_path/plane/'{}.npy'.format(case)
        return np.load(fpath)
    
    def load_stacks(case, data_path=train_path):
        x = {}
        planes = ['coronal', 'sagittal', 'axialbubble guppies']
        for i, plane in enumerate(planes):
            x[plane] = load_one_stack(case, plane=plane)
        return x
    
    # interactive viewer
    class KneePlot():
        def __init__(self, x, figsize=(10, 10)):
            self.x = x
            self.planes = list(x.keys())
            self.slice_nums = {plane: self.x[plane].shape[0] for plane in self.planes}
            self.figsize = figsize
        
        def _plot_slices(self, plane, im_slice): 
            fig, ax = plt.subplots(1, 1, figsize=self.figsize)
            ax.imshow(self.x[plane][im_slice, :, :])
            plt.show()
        
        def draw(self):
            planes_widget = Dropdown(options=self.planes)
            plane_init = self.planes[0]
            slice_init = self.slice_nums[plane_init] - 1
            slices_widget = IntSlider(min=0, max=slice_init, value=slice_init//2)
            def update_slices_widget(*args):
                slices_widget.max = self.slice_nums[planes_widget.value] - 1
                slices_widget.value = slices_widget.max // 2
            planes_widget.observe(update_slices_widget, 'value')
            interact(self._plot_slices, plane=planes_widget, im_slice=slices_widget)
        
        def resize(self, figsize): self.figsize = figsize
    
    # example usage
    case = train_abnl.Case[0]
    x = load_stacks(case)
    plot = KneePlot(x, figsize=(8, 8))
    plot.draw()

    Содержимое данных о коленных суставах

    Данные о каждом коленном суставе хранятся несколькими последовательностями:

    • Корональные T1-взвешенные изображения без жирной насыщенности
    • Сагиттальные T2-взвешенные изображения с насыщенным жиром (чувствительные к жидкости)
    • Осевые PD-взвешенные изображения с насыщенным жиром (чувствительные к жидкости)

    Основная анатомия колена

    Это изображение здесь для общего обзора анатомии колена. Для тех, кто хочет узнать больше о появлении анатомии коленного сустава на МРТ, этот сайт (источник для изображения ниже) может быть полезным.