ILSVRC2012神经网络训练图像预处理

最近在学习机器学习图像训练,因此从网上找了ILSVRC2012的训练图像,总大小130多G,下了半个多月才下来,下载链接如下:

magnet:?xt=urn:btih:A306397CCF9C2EAD27155983C254227C0FD938E2

由于我是用matlab进行图像训练,下面把训练前的一些预处理操作和matlab源码贴出,以备有需要的。

1、批量修改文件夹名称
ILSVRC2012_img_train.tar压缩包解压后里面有1000个子压缩包,每个压缩包对应一种物体类别的图像文件夹,在matlab训练图像时,可以用文件夹的名称作为类别名称。
ILSVRC2012神经网络训练图像预处理_第1张图片

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

代码运行后文件夹名称变为如下:

ILSVRC2012神经网络训练图像预处理_第2张图片

2、批量修改图片尺寸
下面需要将所有文件中的图片都修改为统一的大小2272273,采用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

此代码是检查图像的尺寸,删掉所有不是2272273尺寸的图像

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

你可能感兴趣的:(ai,图像,cnn)