Извлеките учебные выборки из большого изображения

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

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

Создайте bigimage. Это примеры использует модифицированную версию изображения "tumor_091.tif" от набора данных CAMELYON16. Оригинальное изображение является учебным изображением лимфатического узла, содержащего ткань опухоли. Оригинальное изображение имеет восемь уровней разрешения, и самый прекрасный уровень имеет разрешение 53760 61440. Модифицированное изображение имеет только три крупных уровня разрешения. Пространственная ссылка модифицированного изображения была настроена, чтобы осуществить сопоставимое соотношение сторон и указать функции на каждом уровне.

bim = bigimage('tumor_091R.tif');

ROI маркирует Data

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

Загрузите данные о метке для большого изображения. Это примеры использует модифицированную версию меток изображения "tumor_091.tif" от набора данных CAMELYON16. Исходные метки хранятся в.XML формате. Модифицированные метки передискретизируются и сохранены как.MAT файлы.

roiPoints = load('labelledROIs.mat')
roiPoints = 

  struct with fields:

       cancerRegions: {1×6 cell}
    nonCancerRegions: {[46×2 double]}

Создайте объекты ROI из координат контуров.

tumorPolys = cellfun(@(position) images.roi.Polygon('Position',position),...
    roiPoints.cancerRegions);
normalPolys = cellfun(@(position) images.roi.Polygon('Position',position),...
    roiPoints.nonCancerRegions);

Задайте маркируют Data Using ROI Objects

Отобразите изображение, наложенное с аннотируемыми ROI. Координаты ROI находятся в той же системе координат, как изображение, таким образом изменяя уровни разрешения отображенного изображения все еще представляет ROI точно.

figure
h = bigimageshow(bim);
set(tumorPolys,'Visible','on');
set(tumorPolys,'Parent',gca);
set(tumorPolys,'Color','r');
set(normalPolys,'Visible','on');
set(normalPolys,'Parent',gca);
set(normalPolys,'Color','g');

title(['Resolution Level:' num2str(h.ResolutionLevel)]);
snapnow

Увеличьте масштаб к одному ROI.

xlim([3940, 4290])
ylim([2680 3010])
title(['Resolution Level:' num2str(h.ResolutionLevel)]);
snapnow

Задайте маркируют Data как маски

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

tissueMask = apply(bim,bim.CoarsestResolutionLevel,@(im)bwmorph(rgb2gray(im)<130, 'close'));
bigimageshow(tissueMask);

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

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

ref = bim.SpatialReferencing(bim.CoarsestResolutionLevel);
pixelExtent = [ref.PixelExtentInWorldX,ref.PixelExtentInWorldY];

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

blockSize = [512 512];
bmBackground = bigimage(ref,1,'logical','BlockSize',blockSize);
bmNormal = bigimage(ref,1,'logical','BlockSize',blockSize);
bmTumor = bigimage(ref,1,'logical','BlockSize',blockSize);

Цикл посредством каждого выхода bigimage, один блок за один раз. Определите метку каждого блока, затем установите пиксельные данные блока соответственно.

Если у вас есть Parallel Computing Toolbox™, то можно заменить for оператор с parfor оператор, чтобы запустить цикл параллельно.

for cStart = 1:bmBackground.BlockSize(2):ref.ImageSize(2)
    for rStart = 1:bmBackground.BlockSize(1):ref.ImageSize(1)
        % Center of top left pixel of this block in world units
        xyStart = [cStart, rStart].* pixelExtent;

        % Clamp block end edge to end of image
        cEnd = min(cStart + bmBackground.BlockSize(2)-1, ref.ImageSize(2));
        rEnd = min(rStart + bmBackground.BlockSize(1)-1, ref.ImageSize(1));

        % Center of bottom right pixel of this block in world units
        xyEnd = [cEnd, rEnd].* pixelExtent;

        bsize = [rEnd, cEnd] - [rStart, cStart] + 1;

        % Meshgrid in world units for all pixels in this block.
        [xgrid, ygrid] = meshgrid(xyStart(1):ref.PixelExtentInWorldX:xyEnd(1),...
            xyStart(2):ref.PixelExtentInWorldY:xyEnd(2));

        % Start with the tissue mask:
        % 0 is background, 1 is foreground
        tmask = getRegion(tissueMask,1,xyStart,xyEnd);

        % Create the tumor mask
        cmask = false(bsize);
        for ind = 1:numel(roiPoints.cancerRegions)
            vertices = roiPoints.cancerRegions{ind};
            isTumor = inpolygon(xgrid, ygrid,...
                vertices(:,1), vertices(:,2));
            cmask = cmask|isTumor;
        end

        % Carve out the healthy part from this mask
        for ind = 1:numel(roiPoints.nonCancerRegions)
            vertices = roiPoints.nonCancerRegions{ind};
            isHealthy = inpolygon(xgrid,ygrid,...
                vertices(:,1),vertices(:,2));
            cmask = cmask & ~isHealthy;
        end

        % Healthy tissue is 'tissue' and 'not tumor'
        hmask = tmask==1 & cmask==0;
        % Write the blocks out
        setBlock(bmNormal,1,xyStart,hmask);
        setBlock(bmTumor,1,xyStart,cmask==1);

        % Write out the background mask
        bmask = tmask==0;

        % Healthy and tumor tissue are not part of background
        bmask = bmask & ~cmask & ~hmask;
        setBlock(bmBackground, 1, xyStart, bmask);
    end
end

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

subplot(2,2,1)
bigimageshow(bim);
title('Full Image')
subplot(2,2,2)
bigimageshow(bmBackground);
title('Background');
subplot(2,2,3)
bigimageshow(bmNormal);
title('Normal Tissue');
subplot(2,2,4)
bigimageshow(bmTumor);
title('Tumor Tissue')

Увеличьте масштаб к необходимой области.

linkaxes(findall(gcf,'Type','axes'));
xlim([4029,4287]);
ylim([2753,2993]);

Сохраните маски для использования позже

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

Запишите им в персистентное местоположение.

imageDir = 'Camelyon16_maskImage91';
if exist(imageDir,'dir')
    rmdir Camelyon16_maskImage91 s;
end

backgroundDir = fullfile(imageDir,'background');
tumorDir = fullfile(imageDir,'tumor');
normalDir = fullfile(imageDir,'normal');

write(bmBackground,backgroundDir);
write(bmTumor,tumorDir);
write(bmNormal,normalDir);

На новой сессии MATLAB можно перезагрузить маски путем создания нового |bigimage|s.

bmBackground = bigimage(backgroundDir);
bmTumor = bigimage(tumorDir);
bmNormal = bigimage(normalDir);

Визуализируйте потенциальные блоки кандидата

Можно использовать маски с bigimageDatastore извлекать блоки изображений только там, где маской является true. Если блоком маски является true, затем datastore читает целый блок изображений. Однако объявление маски блокируется как true неоднозначно, потому что каждый блок маски может содержать смесь true (ROI) и false (фон) пиксели. InclusionThreshold свойство bigimageDatastore удаляет неоднозначность путем определения минимального процента true пиксели для маски блокируются, чтобы быть рассмотренными true.

Отобразите маску ткани опухоли по изображению. Подсветите блоки в ROI с цветным зеленым. По умолчанию порогом включения является 0.5, таким образом, блок маски рассматривается true только если это имеет минимум 50% true 'pixels'.

blockSize = [256 256];

figure
h = bigimageshow(bim);
showmask(h,bmTumor,'BlockSize',blockSize);
snapnow

Чтобы увеличить число включенных блоков, уменьшите порог включения.

showmask(h,bmTumor,'BlockSize',blockSize,'InclusionThreshold',0.1);

Создайте bigimageDatastore

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

Можно также сгенерировать больше закрашенных фигур путем сверхдискретизации областей опухоли. Чтобы сверхдискретизировать, задайте BlockOffsets свойство как [numrows numcols] вектор, меньший, чем размер блока.

bimdsTumor = bigimageDatastore(bim,1,'BlockSize',blockSize, ...
    'BlockOffsets',[50,50],'Masks',bmTumor,'InclusionThreshold',0.1);

Создайте bigimageDatastore это извлекает закрашенные фигуры из нормальных областей на самом прекрасном уровне разрешения. Используйте showmask определить соответствующий порог включения для нормальной ткани.

figure
h = bigimageshow(bim);
showmask(h,bmNormal,'BlockSize',blockSize);

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

bimdsNormal = bigimageDatastore(bim,1,'BlockSize',blockSize, ...
    'Masks',bmNormal,'InclusionThreshold',0.5);

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

bimdsBackground = bigimageDatastore(bim,1,'BlockSize',blockSize, ...
    'Masks',bmBackground,'InclusionThreshold',1);

Считайте учебные закрашенные фигуры из bigimageDatastore

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

bimdsBackground.ReadSize = 6;
bimdsNormal.ReadSize = 6;
bimdsTumor.ReadSize = 6;

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

figure
subplot(3,1,1)
montage(read(bimdsBackground),'Size',[1 6],'BorderSize',[5 5])
title('Background');

subplot(3,1,2)
montage(read(bimdsNormal),'Size',[1 6],'BorderSize',[5 5])
title('Normal');

subplot(3,1,3)
montage(read(bimdsTumor),'Size',[1 6],'BorderSize', [5 5])
title('Tumor');

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

| |

Похожие темы