ILSVRC2012神经网络训练图像预处理
最近在学习机器学习图像训练,因此从网上找了ILSVRC2012的训练图像,总大小130多G,下了半个多月才下来,下载链接如下:
magnet:?xt=urn:btih:A306397CCF9C2EAD27155983C254227C0FD938E2
由于我是用matlab进行图像训练,下面把训练前的一些预处理操作和matlab源码贴出,以备有需要的。
1、批量修改文件夹名称
ILSVRC2012_img_train.tar压缩包解压后里面有1000个子压缩包,每个压缩包对应一种物体类别的图像文件夹,在matlab训练图像时,可以用文件夹的名称作为类别名称。
ILSVRC2012_img_train.tar 子压缩包上图看出,子文件夹的文件名称是随机的数字,因此需要先批量修改文件夹名称,在网上搜了一下没找到matlab批量修改文件的方法(本人matlab也是小白),但是找到了用python修改文件夹名称的方法,代码如下,下面的代码将文件夹的名称按照数字顺序命名.
import os
l=os.listdir('H:\ILSVRC2012_img_train')
os.chdir('H:\ILSVRC2012_img_train')
n=1
for i in l:
filename=str(n)
os.rename(i,filename)
n=n+1
代码运行后文件夹名称变为如下:
2、批量修改图片尺寸
下面需要将所有文件中的图片都修改为统一的大小227*227*3,采用matlab源码如下:
clear;
clc;
close all;
for k=999 :1 :1001
k
a=num2str(k);
imagePath = ['H:\ILSVRC2012_img_train\',a,'\'];
imageFiles = dir(imagePath);
numFiles = length(imageFiles);
parfor i=3:numFiles
j = i-2;
imageFile = strcat(imagePath,imageFiles(i).name);
A = imread(imageFile);
B = imresize(A,[227 227]);
imwrite(B,imageFile);
end
end
运行上面的代码的时候matlab在运行到某些图片文件的时候会提示 遇到不支持CMKY空间的JPEG图像 而程序终止,为什么这些图像不支持CMKY空间我现在也没弄明白,索性把不支持的图片都删掉,由于上面代码是for并行运行的,不太好直接看出是哪张图片的问题,但是能看出是哪一个文件夹里的图片,因此用另一个matlab代码运行看是哪个图片错误,代码如下:
clear;
clc;
close all;
imagePath = 'H:\ILSVRC2012_img_train\1\'
imageFiles = dir(imagePath);
numFiles = length(imageFiles);
for i=3:numFiles
imageFile = strcat(imagePath,imageFiles(i).name);
[m,n,p]=size(imread(imageFile))
A = imread(imageFile);
B = imresize(A,[227 227]);
imwrite(B,imageFile);
end
修改上面代码中的'H:\ILSVRC2012_img_train\1\'的数字1为出错的文件夹,然后运行程序,出错后,通过命令imageFiles(i).name查看问题图片,然后删掉即可。
3、删除黑白图像
进行完上面的操作之后,发现另外一个问题,就是ILSVRC2012中有很多黑白图像,而我此次训练打算用RGB图像,因此还需要删掉所有RGB图像,删除的matlab源码如下:
clear;
clc;
close all;
for k=1 :1 :1000
k
a=num2str(k);
imagePath = ['H:\ILSVRC2012_img_train\',a,'\'];
imageFiles = dir(imagePath);
numFiles = length(imageFiles);
parfor i=3:numFiles
j = i-2;
imageFile = strcat(imagePath,imageFiles(i).name);
[m,n,p]=size(imread(imageFile));
if(m~= 227 || n ~= 227 || p~=3)
delete(imageFile);
i;
end
end
end
此代码是检查图像的尺寸,删掉所有不是227*227*3尺寸的图像
4、计算所有文件夹中图片数量的最小值
由于所采用的matlab神经网络训练程序需要每个类别的图像训练数目一样,但是ILSVRC2012中每个类别的图像数量相差不少,因此需要知道每个类别拥有图片数量的最小值,下面是matlab源码:
min= 1300 ;
for k=1 :1 :1000
a=num2str(k);
imagePath = ['H:\ILSVRC2012_img_train\',a,'\'];
imageFiles = dir(imagePath);
numFiles = length(imageFiles);
if(numFiles < min)
min = numFiles ;
end
min
end
上面的代码运行后,会实时打印当前计算出的最小值,最终计算出的最小值为700多,因此下面的训练实例中用600张作为训练,100张作为验证。
5、matlab 机器学习训练实例
clc;clear;
digitDatasetPath = 'H:\ILSVRC2012_img_train\';
imds = imageDatastore(digitDatasetPath, ...
'IncludeSubfolders',true,'LabelSource','foldernames');
labelCount = countEachLabel(imds);
numTrainFiles = 600;
[imdsTrain,imdsValidation_temp] = splitEachLabel(imds,numTrainFiles,'randomize');
[imdsValidation,imdsValidation_temp2] = splitEachLabel(imdsValidation_temp,100,'randomize');
imageAugmenter = imageDataAugmenter( ...
'RandRotation',[-90,90], ...
'RandXTranslation',[-30 30], ...
'RandYTranslation',[-30 30]);
%imageSize = [227 227 3];
%augimds = augmentedImageDatastore(imageSize,'DataAugmentation',imageAugmenter);
layers = [
imageInputLayer([227 227 3])
convolution2dLayer(6,256,'Padding','same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(6,'Stride',3)
convolution2dLayer(6,256,'Padding','same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(6,'Stride',3)
convolution2dLayer(6,256,'Padding','same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(6,'Stride',3)
convolution2dLayer(6,64,'Padding','same')
batchNormalizationLayer
reluLayer
fullyConnectedLayer(3000)
reluLayer
dropoutLayer
fullyConnectedLayer(3000)
reluLayer
dropoutLayer
fullyConnectedLayer(1000)
softmaxLayer
classificationLayer];
options = trainingOptions('sgdm', ...
'InitialLearnRate',0.001, ...
'MiniBatchSize',5,...
'MaxEpochs',50, ...
'ValidationPatience',5000,...
'ExecutionEnvironment','gpu', ...
'Shuffle','every-epoch', ...
'ValidationData',imdsValidation, ...
'ValidationFrequency',5, ...
'Verbose',true, ...
'Plots','training-progress');
net = trainNetwork(imdsTrain,layers,options);
YPred = classify(net,imdsValidation);
YValidation = imdsValidation.Labels;
accuracy = sum(YPred == YValidation)/numel(YValidation)
上面的代码是matlab训练卷积神经网络的,里面从每个文件夹中获取600张图片作为训练用,100张作为验证用,训练采用GPU