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

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

Пример показывает, как обучить 3-D сеть U-Net и также обеспечивает предварительно обученную сеть. Если вы принимаете решение обучить сеть, использование CUDA-способного графического процессора NVIDIA™ с вычисляют возможность 3.0, или выше настоятельно рекомендован (требует Parallel Computing Toolbox™).

Введение

Семантическая сегментация вовлекает маркировку каждого пикселя в изображение или воксел 3-D объема с классом.

Этот пример иллюстрирует использование методов глубокого обучения, чтобы семантически сегментировать опухоли головного мозга на сканированиях магнитно-резонансной томографии (MRI). Это также показывает, как выполнить бинарную сегментацию, в которой каждый воксел маркирован как опухоль или фон.

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

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

Загрузите обучение, валидацию и тестовые данные

Этот пример использует набор данных BraTS [2]. Набор данных BraTS содержит сканирования MRI опухолей головного мозга, а именно, глиом, которые являются наиболее распространенной первичной мозговой зловредностью. Размер файла данных составляет ~7 Гбайт. Если вы не хотите загружать набор данных BraTS, то перейдите непосредственно к разделу Download Pretrained Network и Sample Test Set в этом примере.

Создайте директорию, чтобы сохранить набор данных BraTS.

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

Чтобы загрузить данные BraTS, перейдите к Медицинской Сегментации веб-сайт Decathalon и щелкните по ссылке "Download Data". Загрузите файл [3] "Task01_BrainTumour.tar". Разархивируйте файл TAR в директорию, заданную переменной imageDir. Когда разархивировано успешно, imageDir будет содержать директорию под названием Task01_BrainTumour, который имеет три подкаталога: imagesTr, imagesTs и labelsTr.

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

Предварительно обработайте данные об обучении и валидации

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

Функция помощника выполняет эти операции:

  • Обрежьте данные в область, содержащую, в основном, мозг и опухоль. Обрезка данных уменьшает размер данных при сохранении самой критической части каждого объема MRI и его соответствующих меток.

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

  • Разделите набор данных в обучение, валидацию и наборы тестов.

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

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

Создайте случайный Datastore экстракции закрашенной фигуры для обучения и валидации

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

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

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

Создайте pixelLabelDatastore, чтобы сохранить метки.

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

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

volume = preview(volds);
label = preview(pxds);
figure
h = labelvolshow(label,volume(:,:,:,1));
h.LabelVisibility(1) = 0;

Создайте randomPatchExtractionDatastore из datastore изображений и пиксельного datastore метки. Задайте размер закрашенной фигуры 64 64 64 вокселами. Задайте 'PatchesPerImage', чтобы извлечь 16 случайным образом расположенных закрашенных фигур от каждой пары объемов и меток во время обучения. Задайте мини-пакетный размер 8.

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

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

dsTrain = transform(patchds,@augment3dPatch);

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

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

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

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

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

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

Этот пример задает 3-D U-Net использование слоев от Deep Learning Toolbox™, включая:

Этот пример также задает пользовательский слой Игры в кости потерь, названный dicePixelClassification3dLayer, чтобы решить проблему неустойчивости класса в данных [4]. Этот слой присоединен к примеру как к вспомогательному файлу. Для получения дополнительной информации смотрите, Задают Пользовательский Слой Классификации Пикселей с Потерей Игры в кости.

Первый слой, imageInput3dLayer, работает с закрашенными фигурами изображений размера 64 64 64 вокселами.

inputSize = [64 64 64 4];
inputLayer = image3dInputLayer(inputSize,'Normalization','none','Name','input');

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

Дайте уникальные имена всем слоям. Слои в энкодере имеют имена начиная с "en", сопровождаемого индексом модуля энкодера. Например, "en1" обозначает первый модуль энкодера.

numFiltersEncoder = [
    32 64; 
    64 128; 
    128 256];

layers = [inputLayer];
for module = 1:3
    modtag = num2str(module);
    encoderModule = [
        convolution3dLayer(3,numFiltersEncoder(module,1), ...
            'Padding','same','WeightsInitializer','narrow-normal', ...
            'Name',['en',modtag,'_conv1']);
        batchNormalizationLayer('Name',['en',modtag,'_bn']);
        reluLayer('Name',['en',modtag,'_relu1']);
        convolution3dLayer(3,numFiltersEncoder(module,2), ...
            'Padding','same','WeightsInitializer','narrow-normal', ...
            'Name',['en',modtag,'_conv2']);
        reluLayer('Name',['en',modtag,'_relu2']);
        maxPooling3dLayer(2,'Stride',2,'Padding','same', ...
            'Name',['en',modtag,'_maxpool']);
    ];
    
    layers = [layers; encoderModule];
end

Создайте расширяющийся путь 3-D U-Net. Расширяющийся путь состоит из четырех модулей декодера. Все декодеры содержат два слоя свертки с 3 3х3 фильтрами, которые делят на два количество карт функции, сопровождаемых нелинейной активацией с помощью reLu слоя. Первые три декодера завершают транспонированным слоем свертки, который сверхдискретизировал изображение фактором 2. Итоговый декодер включает слой свертки, который сопоставляет характеристический вектор каждого воксела к классам.

Дайте уникальные имена всем слоям. Слои в декодере имеют имена начиная с "de", сопровождаемого индексом модуля декодера. Например, "de4" обозначает четвертый модуль декодера.

numFiltersDecoder = [
    256 512; 
    256 256; 
    128 128; 
    64 64];

decoderModule4 = [
    convolution3dLayer(3,numFiltersDecoder(1,1), ...
        'Padding','same','WeightsInitializer','narrow-normal', ...
        'Name','de4_conv1');
    reluLayer('Name','de4_relu1');
    convolution3dLayer(3,numFiltersDecoder(1,2), ...
        'Padding','same','WeightsInitializer','narrow-normal', ...
        'Name','de4_conv2');
    reluLayer('Name','de4_relu2');
    transposedConv3dLayer(2,numFiltersDecoder(1,2),'Stride',2, ...
        'Name','de4_transconv');
];

decoderModule3 = [
    convolution3dLayer(3,numFiltersDecoder(2,1), ...
        'Padding','same','WeightsInitializer','narrow-normal', ....
        'Name','de3_conv1');       
    reluLayer('Name','de3_relu1');
    convolution3dLayer(3,numFiltersDecoder(2,2), ...
        'Padding','same','WeightsInitializer','narrow-normal', ...
        'Name','de3_conv2'); 
    reluLayer('Name','de3_relu2');
    transposedConv3dLayer(2,numFiltersDecoder(2,2),'Stride',2, ...
        'Name','de3_transconv');
];

decoderModule2 = [
    convolution3dLayer(3,numFiltersDecoder(3,1), ...
        'Padding','same','WeightsInitializer','narrow-normal', ...
        'Name','de2_conv1');
    reluLayer('Name','de2_relu1');
    convolution3dLayer(3,numFiltersDecoder(3,2), ...
        'Padding','same','WeightsInitializer','narrow-normal', ...
        'Name','de2_conv2');
    reluLayer('Name','de2_relu2');
    transposedConv3dLayer(2,numFiltersDecoder(3,2),'Stride',2, ...
        'Name','de2_transconv');
];

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

numLabels = 2;
decoderModuleFinal = [
    convolution3dLayer(3,numFiltersDecoder(4,1), ...
        'Padding','same','WeightsInitializer','narrow-normal', ...
        'Name','de1_conv1');
    reluLayer('Name','de1_relu1');
    convolution3dLayer(3,numFiltersDecoder(4,2), ...
        'Padding','same','WeightsInitializer','narrow-normal', ...
        'Name','de1_conv2');
    reluLayer('Name','de1_relu2');
    convolution3dLayer(1,numLabels,'Name','convLast');
    softmaxLayer('Name','softmax');
    dicePixelClassification3dLayer('output');
];

Конкатенация входного слоя и модулей энкодера с четвертым модулем декодера. Добавьте другие модули декодера в график слоя как отдельные ответвления.

layers = [layers; decoderModule4];
lgraph = layerGraph(layers);
lgraph = addLayers(lgraph,decoderModule3);
lgraph = addLayers(lgraph,decoderModule2);
lgraph = addLayers(lgraph,decoderModuleFinal);

Используйте слои конкатенации, чтобы соединить второй reLu слой каждого модуля энкодера с транспонированным слоем свертки равного размера от модуля декодера. Соедините вывод каждого слоя конкатенации к первому слою свертки модуля декодера.

concat1 = concatenationLayer(4,2,'Name','concat1');
lgraph = addLayers(lgraph,concat1);
lgraph = connectLayers(lgraph,'en1_relu2','concat1/in1');
lgraph = connectLayers(lgraph,'de2_transconv','concat1/in2');
lgraph = connectLayers(lgraph,'concat1/out','de1_conv1');

concat2 = concatenationLayer(4,2,'Name','concat2');
lgraph = addLayers(lgraph,concat2);
lgraph = connectLayers(lgraph,'en2_relu2','concat2/in1');
lgraph = connectLayers(lgraph,'de3_transconv','concat2/in2');
lgraph = connectLayers(lgraph,'concat2/out','de2_conv1');

concat3 = concatenationLayer(4,2,'Name','concat3');
lgraph = addLayers(lgraph,concat3);
lgraph = connectLayers(lgraph,'en3_relu2','concat3/in1');
lgraph = connectLayers(lgraph,'de4_transconv','concat3/in2');
lgraph = connectLayers(lgraph,'concat3/out','de3_conv1'); 

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

lgraph = createUnet3d(inputSize);

Постройте график слоя.

analyzeNetwork(lgraph)

Задайте опции обучения

Обучите сеть с помощью "adam" решателя оптимизации. Задайте гиперустановки параметров с помощью функции trainingOptions. Начальный темп обучения установлен в 5e-4 и постепенно уменьшается по промежутку обучения.

options = trainingOptions('adam', ...
    'MaxEpochs',100, ...
    '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/brainTumor3DUNet.mat';
sampleData_url = 'https://www.mathworks.com/supportfiles/vision/data/sampleBraTSTestSet.tar.gz';

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

Обучите сеть

После конфигурирования опций обучения и источника данных, обучите 3-D сеть U-Net при помощи функции trainNetwork. Чтобы обучить сеть, установите параметр doTraining в следующем коде к true. CUDA-способный графический процессор NVIDIA™ с вычисляет возможность 3.0, или выше настоятельно рекомендован для обучения.

Если вы сохраняете параметр doTraining в следующем коде как false, то пример возвращает предварительно обученную 3-D сеть U-Net.

Примечание: Обучение занимает приблизительно 60 часов на Титане NVIDIA™ X и может взять еще дольше в зависимости от вашего оборудования графического процессора.

doTraining = false;
if doTraining
    modelDateTime = datestr(now,'dd-mmm-yyyy-HH-MM-SS');
    [net,info] = trainNetwork(dsTrain,lgraph,options);
    save(['trained3DUNet-' modelDateTime '-Epoch-' num2str(maxEpochs) '.mat'],'net');
else
    load(fullfile(imageDir,'trained3DUNet','brainTumor3DUNet.mat'));
end

Можно теперь использовать U-Net, чтобы семантически сегментировать опухоли головного мозга.

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

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

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

Обрежьте центральный фрагмент изображений и меток, чтобы измерить 128 128 128 вокселами при помощи функции помощника centerCropMatReader. Эта функция присоединена к примеру как к вспомогательному файлу. Переменная voldsTest хранит наземные тестовые изображения истины. Переменная pxdsTest хранит заземляющие метки истины.

windowSize = [128 128 128];
volReader = @(x) centerCropMatReader(x,windowSize);
labelReader = @(x) centerCropMatReader(x,windowSize);
voldsTest = imageDatastore(volLocTest, ...
    'FileExtensions','.mat','ReadFcn',volReader);
pxdsTest = pixelLabelDatastore(lblLocTest,classNames,pixelLabelID, ...
    'FileExtensions','.mat','ReadFcn',labelReader);

Для каждого тестового изображения добавьте наземные объемы истины изображений и метки к массивам ячеек. Используйте обучивший сеть с функцией semanticseg, чтобы предсказать метки для каждого тестового объема.

После выполнения сегментации постобработайте предсказанные метки путем маркировки немозговых вокселов как 1, соответствия фону. Используйте тестовые изображения, чтобы определить, какие вокселы не принадлежат мозгу. Можно также очистить предсказанные метки путем удаления островов и заполнения дыр с помощью функции medfilt3. medfilt3 не поддерживает категориальные данные, таким образом, бросает пиксельную метку IDs к uint8 перед вычислением. Затем бросьте отфильтрованные метки назад к типу категориальных данных, задав исходную пиксельную метку IDs и имена классов.

id=1;
while hasdata(voldsTest)
    disp(['Processing test volume ' num2str(id)])
    
    groundTruthLabels{id} = read(pxdsTest);
    
    vol{id} = read(voldsTest);
    tempSeg = semanticseg(vol{id},net);

    % Get the non-brain region mask from the test image.
    volMask = vol{id}(:,:,:,1)==0;
    % Set the non-brain region of the predicted label as background.
    tempSeg(volMask) = classNames(1);
    % Perform median filtering on the predicted label.
    tempSeg = medfilt3(uint8(tempSeg)-1);
    % Cast the filtered label to categorial.
    tempSeg = categorical(tempSeg,pixelLabelID,classNames);
    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 = 2;
vol3d = vol{volId}(:,:,:,1);

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

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

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

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

figure
h1 = labelvolshow(groundTruthLabels{volId},vol3d);
h1.LabelVisibility(1) = 0;
h1.VolumeThreshold = 0.68;

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

figure
h2 = labelvolshow(predictedLabels{volId},vol3d);
h2.LabelVisibility(1) = 0;
h2.VolumeThreshold = 0.68;

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

Определите количество точности сегментации

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

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

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

Вычислите средний счет Игры в кости через набор тестовых объемов.

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.99341
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.85204

Данные показывают boxplot, который визуализирует статистику об очках Игры в кости через набор пяти демонстрационных тестовых объемов. Красные линии в графике показывают среднее значение Игры в кости для классов. Верхние и нижние границы синего поля указывают на 25-е и 75-е процентили, соответственно. Черные контактные усики расширяют к самым экстремальным точкам данных, не рассмотренным выбросами.

Если у вас есть Statistics and Machine Learning Toolbox™, то можно использовать функцию boxplot, чтобы визуализировать статистику об очках Игры в кости через все тестовые объемы. Чтобы создать boxplot, установите параметр createBoxplot в следующем коде к true.

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

Сводные данные

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

  • Загрузите и предварительно обработайте данные тренировки.

  • Создайте randomPatchExtractionDatastore, который кормит данными тренировки сеть.

  • Задайте слои 3-D сети U-Net.

  • Задайте опции обучения.

  • Обучите сеть с помощью функции trainNetwork.

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

Ссылки

[1] Çiçek, Ö., А. Абдулкадир, С. С. Линкамп, Т. Брокс и О. Роннебергер. "3D U-Net: Изучение Плотной Объемной Сегментации из Разреженной Аннотации". В Продолжениях Международной конференции по вопросам Медицинского Вычисления Изображений и Машинного Вмешательства. Афины, Греция, октябрь 2016, стр 424-432.

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

[3] "Мозговые опухоли". Медицинская сегментация Decathalon. http://medicaldecathlon.com/

Набор данных BraTS обеспечивается Медицинским Десятиборьем в соответствии с лицензией CC-BY-SA 4.0. От всех гарантий и представлений отказываются; см. лицензию на детали. MathWorks® изменил набор данных, соединенный в разделе Download Pretrained Network и Sample Test Set этого примера. Измененный демонстрационный набор данных был обрезан в область, содержащую, в основном, мозг и опухоль, и каждый канал был нормирован независимо путем вычитания среднего значения и деления на стандартное отклонение обрезанного отдела головного мозга.

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

Смотрите также

| | | | | |

Связанные примеры

Больше о

Для просмотра документации необходимо авторизоваться на сайте