pixelLabelDatastore из загруженного изображения в рабочей области - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть несколько небольших * .mat файлов, каждый из которых содержит 4 входных изображения (template{1:4} и второй канал template2{1:4}) и 4 выходных изображения (region_of_interests{1:4}), бинаризованное («маска») изображение для обученияглубокая нейронная сеть.

Я в основном следовал примеру на Mathworks и предлагает использовать функцию (в этом примере @matreader) для чтения в пользовательских форматах файлов.

Однако ...

  1. Кажется невозможным загрузить несколько изображений из одного * .mat-файла, используя любую функцию загрузки, так как она допускает только один вывод, а imageDatastore, похоже, неразрешить загрузку данных из рабочей области.Как этого достичь?
  2. Точно так же невозможно загрузить pixelLabelDatastore из переменной рабочей области.В качестве обходного пути я закончил тем, что сохранил содержимое моего * .mat-файла в изображение (используя imwrite, сохранив в save_dir) и перезагрузил его оттуда (в этом случае функция даже не позволяетзагрузить * .mat файлы.).(Как) это может быть достигнуто без повторного сохранения файла как изображения?

Вот моя неудачная попытка сделать это:


%main script
image_dir = pwd; %location of *.mat files
save_dir  = [pwd '/a/']; %location of saved output masks
imds = imageDatastore(image_dir,'FileExtensions','.mat','ReadFcn',@matreader); %load template (input) images
pxds = pixelLabelDatastore(save_dir,{'nothing','something'},[0 255]);%load region_of_interests (output) image

%etc, etc, go on to train network

%matreader function, save as separate file
function data=matreader(filename)
  in=1; %give up the 3 other images stored in template{1:4}
  load(filename); %loads template and template2, containing 4x input images each
  data=cat(3,template{in},template2{in}); %concatinate 2 template input images in 3rd dimension
end

%generate example data for this question, will save into a file 'example.mat' in workspace
for ind=1:4
  template{ind}=rand([200,400]);
  template2{ind}=rand([200,400]);
  region_of_interests{ind}=rand([200,400])>.5;
end
save('example','template','template2','output')

1 Ответ

0 голосов
/ 03 декабря 2018

Этого можно добиться, используя стандартные функции load и save.Посмотрите на этот код:

image_dir = pwd;
save_dir = pwd;

imds = imageDatastore(image_dir,'FileExtensions',{'.jpg','.tif'});
pxds = pixelLabelDatastore(save_dir,{'nothing','something'},[0 255]);
save('images.mat','imds', 'pxds')

clear
load('images.mat')  % gives you the variable "imds" and "pxds" directly -> might override previous variables
tmp = load('images.mat'); % saves all variables in a struct, access it via tmp.imds and tmp.pxds

Если вы хотите выбрать только те переменные, которые хотите загрузить, используйте:

load('images.mat','imds')        % loads "imds" variable
load('images.mat','pxds')        % loads "pxds" variable
load('images.mat','imds','pxds') % loads both variables

РЕДАКТИРОВАТЬ

Теперь у меня проблема, но я боюсь, что это не так.Идея, лежащая в основе объектов Datastore, заключается в том, что они используются, если данные слишком велики, чтобы поместиться в памяти в целом, но каждый маленький кусочек достаточно мал, чтобы поместиться в памяти.Вы можете использовать объект Datastore, чем легко обрабатывать и читать несколько файлов на диске.Для вас это означает: просто сохраняйте изображения не как один большой *mat файл, а как несколько маленьких *.mat файлов, которые содержат только одно изображение.

РЕДАКТИРОВАТЬ 2

Строго ли необходимо использовать imageDatastore для этой задачи?Если нет, вы можете использовать что-то вроде следующего:

image_dir = pwd;
matFiles = dir([image_dir '*.mat']);
for i=1:length(matFiles)
    data = load(matFiles(i).name);
    img = convertMatToImage(data); % write custom function which converts the mat input to your image
    % or something like this:
    % for j=1:4
        % img(:,:,j) = cat(3,template{j},template2{j});
    % end

    % process image
end

другой альтернативой будет создание «изображения» в вашем «matreader», которое не только имеет 2 полосы, но и просто помещает все полосы (все шаблоны) друг над другом, предоставляя «куб данных», а затем на втором шаге после перебора всех небольших файлов матов и чтения их, разделяя отдельные изображения из одного большего куба данных.

будет выглядеть примерно так:

function data=matreader(filename)
load(filename);
for in=1:4
    data=cat(3,template{in},template2{in}); 
end
end

, и в вашем главном файле вы должны просто разделить data на 4 части.

Я никогда не проверял это, но, возможно, можно вернуть ячейку вместо матрицы?

function data=matreader(filename)
load(filename);
data = cell(1,4)
for in=1:4
    data{in}=cat(3,template{in},template2{in}); 
end
end

Не уверен, что это сработает.

Однако правильный путь отсюда зависит от того, как вы планируете использовать изображения с imds и действительно ли необходимо использовать imageDatastore.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...