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

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

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

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

Загрузите набор данных Camelyon16

Этот пример использует WSIs от проблемы Camelyon16 [1]. Данные из этой проблемы содержат в общей сложности 400 WSIs лимфатических узлов из двух независимых источников, разделенных на 270 учебных изображений и 130 тестовых изображений. WSIs хранятся как файлы TIF в разделенном формате с 11-уровневой структурой пирамиды.

Обучающий набор данных состоит из 159 WSIs нормальных лимфатических узлов и 111 WSIs лимфатических узлов с опухолью и здоровой ткани. Координаты основной истины контуров повреждения сопровождают изображения опухоли.

Задайте dataDir как целевое местоположение данных. Размер набора данных составляет приблизительно 451 Гбайт.

dataDir = fullfile(tempdir,"Camelyon16");

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

Откройте "учебную" директорию, затем выполните эти шаги:

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

  2. Откройте "нормальную" директорию. Загрузите изображения на директорию, заданную trainNormalDir переменная.

  3. Откройте директорию "опухоли". Загрузите изображения на директорию, заданную trainTumorDir переменная.

trainingDir = fullfile(dataDir,"training");
trainNormalDir = fullfile(trainingDir,"normal");
trainTumorDir = fullfile(trainingDir,"tumor");
trainAnnotationDir = fullfile(trainingDir,"lesion_annotations");
if ~exist(dataDir,"dir")
    mkdir(trainingDir)
    mkdir(trainNormalDir)
    mkdir(trainTumorDir)
    mkdir(trainAnnotationDir)
end

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

Получите имена файлов нормального и изображений обучения опухоли.

normalFileSet = matlab.io.datastore.FileSet(fullfile(trainNormalDir,"normal*"));
normalFilenames = normalFileSet.FileInfo.Filename;
tumorFileSet = matlab.io.datastore.FileSet(fullfile(trainTumorDir,"tumor*"));
tumorFilenames = tumorFileSet.FileInfo.Filename;

Одно из учебных изображений нормальной ткани, "normal_144.tif", пропускает важные метаданные, требуемые вывести физические степени изображения. Исключите этот файл.

normalFilenames(contains(normalFilenames,"normal_144")) = [];

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

normalImages = blockedImage(normalFilenames);
tumorImages = blockedImage(tumorFilenames);

Отобразите изображения WSI

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

browseBlockedImages(normalImages,8)

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

idxSampleTumorImage = 10;
tumorImage = tumorImages(idxSampleTumorImage);
h = bigimageshow(tumorImage);
title("Resolution Level: "+h.ResolutionLevel)

Увеличьте масштаб к сфере интересов. Уровень разрешения автоматически увеличивается, чтобы показать больше детали.

xlim([33600, 35000])
ylim([104600, 106000])
title("Resolution Level: "+h.ResolutionLevel)

Выровняйте пространственные степени

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

Смотрите размерности демонстрационного изображения опухоли на каждом уровне разрешения. Уровень 1 имеет большинство пикселей и является самым прекрасным уровнем разрешения. Уровень 10 имеет наименьшее количество пикселей и является самым грубым уровнем разрешения. Соотношение сторон не сопоставимо, который обычно указывает, что уровни не охватывают ту же мировую область.

levelSizeInfo = table((1:length(tumorImage.Size))', ...
    tumorImage.Size(:,1), ...
    tumorImage.Size(:,2), ...
    tumorImage.Size(:,1)./tumorImage.Size(:,2), ...
    VariableNames=["Resolution Level" "Image Width" "Image Height" "Aspect Ratio"]);
disp(levelSizeInfo)
    Resolution Level    Image Width    Image Height    Aspect Ratio
    ________________    ___________    ____________    ____________

            1           2.1555e+05        97792           2.2042   
            2           1.0803e+05        49152           2.1979   
            3                54272        24576           2.2083   
            4                27136        12288           2.2083   
            5                13824         6144             2.25   
            6                 7168         3072           2.3333   
            7                 1577         3629          0.43455   
            8                 3584         1536           2.3333   
            9                 2048         1024                2   
           10                 1024          512                2   
           11                  512          512                1   

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

normalImages = setSpatialReferencingForCamelyon16(normalImages);
tumorImages = setSpatialReferencingForCamelyon16(tumorImages);

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

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

Рассмотрите эти два фактора при выборе уровня маски:

  • Размер изображения на выбранном уровне маски. Чтобы обработать маски более быстро, используйте более низкий уровень разрешения.

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

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

normalMaskLevel = 8;

Фон однородно легок. Можно сегментировать ткань посредством простой операции пороговой обработки. Примените порог мудрым блоком способом ко всем нормальным учебным изображениям с помощью apply функция. Сохраните результаты на диск путем определения OutputLocation аргумент значения имени.

trainNormalMaskDir = fullfile(trainingDir,"normal_mask_level"+num2str(normalMaskLevel));
if ~isfolder(trainNormalMaskDir)
    mkdir(trainNormalMaskDir)
    normalMasks = apply(normalImages, @(bs)imclose(im2gray(bs.Data)<150, ones(5)), ...
        BlockSize=[512 512],...
        Level=normalMaskLevel, ...
        UseParallel=canUseGPU, ...
        OutputLocation=trainNormalMaskDir);
    save(fullfile(trainNormalMaskDir,"normalMasks.mat"),"normalMasks")
else
    load(fullfile(trainNormalMaskDir,"normalMasks.mat"),"normalMasks");
end

Отобразите маски ткани

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

browseBlockedImages(normalMasks,1)

На основе обзора выберите один blockedImage далее оценить точность маски ткани. Отобразите blockedImage использование bigimageshow функция. Отобразите маску как наложение на blockedImage использование showlabels функция. Установите прозрачность каждого пикселя с помощью AlphaData аргумент значения имени. Для пикселей в ROI метки полностью прозрачны. Для пикселей вне ROI метка частично прозрачна и появляется с зеленым оттенком.

idxSampleNormalImage = 42;
normalImage = normalImages(idxSampleNormalImage);
normalMask = normalMasks(idxSampleNormalImage);

hNormal = bigimageshow(normalImage);
showlabels(hNormal,normalMask,AlphaData=normalMask,Alphamap=[0.3 0])
title("Tissue; Background Has Green Tint")

Увеличьте масштаб, чтобы смотреть сферу интересов.

xlim([47540 62563])
ylim([140557 155581])

Создайте маски опухоли

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

Отобразите контуры опухоли

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

idxSampleTumorImage = 64;
tumorImage = tumorImages(idxSampleTumorImage);
showCamelyon16TumorAnnotations(tumorImage,trainAnnotationDir);
xlim([77810 83602])
ylim([139971 145763])

Преобразуйте координаты многоугольника в бинарные блокированные изображения

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

tumorMaskLevel = 8;

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

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

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

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

trainTumorMaskDir = fullfile(trainingDir,"tumor_mask_level"+num2str(tumorMaskLevel));
if ~isfolder(trainTumorMaskDir)
    mkdir(trainTumorMaskDir)
    tumorMasks = createMaskForCamelyon16TumorTissue(tumorImages,trainAnnotationDir,trainTumorMaskDir,tumorMaskLevel);
    save(fullfile(trainTumorMaskDir,"tumorMasks.mat"),"tumorMasks")
else
    load(fullfile(trainTumorMaskDir,"tumorMasks.mat"),"tumorMasks");
end

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

browseBlockedImages(tumorMasks,1)

Подтвердите точность маски к контурам ROI

Выберите демонстрационное изображение опухоли, которое имеет сложные области, и отобразите blockedImage использование bigimageshow функция. Отобразите маску как наложение на blockedImage использование showlabels функция. Установите прозрачность каждого пикселя с помощью AlphaData аргумент значения имени. Для пикселей в ROI метки полностью прозрачны. Для пикселей вне ROI метка частично прозрачна и появляется с зеленым оттенком.

idxSampleTumorImage = 64;
tumorImage = tumorImages(idxSampleTumorImage);
tumorMask = tumorMasks(idxSampleTumorImage);
hTumor = bigimageshow(tumorImage);
showlabels(hTumor,tumorMask,AlphaData=tumorMask,Alphamap=[0.3 0]);
title("Tumor; Background Has Green Tint")
xlim([77810 83602])
ylim([139971 145763])

Выберите Blocks For Training

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

trainingLevel = 1;

Задайте размер блока, чтобы совпадать с входным размером сети. Этот пример использует размер блока, подходящий для сети Inception-v3.

networkBlockSize = [299 299 3];

Создайте наборы нормальных и блоков опухоли с помощью selectBlockLocations функция. Эта функция выбирает блоки, которые являются в определенной площади маски. Можно совершенствовать количество выбранных блоков для каждого класса путем определения BlockOffsets и InclusionThreshold аргументы name-value. Рассмотрите эти два фактора при вызове selectBlockLocations функция.

  • Сумма обучающих данных. Используя как можно большее количество обучающих данных помогает обобщить сеть во время обучения и гарантирует хороший баланс представления класса в выбранном наборе блока. Увеличьте число выбранных блоков путем уменьшения BlockOffsets и InclusionThreshold аргументы name-value.

  • Оборудование и время, доступное, чтобы обучаться. Используя большее количество блоков требует большего количества учебного времени или более мощного оборудования. Сократите число выбранных блоков путем увеличения BlockOffsets и InclusionThreshold аргументы name-value.

Выберите блоки в нормальных изображениях с помощью масок ткани. Этот пример задает значения BlockOffsets и InclusionThreshold тот результат в относительно небольшом количестве блоков.

normalOffsetFactor = 3.5;
normalInclusionThreshold = 0.97;
blsNormalData = selectBlockLocations(normalImages, ...
    BlockSize=networkBlockSize(1:2), ...
    BlockOffsets=round(networkBlockSize(1:2)*normalOffsetFactor), ...
    Levels=trainingLevel, ...
    Masks=normalMasks, ...
    InclusionThreshold=normalInclusionThreshold, ...
    ExcludeIncompleteBlocks=true, ...
    UseParallel=canUseGPU);
disp(blsNormalData)
  blockLocationSet with properties:

    ImageNumber: [190577×1 double]
    BlockOrigin: [190577×3 double]
      BlockSize: [299 299 3]
         Levels: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 … ]

Выберите блоки в изображениях опухоли с помощью масок опухоли. Этот пример задает значения BlockOffsets и InclusionThreshold тот результат в относительно небольшом количестве блоков.

tumorOffsetFactor = 1;
tumorInclusionThreshold = 0.90;
blsTumorData = selectBlockLocations(tumorImages, ...
    BlockSize=networkBlockSize(1:2), ...
    BlockOffsets=round(networkBlockSize(1:2)*tumorOffsetFactor), ...
    Levels=trainingLevel, ...
    Masks=tumorMasks, ...
    InclusionThreshold=tumorInclusionThreshold, ...
    ExcludeIncompleteBlocks=true, ...
    UseParallel=canUseGPU);
disp(blsTumorData)
  blockLocationSet with properties:

    ImageNumber: [181679×1 double]
    BlockOrigin: [181679×3 double]
      BlockSize: [299 299 3]
         Levels: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 … ]

Создайте блокированные хранилища данных изображений для обучения и валидации

Создайте один blockedImageDatastore объект путем объединения наборов нормальных и блоков опухоли.

allImages = [normalImages,tumorImages];
blsAll = blockLocationSet( ...
    [blsNormalData.ImageNumber; blsTumorData.ImageNumber + numel(normalImages)],...
    [blsNormalData.BlockOrigin; blsTumorData.BlockOrigin],...
    networkBlockSize,trainingLevel);
dsAllBlocks = blockedImageDatastore(allImages,BlockLocationSet=blsAll);

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

dsAllBlocks = shuffle(dsAllBlocks);

Разделите блоки в наборы данных обучения и валидации. Выделите 99% блоков для обучения и используйте остающийся 1% для валидации.

numericBlockLabels = [zeros(size(blsNormalData.ImageNumber)); ones(size(blsTumorData.ImageNumber))];
blockLabels = categorical(numericBlockLabels,[0,1],["normal","tumor"]);
idx  = splitlabels(blockLabels,0.99,"randomized");
dsTrain = subset(dsAllBlocks,idx{1});
dsVal = subset(dsAllBlocks,idx{2});

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

numericImageLabels = [zeros(size(normalImages)),ones(size(tumorImages))];
imageLabels = categorical(numericImageLabels,[0,1],["normal","tumor"]);

Преобразуйте blockedImageDatastore таким образом, что datastore возвращает оба блока и соответствующие метки с помощью transform функционируйте и labelCamelyon16Blocks функция помощника. Функция помощника присоединена к примеру как к вспомогательному файлу.

labelCamelyon16Blocks функция помощника выводит метку блока из индекса изображений, который хранится в ImageNumber поле метаданных блока. Функция помощника возвращает данные о блоке и метку как двухэлементный массив ячеек, подходящий для того, чтобы обучить сеть классификации.

dsTrainLabeled = transform(dsTrain, ...
    @(block,blockInfo) labelCamelyon16Blocks(block,blockInfo,imageLabels),IncludeInfo=true);
dsValLabeled = transform(dsVal, ...
    @(block,blockInfo) labelCamelyon16Blocks(block,blockInfo,imageLabels),IncludeInfo=true);

Увеличьте обучающие данные

Увеличьте обучающие данные с помощью transform функционируйте и augmentBlocksReflectionRotation функция помощника. Функция помощника присоединена к примеру как к вспомогательному файлу.

augmentBlocksReflectionRotation функция помощника увеличивает размер обучающих данных путем создания трех изменений каждого входного блока с отражениями и 90 вращениями степени.

dsTrainLabeled = transform(dsTrainLabeled,@augmentBlocksReflectionRotation);

Предварительно просмотрите пакет обучающих данных.

batch = preview(dsTrainLabeled);
montage(batch(:,1),BorderSize=5,Size=[1 4])

Можно улучшить способность сети сделать вывод к другим данным путем выполнения дополнительных рандомизированных операций увеличения. Например, окрасьте нормализацию, общий метод увеличения для изображений WSI. Нормализация окраски уменьшает изменчивость в цвете и интенсивность, существующую в запятнанных изображениях из других источников [4].

Сохраните хранилища данных обучения и валидации на диск.

save(fullfile(dataDir,"trainingAndValidationDatastores.mat"),"dsTrainLabeled","dsValLabeled");

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

Ссылки

[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.

[4] Маценко, Марк, Марк Нитэммер, Дж. С. Маррон, Дэвид Борлэнд, Джон Т. Вусли, Сяоцзюнь Гуань, Чарльз Шмитт и Нэнси Э. Томас. “Метод для Нормализации Слайдов Гистологии для Количественного анализа”. В 2 009 IEEE Международный Симпозиум по Биомедицинской Обработке изображений: От Нано до Макроса, 1107–10, 2009. https://doi.org/10.1109/ISBI.2009.5193250.

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

| | | | |

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

Больше о