Классифицируйте большие изображения мультиразрешения Используя blockedImage и глубокое обучение

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

Единственный категорический способ диагностировать рак молочной железы путем исследования выборок ткани, собранных из биопсии или хирургии. Выборки обычно готовятся с гематоксилином и эозином (H&E) окрашивание, чтобы увеличить контраст структур в ткани. Традиционно, патологи исследуют ткань на стеклянных слайдах под микроскопом, чтобы обнаружить ткань опухоли. Диагноз занимает время, когда патологи должны полностью смотреть целое понижение при близком увеличении. Далее, патологи не могут заметить маленькие опухоли. Методы глубокого обучения стремятся автоматизировать обнаружение ткани опухоли, экономя время и улучшая процент раскрытых преступлений маленьких опухолей.

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

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

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

Загрузите обучающие данные

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

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

Размер каждого учебного файла составляет приблизительно 2 Гбайт. Если вы не хотите загружать обучающий набор данных или обучать сеть, то перейдите непосредственно к Обучению или Загрузке раздел Network в этом примере.

Создайте директорию, чтобы сохранить обучающий набор данных.

trainingImageDir = fullfile(tempdir,'Camelyon16','training');
if ~exist(trainingImageDir,'dir')
    mkdir(trainingImageDir);
    mkdir(fullfile(trainingImageDir,'normal'));
    mkdir(fullfile(trainingImageDir,'tumor'));
    mkdir(fullfile(trainingImageDir,'lesion_annotations'));
end

trainNormalDataDir = fullfile(trainingImageDir,'normal');
trainTumorDataDir = fullfile(trainingImageDir,'tumor');
trainTumorAnnotationDir = fullfile(trainingImageDir,'lesion_annotations');

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

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

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

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

Задайте количество учебных изображений. Обратите внимание на то, что одно из учебных изображений нормальной ткани, 'normal_144.tif', имеет метаданные, которые не могут быть считаны blockedImage объект. Этот пример использует остающиеся 158 учебных файлов.

numNormalFiles = 158;
numTumorFiles = 111;

Визуализируйте обучающие данные

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

Создайте blockedImage объект от изображения обучения опухоли.

tumorFileName = fullfile(trainTumorDataDir,'tumor_001.tif');
tumorImage = blockedImage(tumorFileName);

Смотрите размерности blockedImage на каждом уровне разрешения. Уровень 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"])
levelSizeInfo=11×4 table
    Resolution Level    Image Width    Image Height    Aspect Ratio
    ________________    ___________    ____________    ____________

            1           2.2118e+05        97792           2.2618   
            2           1.1059e+05        49152             2.25   
            3                55296        24576             2.25   
            4                27648        12288             2.25   
            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   

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

h = bigimageshow(tumorImage,'ResolutionLevel',8);

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

xlim([29471,29763]);
ylim([117450,118110]);

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

h.ResolutionLevel = 1;

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

Можно уменьшать объем расчета путем обработки только видимых областей (ROIs). Используйте маску, чтобы задать ROI. Маска является логическим изображением в который true пиксели представляют ROI.

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

Задайте уровень разрешения, чтобы использовать для создания маски. Этот пример использует уровень 7 разрешения, который крупен и умещается в памяти. Обратите внимание на то, что blockedImage возразите автоматически сортирует уровни в изображении мультиразрешения от самого прекрасного до самого грубого на основе количества пикселей на каждом уровне. Несколько файлов изображений Camelyon16 содержат маску промежуточного разрешения. Этот пример игнорирует маску при определении и чтении седьмого уровня данных изображения.

resolutionLevel = 7;

Создайте маски для нормальных изображений

В нормальных изображениях ROI состоит из здоровой ткани. Цвет здоровой ткани отличен от цвета фона, таким образом используйте цветную пороговую обработку, чтобы сегментировать изображение и создать ROI. L*a*b* цветовое пространство обеспечивает лучшее цветоделение для сегментации. Преобразуйте изображение в L*a*b* цветовое пространство, затем порог* канал, чтобы создать маску ткани.

Можно использовать функцию помощника createMaskForNormalTissue создать маски с помощью цветной пороговой обработки. Эта функция помощника присоединена к примеру как к вспомогательному файлу.

Функция помощника выполняет эти операции на каждом учебном изображении нормальной ткани:

  • Создайте blockedImage объект из файла изображения TIF.

  • Установите пространственную ссылку всех уровней разрешения от метаданных изображения.

  • Получите изображение на крупном уровне разрешения.

  • Преобразуйте крупное изображение в L*a*b* цветовое пространство, затем извлеките* канал.

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

  • Создайте одно разрешение blockedImage объект от маски и набора пространственная ссылка маски, чтобы совпадать с пространственной ссылкой входного изображения.

  • Запишите маске blockedImage к памяти. Только blockedImage объект находится в памяти. Отдельные блоки изображений, соответствующие логическому рисунку маски, находятся во временной директории. Запись в директорию сохраняет пользовательскую пространственную ссылку, которая гарантирует, что нормальные изображения и их соответствующие рисунки маски имеют ту же пространственную ссылку.

trainNormalMaskDir = fullfile(trainNormalDataDir,['normal_mask_level' num2str(resolutionLevel)]);
createMaskForNormalTissue(trainNormalDataDir,trainNormalMaskDir,resolutionLevel)

Теперь, когда и нормальные изображения и маски находятся на диске, создают blockedImage объекты управлять данными при помощи помощника функционируют createBlockedImageAndMaskArrays. Эта функция создает массив blockedImage объекты от нормальных изображений и соответствующего массива blockedImage объекты из нормальных рисунков маски. Функция помощника присоединена к примеру как к вспомогательному файлу.

[normalImages,normalMasks] = createBlockedImageAndMaskArrays(trainNormalDataDir,trainNormalMaskDir);

Выберите демонстрационное нормальное изображение и маску. Подтвердите, что пространственные мировые степени маски совпадают со степенями изображения на самом прекрасном уровне разрешения. Пространственные мировые степени заданы WorldStart и WorldEnd свойства.

idx = 2;
[normalImages(idx).WorldStart normalImages(idx).WorldEnd]
ans = 11×6
105 ×

         0         0    0.0000    2.2118    0.9779    0.0000
         0         0    0.0000    2.2118    0.9830    0.0000
         0         0    0.0000    2.2118    0.9830    0.0000
         0         0    0.0000    2.2118    0.9830    0.0000
         0         0    0.0000    2.2118    0.9830    0.0000
         0         0    0.0000    2.2938    0.9830    0.0000
    0.0000    0.0000    0.0000    2.2118    0.9779    0.0000
         0         0    0.0000    2.2938    0.9830    0.0000
         0         0    0.0000    2.6214    1.3107    0.0000
         0         0    0.0000    2.6214    1.3107    0.0000
      ⋮

[normalMasks(idx).WorldStart normalMasks(idx).WorldEnd]
ans = 1×4

           0           0      221184       97792

Проверьте, что маска содержит правильные ROI и пространственную ссылку. Отобразите демонстрационное изображение при помощи bigimageshow функция. Получите оси, содержащие отображение.

figure
hNormal = bigimageshow(normalImages(idx));
hNormalAxes = hNormal.Parent;

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

hMaskAxes = axes;
hMask = bigimageshow(normalMasks(idx),'Parent',hMaskAxes, ...
    'Interpolation','nearest','AlphaData',0.5);
hMaskAxes.Visible = 'off';

Соедините оси изображения с осями маски. Когда вы масштабируете и панорамирование, обе оси обновляются тождественно.

linkaxes([hNormalAxes,hMaskAxes]);

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

xlim([45000 80000]);
ylim([130000 165000]);

Создайте маски для изображений опухоли

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

Можно использовать функцию помощника createMaskForTumorTissue создать маску с помощью ROI. Эта функция помощника присоединена к примеру как к вспомогательному файлу.

Функция помощника выполняет эти операции на каждом учебном изображении ткани опухоли:

  • Создайте blockedImage объект из файла изображения TIF.

  • Установите пространственную ссылку от метаданных изображения.

  • Считайте соответствующие аннотации повреждения в XML-файлах и преобразуйте аннотации в многоугольники (Polygon объекты.

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

  • Создайте выход логическая маска blockedImage объект на более грубом уровне разрешения. Запишите рисунок маски на базисе блока блоком при помощи setBlock функция.

  • Запишите маске blockedImage возразите против директории в памяти. Только blockedImage объект находится в памяти. Отдельные блоки изображений, соответствующие логическому рисунку маски, находятся во временной директории. Запись в директорию сохраняет пользовательскую пространственную ссылку, которая гарантирует, что изображения опухоли и их соответствующие рисунки маски имеют ту же пространственную ссылку.

trainTumorMaskDir = fullfile(trainTumorDataDir,['tumor_mask_level' num2str(resolutionLevel)]);
createMaskForTumorTissue(trainTumorDataDir,trainTumorAnnotationDir, ...
    trainTumorMaskDir,resolutionLevel);

Теперь, когда и изображения опухоли и маски находятся на диске, создают blockedImage объекты управлять данными при помощи помощника функционируют createBlockedImageAndMaskArrays. Эта функция создает массив blockedImage объекты от изображений опухоли и соответствующего массива blockedImage объекты из рисунков маски опухоли. Функция помощника присоединена к примеру как к вспомогательному файлу.

[tumorImages,tumorMasks] = createBlockedImageAndMaskArrays(trainTumorDataDir,trainTumorMaskDir);

Выберите демонстрационное изображение опухоли и маску. Подтвердите, что пространственные мировые степени маски совпадают со степенями изображения на самом прекрасном уровне разрешения. Пространственные мировые степени заданы XWorldLimits и YWorldLimits свойства.

idx = 5;
[tumorImages(idx).WorldStart tumorImages(idx).WorldEnd]
ans = 11×6
105 ×

         0         0    0.0000    2.1965    0.9779    0.0000
         0         0    0.0000    2.2016    0.9830    0.0000
         0         0    0.0000    2.2118    0.9830    0.0000
         0         0    0.0000    2.2118    0.9830    0.0000
         0         0    0.0000    2.2118    0.9830    0.0000
         0         0    0.0000    2.2938    0.9830    0.0000
    0.0000    0.0000    0.0000    2.1965    0.9779    0.0000
         0         0    0.0000    2.2938    0.9830    0.0000
         0         0    0.0000    2.6214    1.3107    0.0000
         0         0    0.0000    2.6214    1.3107    0.0000
      ⋮

[tumorMasks(idx).WorldStart tumorMasks(idx).WorldEnd]
ans = 1×4

           0           0      219648       97792

Проверьте, что маска содержит правильные ROI и пространственную ссылку. Отобразите демонстрационное изображение при помощи bigimageshow функция. Получите оси, содержащие отображение.

figure
hTumor = bigimageshow(tumorImages(idx));
hTumorAxes = hTumor.Parent;

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

hMaskAxes = axes;
hMask = bigimageshow(tumorMasks(idx),'Parent',hMaskAxes, ...
    'Interpolation','nearest','AlphaData',0.5);
hMaskAxes.Visible = 'off';

Соедините оси изображения с осями маски. Когда вы масштабируете и панорамирование, обе оси обновляются тождественно.

linkaxes([hTumorAxes,hMaskAxes]);

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

xlim([45000 65000]);
ylim([130000 150000]);

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

Извлекать закрашенные фигуры обучающих данных от blockedImage объекты, используйте blockedImageDatastore. Этот datastore читает закрашенные фигуры blockedImage данные на одном уровне разрешения.

Цветная неустойчивость и неустойчивость класса в необработанных учебных закрашенных фигурах могут потенциально сместить сеть. Цветная неустойчивость следует из неоднородного цветного окрашивания ткани. Неустойчивость класса следует из неравной суммы опухоли и нормальной ткани в данных. Чтобы откорректировать эту неустойчивость, можно предварительно обработать и увеличить datastore.

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

Выберите Location of Normal Tissue Patches to Read

Случайным образом разделите нормальные изображения и соответствующие маски в два набора. Набор валидации содержит два случайным образом выбранных изображения и соответствующие маски. Набор обучающих данных содержит остающиеся изображения и маски.

normalValnIdx = randi(numNormalFiles,[1 2]);
normalTrainIdx = setdiff(1:numNormalFiles,normalValnIdx);

Размер закрашенной фигуры мал по сравнению с размером функций в изображении. По умолчанию, blockedImageDatastore извлечения исправляют без перекрытия и никакого разрыва, который генерирует огромное количество учебных закрашенных фигур. Можно уменьшать сумму обучающих данных путем определения подмножества закрашенных фигур. Задайте координаты закрашенных фигур с помощью selectBlockLocations функция. Добавьте разрыв между произведенными учебными закрашенными фигурами с помощью BlockOffsets аргумент значения имени. Задайте смещение, которое больше, чем размер закрашенной фигуры. Увеличьте порог включения со значения по умолчанию 0,5 так, чтобы сеть обучалась на относительно однородных закрашенных фигурах.

patchSize = [299,299,3];
normalStrideFactor = 10;
blsNormalData = selectBlockLocations(normalImages(normalTrainIdx), ...
    "BlockSize",patchSize(1:2),"BlockOffsets",patchSize(1:2)*normalStrideFactor, ...
    "Masks",normalMasks(normalTrainIdx),"InclusionThreshold",0.75,"ExcludeIncompleteBlocks",true);

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

blsNormalDataVal = selectBlockLocations(normalImages(normalValnIdx), ...
    "BlockSize",patchSize(1:2), ...
    "Masks",normalMasks(normalValnIdx),"InclusionThreshold",0.75,"ExcludeIncompleteBlocks",true);

Создайте хранилища данных для нормальных изображений

Создайте хранилища данных dsNormalData и dsNormalDataVal то изображение чтения исправляет от нормальных изображений на самом прекрасном уровне разрешения для обучения и валидации, соответственно. Задайте координаты закрашенных фигур с помощью BlockLocationSet аргумент пары "имя-значение".

dsNormalData = blockedImageDatastore(normalImages(normalTrainIdx), ...
    "BlockLocationSet",blsNormalData);
dsNormalDataVal = blockedImageDatastore(normalImages(normalValnIdx), ...
    "BlockLocationSet",blsNormalDataVal);

Предварительный просмотр исправляет от datastore, содержащего нормальные учебные изображения.

imagesToPreview = zeros([patchSize 10],'uint8');
for n = 1:10
    im = read(dsNormalData);
    imagesToPreview(:,:,:,n) = im{1};
end
figure
montage(imagesToPreview,'Size',[2 5],'BorderSize',10,'BackgroundColor','k');

title("Training Patches of Normal Tissue")

Выберите Location of Tumor Tissue Patches to Read

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

tumorValIdx = randi(numTumorFiles,[1 2]);
tumorTrainIdx = setdiff(1:numTumorFiles,tumorValIdx);

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

tumorStrideFactor = 3;
blsTumorData = selectBlockLocations(tumorImages(tumorTrainIdx), ...
    "BlockSize",patchSize(1:2),"BlockOffsets",patchSize(1:2)*tumorStrideFactor, ...
    "Masks",tumorMasks(tumorTrainIdx),"InclusionThreshold",0.75,"ExcludeIncompleteBlocks",true);

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

blsTumorDataVal = selectBlockLocations(tumorImages(tumorValIdx), ...
    "BlockSize",patchSize(1:2), ...
    "Masks",tumorMasks(tumorValIdx),"InclusionThreshold",0.75,"ExcludeIncompleteBlocks",true);

Создайте хранилища данных для изображений опухоли

Создайте blockedImageDatastore от учебных изображений опухоли и масок. Хранилища данных dsTumorData и dsTumorDataVal считайте закрашенные фигуры изображений из изображений опухоли на самом прекрасном уровне разрешения для обучения и валидации, соответственно.

dsTumorData = blockedImageDatastore(tumorImages(tumorTrainIdx), ...
    "BlockLocationSet",blsTumorData);
dsTumorDataVal = blockedImageDatastore(tumorImages(tumorValIdx), ...
    "BlockLocationSet",blsTumorDataVal);

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

imagesToPreview = zeros([patchSize 10],'uint8');
for n = 1:10
    im = read(dsTumorData);
    imagesToPreview(:,:,:,n) = im{1};
end
montage(imagesToPreview,'Size',[2 5],'BorderSize',10,'BackgroundColor','k');
title("Training Patches of Tumor Tissue")

Нормируйте цвета и увеличьте обучающие данные

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

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

augmentAndLabelCamelyon16 функция выполняет эти операции:

  • Нормируйте окрашивание при помощи normalizeStaining.m функция [4]. Нормализация окраски выполняется с помощью метода Маценко, который разделяет цветовые каналы H&E цветной разверткой с помощью фиксированной матрицы и затем воссоздает нормированные изображения с индивидуумом, откорректированным, смешиваясь. Функция возвращает нормированное изображение, а также изображения H&E.

  • Добавьте колебание цвета при помощи jitterColorHSV функция. Колебание цвета варьируется цвет каждой закрашенной фигуры путем беспокойства контрастности изображений, оттенка, насыщения и яркости. Колебание цвета выполняется в HSV-цветовом пространстве, чтобы избежать нежелательных цветных артефактов в изображении RGB.

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

  • Пометьте закрашенную фигуру как 'normal' или 'tumor'.

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

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

dsLabeledNormalData = transform(dsNormalData, ...
    @(x,info)augmentAndLabelCamelyon16(x,info,'normal'),'IncludeInfo',true);
dsLabeledNormalDataVal = transform(dsNormalDataVal, ...
    @(x,info)augmentAndLabelCamelyon16(x,info,'normal'),'IncludeInfo',true);

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

dsLabeledTumorData = transform(dsTumorData, ...
    @(x,info)augmentAndLabelCamelyon16(x,info,'tumor'),'IncludeInfo',true);
dsLabeledTumorDataVal = transform(dsTumorDataVal, ...
    @(x,info)augmentAndLabelCamelyon16(x,info,'tumor'),'IncludeInfo',true);

Сбалансируйте опухоль и нормальные классы

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

Чтобы предотвратить неустойчивость класса, этот пример задает пользовательский datastore, названный randomSamplingDatastore это случайным образом выбирает нормальный и закрашенные фигуры обучения опухоли сбалансированным способом. Скрипт, чтобы задать этот пользовательский datastore присоединен к примеру как к вспомогательному файлу. Для получения дополнительной информации смотрите, Разрабатывают Пользовательский Datastore.

Создайте пользовательский randomSamplingDatastore от нормального и хранилищ данных обучения опухоли. Случайный datastore выборки dsTrain обеспечивает мини-пакеты обучающих данных к сети в каждой итерации эпохи.

dsTrain = randomSamplingDatastore(dsLabeledTumorData,dsLabeledNormalData);

Чтобы ограничить количество закрашенных фигур, используемых во время валидации, этот пример задает пользовательский datastore, названный validationDatastore это возвращает пять закрашенных фигур валидации в каждый класс. Скрипт, чтобы задать этот пользовательский datastore присоединен к примеру как к вспомогательному файлу.

Создайте пользовательский validationDatastore от нормального и хранилищ данных валидации опухоли.

numValidationPatchesPerClass = 5;
dsVal = validationDatastore(dsLabeledTumorDataVal, ...
    dsLabeledNormalDataVal,numValidationPatchesPerClass);

Настройте слоя сети Inception-v3

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

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

net = inceptionv3;

Замените последние слои

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

Извлеките график слоев из обучившего сеть.

lgraph = layerGraph(net);

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

[learnableLayer,classLayer] = findLayersToReplace(lgraph)
learnableLayer = 
  FullyConnectedLayer with properties:

          Name: 'predictions'

   Hyperparameters
     InputSize: 2048
    OutputSize: 1000

   Learnable Parameters
       Weights: [1000×2048 single]
          Bias: [1000×1 single]

  Show all properties

classLayer = 
  ClassificationOutputLayer with properties:

            Name: 'ClassificationLayer_predictions'
         Classes: [1000×1 categorical]
    ClassWeights: 'none'
      OutputSize: 1000

   Hyperparameters
    LossFunction: 'crossentropyex'

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

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 решатель оптимизации. Этот решатель автоматически настраивает скорость обучения и импульс для более быстрой сходимости. Задайте другие установки гиперпараметров при помощи trainingOptions (Deep Learning Toolbox) функция. Уменьшайте MaxEpochs к небольшому числу, потому что большая сумма обучающих данных позволяет сети достигнуть сходимости раньше.

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

options = trainingOptions('rmsprop', ...
    'InitialLearnRate',1e-5, ...
    'SquaredGradientDecayFactor',0.99, ...
    'MaxEpochs',3, ...
    'MiniBatchSize',32, ...
    'Plots','training-progress', ...
    'CheckpointPath',checkpointsDir, ...
    'ValidationData',dsVal, ...
    'ExecutionEnvironment','auto', ...
    'Shuffle','every-epoch');

Обучите или загрузите сеть

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

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

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

doTraining = false;
if doTraining
    trainedNet = trainNetwork(dsTrain,lgraph,options);
    modelDateTime = string(datetime('now','Format',"yyyy-MM-dd-HH-mm-ss"));
    save(strcat("trainedCamelyonNet-",modelDateTime,".mat"),'trainedNet');
else
    trainedCamelyonNet_url = 'https://www.mathworks.com/supportfiles/vision/data/trainedCamelyonNet.mat';
    netDir = fullfile(tempdir,'Camelyon16');
    downloadTrainedCamelyonNet(trainedCamelyonNet_url,netDir);
    load(fullfile(netDir,'trainedCamelyonNet.mat'));
end
Pretrained Inception-v3 network for Cameylon16 data set already exists.

Загрузите и предварительно обработайте тестовые данные

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

Создайте директорию, чтобы сохранить тестовые данные.

testingImageDir = fullfile(tempdir,'Camelyon16','testing');
if ~exist(testingImageDir,'dir')
    mkdir(testingImageDir);
    mkdir(fullfile(testingImageDir,'images'));
    mkdir(fullfile(testingImageDir,'lesion_annotations'));
end

testDataDir = fullfile(testingImageDir,'images');
testTumorAnnotationDir = fullfile(testingImageDir,'lesion_annotations');

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

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

  • Откройте директорию "изображений". Загрузите первые два файла, "test_001.tif" и "test_002.tif". Переместите файлы в директорию, заданную testDataDir переменная.

Задайте количество тестовых изображений.

numTestFiles = 2;

Создайте маски для тестовых изображений

Тестовые изображения содержат соединение изображений опухоли и нормальных. Чтобы уменьшать объем расчета во время классификации, задайте ROI путем создания масок.

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

resolutionLevel = 7;

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

testTissueMaskDir = fullfile(testDataDir,['test_tissuemask_level' num2str(resolutionLevel)]);
createMaskForNormalTissue(testDataDir,testTissueMaskDir,resolutionLevel);

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

testTumorMaskDir = fullfile(testDataDir,['test_tumormask_level' num2str(resolutionLevel)]);
createMaskForTumorTissue(testDataDir,testTumorAnnotationDir,testTumorMaskDir,resolutionLevel);

Классифицируйте тестовые данные и создайте тепловые карты

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

[testImages,testTissueMasks] = createBlockedImageAndMaskArrays(testDataDir,testTissueMaskDir);
[~,testTumorMasks] = createBlockedImageAndMaskArrays(testDataDir,testTumorMaskDir);

Используйте обученную сеть Inception-v3, чтобы идентифицировать закрашенные фигуры опухоли в тестовых изображениях, testImages. Классифицируйте тестовые изображения на базисе блока блоком при помощи apply функция с пользовательским конвейером обработки, заданным помощником, функционирует tumorProbabilityHeatMap. Эта функция помощника присоединена к примеру как к вспомогательному файлу. Чтобы уменьшать объем требуемого расчета, задайте маску ткани testTissueMask так, чтобы apply функциональные процессы только исправляют, которые содержат ткань. Задайте 'UseParallel' аргумент пары "имя-значение" как как булевская переменная, возвращенная canUseGPU. Если поддерживаемый графический процессор доступен для расчета, то apply функция оценивает блоки параллельно.

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

  • Вычислите счет вероятности опухоли при помощи predict (Deep Learning Toolbox) функция.

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

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

Чтобы визуализировать тепловую карту, наложите тепловую карту на оригинальном изображении и установите прозрачность 'AlphaData' свойство как маска ткани. Наложение показывает, как хорошо опухоль локализуется в изображении. Области с высокой вероятностью того, чтобы быть опухолями отображены с красными пикселями. Области с низкой вероятностью того, чтобы быть опухолями отображены как синие пиксели.

outputHeatmapsDir = fullfile(testingImageDir,'heatmaps');
if ~exist(outputHeatmapsDir,'dir')
    mkdir(outputHeatmapsDir);
end

patchSize = [299,299,3];

for idx = 1:numTestFiles
    bls = selectBlockLocations(testImages(idx),'BlockSize',patchSize(1:2),'Mask',testTissueMasks(idx),...
        'InclusionThreshold',0,'Levels',1);
    testHeatMaps(idx) = apply(testImages(idx),@(x)tumorProbabilityHeatMap(x,trainedNet), ...
        'Level',1,'BlockLocationSet',bls,'UseParallel',canUseGPU,'OutputLocation',outputHeatmapsDir);

    figure
    hTest = bigimageshow(testImages(idx));
    hTestAxes = hTest.Parent;
    hTestAxes.Visible = 'off';

    hMaskAxes = axes;
    hMask = bigimageshow(testHeatMaps(idx),'Parent',hMaskAxes, ...
        "Interpolation","nearest","AlphaData",testTissueMasks(idx));
    colormap(jet(255));
    hMaskAxes.Visible = 'off';

    linkaxes([hTestAxes,hMaskAxes]);
    title(['Tumor Heatmap of Test Image ',num2str(idx)]);
end

Ссылки

[1] Эхтешэми Б. Б., и др. "Диагностическая Оценка Алгоритмов Глубокого обучения для Обнаружения Метастаз Лимфатического узла в Женщинах С Раком молочной железы". Журнал американской Медицинской ассоциации. Издание 318, № 22, 2017, стр 2199–2210. doi:10.1001/jama.2017.14585

[2] Szegedy, C., В. Вэнхук, С. Иоффе, Дж. Шленс и З. Уоджна. "Заново продумав архитектуру начала для компьютерного зрения". В продолжениях конференции по IEEE по компьютерному зрению и распознаванию образов, 2818–2826. Лас-Вегас, NV: IEEE, 2016.

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

[4] Маценко, M., и др. "Метод для Нормализации Слайдов Гистологии для Количественного анализа". В 2 009 IEEE Международный Симпозиум по Биомедицинской Обработке изображений: От Нано до Макроса, 1107–1110. Бостон, MA: IEEE, 2009.

[5] xml2struct https://www.mathworks.com/matlabcentral/fileexchange/28518-xml2struct.

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

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте