blockedImage
и глубокое обучениеВ этом примере показано, как классифицировать мультиразрешение целые изображения понижения (WSIs), которые не умещаются в памяти с помощью глубокой нейронной сети Inception-v3.
Единственный категорический способ диагностировать рак молочной железы путем исследования выборок ткани, собранных из биопсии или хирургии. Выборки обычно готовятся с гематоксилином и эозином (H&E) окрашивание, чтобы увеличить контраст структур в ткани. Традиционно, патологи исследуют ткань на стеклянных слайдах под микроскопом, чтобы обнаружить ткань опухоли. Диагноз занимает время, когда патологи должны полностью смотреть целое понижение при близком увеличении. Далее, патологи не могут заметить маленькие опухоли. Методы глубокого обучения стремятся автоматизировать обнаружение ткани опухоли, экономя время и улучшая процент раскрытых преступлений маленьких опухолей.
Методы глубокого обучения для классификации опухолей используют цифровую патологию, при которой целые слайды ткани отображены и оцифрованы. Получившиеся WSIs имеют чрезвычайно высокое разрешение. WSIs часто хранятся в файле мультиразрешения, чтобы упростить отображение, навигацию и обработку изображений.
WSIs чтения является проблемой, потому что изображения не могут загрузиться в целом в память и поэтому потребовать методов обработки изображений из ядра. Можно сохранить и обработать этот тип большого изображения мультиразрешения при помощи blockedImage
(Image Processing Toolbox) объекты. Можно извлечь пакеты данных из blockedImage
объекты с помощью blockedImageDatastore
(Image Processing Toolbox) объекты.
В этом примере показано, как обучить нейронную сеть для глубокого обучения классифицировать опухоли на очень большие изображения мультиразрешения с помощью 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
Объект (Image Processing Toolbox).
Создайте 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
(Image Processing Toolbox) функция. Возвратите указатель на bigimageshow
объект. Можно использовать указатель, чтобы настроить отображение. Изображение содержит большой пустой пробел. Ткань занимает только небольшую часть изображения.
h = bigimageshow(tumorImage,'ResolutionLevel',8);
Увеличьте масштаб одной части изображения путем установки горизонтали и вертикальных пространственных степеней относительно самого прекрасного уровня разрешения. Изображение выглядит расплывчатым, потому что этот уровень разрешения очень крупен.
xlim([29471,29763]); ylim([117450,118110]);
Чтобы видеть больше деталей, измените уровень разрешения в более прекрасный уровень.
h.ResolutionLevel = 1;
Можно уменьшать объем расчета путем обработки только видимых областей (ROIs). Используйте маску, чтобы задать ROI. Маска является логическим изображением в который true
пиксели представляют ROI.
Чтобы далее уменьшать объем расчета, создайте маски на крупном уровне разрешения, который может быть обработан полностью в памяти вместо на базисе блока блоком. Если пространственная ссылка крупного уровня разрешения совпадает с пространственной ссылкой более прекрасных уровней разрешения, то местоположения на крупном уровне соответствуют местоположениям на более прекрасных уровнях. В этом случае можно использовать крупную маску, чтобы выбрать который блоки к процессу на более прекрасных уровнях. Для получения дополнительной информации смотрите Настроенную Пространственную Ссылку для Блокированных Изображений (Image Processing Toolbox) и Процесс Блокированные Изображения Эффективно Используя Маску (Image Processing Toolbox).
Задайте уровень разрешения, чтобы использовать для создания маски. Этот пример использует уровень 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
(Image Processing Toolbox) объекты).
Для каждого блока изображений используйте данные о многоугольнике, чтобы создать маску для соответствующего блока. Изображения с областями опухоли могут содержать некоторые нормальные области в них. Используйте аннотации нормальной ткани, чтобы исключить те области.
Создайте выход логическая маска 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
(Image Processing Toolbox). Этот datastore читает закрашенные фигуры blockedImage
данные на одном уровне разрешения.
Цветная неустойчивость и неустойчивость класса в необработанных учебных закрашенных фигурах могут потенциально сместить сеть. Цветная неустойчивость следует из неоднородного цветного окрашивания ткани. Неустойчивость класса следует из неравной суммы опухоли и нормальной ткани в данных. Чтобы откорректировать эту неустойчивость, можно предварительно обработать и увеличить datastore.
В этом примере показано, как создать blockedImageDatastore
это извлекает опухоль и нормальные закрашенные фигуры для того, чтобы обучить сеть. Пример также показывает, как предварительно обработать и увеличить хранилища данных, чтобы не смещать сеть.
Случайным образом разделите нормальные изображения и соответствующие маски в два набора. Набор валидации содержит два случайным образом выбранных изображения и соответствующие маски. Набор обучающих данных содержит остающиеся изображения и маски.
normalValnIdx = randi(numNormalFiles,[1 2]); normalTrainIdx = setdiff(1:numNormalFiles,normalValnIdx);
Размер закрашенной фигуры мал по сравнению с размером функций в изображении. По умолчанию, blockedImageDatastore
извлечения исправляют без перекрытия и никакого разрыва, который генерирует огромное количество учебных закрашенных фигур. Можно уменьшать сумму обучающих данных путем определения подмножества закрашенных фигур. Задайте координаты закрашенных фигур с помощью selectBlockLocations
(Image Processing Toolbox) функция. Добавьте разрыв между произведенными учебными закрашенными фигурами с помощью 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")
Случайным образом разделите изображения опухоли и соответствующие маски в два набора. Набор валидации содержит два случайным образом выбранных изображения и соответствующие маски. Набор обучающих данных содержит остающиеся изображения и маски.
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
(Image Processing Toolbox) функция. Колебание цвета варьируется цвет каждой закрашенной фигуры путем беспокойства контрастности изображений, оттенка, насыщения и яркости. Колебание цвета выполняется в 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, сверточная нейронная сеть, которая обучена больше чем на миллионе изображений от базы данных ImageNet [3]. Сеть является 48 слоями глубоко и может классифицировать изображения в 1 000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные. Сеть ожидает входной размер изображений 299 299 с 3 каналами.
inceptionv3
функция возвращает предварительно обученную сеть Inception-v3. Inception-v3 требует Модели Deep Learning Toolbox™ для пакета Сетевой поддержки Inception-v3. Если этот пакет поддержки не установлен, то функция обеспечивает ссылку на загрузку.
net = inceptionv3;
Сверточные слои сетевого извлечения отображают функции что последний learnable слой и итоговое использование слоя классификации, чтобы классифицировать входное изображение. Эти два слоя содержат информацию о том, как сочетать функции, которые сеть извлекает в вероятности класса, значение потерь и предсказанные метки. Чтобы переобучить предварительно обученную сеть, чтобы классифицировать новые изображения, замените эти два слоя на новые слои, адаптированные к новому набору данных. Для получения дополнительной информации смотрите, Обучают Нейронную сеть для глубокого обучения Классифицировать Новые Изображения.
Извлеките график слоев из обучившего сеть.
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
функция. Уменьшайте 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
функция.
Обучайтесь на графическом процессоре, если вы доступны. Используя графический процессор требует 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
(Image Processing Toolbox) функция с пользовательским конвейером обработки, заданным помощником, функционирует tumorProbabilityHeatMap
. Эта функция помощника присоединена к примеру как к вспомогательному файлу. Чтобы уменьшать объем требуемого расчета, задайте маску ткани testTissueMask
так, чтобы apply
функциональные процессы только исправляют, которые содержат ткань. Задайте 'UseParallel'
аргумент пары "имя-значение" как как булевская переменная, возвращенная canUseGPU
. Если поддерживаемый графический процессор доступен для расчета, то apply
функция оценивает блоки параллельно.
tumorProbabilityHeatMap
функция выполняет эти операции на каждом блоке ткани:
Вычислите счет вероятности опухоли при помощи predict
функция.
Создайте закрашенную фигуру тепловой карты изображений с пиксельными значениями, равными счету вероятности опухоли.
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.
trainingOptions
| trainNetwork
| transform
| bigimageshow
(Image Processing Toolbox) | blockedImage
(Image Processing Toolbox) | blockedImageDatastore
(Image Processing Toolbox) | blockLocationSet
(Image Processing Toolbox) | selectBlockLocations
(Image Processing Toolbox)