目的:将两个文件夹下的图片数据放入mat文件中,包含label和image两个模块。
1.取出数据
这里我们取出两次数据,包括数据集中Bad和Good两个类别的图像。
这里我将图像大小缩减为280*280,图像越大,处理的时间越长,如果电脑内存不够就会卡死的。
pt = 'E:\数据集\03-DRIMDB\Bad\'; %读取路径
ext = '*.jpg';
dis = dir([pt ext]);
nms = {dis.name};
for k = 1:length(nms)
nm = [pt nms{k}]; %nm存储每张图片的路径(包括图片名)D:\Workspace\Matlab\1.bmp
image = rgb2gray(imread(nm));
image = imresize(image,[280,280]);
image(:,:,k)=image; %将第k张图片存储到三维数组的第k页
end
% labels = ones(k,1);
% save fundus_img labels images; %将数组存储为mat格式
%%
pt1 = 'E:\数据集\03-DRIMDB\Good\'; %读取路径
ext1 = '*.jpg';
dis1 = dir([pt1 ext1]);
nms1 = {dis1.name};
for k1 = 1:length(nms)
nm1 = [pt1 nms1{k1}]; %nm存储每张图片的路径(包括图片名)D:\Workspace\Matlab\1.bmp
image1 = rgb2gray(imread(nm1));
image1 = imresize(image1,[280,280]);
image1(:,:,k1)=image1; %将第k张图片存储到三维数组的第k页
end
2.存入数据
将取出的image和label存入到mat文件中,作为后续CNN的输入。
images = cat(3,image,image1);
labels = [ones(k,1);zeros(k1,1)];
save fundus_img labels images; %将数组存储为mat格式
3.划分数据集
相关的图像大小要更改。
训练集、测试集和验证集的比例可以更改。
load('fundus_img.mat')
X = reshape(images, [280,280,1,length(labels)]); % 灰度图片的作为输入的要求为h*w**c*s,
% 其中h为图片的长度,w为宽度,c为通道数,s就是数据的个数
size(X) % 可以看到我们的数据集尺寸为:28*28*1*18724
Y = categorical(labels); % 标签的数据类型为categorical
idx = randperm(length(labels)); % 产生一个和数据个数一致的随机数序列,范围是0~length(images)
num_train = round(0.5*length(labels)); % 训练集个数,0.5表示全部数据中随机选取50%作为训练集
num_val = round(0.3*length(labels)); % 验证集个数,0.3表示全部数据中随机选取30%作为验证集,故测试集自动变为剩下的20%
% 训练集,验证集和测试集数据
X_train = X(:,:,:,idx(1:num_train));
X_val = X(:,:,:,idx(num_train+1:num_train+num_val));
X_test = X(:,:,:,idx(num_train+num_val+1:end)); %这里假设,全部数据中除了
% 训练集,验证集和测试集标签
Y_train = Y(idx(1:num_train),:);
Y_val = Y(idx(num_train+1:num_train+num_val),:);
Y_test = Y(idx(num_train+num_val+1:end),:);
4.搭建模型
更改输入层的图像大小;
更改全连接层输出类别(与标签类别相匹配)。
% 定义网络层
layers = [...
imageInputLayer([280,280,1]); % 输入层,要正确输入图片的height, width 和 number of channels of the images
batchNormalizationLayer(); % 批量归一化
convolution2dLayer(5,20); % 卷积层
batchNormalizationLayer();
reluLayer() % Relu激活函数
maxPooling2dLayer(2,'Stride',2); % 池化层
fullyConnectedLayer(2); % 全连接层
softmaxLayer(); % softmax层
classificationLayer(),...
];
% 参数
options = trainingOptions('sgdm',... % 也可以用adam、rmsprop等方法
'MaxEpochs',1000,... % 最大迭代次数
'Plots','training-progress');
net_cnn = trainNetwork(X_train,Y_train,layers,options);
5.结果分析
根据已搭建的网络做图像质量分类的准确度并不高,原因有以下几点:
※ 数据集数量少;
※ 图像大小缩放使图像模糊;
※ 模型太简单;
一一一一一一一一一一一一一一一一一一一一一一一一一一
继续尝试更复杂的网络模型。