Классифицируйте опухоли на мультиразрешение блокированные изображения

В этом примере показано, как классифицировать мультиразрешение целые изображения понижения (WSIs), который не может уместиться в памяти с помощью глубокой нейронной сети Inception-v3.

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

Пример обрисовывает в общих чертах архитектуру, чтобы использовать основанную на блоке обработку, чтобы обучить большой WSIs. Пример обучает основанную на Inception-v3 сеть с помощью методов передачи обучения, чтобы классифицировать отдельные блоки как normal или tumor.

Если вы не хотите загружать обучающие данные и обучать сеть, затем продолжаться к разделу Train или Download Network этого примера.

Подготовьте обучающие данные

Подготовьтесь данные об обучении и валидации путем следования инструкциям в Предварительно обрабатывают Изображения Мультиразрешения для того, чтобы Обучить Сеть Классификации. Пример предварительной обработки сохраняет предварительно обработанные хранилища данных обучения и валидации в файл под названием trainingAndValidationDatastores.mat.

Установите значение dataDir переменная как местоположение, где trainingAndValidationDatastores.mat файл расположен. Загрузите хранилища данных обучения и валидации в переменные под названием dsTrainLabeled and dsValLabeled.

dataDir = fullfile(tempdir,"Camelyon16");
load(fullfile(dataDir,"trainingAndValidationDatastores.mat"))

Настройте слоя сети Inception-v3 для передачи обучения

Этот пример использует сеть Inception-v3 [2], сверточная нейронная сеть, которая обучена больше чем на миллионе изображений от базы данных ImageNet [3]. Сеть является 48 слоями глубоко и может классифицировать изображения в 1 000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные.

inceptionv3 (Deep Learning Toolbox) функция возвращает предварительно обученную сеть Inception-v3. Inception-v3 требует Модели Deep Learning Toolbox™ для пакета Сетевой поддержки Inception-v3. Если этот пакет поддержки не установлен, то функция обеспечивает ссылку на загрузку.

net = inceptionv3;
lgraph = layerGraph(net);

Сверточные слои сетевого извлечения отображают функции. Последний learnable слой и итоговый слой классификации классифицируют входное изображение, использующее функции изображений. Эти два слоя содержат информацию о том, как сочетать функции в вероятности класса, значение потерь и предсказанные метки. Чтобы переобучить предварительно обученную сеть, чтобы классифицировать новые изображения, замените эти два слоя на новые слои, адаптированные к новому набору данных. Для получения дополнительной информации смотрите, Обучают Нейронную сеть для глубокого обучения Классифицировать Новые Изображения (Deep Learning Toolbox).

Найдите, что имена этих двух слоев заменяют использование функции помощника findLayersToReplaceЭта функция присоединена к примеру как вспомогательный файл. В Inception-v3 эти два слоя называют 'predictions' и 'ClassificationLayer_predictions'.

[learnableLayer,classLayer] = findLayersToReplace(lgraph);

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

numClasses = 2;
newLearnableLayer = fullyConnectedLayer(numClasses,Name="predictions");
lgraph = replaceLayer(lgraph,learnableLayer.Name,newLearnableLayer);

Создайте новый слой классификации для двух классов. Замените итоговый слой классификации на новый слой.

newClassLayer = classificationLayer(Name="ClassificationLayer_predictions");
lgraph = replaceLayer(lgraph,classLayer.Name,newClassLayer);

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

Обучите сеть с помощью корневого среднеквадратического распространения (RMSProp) оптимизация. Задайте установки гиперпараметров для RMSProp при помощи trainingOptions (Deep Learning Toolbox) функция.

Уменьшайте MaxEpochs к небольшому числу, потому что большая сумма обучающих данных позволяет сети достигнуть сходимости раньше. Задайте MiniBatchSize согласно вашей доступной памяти графического процессора. В то время как большие мини-пакетные размеры могут сделать учебные более быстрые, большие размеры, может уменьшать способность сети сделать вывод. Установите ResetInputNormalization к false предотвратить полное чтение обучающих данных, чтобы вычислить статистику нормализации.

checkpointsDir = fullfile(dataDir,'checkpoints');
if ~exist(checkpointsDir,'dir')
    mkdir(checkpointsDir);
end

options = trainingOptions("rmsprop", ...
    MaxEpochs=1, ...
    MiniBatchSize=256, ...
    Shuffle="every-epoch", ...
    ValidationFrequency=250, ...
    InitialLearnRate=1e-4, ...
    SquaredGradientDecayFactor=0.99, ...
    ResetInputNormalization=false, ...
    ExecutionEnvironment="auto", ...
    Plots="training-progress", ...
    CheckpointPath=checkpointsDir);

Обучите сеть или загрузите предварительно обученную сеть

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

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

Обучайтесь на одном или нескольких графических процессорах при наличии. Используя графический процессор требует Parallel Computing Toolbox™, и CUDA® включил NVIDIA® графический процессор. Для получения дополнительной информации смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox).

doTraining = false;
if doTraining
    options.ValidationData=dsValLabeled;
    trainedNet = trainNetwork(dsTrainLabeled,lgraph,options);
    modelDateTime = string(datetime("now",Format="yyyy-MM-dd-HH-mm-ss"));
    save(dataDir+"trainedCamelyonNet-"+modelDateTime+".mat","trainedNet");

else
    trainedCamelyonNet_url = "https://www.mathworks.com/supportfiles/vision/data/trainedCamelyonNet.mat";
    dataDir = fullfile(tempdir,"Camelyon16");
    downloadTrainedCamelyonNet(trainedCamelyonNet_url,dataDir);
    load(fullfile(dataDir,"trainedCamelyonNet.mat"));
end

Загрузите тестовые данные

Набор тестовых данных Camelyon16 состоит из 130 WSIs. Эти изображения имеют и нормальную ткань и ткань опухоли. Размер каждого файла составляет приблизительно 2 Гбайт.

Чтобы загрузить тестовые данные, перейдите к веб-сайту Camelyon17 и щелкните по первой "ссылке" набора данных CAMELYON16. Откройте директорию "тестирования", затем выполните эти шаги.

  • Загрузите файл "lesion_annotations.zip". Извлеките все файлы к директории, заданной testAnnotationDir переменная.

  • Откройте директорию "изображений". Загрузите файлы на директорию, заданную testImageDir переменная.

testDir = fullfile(dataDir,"testing");
testImageDir = fullfile(testDir,"images");
testAnnotationDir = fullfile(testDir,"lesion_annotations");
if ~exist(testDir,"dir")
    mkdir(testDir);
    mkdir(fullfile(testDir,"images"));
    mkdir(fullfile(testDir,"lesion_annotations"));
end

Предварительно обработайте тестовые данные

Создайте blockedImage Объекты управлять тестовыми изображениями

Получите имена файлов тестовых изображений. Затем создайте массив blockedImage объекты, которые управляют тестовыми изображениями. Каждый blockedImage возразите указывает на соответствующий файл изображения на диске.

testFileSet = matlab.io.datastore.FileSet(testImageDir+filesep+"test*");
testImages = blockedImage(testFileSet);

Установите пространственную ссылку для всех обучающих данных при помощи setSpatialReferencingForCamelyon16 функция помощника. Эта функция присоединена к примеру как вспомогательный файл. setSpatialReferencingForCamelyon16 функционируйте устанавливает WorldStart и WorldEnd свойства каждого blockedImage объект с помощью пространственной информации о ссылке от метаданных файла TIF.

testImages = setSpatialReferencingForCamelyon16(testImages);

Создайте маски ткани

Чтобы обработать данные WSI эффективно, создайте маску ткани для каждого тестового изображения. Этот процесс совпадает с тем, используемым для предварительной обработки нормальных учебных изображений. Для получения дополнительной информации смотрите, Предварительно обрабатывают Изображения Мультиразрешения для того, чтобы Обучить Сеть Классификации.

normalMaskLevel = 8;

testTissueMaskDir = fullfile(testDir,"test_tissue_mask_level"+num2str(normalMaskLevel));

if ~isfolder(testTissueMaskDir)
    testTissueMasks = apply(testImages, @(bs)im2gray(bs.Data)<150, ...
        BlockSize=[512 512], ...
        Level=normalMaskLevel, ...
        UseParallel=canUseGPU, ...
        DisplayWaitbar=false, ...
        OutputLocation=testTissueMaskDir);
    save(fullfile(testTissueMaskDir,"testTissueMasks.mat"),"testTissueMasks")
else
    % Load previously saved data
    load(fullfile(testTissueMaskDir,"testTissueMasks.mat"),"testTissueMasks");
end

Маски ткани имеют только один уровень и малы достаточно, чтобы уместиться в памяти. Отобразите маски ткани в приложении Image Browser с помощью browseBlockedImages функция помощника. Эта функция помощника присоединена к примеру как к вспомогательному файлу.

browseBlockedImages(testTissueMasks,1);

Предварительно обработайте изображения основной истины опухоли

Задайте уровень разрешения масок опухоли.

tumorMaskLevel = 8;

Создайте маску опухоли для каждого изображения опухоли основной истины с помощью createMaskForCamelyon16TumorTissue функция помощника. Эта функция помощника присоединена к примеру как к вспомогательному файлу. Функция выполняет эти операции для каждого изображения:

  • Читайте (x, y) граничные координаты для всех ROI в аннотируемом XML-файле.

  • Разделите граничные координаты для опухоли и нормальных ROI ткани в массивы отдельной ячейки.

  • Преобразуйте массивы ячеек граничных координат к блокированному изображению двоичного файла с помощью polyToBlockedImage функция. В бинарном изображении ROI указывает на пиксели опухоли, и фон указывает на нормальные пиксели ткани. Пиксели, которые являются и в опухоли и в нормальных ROI ткани, классифицируются как фон.

testTumorMaskDir = fullfile(testDir,['test_tumor_mask_level' num2str(tumorMaskLevel)]);
if ~isfolder(testTumorMaskDir)
    testTumorMasks = createMaskForCamelyon16TumorTissue(testImages,testAnnotationDir,testTumorMaskDir,tumorMaskLevel);    
    save(fullfile(testTumorMaskDir,"testTumorMasks.mat"),"testTumorMasks")
else
    load(fullfile(testTumorMaskDir,"testTumorMasks.mat"),"testTumorMasks");
end

Предскажите тепловые карты вероятности опухоли

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

  • Выберите блоки с помощью selectBlockLocations функция. Включайте все блоки, которые имеют по крайней мере один пиксель ткани путем определения InclusionThreshold аргумент значения имени как 0.

  • Пакеты процесса блоков с помощью apply функция с операциями по обработке, заданными predictBlock функция помощника. Функция помощника присоединена к примеру как к вспомогательному файлу. predictBlock вызовы функции помощника predict Функция (Deep Learning Toolbox) на блоке данных и возвращает счет вероятности, что блок является tumor.

  • Запишите данные о тепловой карте в файл TIF с помощью write функция. Окончательный результат после обработки всех блоков является тепловой картой, показывающей вероятность нахождения опухолей по целому WSI.

numTest = numel(testImages);
outputHeatmapsDir = fullfile(testDir,"heatmaps");
networkBlockSize = [299,299,3];
tic
for ind = 1:numTest
    % Check if TIF file already exists
    [~,id] = fileparts(testImages(ind).Source);
    outFile = fullfile(outputHeatmapsDir,id+".tif");
    if ~exist(outFile,"file")
        bls = selectBlockLocations(testImages(ind),Levels=1, ...
            BlockSize=networkBlockSize, ...
            Mask=testTissueMasks(ind),InclusionThreshold=0);
    
        % Resulting heat maps are in-memory blockedImage objects
        bhm = apply(testImages(ind),@(x)predictBlockForCamelyon16(x,trainedNet), ...
            Level=1,BlockLocationSet=bls,BatchSize=128, ...
            PadPartialBlocks=true,DisplayWaitBar=false);
    
        % Write results to a TIF file
        write(bhm,outFile,BlockSize=[512 512]);
    end
end
toc

Соберите все записанные тепловые карты как массив blockedImage объекты.

heatMapFileSet = matlab.io.datastore.FileSet(outputHeatmapsDir,FileExtensions=".tif");
bheatMapImages = blockedImage(heatMapFileSet);

Визуализируйте тепловую карту

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

idx = 27;
figure
tiledlayout(1,2)
nexttile
hBim1 = showCamelyon16TumorAnnotations(testImages(idx),testAnnotationDir);
title("Ground Truth")

На правой стороне рисунка отобразите тепловую карту для тестового изображения.

nexttile
hBim2 = bigimageshow(bheatMapImages(idx),Interpolation="nearest");
colormap(jet)

Соедините оси и увеличение к сфере интересов.

linkaxes([hBim1.Parent,hBim2.Parent])
xlim([53982, 65269])
ylim([122475, 133762])
title("Predicted Heatmap")

Классифицируйте тестовые изображения в определенном пороге

Классифицировать блоки как tumor или normal, примените порог к значениям вероятности тепловой карты.

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

thresh = 0.8;

Классифицируйте блоки на каждый тест, отображают и вычисляют матрицу беспорядка использование apply функция с операциями по обработке, заданными computeBlockConfusionMatrixForCamelyon16 функция помощника. Функция помощника присоединена к примеру как к вспомогательному файлу.

computeBlockConfusionMatrixForCamelyon16 функция помощника выполняет эти операции на каждой тепловой карте:

  • Измените размер и совершенствуйте маску основной истины, чтобы совпадать с размером тепловой карты.

  • Примените порог на тепловую карту.

  • Вычислите матрицу беспорядка для всех блоков на самом прекрасном уровне разрешения. Матрица беспорядка дает количество верного положительного (TP), положительной лжи (FP), истинного отрицания (TN) и предсказаний классификации ложных отрицаний (FN).

  • Сохраните общие количества TP, FP, TN и блоков FN как структура в блокированном изображении. Блокированное изображение возвращено как элемент в массиве блокированных изображений, bcmatrix.

  • Сохраните числовой помеченный образ предсказаний классификации в блокированном изображении. Значения 0, 1, 2, и 3 соответствуют TN, FP, FN и результатам TP, соответственно. Блокированное изображение возвращено как элемент в массиве блокированных изображений, bcmatrixImage.

for ind = 1:numTest
    [bcmatrix(ind),bcmatrixImage{ind}] = apply(bheatMapImages(ind), ...
        @(bs,tumorMask,tissueMask)computeBlockConfusionMatrixForCamelyon16(bs,tumorMask,tissueMask,thresh), ...
        ExtraImages=[testTumorMasks(ind),testTissueMasks(ind)]);    
end

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

cmArray = arrayfun(@(c)gather(c),bcmatrix);
cm = [sum([cmArray.tp]),sum([cmArray.fp]);
    sum([cmArray.fn]),sum([cmArray.tn])];

Отобразите график беспорядка нормированной глобальной матрицы беспорядка. Большинство блоков в изображениях WSI имеет нормальную ткань, приводящую к высокому проценту истинных отрицательных предсказаний.

figure
confusionchart(cm,["Tumor","Normal"],Normalization="total-normalized")

Визуализируйте результаты классификации

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

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

idx = 27;
figure
tiledlayout(1,2)
nexttile
hBim1 = showCamelyon16TumorAnnotations(testImages(idx),testAnnotationDir);
title("Ground Truth")
nexttile
hBim2 = bigimageshow(testImages(idx));
cmColormap = [0 0 0; 0 1 1; 1 1 0; 1 0 0];
showlabels(hBim2,bcmatrixImage{idx}, ...
    Colormap=cmColormap,AlphaData=bcmatrixImage{idx})

title("Classified Blocks")
linkaxes([hBim1.Parent,hBim2.Parent])
xlim([56000 63000])
ylim([125000 132600])

Примечание: Чтобы уменьшать ошибку классификации вокруг периметра опухоли, можно переобучить сеть с меньшим количеством однородных блоков. При предварительной обработке Tumor блоки обучающего набора данных, уменьшайте значение InclusionThreshold аргумент значения имени.

Определите количество сетевого предсказания с кривой AUC-ROC

Вычислите значения кривой ROC в различных порогах при помощи computeROCCurvesForCamelyon16 функция помощника. Эта функция помощника присоединена к примеру как к вспомогательному файлу.

threshs = [1 0.99 0.9:-.1:.1 0.05 0];
[tpr,fpr,ppv] = computeROCCurvesForCamelyon16(bheatMapImages,testTumorMasks,testTissueMasks,threshs);

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

figure
stairs(fpr,tpr,"-");
ROCAUC = trapz(fpr,tpr);
title(["Area Under Curve: " num2str(ROCAUC)]);
xlabel("False Positive Rate")
ylabel("True Positive Rate")

Ссылки

[1] Ehteshami Bejnordi, Babak, Митко Вета, Пол Джоханнс ван Дист, Брэм ван Джиннекен, Нико Карссемейджер, Герт Литьенс, Йерун А. В. М. ван дер Лак, и др. “Диагностическая Оценка Алгоритмов Глубокого обучения для Обнаружения Метастаз Лимфатического узла в Женщинах С Раком молочной железы”. JAMA 318, № 22 (12 декабря 2017): 2199–2210. https://doi.org/10.1001/jama.2017.14585.

[2] Szegedy, христианин, Винсент Вэнхук, Сергей Иоффе, Джонатон Шленс и Збигнев Война. “Заново продумав Архитектуру Начала для Компьютерного зрения”. Предварительно распечатайте, представленный 2 декабря 2015. https://arxiv.org/abs/1512.00567v3.

[3] ImageNet. https://www.image-net.org.

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

| | | | | (Deep Learning Toolbox) | (Deep Learning Toolbox)

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

Больше о