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

Чтение объемных данных

Поддерживаемые форматы файлов для объемных данных изображений включают MAT-файлы, файлы Digital Imaging and Communications in Medicine (DICOM) и файлы Neuroimaging Informatics Technology Initiative (NIfTI).

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

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

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

Создайте Image Datastore или Pixel Label 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 в нескольких файлах

Выполните следующие действия. Для получения примера смотрите Изображение Create 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 может сгенерировать несколько закрашенные фигуры к изображениям из одного тестового изображения. Извлечение закрашенной фигуры «один ко многим» эффективно увеличивает объем доступных обучающих данных.

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

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

Для предварительной обработки объемных данных используйте 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.

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

transform функция должна возвращать данные, которые совпадают с входом сети. transform функция не поддерживает отображений наблюдений «один ко многим».

Пример: Преобразование объемных данных в Image Datastore

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

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

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

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

  • Измените размер тома на размер, ожидаемый сетью.

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

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

function dataOut = preprocessVolumetricImage(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 случайного извлечения закрашенной фигуры volPatchDS использование произвольного конвейера предварительной обработки, заданного в функции augmentVolumetricPatch. Пример принимает, что ReadSize от volPatchDS равен 1, и сетевые отклики являются изображениями меток пикселей в хранилище данных меток пикселей.

dsTrain = transform(volPatchDS,@(x) augmentVolumetricPatch(x));

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

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

  • Примените одно и то же увеличение к обоим изображениям.

  • Верните пару дополненных изображений в таблицу.

function dataOut = augmentVolumetricPatch(data)

img = data.InputImage{1};
resp = data.ResponsePixelLabelImage{1};

% 5 augmentations: none, 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 augmented data as a table
dataOut = table({imgOut},{respOut}, ...
    'VariableNames',["InputImage" "ResponsePixelLabelImage"]);

end

См. также

| | | (Computer Vision Toolbox) | (Набор Image Processing Toolbox)

Похожие примеры

Подробнее о

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