Этот пример показывает, как обучить 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 извлекает случайные закрашенные фигуры от наземных изображений истины и соответствующих пиксельных данных о метке. Исправление является общим методом, чтобы предотвратить исчерпывание памяти когда обучение с произвольно большими объемами
Во-первых, сохраните учебные изображения в 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 [1]. В U-Net начальные серии сверточных слоев вкраплены макс. слоями объединения, последовательно уменьшив разрешение входного изображения. Эти слои сопровождаются серией сверточных слоев, вкрапленных повышающей дискретизацией операторов, последовательно увеличивая разрешение входного изображения. U-Net имени прибывает из того, что сеть может чертиться с симметричной формой как буква U. Этот пример изменяет U-Net, чтобы использовать дополнение нуля в свертках, так, чтобы вход и вывод к сверткам имели тот же размер.
Этот пример задает 3-D U-Net использование слоев от Deep Learning Toolbox™, включая:
image3dInputLayer
- 3-D изображение ввело слой
convolution3dLayer
- 3-D слой свертки для сверточных нейронных сетей
batchNormalizationLayer
- Пакетный слой нормализации
reluLayer
- Текучий исправленный линейный модульный слой
maxPooling3dLayer
- 3-D макс. слой объединения
transposedConv3dLayer
- Транспонированный 3-D слой свертки
softmaxLayer
- Softmax слой вывода
Слой concatenationLayer
- Concatenation
Этот пример также задает пользовательский слой Игры в кости потерь, названный dicePixelClassification3dLayer
, чтобы решить проблему неустойчивости класса в данных [4]. Этот слой присоединен к примеру как к вспомогательному файлу. Для получения дополнительной информации смотрите, Задают Пользовательский Слой Классификации Пикселей с Потерей Игры в кости (Deep Learning Toolbox).
Первый слой, 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.
imageDatastore
| pixelLabelDatastore
| randomPatchExtractionDatastore
| semanticseg
| trainNetwork
| trainingOptions
| transform