如何在Matlab中使用深度R-NN检测停止的交通标志

360 阅读8分钟

如何在Matlab中使用深度R-NN检测停止的交通标志

R-CNN(区域卷积神经网络)是一种深度学习方法,用于检测图像中的各种物体。它在自动驾驶汽车、智能监控系统和面部表情中都有应用。

使用R-CNN进行物体检测的模型是基于三个过程。第一个过程是找到图像中可能包含物体的区域,也就是建议的区域。然后,它从该区域提取CNN特征,最后利用提取的特征对物体进行分类。

有三种R-CNN的变体。它们是R-CNN、快速R-CNN和更快R-CNN。顾名思义,训练和检测的速度从第一种到最后一种都有所提高。

在本教程中,我们将使用R-CNN。我们将学习如何使用Matlab在实时和离线模式下使用深度R-NN检测停车交通标志。我们将使用图像标签程序来创建我们的预训练图像数据库。在这里,转移学习被使用,预训练的R-CNN在其图像数据集上被重新训练。

前提条件

要跟上本教程,你需要。

  • 安装[MATLAB]。
  • 对[MATLAB]基础知识的正确理解。

使用R-CNN进行物体检测的模型是基于以下三个过程。

  1. 寻找图像上可能包含物体的区域。这些区域被称为区域建议。
  2. 从区域建议中提取CNN特征。
  3. 使用提取的特征对物体进行分类。

R-CNN有三种变体。它们是R-CNN、快速R-CNN和更快R-CNN。

cnns

在本教程中,我们将实现基本的R-CNN。

R-CNN的方案

基本的R-CNN检测器首先使用搜索框等选择性搜索算法生成区域建议。不幸的是,这些区域的提议是2000 ,使这个过程变慢,因为它必须定位区域提议。

然后将每个区域从图像中裁剪出来,调整大小,并将其重塑为一个正方形。然后,它被送入CNN进行分类。然后,使用CNN特征训练的SVM定义了区域建议的边界框。

svm

以图像形式提出的方案是。

proposed scheme

使用Matlab的图像标签器创建数据库

尽管我们在提议的工作中使用了预训练的R-CNN网络,但它必须在我们的数据库中进行微调训练。这意味着我们必须有一个图像数据库。它不一定包含图像,但几张图像就足以对预训练的R-CNN进行微调。

我们必须通过图像中的边界框来定义R-CNN的ROI(感兴趣的区域)。这个带有ROI的图像数据库可以用Matlab的图像标签程序创建。

对于拟议的工作,我们总共使用了60 图像。这些图像是随机从互联网上下载的。由于这些图像的尺寸不同,我们把它们调整到一个共同的尺寸,即640px 。这样做是为了减少训练和测试的时间。

然后,这些图像被导入到图像标签程序中进行边界框标记,并导出到Matlab的工作区,或作为.mat 文件保存在一个文件夹中。

如何使用Matlab的图像标签器

  • 打开图像标注器应用程序。

show location

  • 一个新的窗口打开了,当你点击加载标签时。定义数据源以导入你的数据集。

loading data

  • 导入所有的60 图像。点击ROI标签定义,使用边界框定义你的ROI。

show roi label def

  • 一个新的窗口,要求你给标签一个名字。请注意,由于我们使用的是预训练的网络,这个名字应该是stopSign ,因为它是在网络中定义的。
  • 点击ok ,然后为所有的图像画出站牌图像周围的边界框。如果你有成千上万的图像,这需要很大的努力。

show how your draw the ROI

  • 一旦你完成了对图像的标注,点击导出图像,并指定你要导出的位置。对于我们的案例,我们导出到当前目录。

  • 由于我们导出到工作区,我们使用label 格式,并给出变量名称。另外,由于预训练的网络,变量名称应该是stopSigns

  • 一旦这些都完成了,我们就会看到所有的图像都被导出到工作区。

images in the workspace

  • 这就是你如何使用图像标签器来准备你的数据集。save然后,在导出图像后,你可以直接从工作区使用它们,或者通过点击.mat ,将它们保存为当前目录下的文件。

用于训练的Matlab代码

我们首先加载预训练的R-CNN和图像数据库的层。对于预训练的R-CNN,我们使用Matlab的内置文件rcnnStopSigns.mat

%program to train an RCNN to detect stop signs
load('rcnnStopSigns', 'layers')   %loading layers of pre-trained RCNN
load stopsign.mat;     %loading image database for training

内置的.mat 文件有很多参数,但我们只需要层。所以我们需要显示这些层,我们使用下面的代码。

Igraph = layerGraph(layers);   %Getting layers
Igraph.Layers    %Displaying layers.

然后我们定义训练选项并训练我们的数据集。

%Define trainning options
options = trainingOptions('sgdm', 'MiniBatchSize', 32, 'initialLearnRate', 1e-6, 'MaxEpochs', 10);

%Trainning RCNN
rcnn = trainRCNNObjectDetector(stopSigns, layers, options, 'NegativeOverlapRange', [0 0.1]);

训练完成后,所有训练过的层和对应的层将被存储在rcnn 变量中。你可以把这个rcnn ,以备将来测试之用,但目前你仍然可以使用它。

image of the training process

测试图像的Matlab代码(离线模式)

在这里,我们要求用户要提供检测的输入图像。然后在检测前读取这个图像。

%Reading input image
[filename, pathname]=uigetfile('*.*', 'Select test image');
filewithpath=strcat(pathname, filename);
img= imread(filewithpath);

这个测试图像被存储在变量img 。然后,该图像被作为参数传递给detect函数,以执行检测。

[bbox, score, label] = detect(rcnn, img, 'MiniBatchSize', 32);   %Stop sign detection
nobox = size(score, 1); %sorting o the basis of scores

检测到的边界框坐标将进入bbox 变量,所有的限定分数将被存储到score 变量。然后,所有的标签都存储在labels

因此,我们需要找到边界框的数量f ,以了解检测到的交通停车标志的相应数量。然后,我们将scorebbox ,形成一个矩阵,然后对这个矩阵进行排序,以便在顶部有拥有最大分数的条目。

scorebox=[score, bbox];
scorebox=sortrows(scorebox, 'descend');

接下来,在图像上插入注释。

img = insertObjectAnnotation(img, 'rectangle', scorebox(1,2:end),...
    strcat('Stop Sign: Conf.Score:', num2str(scorebox(1,1))));

让我们引入一个循环,以应对有一个以上停车标志的图像的情况。这意味着在这种情况下,我们需要一个以上的bboxannotation ,我们用下面的代码实现这个目标。

for i=2:nobox
    if score(i)==1
        img=insertObjectAnnotation(img, 'rectangle', scorebox(i,2:end),...
            strcat('StopSign: Conf. Score: ', num2str(score(i,1))));
    end
end

然后我们最后显示输出。

figure
imshow(img)

tested image

测试视频的Matlab代码(离线模式)

首先输入视频。

% Reading input video
[filename, pathname] = uigetfile('*.*', 'select test video');
filewithpath=strcat(pathname, filename);

然后,定义视频阅读器对象,你将用它来读取视频并初始化视频播放器。

v = VideoReader(filewithpath);  %Declare video object
videoplayer=vision.VideoPlayer();  %Initialize video player

接下来,引入一个while 循环,逐一读取视频帧。该循环读取帧,检测停止符号,并插入注释。

runloop= true;   %conditions for the while loop

while runloop
img = readFrame(v); %Reading one frame
[bbox, score, ~] = detect(rcnn, img, 'MiniBatchSize', 32);  %Detecting Stop sign
[score1, idx]=max(score);   %getting max. Score

bbox1 = bbox(idx, :);  %getting Bounding box corresponding to max. Score
img = insertObjectAnnotation(img, 'rectangle', bbox1,...
    strcat('sStop Sign: Conf. Score:', num2str(score1)));  %Insertig anotation
step(videoplayer, img); %Displaying image as frame in the video player
runloop = isOpen(videoplayer);   %checking video player is ON or OFF
end

step(videoplayer,img) 意味着所有带有边界框和注释的图像都被交给视频播放器对象来显示。如果你执行该程序,你会得到检测到停止标志的输出。

Output for offline video

测试视频的Matlab代码(实时)

在这种情况下,我们将使用网络摄像头来捕捉实时视频。现在,这就是离线和在线情况的区别。

其余的代码对于这两种情况是相似的。另外,我们不是读取帧,而是拍摄快照并读取它们。

% Reading input video
cam = webcam;

videoplayer=vision.VideoPlayer();  %Initialize video player

runloop= true;   %conditions for the while loop

while runloop
img = snapshot(cam); %Reading one frame
[bbox, score, ~] = detect(rcnn, img, 'MiniBatchSize', 32);  %Detecting Stop sign
[score1, idx]=max(score);   %getting max. Score

bbox1 = bbox(idx, :);  %getting Bounding box corresponding to max. Score
img = insertObjectAnnotation(img, 'rectangle', bbox1,...
    strcat('sStop Sign: Conf. Score:', num2str(score1)));  %Insertig anotation
step(videoplayer, img); %Displaying image as frame in the video player
runloop = isOpen(videoplayer);   %checking video player is ON or OFF
end
clear cam;

当我们运行训练程序时,我们会看到关于我们预训练的网络的所有信息。

结论

交通停车标志检测是Matlab的一项非常重要的能力。在车辆上实现这一功能,可以避免事故的发生。Matlab处理深度学习的能力是不可思议的。

正如我们所看到的,训练代码很容易,而且其实施效果很好。训练算法也非常准确。Matlab有内置的功能,易于使用且非常有效。