美文网首页
ILSVRC2012神经网络训练图像预处理

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

作者: A大于_963a | 来源:发表于2020-05-01 07:38 被阅读0次

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

    相关文章

      网友评论

          本文标题:ILSVRC2012神经网络训练图像预处理

          本文链接:https://www.haomeiwen.com/subject/mklhnqtx.html