MATLAB2017a使用FasterRcnn目标检测训练及其测试流程

    本文在matlab2017a已有的FasterRcnn算法基础上来检测人群。流程比较简单,对一些初学者来说比较容易理解和操作。

1.安装所需要的软硬件环境

1.1.硬件环境:

· CPU:Intel i5

· GPU:GTX940m

· 内存:4G

· 硬盘:500G

1.2软件环境

· 开发环境: Windows 10

· 编译环境:MATLAB2017a

2.目标模型的训练

2.1获得数据集

打开MATLAB2017a,输入命令trainingImageLabeler使用matlab自带的trainingImageLabeler来对图片进行标注。简单起见,选43张图片标注,每张图片最后只选择一个框(方便对数据提取


    所有图片的label标注完后点击 Export ROIs 就会得到像这样的一个table文件。imageFilename代表了图片所存储的位置。 并将table文件保存到指定文件夹。(注:获得table文件不能通过保存获得必须Export ROIs)

    使用命令save('D:\MATLAB\toolbox\vision\visiondata\people\tset_1\peopledata.mat','peopledata');

就可以报存到这个位置:D:\MATLAB\toolbox\vision\visiondata\people\;

    注意peopledata.mat是要保存的类型以及文件格式,第二项peopledata是从Export ROIs 导出后命名的文件名。

    使用函数extractpeople(matpath,savepath)批量修改table文件中图片大小为227X227(大小是固定的)

    从上述产生的table可以看到,ROI框坐标数据保存类型是1*4 double。有时候导出时产生的是cell型,double型和cell型数据提取方式不一样,不注意可能会报错。一下仅以double型为例。

输入一下命令设置上述获得的数据集所在路径和保存路径。

    matpath=('D:\MATLAB\toolbox\vision\visiondata\people\tset_1\peopledata.mat')

    savepath=('D:\MATLAB\toolbox\vision\visiondata\people\tset_1\people\');   %框选图片保存位置

    输入命令 extractpeople(matpath,savepath)即可(该函数的作用是将框选目标提取出来将其图片大小改为227*227,并按顺序命名)

 (1)%double 型的方式

    function extractpeople(matpath,savepath)
    %batch change image size
    load(matpath); 
    %get image
    [length b]=size(peopledata);   
    %get the number of image
    for i=1:length
    img=imread(peopledata.imageFilename{i});
    str=zeros(1,4);       
    str(1)=peopledata.people(i,1);
    str(2)=peopledata.people(i,2);
    str(3)=peopledata.people(i,3);
    str(4)=peopledata.people(i,4);   
    rect=str;      
    I=imcrop(img,rect);
    I=imresize(I,[227 227]);
    imwrite(I,[savepath,'\',num2str(i),'.jpg']);
    %resize image
end

(2)cell 型方式

    function extractpeople(matpath,savepath)
    %batch change image size
    load(matpath); 
    %get image
    [length b]=size(peopledata);   
    %get the number of image
    for i=1:length
    img=imread(peopledata.imageFilename{i});  
    rect= peopledata.people{}i};     
    I=imcrop(img,rect);
    I=imresize(I,[227 227]);
    imwrite(I,[savepath,'\',num2str(i),'.jpg']);
    %resize image
end

 


2.2.   模型训练

(1)使用MATLAB2017a自带的神经网络Alexnet,选择训练深度为20。

    依次输入命令net=alexnet;

%doc alexnet 可以查看具体相关流程这里不做说明

%doc imageDatastore 可以查看具体相关流程这里不做说明

image = imageDatastore(fullfile('D:\MATLAB\toolbox\vision\visiondata\people\tset_1\'),...
'IncludeSubfolders',true,'LabelSource','foldernames');

layersTransfer=net.Layers(1:end-3);

numClasses = numel(categories(image.Labels))


%设置网络训练参数

输入命令netTransfer = trainNetwork(image,layers,options);%开始训练

 

(2)使用FasterRcnn训练,选择训练深度为20。训练结束后,保存训练模型

    load('peopledata.mat');     %it is not necessary

     options = trainingOptions('sgdm', ...
    'InitialLearnRate', 1e-8, ...
    'MaxEpochs', 20, ...                     %twenty times  训练深度不是越多效果越好,有可能适得其反,
    'CheckpointPath', tempdir);
     layer=netTransfer.Layers

     detector = trainFasterRCNNObjectDetector(peopledata, layer, options)

    %开始训练大概要10分钟左右,设备好相对快些


2.3 检测

(1)检验模型

    读取一张大小适合的图片进行检测,并输出检测结果,获得检测框的坐标,以及检测分数。

(2)运行实例


3.优点与缺点

    训练模型量要很大,这就产生了很大的数据,对于同一张图片,有着大小限制,大小小于227时,会无法检测,改变其大小比列可能检测不出目标。

    每一次FasterRcnn模型训练都将产生很大缓存数据,选择训练深度30,训练图片数量280,产生了25G的缓存数据。要命的是它存在C盘容易导致电脑卡顿,所以每次训练结束都要清楚缓存数据。

    当然,它的识别精度还是比较可靠的,主要在于训练模型的图片要选择恰当。


Guess you like

Origin blog.csdn.net/qq_42263796/article/details/80453438