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

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

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

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

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

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

Создайте Datastore изображений

Создайте пиксельный Datastore метки

MAT

volds = imageDatastore(filepath, ...
   'FileExtensions','.mat','ReadFcn',@(x) matRead(x));
matRead пользовательская функция, которую вы пишете, чтобы считать данные из.MAT файла. Для демонстрационной реализации смотрите, Задают Пользовательскую Функцию, чтобы Считать Файлы MAT.

pxds = pixelLabelDatastore(filepath,classNames,pixelLabelID, ...
    'FileExtensions','.mat','ReadFcn',@(x) matRead(x));
matRead пользовательская функция, которую вы пишете, чтобы считать данные из.MAT файла. Для демонстрационной реализации смотрите, Задают Пользовательскую Функцию, чтобы Считать Файлы MAT.

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

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

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

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

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

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

Создайте ImageDatastore из набора файлов DICOM путем выполнения этих шагов.

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

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

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

  • Создайте ImageDatastore из набора.MAT файлов.

Для примера этих шагов смотрите Объемы Рида Малти-Файла ДИКОМА.

Создайте PixelLabelDatastore из набора файлов DICOM путем выполнения этих шагов.

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

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

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

  • Создайте PixelLabelDatastore из набора.MAT файлов, имен классов и пиксельной метки IDs.

Для примера этих шагов смотрите Объемы Рида Малти-Файла ДИКОМА.

NIfTI

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

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

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

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

Задайте пользовательскую функцию, чтобы считать файлы MAT

Чтобы считать данные из.MAT файла, необходимо задать пользовательскую функцию чтения. Например, этот код создает функцию под названием 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

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

Пример: подготовьте Datastore, содержащий один и многофайловые объемы DICOM

В этом примере показано, как создать imageDatastore или PixelLabelDatastore от набора файлов DICOM, которые включают 3-D объем.

Задайте директорию, которая содержит файлы DICOM. Директория может включать файлы, которые содержат 2D изображение, файлы, которые содержат полный 3-D объем и файлы, которые содержат 2D срезы 3-D объема. Datastore будет включать только файлы, которые содержат 3-D данные, или как полный 3-D объем в одном файле или как 2D срезы 3-D объема.

dicomDir = fullfile(matlabroot,'toolbox','images','imdata');

Соберите детали вокруг файлов DICOM при помощи dicomCollection функция. Эта функция возвращает детали как таблицу, где каждая строка представляет одно исследование. Функция агрегировала файлы многофайлового объема DICOM в одно исследование. Имена файлов многофайлового объема DICOM перечислены в массиве строк в Filenames переменная.

collection = dicomCollection(dicomDir,'IncludeSubfolders',true)

Создайте директорию, чтобы сохранить обработанные объемы DICOM.

matFileDir = fullfile(tempdir,'MATFiles');
if ~exist(matFileDir,'dir')
    mkdir(matFileDir)
end

Для каждого исследования в наборе получите имена файлов, которые включают исследование. Попытайтесь считать данные исследования при помощи dicomreadVolume функция.

  • Если данные содержатся в нескольких файлах, то dicomreadVolume запуски успешно и возвращают полный объем в одном 4-D массиве. Этот объем может быть включен в datastore.

  • Если данные содержатся в одном файле, то dicomreadVolume не запускается успешно. В этом случае считайте данные при помощи dicomread функция.

    • Если dicomread возвращает 4-D массив, затем исследование содержит полный 3-D объем, который может быть включен в datastore.

    • Если dicomread возвращает 2D матрицу или трехмерный массив, затем исследование содержит одно 2D изображение. В этом случае не используйте данные изображения от datastore и движения к следующему исследованию в наборе.

Для полных объемов, возвращенных в 4-D массиве, запишите данные в.MAT файл. Этот пример также пишет абсолютное имя файла файла DICOM, 'dicomFileName', как вторая переменная. Поскольку несколько регистрируют объемы DICOM, 'dicomFileName' массив строк всех отдельных файлов DICOM.

for idx = 1:numel(collection.Row)
    dicomFileName = collection.Filenames{idx};
    if length(dicomFileName) > 1
        matFileName = fileparts(dicomFileName(1));
        matFileName = split(matFileName,filesep);
        matFileName = replace(strtrim(matFileName(end))," ","_");
    else
        [~,matFileName] = fileparts(dicomFileName);
    end
    matFileName = fullfile(matFileDir,matFileName);
    
    try
        V = dicomreadVolume(collection,collection.Row{idx});
    catch ME
        V = dicomread(dicomFileName);
        if ndims(V)<4
            % Skip files that are not volumes
            continue;
        end
    end
    
    % For multi-file DICOM, dicomFileName is a string array.    
    save(matFileName,'V','dicomFileName');
    
end

Если объемы представляют данные изображения, то создают imageDatastore из.MAT файлов, содержащих объемы. Можно задать ReadFcn свойство как matRead функция от Задает Пользовательскую Функцию, чтобы Считать Файлы MAT.

imdsdicom = imageDatastore(matFileDir,'FileExtensions','.mat', ...
    'ReadFcn',@matReader);

Если объемы представляют данные о пиксельных метках, то создают PixelLabelDatastore из.MAT файлов, содержащих объемы. Можно задать ReadFcn свойство как matRead функция от Задает Пользовательскую Функцию, чтобы Считать Файлы MAT. Аргументы classNames и pixelLabelID векторы, которые задают отображение значений метки вокселя к именам классов.

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

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

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

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

| | | |

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

Больше о