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-взвешенные изображения с насыщенным жиром (чувствительные к жидкости)

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

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

Подписаться
Уведомить о
guest

0 Comments
Межтекстовые Отзывы
Посмотреть все комментарии

gogpt