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

Считайте объемные данные изображения

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

Можно считать объемные данные изображения в ImageDatastore. Когда вы создаете datastore изображений, задаете аргумент 'FileExtensions' как расширения файла ваших данных. Задайте свойство ReadFcn как указатель на функцию, который считывает данные формата файла. Для получения дополнительной информации смотрите Хранилища данных для Глубокого обучения.

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

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

Отобразите создание Datastore

MAT

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

Необходимо создать функцию matRead, чтобы считать данные из MAT-файла. Сохраните функцию в файле под названием matRead.m.

function data = matRead(filename)
% data = matRead(filename) reads the image data in the MAT-file filename

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

DICOM

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

Используя файлы DICOM для 3-D глубокого обучения требует, чтобы данные об объеме хранились в одном файле. Вы не можете данные об объеме, которые разделены на файлы повторного изображения.

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

NIfTI

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

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

Считайте объемные данные о метке для семантической сегментации

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

Можно считать объемные данные о метке в PixelLabelDatastore. Когда вы создаете пиксельный datastore метки, задаете аргумент 'FileExtensions' как расширения файла ваших данных. Задайте свойство ReadFcn как указатель на функцию, который считывает данные формата файла.

Таблица показывает, как создать пиксельный datastore метки для каждых из поддерживаемых форматов файлов. Аргумент filepath задает путь к файлам или папке, содержащей данные о метке. Аргументы classNames и pixelLabelID задают отображение значений метки воксела к именам классов.

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

Пиксельное создание Datastore метки

MAT

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

Необходимо создать функцию matRead, чтобы считать данные из MAT-файла. Сохраните функцию в файле под названием matRead.m.

function data = matRead(filename)
% data = matRead(filename) reads the label data in the MAT-file filename

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

DICOM

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

Используя файлы DICOM для 3-D глубокого обучения требует, чтобы данные об объеме хранились в одном файле. Вы не можете данные об объеме, которые разделены на файлы повторного изображения.

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

NIfTI

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

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

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

Чтобы сопоставить объемное изображение и данные о метке для семантической сегментации или два объемных хранилища данных изображений для регрессии, используют randomPatchExtractionDatastore. Случайный 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 PixelLabelDatastore.

randomPatchExtractionDatastore

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

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

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

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

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

Этот пример кода показывает, как преобразовать объемные данные в datastore изображений volds с помощью произвольного конвейера предварительной обработки, заданного в функциональном preprocessVolumetricIMDS. Пример принимает, что ReadSize volds больше, чем 1.

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

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

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

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

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

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

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

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

    % Return the preprocessed data
    dataOut(idx) = dataNoisy;
    
end
end

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

Этот пример кода показывает, как преобразовать объемные данные в случайный datastore экстракции закрашенной фигуры volds с помощью произвольного конвейера предварительной обработки, заданного в функциональном preprocessVolumetricPatchDS. Пример принимает, что ReadSize volds равняется 1.

dsTrain = transform(volds,@preprocessVolumetricPatchDS);

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

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

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

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

function dataOut = preprocessVolumetricPatchDS(data)

img = data(1);
resp = data(2);

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

rndIdx = randi(5,1);
imgOut = augType{rndIdx}(img);
respOut = augType{rndIdx}(resp);

% Return the preprocessed data
dataOut = table(imgOut,respOut};

end

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

| | | |

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

Больше о