이 페이지의 내용은 이전 릴리스에 관한 것입니다. 해당 영문 페이지는 최신 릴리스에서 제거되었습니다.

딥러닝을 사용한 3차원 뇌종양 분할

이 예제에서는 3차원 U-Net 신경망을 훈련시키고 3차원 의료 영상에서 뇌종양의 의미론적 분할을 수행하는 방법을 다룹니다. 이 예제에서는 3차원 U-Net 네트워크를 훈련시키는 방법을 보여주고, 사전 훈련된 네트워크도 제공합니다. 3차원 의미론적 분할을 수행할 때는 CUDA 지원 NVIDIA™ GPU(Compute Capability 3.0 이상)를 사용하는 것이 권장됩니다(Parallel Computing Toolbox™ 필요).

소개

의미론적 분할에서는 영상의 각 픽셀에 또는 3차원 볼륨의 복셀에 클래스 레이블을 지정하게 됩니다. 이 예제에서는 딥러닝 방법을 사용하여 MRI(자기 공명 영상) 스캔에 있는 뇌종양에 대해 이진 의미론적 분할을 수행하는 방법을 보여줍니다. 이 이진 분할에서 각 픽셀은 종양 또는 배경으로 레이블 지정됩니다.

이 예제에서는 3차원 U-Net 아키텍처 [1]를 사용하여 뇌종양 분할을 수행합니다. U-Net은 의미론적 분할 분야에서 널리 도입되고 있는 빠르고 효율적이며 간단한 네트워크입니다.

의료 영상 분할의 경우 3차원 볼륨을 저장하고 처리하는 데 엄청난 양의 메모리가 필요하다는 어려움이 있습니다. GPU 리소스 제약으로 인해, 전체 입력 볼륨에 대해 네트워크를 훈련시키는 것은 실용적이지 않습니다. 이 예제에서는 영상 패치를 대상으로 네트워크를 훈련시킴으로써 이 문제를 해결합니다. 이 예제에서는 중첩 타일 전략을 사용하여 테스트 패치를 하나의 완전한 분할된 테스트 볼륨으로 이어 붙입니다. 이 예제에서는 신경망에 있는 컨벌루션의 유효한 부분을 사용하여 경계 아티팩트를 방지합니다 [5].

의료 영상 분할의 두 번째 어려움은 데이터에 있는 클래스 불균형으로, 이는 일반적인 교차 엔트로피 손실을 사용할 때 훈련에 지장을 줍니다. 이 예제에서는 가중 다중클래스 다이스 손실함수 [4]를 사용하여 문제를 해결합니다. 클래스에 가중치를 적용하면 큰 영역이 다이스 점수에 미치는 영향을 상쇄하여 네트워크가 작은 영역을 분할하는 방법을 학습하는 것이 보다 쉬워집니다.

훈련, 검증 및 테스트 데이터 다운로드하기

이 예제에서는 BraTS 데이터 세트 [2]를 사용합니다. BraTS 데이터 세트는 뇌종양 중에서도 가장 일반적인 주요 악성 뇌종양인 신경교종의 MRI 스캔을 포함합니다. 데이터 파일의 크기는 최대 7GB입니다. BraTS 데이터 세트를 다운로드하기를 원치 않는 경우에는 이 예제의 사전 훈련된 네트워크 및 샘플 테스트 세트 다운로드하기 섹션으로 건너뛰십시오.

BraTS 데이터 세트를 저장할 디렉터리를 만듭니다.

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

BraTS 데이터를 다운로드하려면 Medical Segmentation Decathalon 웹 사이트로 이동하여 "Download Data" 링크를 클릭하십시오. "Task01_BrainTumour.tar" 파일 [3]을 다운로드합니다. imageDir 변수로 지정된 디렉터리에 TAR 파일의 압축을 풉니다. 압축을 풀면 imageDir 안에 Task01_BrainTumour 디렉터리가 있고, 또 그 안에는 imagesTr, imagesTs, labelsTr이라는 3개의 하위 디렉터리가 있을 것입니다.

이 데이터 세트에는 3차원 영상이 쌓여있는 4차원 볼륨이 750개 있습니다. 각 4차원 볼륨은 크기가 240x240x155x4입니다. 여기서 처음 3개의 차원은 3차원 볼륨 영상의 높이, 너비, 깊이에 해당합니다. 4번째 차원은 각종 스캔 모달리티에 해당합니다. 데이터 세트는 복셀 레이블이 있는 훈련 볼륨 484개와 테스트 볼륨 266개로 나뉘어 있습니다. 테스트 볼륨에는 레이블이 없으므로 이 예제에서는 테스트 데이터를 사용하지 않습니다. 대신 이 예제에서는 484개의 훈련 볼륨을 각각 훈련, 검증, 테스트용으로 사용할 3개의 독립적인 세트로 분할합니다.

훈련 데이터와 검증 데이터 전처리하기

3차원 U-Net 네트워크를 더 효율적으로 훈련시키려면 헬퍼 함수 preprocessBraTSdataset을 사용하여 MRI 데이터를 전처리하십시오. 이 함수는 예제에 지원 파일로 첨부되어 있습니다.

헬퍼 함수는 다음과 같은 작업을 수행합니다.

  • 데이터를 뇌와 종양을 주로 포함하는 영역으로 자릅니다. 데이터를 자르면 데이터의 크기는 줄어들면서 각 MRI 볼륨과 그에 해당하는 레이블의 가장 중요한 부분은 보존됩니다.

  • 잘린 뇌 영역의 평균을 빼고 표준편차로 나누어서 각 볼륨의 각 모달리티를 독립적으로 정규화합니다.

  • 484개의 훈련 볼륨을 400개의 훈련 세트, 29개의 검증 세트, 55개의 테스트 세트로 분할합니다.

데이터 전처리가 완료되는 데는 약 30분 정도 소요될 수 있습니다.

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

훈련 및 검증을 위해 무작위 패치 추출 데이터저장소 만들기

훈련 데이터를 네트워크에 입력하고 훈련 진행 상황을 검증하기 위해 무작위 패치 추출 데이터저장소를 사용합니다. 이 데이터저장소는 실측 영상과 그에 해당하는 픽셀 레이블 데이터로부터 무작위 패치를 추출합니다. 패치 사용은 임의로 큰 볼륨을 사용하여 훈련시킬 때 메모리 부족을 막는 흔한 기법입니다.

3차원 영상 데이터를 저장할 imageDatastore를 만듭니다. MAT 파일 형식은 비표준 영상 형식이므로 영상 데이터를 읽을 수 있도록 MAT 파일 읽기 프로그램을 사용해야 합니다. 헬퍼 MAT 파일 읽기 프로그램 matRead를 사용하면 됩니다. 이 함수는 예제에 지원 파일로 첨부되어 있습니다.

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

레이블을 저장할 pixelLabelDatastore를 만듭니다.

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를 만듭니다. 패치 크기를 132x132x132 복셀로 지정합니다. 훈련 중에 각 볼륨 및 레이블 쌍으로부터 무작위로 배치된 16개의 패치를 추출하도록 'PatchesPerImage'를 지정합니다. 미니 배치 크기를 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. 응답 패치를 네트워크의 출력 크기인 44x44x44 복셀로 자릅니다.

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

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

3차원 U-Net 계층 설정하기

이 예제에서는 3차원 U-Net 네트워크 [1]를 사용합니다. U-Net에서는 초기 일련의 컨벌루션 계층의 사이에 일정 간격으로 최댓값 풀링 계층이 배치되어 입력 영상의 해상도를 연이어 낮춥니다. 그다음에 오는 일련의 컨벌루션 계층의 사이에는 일정 간격으로 업샘플링 연산자가 배치되어 입력 영상의 해상도를 연이어 높입니다. 각 ReLU 계층 전에는 배치 정규화 계층이 옵니다. U-Net이라는 이름은 이 네트워크를 문자 U와 같은 대칭 형태로 그릴 수 있다는 사실에서 유래했습니다.

unetLayers 함수를 사용하여 디폴트 3차원 U-Net 네트워크를 만듭니다. 2개 클래스 분할을 지정합니다. 테스트 볼륨 예측을 위해 중첩 타일 전략을 사용할 때 경계 아티팩트를 방지하기 위해 유효한 컨벌루션 채우기도 지정합니다.

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

이 예제에서는 작은 종양 영역을 더 잘 분할하고 큰 배경 영역의 영향을 줄이기 위해 dicePixelClassificationLayer를 사용합니다. 픽셀 분류 계층을 다이스 픽셀 분류 계층으로 교체합니다.

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

데이터는 이 예제의 훈련 데이터와 검증 데이터 전처리하기 섹션에서 이미 정규화되었습니다. image3dInputLayer에서의 데이터 정규화는 불필요하므로 입력 계층을 데이터 정규화가 없는 입력 계층으로 교체합니다.

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

또는 Deep Learning Toolbox™의 심층 네트워크 디자이너 앱을 사용하여 3차원 U-Net 네트워크를 수정할 수도 있습니다.

업데이트된 3차원 U-Net 네트워크의 그래프를 플로팅합니다.

analyzeNetwork(lgraph)

훈련 옵션 지정하기

adam 최적화 솔버를 사용하여 네트워크를 훈련시킵니다. trainingOptions 함수를 사용하여 하이퍼파라미터 설정을 지정합니다. 초기 학습률은 5e-4로 설정되었으며, 훈련이 진행되는 동안 점진적으로 줄어듭니다. 사용 가능한 GPU 메모리에 따라 여러 MiniBatchSize 속성을 실험해 볼 수 있습니다. GPU 메모리 사용량을 극대화하려면 큰 배치 크기보다 큰 입력 패치를 사용하십시오. 배치 정규화 계층은 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);

사전 훈련된 네트워크 및 샘플 테스트 세트 다운로드하기

선택적으로, BraTS 데이터 세트 [3]에서 사전 훈련된 3차원 U-Net과 5개의 샘플 테스트 볼륨 및 그에 대응되는 레이블을 다운로드합니다. 사전 훈련된 모델과 샘플 데이터를 사용하면 전체 데이터 세트를 다운로드하거나 네트워크가 훈련될 때까지 기다리지 않고도 테스트 데이터에 대해 분할을 수행할 수 있습니다.

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);
Pretrained 3-D U-Net model for BraTS data set already exists.

Sample BraTS test data set already exists.

네트워크 훈련시키기

훈련 옵션과 데이터 소스를 구성한 후에는 trainNetwork 함수를 사용하여 3차원 U-Net 네트워크를 훈련시킵니다. 네트워크를 훈련시키려면 다음 코드에서 doTraining 변수를 true로 설정하십시오. 훈련을 수행할 때는 CUDA 지원 NVIDIA™ GPU(Compute Capability 3.0 이상)를 사용하는 것을 강력히 권장합니다.

다음 코드에서 doTraining 변수를 false로 둘 경우 이 예제에서는 사전 훈련된 3차원 U-Net 네트워크를 반환합니다.

참고: 훈련은 4개의 NVIDIA™ Titan Xp GPU에서 30시간 정도 걸리며, GPU 하드웨어에 따라 시간이 더 걸릴 수도 있습니다.

doTraining = false;
if doTraining
    modelDateTime = datestr(now,'dd-mmm-yyyy-HH-MM-SS');
    [net,info] = trainNetwork(dsTrain,lgraph,options);
    save(['trained3DUNetValid-' 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

이제 U-Net을 사용하여 뇌종양에 대한 의미론적 분할을 수행할 수 있습니다.

테스트 데이터의 분할 수행하기

영상 볼륨의 의미론적 분할을 수행할 때는 GPU를 사용하는 것을 강력히 권장합니다(Parallel Computing Toolbox™ 필요).

테스트를 위한 실측 볼륨과 레이블을 포함하는 테스트 데이터 소스를 선택합니다. 다음 코드에서 useFullTestSet 변수를 false로 둘 경우 이 예제에서는 테스트를 위해 5개의 볼륨을 사용합니다. 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 함수를 사용하여 각 패치의 레이블을 예측한 후 패치들을 다시 결합합니다.

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차원 볼륨 데이터의 첫 번째 모달리티를 추출한 다음 이 3차원 볼륨을 변수 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)')

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

테스트 볼륨 세트의 평균 다이스 점수를 계산합니다.

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

아래 Figure는 5개의 샘플이 있는 테스트 볼륨 세트의 다이스 점수에 대한 통계량을 시각화하는 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

참고 문헌

[1] Çiçek, Ö., A. Abdulkadir, S. S. Lienkamp, T. Brox, and O. Ronneberger. "3D U-Net: Learning Dense Volumetric Segmentation from Sparse Annotation." In Proceedings of the International Conference on Medical Image Computing and Computer-Assisted Intervention - MICCAI 2016. Athens, Greece, Oct. 2016, pp. 424-432.

[2] Isensee, F., P. Kickingereder, W. Wick, M. Bendszus, and K. H. Maier-Hein. "Brain Tumor Segmentation and Radiomics Survival Prediction: Contribution to the BRATS 2017 Challenge." In Proceedings of BrainLes: International MICCAI Brainlesion Workshop. Quebec City, Canada, Sept. 2017, pp. 287-297.

[3] "Brain Tumours". Medical Segmentation Decathalon. http://medicaldecathlon.com/

BraTS 데이터셋은 CC-BY-SA 4.0 라이선스에 따라 Medical Decathlon에서 제공되었습니다. 모든 보증 및 진술은 부인됩니다. 자세한 내용은 라이선스를 참조하십시오. MathWorks®는 이 예제의 사전 훈련된 네트워크 및 샘플 테스트 세트 다운로드하기 섹션에 링크된 데이터 세트를 변경했습니다. 변경된 샘플 데이터셋은 주로 뇌와 종양을 포함하는 영역으로 잘렸고, 각 채널은 잘린 뇌 영역의 평균을 빼고 표준편차로 나누어서 독립적으로 정규화되었습니다.

[4] Sudre, C. H., W. Li, T. Vercauteren, S. Ourselin, and M. J. Cardoso. "Generalised Dice Overlap as a Deep Learning Loss Function for Highly Unbalanced Segmentations." Deep Learning in Medical Image Analysis and Multimodal Learning for Clinical Decision Support: Third International Workshop. Quebec City, Canada, Sept. 2017, pp. 240-248.

[5] Ronneberger, O., P. Fischer, and T. Brox. "U-Net:Convolutional Networks for Biomedical Image Segmentation." In Proceedings of the International Conference on Medical Image Computing and Computer-Assisted Intervention - MICCAI 2015. Munich, Germany, Oct. 2015, pp. 234-241. Available at arXiv:1505.04597.

참고 항목

| | | | | | |

관련 항목