Main Content

Extraer muestras de entrenamiento de Big Image

En este ejemplo se muestra cómo crear muestras de entrenamiento a partir de imágenes grandes etiquetadas mediante un archivo .bigimageDatastore

En este ejemplo se crean almacenes de datos que extraen parches tumorales, normales y de fondo a partir de imágenes etiquetadas. Estos almacenes de datos se pueden usar para entrenar, validar o probar una red neuronal. Los bloques individuales extraídos de los almacenes de datos se pueden escribir en el disco para su uso posterior.

Cree un archivo .bigimage Este ejemplo utiliza una versión modificada de la imagen "tumor_091.tif" del archivo .Conjunto de datos CAMELYON16 La imagen original es una imagen de entrenamiento de un ganglio linfático que contiene tejido tumoral. La imagen original tiene ocho niveles de resolución, y el nivel más alto tiene resolución 53760-por-61440. La imagen modificada tiene solo tres niveles de resolución gruesa. La referencia espacial de la imagen modificada se ha ajustado para aplicar una relación de aspecto coherente y registrar entidades en cada nivel.

bim = bigimage('tumor_091R.tif'); 

Datos de etiquetas de ROI

Los datos de etiqueta de una imagen se pueden especificar de diferentes maneras. El conjunto de datos Camelyon16 proporciona etiquetas de regiones tumorales y normales como un conjunto de coordenadas que especifican los límites de región anotados manualmente. Las coordenadas se especifican con respecto a la imagen de nivel de resolución más fina. Cuando existen píxeles dentro de los límites de una región normal y una región tumoral, la etiqueta correcta para esos píxeles es tejido normal.

Cargue los datos de etiqueta para la imagen grande. En este ejemplo se utiliza una versión modificada de las etiquetas de la imagen "tumor_091.tif" de la imagen .Conjunto de datos CAMELYON16 Las etiquetas originales se almacenan en . Formato XML. Las etiquetas modificadas se vuelven a muestrear y guardar como . Archivos MAT.

roiPoints = load('labelledROIs.mat') 
 roiPoints =     struct with fields:         cancerRegions: {1×6 cell}     nonCancerRegions: {[46×2 double]}  

Cree objetos de ROI a partir de las coordenadas de los límites.

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

Especificar datos de etiquetas mediante objetos de ROI

Muestre la imagen superpuesta con los ROI anotados. Las coordenadas de los ROI están en el mismo sistema de coordenadas que la imagen, por lo que cambiar los niveles de resolución de la imagen mostrada sigue representando los ROI con precisión.

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 

Acérquese a un ROI.

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

Especificar datos de etiqueta como máscaras

Otra forma de especificar etiquetas es mediante máscaras. Cree una máscara en el nivel de resolución más grueso para la región manchada, que incluye tanto el tumor como el tejido normal. La máscara es para píxeles cuyo valor de escala de grises es inferior a 130.true Limpie la máscara con una llamada abwmorph

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

Combine la información de los objetos de ROI y las representaciones de máscaras para generar máscaras individuales de baja resolución para tres clases: fondo, tejido normal y tejido tumoral.

Obtenga la referencia espacial y la extensión de píxel de la imagen grande en el nivel de resolución más grueso.

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

Cree una escritura para almacenar cada máscara.bigimage Especifique un tamaño de bloque que sea lo suficientemente grande como para utilizar la memoria de forma eficaz.

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

Recorre cada salida, un bloque a la vez.bigimage Determine la etiqueta de cada bloque y, a continuación, establezca los datos de píxeles del bloque en consecuencia.

Si tiene Parallel Computing Toolbox™, puede reemplazar la instrucción con una instrucción para ejecutar el bucle en paralelo.forparfor

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 

Muestre las máscaras.

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') 

Acérquese a una región de interés.

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

Guardar máscaras para su uso más tarde

Para la mayoría de los conjuntos de datos, estas máscaras se pueden crear una vez por adelantado y, a continuación, reutilizarse para varias sesiones de entrenamiento. Estas máscaras están actualmente respaldadas por archivos temporales que no existen en matlabs® sesiones de MATLAB.

Escríbalos en una ubicación persistente.

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); 

En una nueva sesión de MATLAB, puede volver a cargar las máscaras creando nuevos .bigimage.

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

Visualizar bloques de candidatos potenciales

Puede utilizar máscaras con para extraer bloques de imagen solo donde se encuentra la máscara.bigimageDatastoretrue Si un bloque de máscara es , el almacén de datos lee todo el bloque de imagen.true Sin embargo, declarar un bloque de máscara como ambiguo porque cada bloque de la máscara puede contener una mezcla de (ROI) y (fondo) píxeles.truetruefalse La propiedad de quita la ambiguedad especificando el porcentaje mínimo de píxeles para el bloque de máscara que se va a tener en cuenta.InclusionThresholdbigimageDatastoretruetrue

Muestre la máscara del tejido tumoral sobre la imagen. Resalte los bloques dentro del ROI con el color verde. De forma predeterminada, el umbral de inclusión es , por lo que un bloque de máscara solo se considera si tiene un mínimo de 50% de píxeles.0.5truetrue

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

Para aumentar el número de bloques incluidos, disminuya el umbral de inclusión.

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

CrearbigimageDatastore

Cree un archivo que extraiga parches de regiones tumorales en el nivel de resolución más fino.bigimageDatastore Las regiones tumorales son escasas, así que usa un pequeño umbral de inclusión. En este ejemplo, el almacén de datos devuelve bloques que contienen al menos un 10% de píxeles tumorales.

También puede generar más parches sobremuestreando regiones tumorales. Para sobremuestrear, especifique la propiedad como un vector [numrows numcols] menor que el tamaño del bloque.BlockOffsets

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

Cree un archivo que extraiga parches de regiones normales en el nivel de resolución más fino.bigimageDatastore Se utiliza para determinar un umbral de inclusión adecuado para el tejido normal.showmask

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

El tejido normal es más frecuente que el tejido tumoral. El umbral de inclusión predeterminado producirá muestras suficientes de tejido normal. El sobremuestreo no es necesario, así que mantenga el valor predeterminado de .BlockOffsets

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

Cree un que extraiga parches del fondo en el nivel de resolución más fino.bigimageDatastore El fondo cubre una gran parte de la imagen, así que seleccione solo los parches que consistan enteramente en píxeles de fondo.

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

Leer parches de entrenamiento debigimageDatastore

De forma predeterminada, un lee un parche a la vez.bigimageDatastore Puede aumentar el número de revisiones devueltas en cada llamada a la función especificando la propiedad.readReadSize

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

Visualice un lote de datos leídos de cada uno de los almacenes de datos. Observe que los parches de tejido normal parecen provenir de bloques adyacentes, como se esperaba del valor predeterminado de la propiedad.BlockOffsets Del mismo modo, los parches del tejido tumoral tienen cierta superposición de contenido de imagen, como se esperaba porque el desplazamiento del bloque es menor que el tamaño del bloque.

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'); 

Consulte también

| |

Temas relacionados