本文在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 型的方式
(2)cell 型方式
2.2. 模型训练
(1)使用MATLAB2017a自带的神经网络Alexnet,选择训练深度为20。
依次输入命令net=alexnet;
%doc alexnet 可以查看具体相关流程这里不做说明
%doc imageDatastore 可以查看具体相关流程这里不做说明
'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盘容易导致电脑卡顿,所以每次训练结束都要清楚缓存数据。
当然,它的识别精度还是比较可靠的,主要在于训练模型的图片要选择恰当。