Main Content

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

이 예제에서는 3차원 의료 영상에서 뇌종양의 의미론적 분할을 수행하는 방법을 다룹니다.

의미론적 분할에서는 영상의 각 픽셀에 또는 3차원 볼륨의 복셀에 클래스 레이블을 지정하게 됩니다. 이 예제에서는 3차원 U-Net 딥러닝 신경망을 사용하여 MRI(자기 공명 영상) 스캔에 있는 뇌종양에 대해 이진 의미론적 분할을 수행합니다. U-Net은 의미론적 분할 분야에서 널리 도입되고 있는 빠르고 효율적이며 간단한 신경망입니다[1].

의료 영상 분할의 경우 3차원 볼륨을 저장하고 처리하는 데 엄청난 양의 메모리가 필요하다는 어려움이 있습니다. GPU 리소스 제약으로 인해, 전체 입력 볼륨에 대해 신경망을 훈련시키고 분할을 수행하는 것은 실용적이지 않습니다. 이 예제에서는 훈련 및 분할을 위해 영상을 더 작은 패치 또는 블록으로 나눔으로써 이 문제를 해결합니다.

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

이 예제에서는 사전 훈련된 3차원 U-Net 아키텍처를 사용하여 뇌종양 분할을 수행하는 방법과 테스트 영상 세트를 사용하여 신경망의 성능을 평가하는 방법을 보여줍니다. BraTS 데이터 세트[2]에서 3차원 U-Net을 선택적으로 훈련시킬 수 있습니다.

사전 훈련된 3차원 U-Net 불러오기

사전 훈련된 3차원 U-Net을 trainedNet이라는 변수로 다운로드합니다. 사전 훈련된 신경망을 사용하면 훈련이 완료될 때까지 기다리지 않고 예제를 실행할 수 있습니다.

dataDir = fullfile(tempdir,"BraTS");
if ~exist(dataDir,"dir")
    mkdir(dataDir);
end
trained3DUnetURL = "https://www.mathworks.com/supportfiles/"+ ...
    "vision/data/brainTumorSegmentation3DUnet_v2.zip";
downloadTrainedNetwork(trained3DUnetURL,dataDir);
load(fullfile(dataDir,"brainTumorSegmentation3DUnet_v2.mat"));

의미론적 분할 수행하기

사전 훈련된 신경망을 사용하여 테스트 MRI 볼륨의 종양 레이블을 예측합니다.

샘플 BraTS 데이터 불러오기

이 예제에서는 BraTS 데이터 세트[2]를 사용합니다. 전체 데이터 세트에는 환자 750명의 뇌종양에 대한 레이블 지정된 MRI 스캔이 포함되어 있습니다. 사전 훈련된 신경망을 사용해 보려면 MathWorks® 웹사이트에서 제공되는 5가지 MRI 스캔의 서브셋과 그에 해당하는 레이블을 다운로드하십시오. 예제에 지원 파일로 첨부되어 있는 downloadBraTSSampleTestData 헬퍼 함수[3]를 사용하여 샘플 데이터를 다운로드합니다.

downloadBraTSSampleTestData(dataDir);

이 중 한 MRI 볼륨을 해당 픽셀 레이블 ground truth와 함께 불러옵니다. 각 볼륨은 4차원 배열입니다. 여기서 처음 3개의 차원은 영상 데이터의 높이, 너비, 깊이에 해당하고, 4번째 차원의 각 페이지는 서로 다른 MRI 모달리티를 포함합니다.

testDir = fullfile(dataDir,"sampleBraTSTestSetValid");
data = load(fullfile(testDir,"imagesTest","BraTS446.mat"));
labels = load(fullfile(testDir,"labelsTest","BraTS446.mat"));
volTest = data.cropVol;
volTestLabels = labels.cropLabel;

블록 형식 영상에서 뇌종양 분할하기

이 예제에서는 큰 볼륨을 효율적으로 처리하기 위해 각 MRI 스캔을 blockedImage (Image Processing Toolbox) 객체에 포함된 일련의 3차원 블록으로 처리합니다. 신경망은 apply (Image Processing Toolbox) 함수를 사용하여 각 블록의 레이블을 예측한 후 블록들을 완전한 분할된 볼륨으로 다시 결합합니다.

다운로드한 샘플 볼륨에 대한 blockedImage 객체를 만듭니다.

bim = blockedImage(volTest);

apply 함수는 blockedImage 내의 각 블록에 대해 사용자 지정 함수를 실행합니다. semanticsegBlock을 각 블록에 적용할 함수로 정의합니다. classNames의 클래스에 대한 레이블을 예측하기 위해 semanticsegBlock 함수는 semanticseg (Computer Vision Toolbox) 함수를 사용하여 사전 훈련된 신경망을 적용합니다.

classNames = ["background","tumor"];
semanticsegBlock = @(bstruct)semanticseg(bstruct.Data,trainedNet,Classes=classNames);

apply 함수를 호출할 때 블록 크기, 블록 간의 테두리 크기와 같은 옵션을 지정할 수 있습니다. 블록 크기를 신경망 출력 크기와 일치하도록 지정합니다. 신경망 입력값과 크기가 같은 샘플 영상을 사전 훈련된 신경망에 전달하여 신경망 출력 크기를 구합니다.

networkInputSize = trainedNet.Layers(1).InputSize;

sampleImage = rand(networkInputSize,"single");
sampleOutput = predict(trainedNet,sampleImage);

networkOutputSize = size(sampleOutput);

blockSize = [networkOutputSize(1:3) networkInputSize(end)];

중첩하는 블록을 만들려면 0이 아닌 테두리 크기를 지정하십시오. 이 예제에서는 블록에 테두리를 더한 값이 신경망 입력 크기와 일치하도록 테두리 크기를 사용합니다.

borderSize = (networkInputSize(1:3) - blockSize(1:3))/2;

semanticsegBlock 함수를 테스트 영상의 모든 블록에 적용합니다. 불완전 블록 채우기를 true로 지정합니다. 볼륨 데이터에 여러 모달리티가 포함되어 있으므로 디폴트 채우기 방법인 "replicate"가 적절합니다. 메모리 리소스가 제한된 컴퓨터에서 메모리 부족 오류를 방지하기 위해 배치 크기를 1로 지정합니다. 그러나 컴퓨터에 충분한 메모리가 있는 경우 블록 크기를 늘려 처리 속도를 높일 수 있습니다.

batchSize = 1;
results = apply(bim, ...
    semanticsegBlock, ...
    BlockSize=blockSize, ...
    BorderSize=borderSize, ...
    PadPartialBlocks=true, ...
    BatchSize=batchSize, ...
    UseParallel=canUseGPU);
predictedLabels = gather(results);

ground truth 데이터의 중앙 단층과 깊이 방향의 예측 레이블을 보여주는 몽타주를 표시합니다.

zID = size(volTest,3)/2;
zSliceGT = labeloverlay(volTest(:,:,zID),volTestLabels(:,:,zID));
zSlicePred = labeloverlay(volTest(:,:,zID),predictedLabels(:,:,zID));

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

다음 애니메이션은 한 테스트 볼륨의 횡축 단층에 대한 ground truth 레이블과 예측 레이블을 나란히 보여줍니다. 왼쪽이 레이블이 지정된 ground truth 데이터이고 오른쪽이 신경망 예측값입니다.

Animation scrolling through the transverse slices of the ground truth and predicted labels for one test volume

훈련을 위해 데이터 준비하기

전체 BraTS 데이터 세트 다운로드하기

훈련을 수행하려면 전체 BraTS 데이터 세트를 다운로드해야 합니다. 데이터 세트의 전체 크기는 최대 7GB이며, 여기에는 750명 환자의 데이터가 포함되어 있습니다. 훈련 데이터 세트 다운로드나 신경망 훈련을 원치 않는 경우에는 이 예제의 신경망 성능 평가하기 섹션으로 건너뛸 수 있습니다.

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

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

데이터 전처리하기

3차원 U-Net 신경망을 더 효율적으로 훈련시키려면 preprocessBraTSDataset 헬퍼 함수를 사용하여 MRI 데이터를 전처리하십시오. 이 함수는 예제에 지원 파일로 첨부되어 있습니다. 헬퍼 함수는 다음과 같은 작업을 수행합니다.

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

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

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

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

sourceDataLoc = fullfile(dataDir,"Task01_BrainTumour");
preprocessDataLoc = fullfile(dataDir,"preprocessedDataset");
if ~isfolder(preprocessDataLoc)
    preprocessBraTSDataset(preprocessDataLoc,sourceDataLoc);
end

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

3차원 훈련 영상 데이터를 읽어오고 관리하기 위해 imageDatastore 객체를 만듭니다. MAT 파일에서 영상 데이터를 읽어오도록 사용자 지정 읽기 함수 matRead를 지정합니다. matRead 헬퍼 함수는 예제에 지원 파일로 첨부되어 있습니다.

volLocTrain = fullfile(preprocessDataLoc,"imagesTr");
voldsTrain = imageDatastore(volLocTrain,FileExtensions=".mat",ReadFcn=@matRead);

레이블을 읽어오고 관리하기 위해 pixelLabelDatastore (Computer Vision Toolbox) 객체를 만듭니다. classNames 변수에 정의된 것과 동일한 클래스 이름을 지정합니다. 픽셀 레이블 ID 1"tumor" 클래스 이름에 매핑되고, 픽셀 레이블 ID 0"background" 클래스 이름에 매핑됩니다.

disp(classNames)
    "background"    "tumor"
pixelLabelID = [0 1];
lblLocTrain = fullfile(preprocessDataLoc,"labelsTr");

pxdsTrain = pixelLabelDatastore(lblLocTrain,classNames,pixelLabelID, ...
    FileExtensions=".mat",ReadFcn=@matRead);

ground truth 영상과 그에 해당하는 픽셀 레이블 데이터로부터 무작위 패치를 추출하는 randomPatchExtractionDatastore (Image Processing Toolbox) 객체를 만듭니다. 패치 크기를 132×132×132 복셀로 지정합니다. 훈련 중에 각 볼륨 및 레이블 쌍으로부터 무작위로 배치된 16개의 패치를 추출하도록 "PatchesPerImage" 이름-값 인수를 지정합니다. 미니 배치 크기를 4로 지정합니다.

patchSize = [132 132 132];
patchPerImage = 16;
miniBatchSize = 4;
patchdsTrain = randomPatchExtractionDatastore(voldsTrain,pxdsTrain,patchSize, ...
    PatchesPerImage=patchPerImage);
patchdsTrain.MiniBatchSize = miniBatchSize;

위에서 한 것과 유사하게 검증 데이터 세트를 관리하기 위해 imageDatastore, pixeLabelDatastore, randomPatchExtractionDatastore 객체를 만듭니다. 검증 데이터를 사용하여 훈련 중에 신경망이 계속해서 학습하고 있는지, 과소적합되고 있는지 아니면 과적합되고 있는지를 평가할 수 있습니다.

volLocVal = fullfile(preprocessDataLoc,"imagesVal");
voldsVal = imageDatastore(volLocVal,FileExtensions=".mat", ...
    ReadFcn=@matRead);

lblLocVal = fullfile(preprocessDataLoc,"labelsVal");
pxdsVal = pixelLabelDatastore(lblLocVal,classNames,pixelLabelID, ...
    FileExtensions=".mat",ReadFcn=@matRead);

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

3차원 U-Net 신경망 아키텍처 정의하기

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

unet3d (Computer Vision Toolbox) 함수를 사용하여 디폴트 3차원 U-Net 신경망을 만듭니다. 클래스가 두 개인 분할을 지정합니다. 경계 아티팩트를 방지하기 위해 유효한 컨벌루션 채우기도 지정합니다.

numChannels = 4;
inputPatchSize = [patchSize numChannels];
numClasses = 2;
[net,outPatchSize] = unet3d(inputPatchSize, ...
    numClasses,ConvolutionPadding="valid");

transform 함수를 augmentAndCrop3dPatch 헬퍼 함수로 지정된 사용자 지정 전처리 연산과 함께 사용하여 훈련 데이터와 검증 데이터를 증대합니다. 이 함수는 예제에 지원 파일로 첨부되어 있습니다. augmentAndCrop3dPatch 함수는 다음 연산을 수행합니다.

  1. 훈련 데이터를 무작위로 회전하고 대칭 이동하여 훈련을 더욱 강력하게 만듭니다. 이 함수는 검증 데이터를 회전하거나 대칭 이동하지 않습니다.

  2. 응답 패치를 신경망의 출력 크기인 44×44×44 복셀로 자릅니다.

dsTrain = transform(patchdsTrain, ...
    @(patchIn)augmentAndCrop3dPatch(patchIn,outPatchSize,"Training"));
dsVal = transform(patchdsVal, ...
    @(patchIn)augmentAndCrop3dPatch(patchIn,outPatchSize,"Validation"));

데이터가 이 예제의 훈련을 위해 데이터 준비하기 섹션에서 이미 정규화되었습니다. 따라서 image3dInputLayer에서 데이터 정규화가 필요하지 않으므로 이 입력 계층을 데이터 정규화가 없는 입력 계층으로 교체합니다.

inputLayer = image3dInputLayer(inputPatchSize, ...
    Normalization="none",Name="ImageInputLayer");
net = replaceLayer(net,net.Layers(1).Name,inputLayer);

또는 심층 신경망 디자이너 앱을 사용하여 3차원 U-Net 신경망을 수정할 수도 있습니다.

deepNetworkDesigner(net)

3차원 U-Net 훈련시키기

훈련 옵션 지정하기

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);

손실 함수 정의하기

예측값 Y와 목표값 T를 받고 일반화된 다이스 손실을 반환하는 사용자 지정 손실 함수 generalizedDiceLoss를 정의합니다. 일반화된 다이스 유사성 계수는 두 분할 영상 간의 중첩을 측정합니다. 계수는 Sørensen-Dice 유사성을 기반으로 하며, 예상 영역의 역수 크기를 사용하여 클래스에 가중치를 부여함으로써 각 클래스가 유사도에 기여하는 정도를 제어합니다. 자세한 내용은 generalizedDice (Computer Vision Toolbox) 항목을 참조하십시오.

function loss = generalizedDiceLoss(Y,T)
% Copyright 2024 The MathWorks, Inc.

% Ignore any NaNs introduced to the training data during augmentation
T(isnan(T)) = 0;

z = generalizedDice(Y,T);

% Compute the mean of the Dice loss across the batch
loss = 1 - mean(z,"all");

end

신경망 훈련시키기

기본적으로 이 예제에서는 다운로드한 사전 훈련된 3차원 U-Net 신경망을 사용합니다. 사전 훈련된 신경망을 사용하면 훈련이 완료될 때까지 기다리지 않고 의미론적 분할을 수행하고 분할 결과를 평가할 수 있습니다.

신경망을 훈련시키려면 다음 코드에서 doTraining 변수를 true로 설정하십시오. trainnet 함수를 사용하여 신경망을 훈련시킵니다. 기본적으로 trainnet 함수는 GPU를 사용할 수 있으면 GPU를 사용합니다. GPU에서 훈련시키려면 Parallel Computing Toolbox™ 라이선스와 지원되는 GPU 장치가 필요합니다. 지원되는 장치에 대한 자세한 내용은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오. GPU를 사용할 수 없는 경우, trainnet 함수는 CPU를 사용합니다. 실행 환경을 지정하려면 ExecutionEnvironment 훈련 옵션을 사용하십시오.

doTraining = false;
if doTraining
    [trainedNet,info] = trainnet(dsTrain,net,@generalizedDiceLoss,options);
    modelDateTime = string(datetime("now",Format="yyyy-MM-dd-HH-mm-ss"));
    save("trained3DUNet-"+modelDateTime+".mat","trainedNet");
end

3차원 U-Net 평가하기

신경망 테스트에 사용할 데이터의 위치를 지정합니다. 기본적으로 useFullTestSetfalse이며 이 예제에서는 샘플 BraTS 데이터 불러오기 섹션에서 다운로드한 5개의 샘플 볼륨을 사용합니다. useFullTestSet 값을 true로 변경하면 이 예제는 전체 데이터 세트에서 테스트에 할당된 55개의 스캔을 사용하게 됩니다.

useFullTestSet = false;
if useFullTestSet
    volLocTest = fullfile(preprocessDataLoc,"imagesTest");
    lblLocTest = fullfile(preprocessDataLoc,"labelsTest");
else
    volLocTest = fullfile(testDir,"imagesTest");
    lblLocTest = fullfile(testDir,"labelsTest");
end

훈련 데이터 세트와 검증 데이터 세트와 마찬가지로, 테스트 데이터 세트의 영상 데이터와 레이블을 관리하기 위해 imageDatastore 객체와 pixelLabelDatastore 객체를 각각 생성합니다.

voldsTest = imageDatastore(volLocTest,FileExtensions=".mat", ...
    ReadFcn=@matRead);

pxdsTest = pixelLabelDatastore(lblLocTest,classNames,pixelLabelID, ...
    FileExtensions=".mat",ReadFcn=@matRead);

각 테스트 볼륨마다, 볼륨을 blockedImage 객체로 읽어오고 apply (Image Processing Toolbox) 함수를 사용하여 각 블록을 처리합니다. apply 함수는 이 예제의 끝에서 정의된 calculateBlockMetrics 헬퍼 함수에서 지정한 연산을 수행합니다. calculateBlockMetrics 함수는 각 블록의 의미론적 분할을 수행하고 예측 레이블과 ground truth 레이블 사이의 혼동행렬을 계산합니다.

imageIdx = 1;
datasetConfMat = table;
while hasdata(voldsTest)

    % Read volume and label data
    vol = read(voldsTest);
    volLabels = read(pxdsTest);

    % Create blockedImage for volume and label data
    testVolume = blockedImage(vol);
    testLabels = blockedImage(volLabels{1});

    % Calculate block metrics
    blockConfMatOneImage = apply(testVolume, ...
        @(block,labeledBlock) ...
            calculateBlockMetrics(block,labeledBlock,trainedNet,classNames), ...
        ExtraImages=testLabels, ...
        PadPartialBlocks=true, ...
        BlockSize=blockSize, ...
        BorderSize=borderSize, ...
        UseParallel=false);

    % Read all the block results of an image and update the image number
    blockConfMatOneImageDS = blockedImageDatastore(blockConfMatOneImage);
    blockConfMat = readall(blockConfMatOneImageDS);
    blockConfMat = struct2table([blockConfMat{:}]);
    blockConfMat.ImageNumber = imageIdx.*ones(height(blockConfMat),1);
    datasetConfMat = [datasetConfMat; blockConfMat];

    imageIdx = imageIdx + 1;
end

evaluateSemanticSegmentation (Computer Vision Toolbox) 함수를 사용하여 분할에 대한 데이터 세트 메트릭 및 블록 메트릭을 평가합니다.

[metrics,blockMetrics] = evaluateSemanticSegmentation( ...
    datasetConfMat,classNames,Metrics="all");
Evaluating semantic segmentation results
----------------------------------------
* Selected metrics: global accuracy, class accuracy, IoU, weighted IoU.
* Processed 5 images.
* Finalizing... Done.
* Data set metrics:

    GlobalAccuracy    MeanAccuracy    MeanIoU    WeightedIoU
    ______________    ____________    _______    ___________

       0.99902          0.97292       0.95915      0.99807  

각 영상에 대해 계산된 자카드 점수를 표시합니다.

metrics.ImageMetrics.MeanIoU
ans = 5×1

    0.9676
    0.9521
    0.9568
    0.9537
    0.9635

지원 함수

calculateBlockMetrics 헬퍼 함수는 블록의 의미론적 분할을 수행하고 예측 레이블과 ground truth 레이블 사이의 혼동행렬을 계산합니다. 이 함수는 블록에 대한 혼동행렬 및 메타데이터를 포함하는 필드가 있는 구조체를 반환합니다. evaluateSemanticSegmentation 함수에 구조체를 사용하여 메트릭을 계산하고 블록 기반 결과를 집계할 수 있습니다.

function blockMetrics = calculateBlockMetrics(bstruct,gtBlockLabels,net,classNames)

% Segment block
predBlockLabels = semanticseg(bstruct.Data,net,Classes=classNames);

% Trim away border region from gtBlockLabels 
blockStart = bstruct.BorderSize + 1;
blockEnd = blockStart + bstruct.BlockSize - 1;
gtBlockLabels = gtBlockLabels( ...
    blockStart(1):blockEnd(1), ...
    blockStart(2):blockEnd(2), ...
    blockStart(3):blockEnd(3));

% Evaluate segmentation results against ground truth
confusionMat = segmentationConfusionMatrix(predBlockLabels,gtBlockLabels);

% blockMetrics is a struct with confusion matrices, image number,
% and block information 
blockMetrics.ConfusionMatrix = confusionMat;
blockMetrics.ImageNumber = bstruct.ImageNumber;
blockInfo.Start = bstruct.Start;
blockInfo.End = bstruct.End;
blockMetrics.BlockInfo = blockInfo;

end

참고 문헌

[1] Çiçek, Özgün, Ahmed Abdulkadir, Soeren S. Lienkamp, Thomas Brox, and Olaf Ronneberger. “3D U-Net: Learning Dense Volumetric Segmentation from Sparse Annotation.” In Medical Image Computing and Computer-Assisted Intervention – MICCAI 2016, edited by Sebastien Ourselin, Leo Joskowicz, Mert R. Sabuncu, Gozde Unal, and William Wells, 9901:424–32. Cham: Springer International Publishing, 2016. https://doi.org/10.1007/978-3-319-46723-8_49.

[2] Isensee, Fabian, Philipp Kickingereder, Wolfgang Wick, Martin Bendszus, and Klaus H. Maier-Hein. “Brain Tumor Segmentation and Radiomics Survival Prediction: Contribution to the BRATS 2017 Challenge.” In Brainlesion: Glioma, Multiple Sclerosis, Stroke and Traumatic Brain Injuries, edited by Alessandro Crimi, Spyridon Bakas, Hugo Kuijf, Bjoern Menze, and Mauricio Reyes, 10670:287–97. Cham: Springer International Publishing, 2018. https://doi.org/10.1007/978-3-319-75238-9_25.

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

The BraTS dataset is provided by Medical Segmentation Decathlon under the CC-BY-SA 4.0 license. All warranties and representations are disclaimed; see the license for details. MathWorks® has modified the data set linked in the Load Sample BraTS Data section of this example. The modified sample data set has been cropped to a region containing primarily the brain and tumor, and each channel has been normalized independently by subtracting the mean and dividing by the standard deviation of the cropped brain region.

[4] Sudre, Carole H., Wenqi Li, Tom Vercauteren, Sebastien Ourselin, and M. Jorge Cardoso. “Generalised Dice Overlap as a Deep Learning Loss Function for Highly Unbalanced Segmentations.” In Deep Learning in Medical Image Analysis and Multimodal Learning for Clinical Decision Support, edited by M. Jorge Cardoso, Tal Arbel, Gustavo Carneiro, Tanveer Syeda-Mahmood, João Manuel R.S. Tavares, Mehdi Moradi, Andrew Bradley, et al., 10553:240–48. Cham: Springer International Publishing, 2017. https://doi.org/10.1007/978-3-319-67558-9_28.

[5] Ronneberger, Olaf, Philipp Fischer, and Thomas Brox. “U-Net: Convolutional Networks for Biomedical Image Segmentation.” In Medical Image Computing and Computer-Assisted Intervention – MICCAI 2015, edited by Nassir Navab, Joachim Hornegger, William M. Wells, and Alejandro F. Frangi, 9351:234–41. Cham: Springer International Publishing, 2015. https://doi.org/10.1007/978-3-319-24574-4_28.

참고 항목

(Computer Vision Toolbox) | | | (Image Processing Toolbox) | (Image Processing Toolbox) | (Image Processing Toolbox) | (Computer Vision Toolbox)

관련 항목

외부 웹사이트