如何基于含图像标签的MAT文件创建分类用ImageDatastore?
解决MATLAB中从.mat文件创建带标签的ImageDatastore问题
嗨,作为MATLAB新手,你遇到的问题其实是因为ImageDatastore默认把每个文件当成一个数据条目,而你的自定义ReadFcn直接返回了整个41x41x1000的批量矩阵,所以imds里只有1个条目,而不是你需要的1000个单张图像条目。不用把图像存到磁盘,我们可以直接从内存中的数据构建带标签的datastore,步骤很简单:
方法步骤:
1. 先加载.mat文件中的数据和标签
首先把.mat里的data和class变量加载到工作区:
load('A.mat'); % 执行后工作区会有data(41x41x1000)和class(1x1000)两个变量
2. 将批量图像数组转换为cell数组
ImageDatastore可以直接接受cell数组作为输入,每个cell对应一张单图。我们把data的每个切片(41x41)转换成cell元素:
% num2cell的[1 2]参数表示保留前两个维度(图像的高和宽),把第三个维度拆分成cell imageCells = num2cell(data, [1 2]); % 此时imageCells是1x1000的cell数组,每个元素是41x41的矩阵
3. 创建ImageDatastore和LabelDatastore
分别创建存储图像和标签的datastore:
% 基于cell数组创建图像datastore imds = imageDatastore(imageCells); % 基于标签数组创建标签datastore labelds = labelDatastore(class);
4. 合并两个datastore(可选但推荐)
如果需要同时读取图像和对应的标签,把两个datastore合并成CombinedDatastore:
combinedds = combine(imds, labelds);
测试读取
现在你可以像普通datastore一样读取数据了,比如读取前3个图像和标签:
reset(combinedds); % 重置读取指针到开头 for i = 1:3 [img, label] = read(combinedds); figure; imshow(img); title(['第', num2str(i), '张图,标签:', num2str(label)]); end
为什么之前的方法不行?
你之前的代码里,matRead函数返回的是整个d.data(41x41x1000),ImageDatastore会把这个矩阵当成一个单独的图像条目(而不是1000个),所以read(imds)只会拿到这个大矩阵,而不是单张图。上面的方法通过拆分数据为单个图像单元,让datastore能正确识别每个条目。
内容的提问来源于stack exchange,提问作者sparkle
相关产品推荐
相关产品推荐

