Предварительно обработайте объемы для глубокого обучения

Считайте объемные данные

Поддерживаемые форматы файлов для объемных данных изображения включают MAT-файлы, Цифровую Обработку изображений и Коммуникации в Медицине (DICOM) файлы и Нейрообработка изображений Технологической Инициативы Информатики (NIfTI) файлы.

Считайте объемные данные изображения в ImageDatastore. Считайте объемные данные о пиксельных метках в PixelLabelDatastore (Computer Vision Toolbox). Для получения дополнительной информации смотрите Хранилища данных для Глубокого обучения.

Таблица показывает типичные использования imageDatastore и pixelLabelDatastore для каждых из поддерживаемых форматов файлов. Когда вы создаете datastore, задаете 'FileExtensions' аргумент как расширения файла ваших данных. Задайте ReadFcn свойство как указатель на функцию, который считывает данные формата файла. filepath аргумент задает путь к файлам или папке, содержащей данные изображения. Поскольку пиксель помечает изображения, дополнительный classNames и pixelLabelID аргументы задают отображение значений метки вокселя к именам классов.

Формат файла изображения

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

MAT

volds = imageDatastore(filepath, ...
   'FileExtensions','.mat','ReadFcn',@(x) fcn(x));

pxds = pixelLabelDatastore(filepath,classNames,pixelLabelID, ...
    'FileExtensions','.mat','ReadFcn',@(x) fcn(x));
fcn пользовательская функция, которая считывает данные из файла MAT. Например, этот код задает функцию под названием matRead это загружает данные об объеме из первой переменной файла MAT. Сохраните функцию в файле под названием matRead.m.

function data = matRead(filename)
    inp = load(filename);
    f = fields(inp);
    data = inp.(f{1});
end

Объем DICOM в одном файле

volds = imageDatastore(filepath, ...
   'FileExtensions','.dcm','ReadFcn',@(x) dicomread(x));

pxds = pixelLabelDatastore(filepath,classNames,pixelLabelID, ...
   'FileExtensions','.dcm','ReadFcn',@(x) dicomread(x));

Для получения дополнительной информации о чтении файлов DICOM, смотрите dicomread (Image Processing Toolbox).

Объем DICOM в нескольких файлах

Выполните эти шаги. Для примера смотрите, Создают Datastore Изображений, Содержащий Один и Многофайловые Объемы DICOM (Image Processing Toolbox).

  • Агрегируйте файлы в одно исследование при помощи dicomCollection (Image Processing Toolbox) функция.

  • Считайте данные DICOM в исследовании при помощи dicomreadVolume (Image Processing Toolbox) функция.

  • Запишите каждый объем как файл MAT.

  • Создайте ImageDatastore или PixelLabelDatastore из набора файлов MAT путем выполнения процедуры для файлов MAT.

NIfTI

volds = imageDatastore(filepath, ...
   'FileExtensions','.nii','ReadFcn',@(x) niftiread(x));

pxds = pixelLabelDatastore(filepath,classNames,pixelLabelID, ...
   'FileExtensions','.nii','ReadFcn',@(x) niftiread(x));

Для получения дополнительной информации о чтении файлов NIfTI, смотрите niftiread (Image Processing Toolbox).

Парные данные об изображении и метке

Чтобы сопоставить объемное изображение и данные о метке для семантической сегментации или два объемных хранилища данных изображений для регрессии, используют randomPatchExtractionDatastore (Image Processing Toolbox). Случайный datastore экстракции закрашенной фигуры извлекает соответствующие случайным образом расположенные закрашенные фигуры из двух хранилищ данных. Исправление является общим методом, чтобы предотвратить исчерпывание памяти когда обучение с произвольно большими объемами. Задайте размер закрашенной фигуры, который совпадает с входным размером сети и, для КПД памяти, меньше, чем полный размер объема, такой как 64 64 64 вокселями.

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

  • randomPatchExtractionDatastore поддержки параллельны обучению, обучению мультиграфического процессора и чтению упреждающей выборки. Задайте параллель или обучение мультиграфического процессора использование 'ExecutionEnvironment' аргумент значения имени trainingOptions. Задайте чтение упреждающей выборки с помощью 'DispatchInBackground' аргумент значения имени trainingOptions. Чтение упреждающей выборки требует Parallel Computing Toolbox™.

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

  • randomPatchExtractionDatastore может сгенерировать несколько закрашенных фигур изображений от одного тестового изображения. Экстракция закрашенной фигуры One-many эффективно увеличивает сумму доступных обучающих данных.

Предварительно обработайте объемные данные

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

Чтобы предварительно обработать объемные данные, используйте transform функция. transform создает измененную форму datastore, названного underlying datastore, путем преобразования данных, считанных базовым datastore согласно набору операций, которые вы задаете в пользовательской функции. Image Processing Toolbox™ обеспечивает несколько функций, которые принимают объемный вход. Для полного списка функций смотрите 3-D Объемную Обработку изображений (Image Processing Toolbox). Можно также предварительно обработать объемные изображения с помощью функций в MATLAB® та работа над многомерными массивами.

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

Лежание в основе Datastore

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

ImageDatastore

Вход к пользовательской функции преобразования зависит от ReadSize свойство.

  • Когда ReadSize 1, функция преобразования должна принять целочисленный массив. Размер массива сопоставим с типом изображений в ImageDatastore. Например, полутоновое изображение имеет размер m-by-n, изображение истинного цвета имеет размер m-by-n-by-3, и многоспектральное изображение с каналами c имеет размер m-by-n-by-c.

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

Для получения дополнительной информации смотрите read функция ImageDatastore.

PixelLabelDatastore

Вход к пользовательской функции преобразования зависит от ReadSize свойство.

  • Когда ReadSize 1, функция преобразования должна принять категориальную матрицу.

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

Для получения дополнительной информации смотрите read (Computer Vision Toolbox) функция PixelLabelDatastore.

RandomPatchExtractionDatastore

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

Для получения дополнительной информации смотрите read (Image Processing Toolbox) функция RandomPatchExtractionDatastore.

transform функция должна возвратить данные, которые совпадают с входным размером сети. transform функция не поддерживает one-many отображения наблюдения.

Применять случайные аффинные преобразования к объемным данным в RandomPatchExtractionDatastore, необходимо использовать transform функция. DataAugmentation свойство этого datastore не поддерживает объемные данные.

Примеры

Преобразуйте пакет объемных данных в Datastore изображений

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

Задайте набор объемных изображений, сохраненных в файлах MAT.

filepath = fullfile(matlabroot,"toolbox","images","imdata","mristack.mat");
files = [filepath; filepath; filepath];

Создайте datastore изображений, который хранит несколько объемных изображений. Укажите что ReadSize из datastore больше 1. Задайте пользовательскую функцию чтения, matRead. Эта функция задана в разделе Supporting Functions этого примера.

volDS = imageDatastore(files,"FileExtensions",".mat", ...
    "ReadSize",3,"ReadFcn",@(x) matRead(x));

Задайте входной размер сети.

inputSize = [128 128];

Предварительно обработайте объемные изображения в volDS использование пользовательского трубопровода предварительной обработки задано в preprocessVolumetricIMDS поддерживание функции.

dsTrain = transform(volDS,@(x) preprocessVolumetricIMDS(x,inputSize));

Считайте пакет данных.

minibatch = read(dsTrain)
minibatch=3×1 cell array
    {128x128x21 uint8}
    {128x128x21 uint8}
    {128x128x21 uint8}

Вспомогательные Функции

matRead функционируйте данные об объеме загрузок из первой переменной файла MAT.

function data = matRead(filename)
    inp = load(filename);
    f = fields(inp);
    data = inp.(f{1});
end

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

  • Случайным образом вращайте изображение об оси z.

  • Измените размер объема к размеру, ожидаемому сетью.

  • Создайте шумную версию изображения с Гауссовым шумом.

  • Возвратите изображение в массиве ячеек.

function batchOut = preprocessVolumetricIMDS(batchIn,inputSize)
 
numRows = size(batchIn,1);
batchOut = cell(numRows,1);
 
for idx = 1:numRows
    
    % Perform randomized 90 degree rotation about the z-axis
    imRotated = imrotate3(batchIn{idx,1},90*(randi(4)-1),[0 0 1]);

    % Resize the volume to the size expected by the network
    imResized = imresize(imRotated,inputSize);
    
    % Add zero-mean Gaussian noise with a normalized variance of 0.01
    imNoisy = imnoise(imResized,'gaussian',0.01);

    % Return the preprocessed data
    batchOut(idx) = {imNoisy};
    
end
end

Преобразуйте объемные данные в случайный Datastore экстракции закрашенной фигуры

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

Задайте два набора объемных изображений, сохраненных в файлах MAT. Каждый набор содержит пять объемных изображений.

dir = fullfile(matlabroot,"toolbox","images","imdata","BrainMRILabeled");
filesVol1 = fullfile(dir,"images");
filesVol2 = fullfile(dir,"labels");

Сохраните каждый набор объемных изображений в datastore изображений. Задайте пользовательскую функцию чтения, matRead. Эта функция задана в разделе Supporting Functions этого примера. Используйте ReadSize по умолчанию из 1.

vol1DS = imageDatastore(filesVol1,"FileExtensions",".mat","ReadFcn",@(x) matRead(x));
vol2DS = imageDatastore(filesVol2,"FileExtensions",".mat","ReadFcn",@(x) matRead(x));

Задайте входной размер сети.

inputSize = [128 128];

Создайте случайный datastore экстракции закрашенной фигуры, который извлекает соответствующие закрашенные фигуры из этих двух хранилищ данных. Выберите три закрашенных фигуры на изображение.

patchVolDS = randomPatchExtractionDatastore(vol1DS,vol2DS,inputSize,"PatchesPerImage",3);

Предварительно обработайте объемные изображения в patchVolDS использование пользовательского трубопровода предварительной обработки задано в preprocessVolumetricPatchDS поддерживание функции.

dsTrain = transform(patchVolDS,@(x) preprocessVolumetricPatchDS(x));

Считайте пакет данных.

minibatch = read(dsTrain)
minibatch=15×2 table
         InputImage            ResponseImage   
    ____________________    ___________________

    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}
    {128x128x155 uint16}    {128x128x155 uint8}

Вспомогательные Функции

matRead функционируйте данные об объеме загрузок из первой переменной файла MAT.

function data = matRead(filename)
    inp = load(filename);
    f = fields(inp);
    data = inp.(f{1});
end

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

  • Случайным образом выберите одно из пяти увеличений.

  • Примените то же увеличение к данным в обоих столбцах таблицы.

  • Возвратите увеличенную пару изображений в таблице.

function batchOut = preprocessVolumetricPatchDS(batchIn)

numRows = size(batchIn,1); 
batchOut = batchIn;

% 5 augmentations: nil,rot90,fliplr,flipud,rot90(fliplr)
augType = {@(x) x,@rot90,@fliplr,@flipud,@(x) rot90(fliplr(x))};

for idx = 1:numRows

    img = batchIn{idx,1}{1};
    resp = batchIn{idx,2}{1};
    
    rndIdx = randi(5,1);
    imgAug = augType{rndIdx}(img);
    respAug = augType{rndIdx}(resp);
    
    batchOut(idx,:) = {imgAug,respAug};

end
end

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

| | (Computer Vision Toolbox) | (Image Processing Toolbox) |

Связанные примеры

Больше о