近些年,随着深度学习在计算机视觉领域中的蓬勃发展。利用卷积神经网络对图像进行分类,以及对图像中目标进行识别定位成为比较前沿的技术。本文比较详尽的介绍了在MATLAB2018b环境下,利用Faster-RCNN对图像进行迁移学习,从而使其能够在自己的数据集上识别目标。
本文主要分为两个部分:1.训练模型 2.结果展示与分析
1.训练模型
-
构建数据集
在对图片进行标注前,先对图片进行处理,本文选用图片为MATLAB视觉工具箱中的stopsign数据:E:\MATLAB2018b\toolbox\vision\visiondata\stopSignImages。将这个文件夹中的图片复制出来,在根目录下建一个新的文件夹 E:\stopsignresize 并将图片放入文件夹中。
之后写一个更改图片尺寸的函数:
imagePath = 'E:\stopsignresize\';
imageFiles = dir(imagePath); %%读取目录文件下的所有图片文件
numFiles = length(imageFiles);%%获取图片的数量
parfor i=3:numFiles %%matlab 并行 其实和for一个用法
j = i-2;
disp(j); %%disp() 函数直接将内容输出在Matlab命令窗口中
imageFile = strcat(imagePath,imageFiles(i).name); %%strcat()函数经常出现在批量处理的时候,这个时候我们需要用到for循环,然后这个函数能够让变量和路径产生一些关系,这个时候我们就可以对其进行批量处理。
A = imread(imageFile); %%读入图片
B = imresize(A,[406 720]); %%修改图片尺寸
imwrite(B,imageFile); %%保存图片 。
end
运行这段代码,将原来1630*920的图片改成720*406,否则训练检测器的时候回显示图片太大显存不足。
之后打开MATLAB自带的标注工具,在命令行输入:
或者点这里
打开图片标注工具,如下图所示:
之后,加载MATLAB视觉工具箱中自带的stopsign图片数据(图片路径:E:\stopsignresize)
得到如下界面:
之后定义一个标签,并起名为stopsign:
然后就可以进行“快乐”的标注过程了(开始的时候觉得标注很有趣,多做几组试试,数据量大点儿试试,目标复杂点儿试试,绝对是个考验强健体魄以及意志品质的浩大工程,微笑脸)
如图,41张图片都标注好了:
之后对session和file进行保存:
保存成table类型文件:
得到table类型文件:
至此,第一部分图片标注工作就完成了,也是看起来工作量最大的一个步骤。
-
选择卷积网络并设置训练参数
本文采用迁移学习的方法对图片进行训练,从而可以做到用几十张图片来训练就能达到很好的检测效果。这是因为在构造Faster-RCNN检测器时,使用预训练过的卷积神经网络(如alexnet)作为主干,来提取图片的底层特征。
而这些特征是用大量数据集训练过的(例如CIFAR10、COCO、ImageNet等等)具有很好的图片底层特征表述能力和泛化能力。因此,可以将其直接放入Faster-RCNN模型中。
接下来设置训练参数。
% Set training options
options = trainingOptions('sgdm', ...
'MiniBatchSize', 1, ... %Faster-RCNN中的minibatch只能设置成1
'InitialLearnRate', 1e-4, ... %学习率,设置大的话训练速度快但效果比较差,甚至会发散,设置小了训练速度会较慢
'LearnRateSchedule', 'piecewise', ...
'LearnRateDropFactor', 0.1, ...
'LearnRateDropPeriod', 100, ...
'MaxEpochs', 20, ...
'CheckpointPath', tempdir, ...
'Verbose', true);
至此,我们可以进行最后一步,训练检测器了:
detector = trainFasterRCNNObjectDetector(gTruth,alexnet,options);
其中gTruth是标注的数据,alexnet是预训练过的卷积网络,options是设置的训练参数。这里建议配置好GPU环境后调用GPU加速和并行处理器,否则训练速度会非常慢。
如果想使用效果更好地复杂网络:
detector = trainFasterRCNNObjectDetector(gTruth,'resnet101',options);
这里调用网络时要先将网络进行下载安装,比如在命令行输入:
这说明我的计算机没有安装resnet50这个网络,点击Add-On Explorer来下载安装这个网络后才能使用(Alexnet,resnet101同理):
-
开始训练
如果一切顺利,MATLAB就会开始训练Faster-RCNN检测器了。
本文的实验验证是在如下配置中运行的:
CPU(20核,MATLAB训练可以调用10个核):
GPU:
之后就是漫长的等待:
可以看到,在700*400这样大小,具有复杂场景的图片,哪怕只有41张,在GPU环境下训练也是比较耗时的,因此强烈建议大家配置好GPU环境再来训练。如果条件实在不允许,我建议1.将图片尺寸调整为128*128或者256*256这种大小的图片;2.选用alexnet这种相对较小网络来训练(现在有种叫squeezenet的网络,能达到alexnet的效果,但是要训练的参数相对少了好多,因此速度也会更快)
2.结果展示与分析
-
结果展示
至此,检测器训练完成。从网络上下载了7张图片放在桌面上来检测
for i=1:7
img=imread(['C:\Users\hp\Desktop\',...
num2str(i),'.jpg']);
[bbox,score,label]=detect(detector,img);
img=insertObjectAnnotation(img,'Rectangle',bbox,score);
detectedImg=insertShape(img,'Rectangle',bbox);
figure;
imshow(detectedImg);
hold on
x=bbox(1)+60;
y=bbox(2)-14;
text(x,y,'stopsign','Color','k','FontSize',12);
end
结果如下:
第七张图片会报错,说明没有检测到stopsign。
-
结果分析
定性地看,检测效果还是蛮不错的,这要归功于Faster-RCNN_Resnet101模型的强大能力,以及GPU的强大计算处理能力。从而能够在复杂多变的场景下把stopsign检测出来。而且完全不用像传统的目标检测算法一样针对某些特定的几何特征做一个描述子出来,费时费力,精度鲁和棒性还不好。
定量地分析的话,这个模型针对这八张图片的准确率Precision为85.7%(6/7),召回率Recall为87.5%(7/8)。准确率P和召回率R是衡量机器学习分类和回归问题的一个重要衡量指标,有兴趣的朋友可以查阅一下资料,这里简单介绍一下计算方法:
准确率是计算检测的准不准:8张图片中标对的框/8张图片所有标出来的框,本文中第四张图片标出两个框,因此算作其中一个评分低的标错了。
召回率是计算检测的全不全:8张图片中标对的框/8张图片中所有应该标注出的框,本文第八张图片没检测出来,算作该标但没标出来的。
第四张图出错的原因估计是检测器把下面那个红色的 小牌子也当成了stopsign,第八张图片出错估计是网络对形变较大,较为模糊的图片检测效果较差,而这两者都是可以通过增加训练集来解决的。
就先介绍到这里,如有问题欢迎批评指正。
同时若碰到问题可以评论告诉我。