【问题标题】:pixelLabelDatastore from loaded image in workspacepixelLabelDatastore 来自工作区中加载的图像
【发布时间】:2019-05-02 15:09:34
【问题描述】:

我有多个小的 *.mat 文件,每个文件包含 4 个输入图像(template{1:4} 和第二个通道 template2{1:4})和 4 个输出图像(region_of_interests{1:4}),一个二值化(“掩码”)图像来训练深度神经网络。

我基本上按照 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。语法是data=load(file.mat),其中data将是一个结构体,其字段引用文件file.mat中的所有变量。例如,data.template 将是文件中的变量 template

标签: matlab deep-learning


【解决方案1】:

您应该能够使用标准的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 文件并读取它们之后,将单个图像从一个更大的数据立方体中分离出来。

看起来像这样:

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

【讨论】:

  • 我可能不清楚,原始文件不作为 jpg/tif 文件存在,它们实际上是 mat 文件中的二维矩阵,并且仅作为“原始”数据存在(如果我理解代码正确,这假设我们将数据导出为 jpg/tifs)。更具体地说,从一个 mat 文件生成一个 imds/pxds 是个问题,一旦它们被构建并没有真正保存结构
  • @edit:我理解那部分,问题是,我有 多个小的 mat 文件,每个文件包含 4 个图像,如 4 个具有第二个通道和一个通道的模板图像输出图像。抱歉,我改编的问题不清楚。
  • @edit2:感谢您的详尽回答。原因主要是跟随示例,然后使用trainnetwork() 进行实际训练,这似乎是多个小文件的方式
  • @more 阐述:我实际上无法使用语法 trainnetwork(X,Y,layers,opts) 组合 4D 数组来训练 2D 标记矩阵,否则这与网络快照结合使用(可以使用手动读入的数据进行进一步培训)可能是一种选择
猜你喜欢
  • 2021-11-03
  • 2018-02-07
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多