来自工作区中已加载图像的pixelLabelDatastore

时间:2018-11-30 12:48:44

标签: matlab deep-learning

我有多个小型* .mat文件,每个文件包含4个输入图像(template{1:4}和第二个通道template2{1:4})和4个输出图像(region_of_interests{1:4}),并进行了二值化处理('mask ')图像来训练深度神经网络。

我基本上遵循了Mathworks和it suggests to use a function(在此示例为@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 :(得分:2)

您应该能够使用标准的loadsave函数来实现这一目标。看一下这段代码:

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个波段,而且只需将所有波段(所有模板)相互叠加即可提供“数据立方体”,然后在第二个遍历所有较小的mat文件并读取它们之后,将步骤从一个较大的datacube中拆分出来。

看起来像这样:

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