exponenta event banner

3-D Сегментация опухолей головного мозга с использованием глубокого обучения

Этот пример показывает, как обучить 3D нейронную сеть U-Net и выполнить семантическую сегментацию опухолей головного мозга от 3D медицинских изображений.

Семантическая сегментация включает в себя маркировку каждого пикселя в изображении или вокселе 3-D объема классом. Этот пример иллюстрирует использование методов глубокого обучения для выполнения двоичной семантической сегментации опухолей головного мозга при сканировании с помощью магнитно-резонансной томографии (МРТ). В этой бинарной сегментации каждый пиксель помечен как опухоль или фон.

В этом примере выполняется сегментация опухоли головного мозга с использованием архитектуры 3-D U-Net [1]. U-Net - это быстрая, эффективная и простая сеть, которая стала популярной в области семантической сегментации.

Одной из проблем сегментации медицинских изображений является объем памяти, необходимый для хранения и обработки 3-D томов. Обучение сети на полном входном томе нецелесообразно из-за ограничений ресурсов GPU. Этот пример решает проблему, обучая сеть исправлениям образов. В примере используется стратегия наложения плиток для сшивания тестовых фрагментов в полный сегментированный тестовый объем. В примере избегаются артефакты границы, используя действительную часть свертки в нейронной сети [5].

Второй проблемой сегментации медицинских изображений является дисбаланс классов в данных, который затрудняет обучение при использовании обычных потерь перекрестной энтропии. В этом примере проблема решается с помощью взвешенной многоклассовой функции потери Dice [4]. Взвешивание классов помогает противостоять влиянию больших областей на оценку Dice, облегчая для сети обучение сегментации меньших областей.

Загрузить данные обучения, проверки и тестирования

В этом примере используется набор данных BraTS [2]. Набор данных BraTS содержит МРТ-сканирование опухолей головного мозга, а именно глиом, которые являются наиболее распространенными первичными злокачественными новообразованиями головного мозга. Размер файла данных составляет ~ 7 ГБ. Если загрузка набора данных BraTS не требуется, перейдите непосредственно к разделу Загрузка предварительно обученной сети и набора тестов образцов в этом примере.

Создайте каталог для хранения набора данных BraTS.

imageDir = fullfile(tempdir,'BraTS');
if ~exist(imageDir,'dir')
    mkdir(imageDir);
end

Чтобы загрузить данные BraTS, перейдите на сайт медицинской сегментации Decathlon и нажмите на ссылку «Загрузить данные». Загрузите файл «Task01_BrainTumour.tar» [3]. Распакуйте файл TAR в каталог, указанный imageDir переменная. При успешной распаковке imageDir будет содержать каталог с именем Task01_BrainTumour имеет три подкаталога: imagesTr, imagesTs, и labelsTr.

Набор данных содержит 750 4-D томов, каждый из которых представляет стек 3-D изображений. У каждого 4-D объема есть размер 240 на 240 на 155 на 4, где первые три измерения соответствуют высоте, ширине и глубине 3D объемного изображения. Четвертое измерение соответствует различным моделям сканирования. Набор данных разделен на 484 учебных тома с буквами вокселя и 266 тестовых томов. Тестовые тома не имеют меток, поэтому в этом примере тестовые данные не используются. Вместо этого в примере 484 учебных тома разделяются на три независимых набора, которые используются для обучения, проверки и тестирования.

Данные предварительного обучения и проверки

Чтобы обучить 3D сеть U-Net более эффективно, предварительно обработайте данные о МРТ, используя функцию помощника preprocessBraTSdataset. Эта функция присоединена к примеру как вспомогательный файл.

Вспомогательная функция выполняет следующие операции:

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

  • Нормализовать каждую модальность каждого объема независимо путем вычитания среднего и деления на стандартное отклонение обрезанной области мозга.

  • Разбейте 484 учебных тома на 400 учебных, 29 валидационных и 55 тестовых наборов.

Предварительная обработка данных может занять около 30 минут.

sourceDataLoc = [imageDir filesep 'Task01_BrainTumour'];
preprocessDataLoc = fullfile(tempdir,'BraTS','preprocessedDataset');
preprocessBraTSdataset(preprocessDataLoc,sourceDataLoc);

Создание хранилища данных для случайного извлечения исправлений для обучения и проверки

Используйте хранилище данных извлечения случайных исправлений для передачи данных обучения в сеть и проверки хода обучения. Это хранилище данных извлекает случайные исправления из изображений истинности земли и соответствующих данных метки пикселя. Патчинг - распространенный метод предотвращения нехватки памяти при тренировках с произвольно большими объёмами.

Создание imageDatastore для хранения 3-D данных изображения. Поскольку формат MAT-файла является нестандартным форматом изображения, необходимо использовать средство чтения MAT-файлов, чтобы включить чтение данных изображения. Можно использовать средство чтения файлов MAT, matRead. Эта функция присоединена к примеру как вспомогательный файл.

volReader = @(x) matRead(x);
volLoc = fullfile(preprocessDataLoc,'imagesTr');
volds = imageDatastore(volLoc, ...
    'FileExtensions','.mat','ReadFcn',volReader);

Создать pixelLabelDatastore (Computer Vision Toolbox) для хранения этикеток.

lblLoc = fullfile(preprocessDataLoc,'labelsTr');
classNames = ["background","tumor"];
pixelLabelID = [0 1];
pxds = pixelLabelDatastore(lblLoc,classNames,pixelLabelID, ...
    'FileExtensions','.mat','ReadFcn',volReader);

Предварительный просмотр одного объема изображения и метки. Отображение помеченного объема с помощью labelvolshow функция. Сделать фон полностью прозрачным, установив видимость метки фона (1Кому 0.

volume = preview(volds);
label = preview(pxds);

viewPnl = uipanel(figure,'Title','Labeled Training Volume');
hPred = labelvolshow(label,volume(:,:,:,1),'Parent',viewPnl, ...
    'LabelColor',[0 0 0;1 0 0]);
hPred.LabelVisibility(1) = 0;

Создать randomPatchExtractionDatastore который содержит обучающее изображение и данные пиксельной метки. Определите размер участка 132 132 132 voxels. Определить 'PatchesPerImage' извлекать 16 случайно расположенных патчей из каждой пары томов и этикеток во время обучения. Укажите размер мини-пакета 8.

patchSize = [132 132 132];
patchPerImage = 16;
miniBatchSize = 8;
patchds = randomPatchExtractionDatastore(volds,pxds,patchSize, ...
    'PatchesPerImage',patchPerImage);
patchds.MiniBatchSize = miniBatchSize;

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

volLocVal = fullfile(preprocessDataLoc,'imagesVal');
voldsVal = imageDatastore(volLocVal, ...
    'FileExtensions','.mat','ReadFcn',volReader);

lblLocVal = fullfile(preprocessDataLoc,'labelsVal');
pxdsVal = pixelLabelDatastore(lblLocVal,classNames,pixelLabelID, ...
    'FileExtensions','.mat','ReadFcn',volReader);

dsVal = randomPatchExtractionDatastore(voldsVal,pxdsVal,patchSize, ...
    'PatchesPerImage',patchPerImage);
dsVal.MiniBatchSize = miniBatchSize;

Увеличение данных обучения и проверки с помощью transform функция с пользовательскими операциями предварительной обработки, заданными функцией помощника augmentAndCrop3dPatch. Эта функция присоединена к примеру как вспомогательный файл.

augmentAndCrop3dPatch функция выполняет следующие операции:

  1. Случайная ротация и отражение данных обучения, чтобы сделать обучение более надежным. Функция не поворачивает и не отражает данные проверки.

  2. Ответ урожая исправляет к размеру продукции сети, 44 44 44 voxels.

dataSource = 'Training';
dsTrain = transform(patchds,@(patchIn)augmentAndCrop3dPatch(patchIn,dataSource));

dataSource = 'Validation';
dsVal = transform(dsVal,@(patchIn)augmentAndCrop3dPatch(patchIn,dataSource));

Настройте 3D слои U-Net

Этот пример использует 3D сеть U-Net [1]. В U-Net начальные серии сверточных слоев перемежаются с максимальными слоями объединения, последовательно уменьшая разрешение входного изображения. За этими слоями следует ряд сверточных слоев, перемежающихся операторами повышающей дискретизации, последовательно повышая разрешающую способность входного изображения. Перед каждым уровнем ReLU вводится уровень периодической нормализации. Название U-Net происходит от того, что сеть может быть нарисована симметричной формой наподобие буквы U.

Создайте дефолт 3D сеть U-Net при помощи unetLayers (Панель инструментов компьютерного зрения). Укажите сегментацию двух классов. Также укажите допустимое заполнение свертки, чтобы избежать артефактов границы при использовании стратегии перекрытий-плиток для прогнозирования тестовых объемов.

inputPatchSize = [132 132 132 4];
numClasses = 2;
[lgraph,outPatchSize] = unet3dLayers(inputPatchSize,numClasses,'ConvolutionPadding','valid');

Чтобы лучше сегментировать меньшие опухолевые области и уменьшить влияние больших фоновых областей, в этом примере используется dicePixelClassificationLayer(Панель инструментов компьютерного зрения). Замените слой классификации пикселей на слой классификации пикселей Dice.

outputLayer = dicePixelClassificationLayer('Name','Output');
lgraph = replaceLayer(lgraph,'Segmentation-Layer',outputLayer);

Данные уже нормализованы в разделе «Данные предварительного обучения и проверки» этого примера. Нормализация данных в image3dInputLayer (Deep Learning Toolbox) не требуется, поэтому замените входной слой на входной, который не имеет нормализации данных.

inputLayer = image3dInputLayer(inputPatchSize,'Normalization','none','Name','ImageInputLayer');
lgraph = replaceLayer(lgraph,'ImageInputLayer',inputLayer);

Кроме того, можно изменить сеть 3-D U-Net с помощью приложения Deep Network Designer из Deep Learning Toolbox™.

Подготовьте график обновленной 3D сети U-Net.

analyzeNetwork(lgraph)

Укажите параметры обучения

Обучение сети с помощью adam решатель оптимизации. Задайте параметры гиперпараметра с помощью trainingOptions (Deep Learning Toolbox). Начальная скорость обучения устанавливается на 5e-4 и постепенно снижается в течение всего периода обучения. Вы можете экспериментировать с MiniBatchSize на основе памяти графического процессора. Для максимального использования памяти графического процессора рекомендуется использовать большие входные патчи в больших пакетах. Обратите внимание, что уровни нормализации партий менее эффективны для меньших значений MiniBatchSize. Настройка начальной скорости обучения на основе MiniBatchSize.

options = trainingOptions('adam', ...
    'MaxEpochs',50, ...
    'InitialLearnRate',5e-4, ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropPeriod',5, ...
    'LearnRateDropFactor',0.95, ...
    'ValidationData',dsVal, ...
    'ValidationFrequency',400, ...
    'Plots','training-progress', ...
    'Verbose',false, ...
    'MiniBatchSize',miniBatchSize);

Загрузить предварительно обученный набор тестов сети и образцов

Загрузите предварительно подготовленную версию 3-D U-Net и пять образцов тестовых томов и соответствующие им метки из набора данных BraTS [3]. Предварительно обученная модель и образцы данных позволяют выполнять сегментацию тестовых данных без загрузки полного набора данных или ожидания обучения в сети.

trained3DUnet_url = 'https://www.mathworks.com/supportfiles/vision/data/brainTumor3DUNetValid.mat';
sampleData_url = 'https://www.mathworks.com/supportfiles/vision/data/sampleBraTSTestSetValid.tar.gz';

imageDir = fullfile(tempdir,'BraTS');
if ~exist(imageDir,'dir')
    mkdir(imageDir);
end

downloadTrained3DUnetSampleData(trained3DUnet_url,sampleData_url,imageDir);

Железнодорожная сеть

По умолчанию пример загружает предварительно обученную 3D сеть U-Net. Предварительно обученная сеть позволяет выполнять весь пример без ожидания завершения обучения.

Для обучения сети установите doTraining переменная в следующем коде true. Обучение модели с помощью trainNetwork (Deep Learning Toolbox).

Обучение на GPU, если он доступен. Для использования графического процессора требуются параллельные вычислительные Toolbox™ и графический процессор NVIDIA ® с поддержкой CUDA ®. Дополнительные сведения см. в разделе Поддержка графического процессора по выпуску (Панель инструментов параллельных вычислений). Обучение занимает приблизительно 30 часов на multi-GPU системе с 4 Титанами NVIDIA™ Xp GPUs и может взять еще дольше в зависимости от Ваших аппаратных средств GPU.

doTraining = false;
if doTraining
    modelDateTime = string(datetime('now','Format',"yyyy-MM-dd-HH-mm-ss"));
    [net,info] = trainNetwork(dsTrain,lgraph,options);
    save(strcat("trained3DUNet-",modelDateTime,"-Epoch-",num2str(options.MaxEpochs),".mat"),'net');
else
    inputPatchSize = [132 132 132 4];
    outPatchSize = [44 44 44 2];
    load(fullfile(imageDir,'trained3DUNet','brainTumor3DUNetValid.mat'));
end

Выполнение сегментации тестовых данных

Графический процессор настоятельно рекомендуется для выполнения семантической сегментации томов изображения (требуется Toolbox™ параллельных вычислений).

Выберите источник тестовых данных, содержащий тома и метки для тестирования. Если сохранить useFullTestSet переменная в следующем коде как false, то в примере используется пять томов для тестирования. Если установить useFullTestSet переменная для trueзатем в примере используется 55 тестовых изображений, выбранных из полного набора данных.

useFullTestSet = false;
if useFullTestSet
    volLocTest = fullfile(preprocessDataLoc,'imagesTest');
    lblLocTest = fullfile(preprocessDataLoc,'labelsTest');
else
    volLocTest = fullfile(imageDir,'sampleBraTSTestSetValid','imagesTest');
    lblLocTest = fullfile(imageDir,'sampleBraTSTestSetValid','labelsTest');
    classNames = ["background","tumor"];
    pixelLabelID = [0 1];
end

voldsTest переменная хранит наземные тестовые изображения истинности. pxdsTest переменная сохраняет метки истинности земли.

volReader = @(x) matRead(x);
voldsTest = imageDatastore(volLocTest, ...
    'FileExtensions','.mat','ReadFcn',volReader);
pxdsTest = pixelLabelDatastore(lblLocTest,classNames,pixelLabelID, ...
    'FileExtensions','.mat','ReadFcn',volReader);

Используйте стратегию «перекрытие-мозаика» для прогнозирования меток для каждого испытательного тома. Каждый тестовый том дополняется, чтобы сделать входной размер кратным выходному размеру сети, и компенсирует эффекты действительного свертывания. Алгоритм перекрытия-мозаики выбирает перекрывающиеся фрагменты, предсказывает метки для каждого фрагмента с помощью semanticseg (Computer Vision Toolbox), а затем рекомбинирует исправления.

id = 1;
while hasdata(voldsTest)
    disp(['Processing test volume ' num2str(id)]);
    
    tempGroundTruth = read(pxdsTest);
    groundTruthLabels{id} = tempGroundTruth{1};
    vol{id} = read(voldsTest);
    
    % Use reflection padding for the test image. 
    % Avoid padding of different modalities.
    volSize = size(vol{id},(1:3));
    padSizePre  = (inputPatchSize(1:3)-outPatchSize(1:3))/2;
    padSizePost = (inputPatchSize(1:3)-outPatchSize(1:3))/2 + (outPatchSize(1:3)-mod(volSize,outPatchSize(1:3)));
    volPaddedPre = padarray(vol{id},padSizePre,'symmetric','pre');
    volPadded = padarray(volPaddedPre,padSizePost,'symmetric','post');
    [heightPad,widthPad,depthPad,~] = size(volPadded);
    [height,width,depth,~] = size(vol{id});
    
    tempSeg = categorical(zeros([height,width,depth],'uint8'),[0;1],classNames);
    
    % Overlap-tile strategy for segmentation of volumes.
    for k = 1:outPatchSize(3):depthPad-inputPatchSize(3)+1
        for j = 1:outPatchSize(2):widthPad-inputPatchSize(2)+1
            for i = 1:outPatchSize(1):heightPad-inputPatchSize(1)+1
                patch = volPadded( i:i+inputPatchSize(1)-1,...
                    j:j+inputPatchSize(2)-1,...
                    k:k+inputPatchSize(3)-1,:);
                patchSeg = semanticseg(patch,net);
                tempSeg(i:i+outPatchSize(1)-1, ...
                    j:j+outPatchSize(2)-1, ...
                    k:k+outPatchSize(3)-1) = patchSeg;
            end
        end
    end
    
    % Crop out the extra padded region.
    tempSeg = tempSeg(1:height,1:width,1:depth);

    % Save the predicted volume result.
    predictedLabels{id} = tempSeg;
    id=id+1;
end
Processing test volume 1
Processing test volume 2
Processing test volume 3
Processing test volume 4
Processing test volume 5

Сравнение истинности почвы с предсказанием сети

Выберите одно из тестовых изображений для оценки точности семантической сегментации. Извлеките первую модальность из 4-D объемных данных и сохраните этот объем 3-D в переменной vol3d.

volId = 1;
vol3d = vol{volId}(:,:,:,1);

Отображение в монтаже центрального среза истинности грунта и прогнозируемых меток вдоль направления глубины.

zID = size(vol3d,3)/2;
zSliceGT = labeloverlay(vol3d(:,:,zID),groundTruthLabels{volId}(:,:,zID));
zSlicePred = labeloverlay(vol3d(:,:,zID),predictedLabels{volId}(:,:,zID));

figure
montage({zSliceGT,zSlicePred},'Size',[1 2],'BorderSize',5) 
title('Labeled Ground Truth (Left) vs. Network Prediction (Right)')

Отображение тома с меткой «ground-truth» с помощью labelvolshow функция. Сделать фон полностью прозрачным, установив видимость метки фона (1Кому 0. Так как опухоль находится внутри мозговой ткани, сделайте некоторые воксели мозга прозрачными, чтобы опухоль была видимой. Чтобы сделать некоторые воксели мозга прозрачными, укажите порог громкости как число в диапазоне [0, 1]. Все интенсивности нормализованного объема ниже этого порогового значения полностью прозрачны. Этот пример устанавливает порог объема меньше 1, так что некоторые пиксели мозга остаются видимыми, чтобы дать контекст пространственного расположения опухоли внутри мозга.

viewPnlTruth = uipanel(figure,'Title','Ground-Truth Labeled Volume');
hTruth = labelvolshow(groundTruthLabels{volId},vol3d,'Parent',viewPnlTruth, ...
    'LabelColor',[0 0 0;1 0 0],'VolumeThreshold',0.68);
hTruth.LabelVisibility(1) = 0;

Для того же объема отобразите прогнозируемые метки.

viewPnlPred = uipanel(figure,'Title','Predicted Labeled Volume');
hPred = labelvolshow(predictedLabels{volId},vol3d,'Parent',viewPnlPred, ...
    'LabelColor',[0 0 0;1 0 0],'VolumeThreshold',0.68);

hPred.LabelVisibility(1) = 0;

На этом рисунке показан результат последовательного отображения фрагментов на одном из томов. Помеченная истина земли находится слева, а предсказание сети - справа.

Количественная точность сегментации

Измерьте точность сегментации с помощью dice функция. Эта функция вычисляет коэффициент подобия Диса между прогнозируемым и нулевым сегментациями истинности.

diceResult = zeros(length(voldsTest.Files),2);

for j = 1:length(vol)
    diceResult(j,:) = dice(groundTruthLabels{j},predictedLabels{j});
end

Вычислите средний балл Dice по набору тестовых томов.

meanDiceBackground = mean(diceResult(:,1));
disp(['Average Dice score of background across ',num2str(j), ...
    ' test volumes = ',num2str(meanDiceBackground)])
Average Dice score of background across 5 test volumes = 0.9993
meanDiceTumor = mean(diceResult(:,2));
disp(['Average Dice score of tumor across ',num2str(j), ...
    ' test volumes = ',num2str(meanDiceTumor)])
Average Dice score of tumor across 5 test volumes = 0.9585

На рисунке показан boxplot (Statistics and Machine Learning Toolbox), которая визуализирует статистику о баллах Dice по набору из пяти образцов тестовых томов. Красные линии на графике показывают среднее значение Dice для классов. Верхняя и нижняя границы синей рамки указывают на 25-й и 75-й процентили соответственно. Черные усы распространяются на самые экстремальные точки данных, не считающиеся отклонениями.

При наличии Toolbox™ статистики и машинного обучения можно использовать boxplot функция для визуализации статистики о баллах Dice на всех тестовых томах. Создание boxplot, установите createBoxplot переменная в следующем коде true.

createBoxplot = false;
if createBoxplot
    figure
    boxplot(diceResult)
    title('Test Set Dice Accuracy')
    xticklabels(classNames)
    ylabel('Dice Coefficient')
end

Ссылки

[1] Чичек, Лиенкамп, Т. Брокс и О. Роннебергер. «3D U-Net: обучение плотной объемной сегментации из разреженной аннотации». В трудах Международной конференции по вычислению медицинских изображений и компьютерному вмешательству - MICCAI 2016. Афины, Греция, октябрь 2016 г., стр. 424-432.

[2] Изенси, Ф., П. Кикингередер, У. Уик, М. Бендзюс и К. Х. Майер-Хайн. «Сегментация опухолей головного мозга и прогноз выживаемости радиомики: вклад в вызов BRATS 2017». В трудах BrainLes: Международный семинар MICCAI Brainlesion. Квебек-Сити, Канада, сентябрь 2017 года, стр. 287-297.

[3] «Опухоли мозга». Декатлон медицинской сегментации. http://medicaldecathlon.com/

Набор данных BraTS предоставляется компанией Medical Segmentation Decathlon по лицензии CC-BY-SA 4.0. Все гарантии и заявления не предоставляются; для получения подробной информации см. лицензию. Приложение MathWorks ® изменило набор данных, связанный в разделе «Загрузка предварительно обученной сети» и «Набор тестов образцов» этого примера. Модифицированный набор данных образца обрезали до области, содержащей главным образом мозг и опухоль, и каждый канал нормализовали независимо путем вычитания среднего значения и деления на стандартное отклонение обрезанной области мозга.

[4] Sudre, C. H., В. Ли, Т. Веркотерен, С. Аурселин и М. Х. Кардозу. «Обобщенное перекрытие кости как функция потери глубокого обучения для сильно несбалансированных сегментов». Глубокое обучение анализу медицинских образов и мультимодальное обучение для поддержки принятия клинических решений: третий международный семинар. Квебек-Сити, Канада, сентябрь 2017 года, стр. 240-248.

[5] Ronneberger, O., П. Фишер и Т. Брокс. «U-Net: сверточные сети для сегментации биомедицинских изображений». В трудах Международной конференции по вычислению медицинских изображений и компьютерному вмешательству - MICCAI 2015. Мюнхен, Германия, октябрь 2015 года, стр. 234-241. Доступно по адресу arXiv:1505.04597.

См. также

| | | (Панель инструментов компьютерного зрения) | (Панель инструментов компьютерного зрения) | (Панель инструментов компьютерного зрения) | (инструментарий для глубокого обучения) | (инструментарий для глубокого обучения)

Связанные темы

Внешние веб-сайты