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

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

Пример показывает, как обучить сеть классификации опухолей Inception-v3 и также обеспечивает предварительно обученную сеть Inception-v3. Если вы принимаете решение обучить сеть Inception-v3, использование способного графического процессора NVIDIA™ CUDA с вычисляют возможность 3.0, или выше настоятельно рекомендован. Для использования GPU требуется Parallel Computing Toolbox.

Введение

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

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

WSIs чтения является проблемой, потому что изображения не могут загрузиться в целом в память и поэтому потребовать методов обработки изображений из ядра. Image Processing Toolbox™ bigimage объекты могут сохранить и обработать этот тип большого изображения мультиразрешения. bigimageDatastore объекты могут подготовить учебные закрашенные фигуры от bigimage питаться в нейронную сеть.

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

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

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

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

warningState = warning('off','images:bigimage:singleStripTiff');
c = onCleanup(@()warning(warningState));

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

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

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

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', имеет метаданные, которые не могут быть считаны bigimage объект. Этот пример использует остающиеся 158 учебных файлов.

numNormalFiles = 158;
numTumorFiles = 111; 

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

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

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

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

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

levelSizeInfo = table((1:length(tumorImage.LevelSizes))', ...
    tumorImage.LevelSizes(:,1), ...
    tumorImage.LevelSizes(:,2), ...
    tumorImage.LevelSizes(:,1)./tumorImage.LevelSizes(:,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                 3584         1536           2.3333   
            8                 2048         1024                2   
            9                 1024          512                2   
           10                  512          512                1   
           11                 1577         3629          0.43455   

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

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

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

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

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

h.ResolutionLevel = 1;

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

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

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

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

resolutionLevel = 7;

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

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

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

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

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

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

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

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

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

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

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

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

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

[bigNormalImages,bigNormalMasks] = createBigImageAndMaskArrays(trainNormalDataDir,trainNormalMaskDir);

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

idx = 2;
bigNormalImages(idx).SpatialReferencing(1)
ans = 
  imref2d with properties:

           XWorldLimits: [0 97792]
           YWorldLimits: [0 221184]
              ImageSize: [221184 97792]
    PixelExtentInWorldX: 1
    PixelExtentInWorldY: 1
    ImageExtentInWorldX: 97792
    ImageExtentInWorldY: 221184
       XIntrinsicLimits: [0.5000 9.7793e+04]
       YIntrinsicLimits: [0.5000 2.2118e+05]

bigNormalMasks(idx).SpatialReferencing(1)
ans = 
  imref2d with properties:

           XWorldLimits: [0 97792]
           YWorldLimits: [0 221184]
              ImageSize: [3456 1527]
    PixelExtentInWorldX: 64.0419
    PixelExtentInWorldY: 64
    ImageExtentInWorldX: 97792
    ImageExtentInWorldY: 221184
       XIntrinsicLimits: [0.5000 1.5275e+03]
       YIntrinsicLimits: [0.5000 3.4565e+03]

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

figure
hBigNormal = bigimageshow(bigNormalImages(idx));
hNormalAxes = hBigNormal.Parent;

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

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

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

linkaxes([hNormalAxes,hMaskAxes]);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[bigTumorImages,bigTumorMasks] = createBigImageAndMaskArrays(trainTumorDataDir,trainTumorMaskDir);

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

idx = 5;
bigTumorImages(idx).SpatialReferencing(1)
ans = 
  imref2d with properties:

           XWorldLimits: [0 97792]
           YWorldLimits: [0 219648]
              ImageSize: [219648 97792]
    PixelExtentInWorldX: 1
    PixelExtentInWorldY: 1
    ImageExtentInWorldX: 97792
    ImageExtentInWorldY: 219648
       XIntrinsicLimits: [0.5000 9.7793e+04]
       YIntrinsicLimits: [0.5000 2.1965e+05]

bigTumorMasks(idx).SpatialReferencing(1)
ans = 
  imref2d with properties:

           XWorldLimits: [0 97792]
           YWorldLimits: [0 219648]
              ImageSize: [3432 1527]
    PixelExtentInWorldX: 64.0419
    PixelExtentInWorldY: 64
    ImageExtentInWorldX: 97792
    ImageExtentInWorldY: 219648
       XIntrinsicLimits: [0.5000 1.5275e+03]
       YIntrinsicLimits: [0.5000 3.4325e+03]

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

figure
hBigTumor = bigimageshow(bigTumorImages(idx));
hTumorAxes = hBigTumor.Parent;

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

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

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

linkaxes([hTumorAxes,hMaskAxes]);

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

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

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

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

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

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

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

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

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

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

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

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

blsNormalDataValidation = selectBlockLocations(bigNormalImages(normalValidationIdx), ...
    "BlockSize",patchSize(1:2), ...
    "Masks",bigNormalMasks(normalValidationIdx),"InclusionThreshold",0.75,"ExcludeIncompleteBlocks",true);

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

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

dsNormalData = bigimageDatastore(bigNormalImages(normalTrainIdx), ...
    "BlockLocationSet",blsNormalData);
dsNormalDataValidation = bigimageDatastore(bigNormalImages(normalValidationIdx), ...
    "BlockLocationSet",blsNormalDataValidation);

Предварительный просмотр исправляет от 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

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

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

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

tumorStrideFactor = 4;
blsTumorData = selectBlockLocations(bigTumorImages(tumorTrainIdx), ...
    "BlockSize",patchSize(1:2),"BlockOffsets",patchSize(1:2)*tumorStrideFactor, ...
    "Masks",bigTumorMasks(tumorTrainIdx),"InclusionThreshold",0.75,"ExcludeIncompleteBlocks",true);

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

blsTumorDataValidation = selectBlockLocations(bigTumorImages(tumorValidationIdx), ...
    "BlockSize",patchSize(1:2), ...
    "Masks",bigTumorMasks(tumorValidationIdx),"InclusionThreshold",0.75,"ExcludeIncompleteBlocks",true);

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

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

dsTumorData = bigimageDatastore(bigTumorImages(tumorTrainIdx), ...
    "BlockLocationSet",blsTumorData);
dsTumorDataValidation = bigimageDatastore(bigTumorImages(tumorValidationIdx), ...
    "BlockLocationSet",blsTumorDataValidation);

Предварительный просмотр исправляет от 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 функция с пользовательскими операциями предварительной обработки, заданными помощником, функционирует augmentAndLabel. Эта функция присоединена к примеру как к вспомогательному файлу.

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

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

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

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

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

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

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

dsLabelledNormalData = transform(dsNormalData, ...
    @(x,info)augmentAndLabel(x,info,'normal'),'IncludeInfo',true);
dsLabelledNormalDataValidation = transform(dsNormalDataValidation, ...
    @(x,info)augmentAndLabel(x,info,'normal'),'IncludeInfo',true);

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

dsLabelledTumorData = transform(dsTumorData, ...
    @(x,info)augmentAndLabel(x,info,'tumor'),'IncludeInfo',true);
dsLabelledTumorDataValidation = transform(dsTumorDataValidation, ...
    @(x,info)augmentAndLabel(x,info,'tumor'),'IncludeInfo',true);

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

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

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

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

dsTrain = randomSamplingDatastore(dsLabelledTumorData,dsLabelledNormalData);

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

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

numValidationPatchesPerClass = 5;
dsValidation = validationDatastore(dsLabelledTumorDataValidation, ...
    dsLabelledNormalDataValidation,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]
      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 к небольшому числу, потому что большая сумма обучающих данных позволяет сети достигнуть сходимости раньше. Если вы имеете Parallel Computing Toolbox™ и аппаратные ресурсы, доступные для мультиграфического процессора, или находите что-либо подобное обучению, то ускоряете обучение путем определения ExecutionEnvironment аргумент пары "имя-значение" как 'multi-gpu' или 'parallel', соответственно.

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',dsValidation, ...
    'ExecutionEnvironment','auto', ...
    'Shuffle','every-epoch');

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

Набор тестовых данных 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);

Обучение сети

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

Примечание: Обучение занимает 20 часов на Титане NVIDIA™ X и может взять еще дольше в зависимости от вашего оборудования графического процессора.

doTraining = false;
if doTraining
    trainedNet = trainNetwork(dsTrain,lgraph,options);
    save(['trainedCamelyonNet-' datestr(now, 'dd-mmm-yyyy-HH-MM-SS') '.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
Downloading pretrained Inception-v3 network for Cameylon16 data.
This can take several minutes to download...
Done.

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

Графический процессор настоятельно рекомендован для классификации тестовых изображений (требует Parallel Computing Toolbox™).

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

[bigTestImages,bigTestTissueMasks] = createBigImageAndMaskArrays(testDataDir,testTissueMaskDir);
[~,bigTestTumorMasks] = createBigImageAndMaskArrays(testDataDir,testTumorMaskDir);

Используйте обученную сеть Inception-v3, чтобы идентифицировать закрашенные фигуры опухоли в тестовых изображениях, bigTestImages. Классифицируйте тестовые изображения на основе блока блоком при помощи apply функция с пользовательским конвейером обработки, заданным помощником, функционирует createHeatMap. Эта функция помощника присоединена к примеру как к вспомогательному файлу. Чтобы уменьшать объем требуемого расчета, задайте маску ткани bigTestTissueMask так, чтобы apply функциональные процессы только исправляют, которые содержат ткань. Если у вас есть Parallel Computing Toolbox™ и графический процессор, то можно оценить блоки параллельно путем определения 'UseParallel' аргумент пары "имя-значение" как true.

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

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

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

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

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

patchSize = [299,299,3];

for idx = 1:numTestFiles
    bigTestHeatMaps(idx) = apply(bigTestImages(idx),1,@(x)createHeatMap(x,trainedNet), ...
        'Mask',bigTestTissueMasks(idx),'InclusionThreshold',0, ...
        'BlockSize',patchSize(1:2),'UseParallel',false);
    
    figure
    hBigTest = bigimageshow(bigTestImages(idx));
    hTestAxes = hBigTest.Parent;
    hTestAxes.Visible = 'off';
        
    hMaskAxes = axes;
    hBigMask = bigimageshow(bigTestHeatMaps(idx),'Parent',hMaskAxes, ...
        "Interpolation","nearest","AlphaData",bigTestTissueMasks(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)

Похожие темы