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

2020-05-01  本文已影响0人  A大于_963a

最近在学习机器学习图像训练,因此从网上找了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

上一篇下一篇

猜你喜欢

热点阅读