В этом примере показано, как классифицировать мультиразрешение целые изображения понижения (WSIs), который не может уместиться в памяти с помощью глубокой нейронной сети Inception-v3.
Методы глубокого обучения для классификации опухолей используют цифровую патологию, при которой целые слайды ткани отображены и оцифрованы. Получившиеся WSIs имеют высокое разрешение порядка 200,000 100,000 пикселей. WSIs часто хранятся в формате мультиразрешения, чтобы упростить эффективное отображение, навигацию и обработку изображений.
Пример обрисовывает в общих чертах архитектуру, чтобы использовать основанную на блоке обработку, чтобы обучить большой WSIs. Пример обучает основанную на Inception-v3 сеть с помощью методов передачи обучения, чтобы классифицировать отдельные блоки как normal
или tumor
.
Если вы не хотите загружать обучающие данные и обучать сеть, затем продолжаться к разделу Train или Download Network этого примера.
Подготовьтесь данные об обучении и валидации путем следования инструкциям в Предварительно обрабатывают Изображения Мультиразрешения для Учебной Сети Классификации (Image Processing Toolbox). Пример предварительной обработки сохраняет предварительно обработанные хранилища данных обучения и валидации в файл под названием trainingAndValidationDatastores.mat
.
Установите значение dataDir
переменная как местоположение, где trainingAndValidationDatastores.mat
файл расположен. Загрузите хранилища данных обучения и валидации в переменные под названием dsTrainLabeled
and
dsValLabeled
.
dataDir = fullfile(tempdir,"Camelyon16"); load(fullfile(dataDir,"trainingAndValidationDatastores.mat"))
Этот пример использует сеть Inception-v3 [2], сверточная нейронная сеть, которая обучена больше чем на миллионе изображений от базы данных ImageNet [3]. Сеть является 48 слоями глубоко и может классифицировать изображения в 1 000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные.
inceptionv3
функция возвращает предварительно обученную сеть Inception-v3. Inception-v3 требует Модели Deep Learning Toolbox™ для пакета Сетевой поддержки Inception-v3. Если этот пакет поддержки не установлен, то функция обеспечивает ссылку на загрузку.
net = inceptionv3; lgraph = layerGraph(net);
Сверточные слои сетевого извлечения отображают функции. Последний learnable слой и итоговый слой классификации классифицируют входное изображение, использующее функции изображений. Эти два слоя содержат информацию о том, как сочетать функции в вероятности класса, значение потерь и предсказанные метки. Чтобы переобучить предварительно обученную сеть, чтобы классифицировать новые изображения, замените эти два слоя на новые слои, адаптированные к новому набору данных. Для получения дополнительной информации смотрите, Обучают Нейронную сеть для глубокого обучения Классифицировать Новые Изображения.
Найдите, что имена этих двух слоев заменяют использование функции помощника 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
функция.
Уменьшайте 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
функция.
Обучайтесь на одном или нескольких графических процессорах при наличии. Используя графический процессор требует 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
Объекты (Image Processing Toolbox), которые управляют тестовыми изображениями. Каждый blockedImage
возразите указывает на соответствующий файл изображения на диске.
testFileSet = matlab.io.datastore.FileSet(testImageDir+filesep+"test*");
testImages = blockedImage(testFileSet);
Установите пространственную ссылку для всех обучающих данных при помощи setSpatialReferencingForCamelyon16
функция помощника. Эта функция присоединена к примеру как вспомогательный файл. setSpatialReferencingForCamelyon16
функционируйте устанавливает WorldStart
и WorldEnd
свойства каждого blockedImage
объект с помощью пространственной информации о ссылке от метаданных файла TIF.
testImages = setSpatialReferencingForCamelyon16(testImages);
Чтобы обработать данные WSI эффективно, создайте маску ткани для каждого тестового изображения. Этот процесс совпадает с тем, используемым для предварительной обработки нормальных учебных изображений. Для получения дополнительной информации смотрите, Предварительно обрабатывают Изображения Мультиразрешения для Учебной Сети Классификации (Image Processing Toolbox).
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
(Image Processing Toolbox) функция. В бинарном изображении 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
(Image Processing Toolbox) функция. Включайте все блоки, которые имеют по крайней мере один пиксель ткани путем определения InclusionThreshold
аргумент значения имени как 0
.
Пакеты процесса блоков с помощью apply
(Image Processing Toolbox) функция с операциями по обработке, заданными predictBlock
функция помощника. Функция помощника присоединена к примеру как к вспомогательному файлу. predictBlock
вызовы функции помощника predict
функция на блоке данных и возвращает счет вероятности, что блок является tumor
.
Запишите данные о тепловой карте в файл TIF с помощью write
(Image Processing Toolbox) функция. Окончательный результат после обработки всех блоков является тепловой картой, показывающей вероятность нахождения опухолей по целому 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
(Image Processing Toolbox) функция с операциями по обработке, заданными 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
аргумент значения имени.
Вычислите значения кривой 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.
blockedImageDatastore
(Image Processing Toolbox) | blockedImage
(Image Processing Toolbox) | blockLocationSet
(Image Processing Toolbox) | selectBlockLocations
(Image Processing Toolbox) | bigimageshow
(Image Processing Toolbox) | trainingOptions
| trainNetwork