利用更快的r-cnn深度学习进行目标检测
此示例演示如何使用名为“更快r-cnn(具有卷积神经网络的区域)”的深度学习技术来训练对象探测器。
概述
此示例演示如何训练用于检测车辆的更快r-cnn对象探测器。更快的r-nnn [1]是r-cnn [2]和快速r-nnn [3]对象检测技术的引伸。所有这三种技术都使用卷积神经网络(cnn)。它们之间的区别在于它们如何选择要处理的区域以及如何对这些区域进行分类.r-cnn和快速r-概算在运行美国有线电视新闻网之前使用区域建议算法作为预处理步骤。提议算法通常是技术例如edgox [4]或选择性搜索[5],是独立的美国有线电视新闻网。在快速r-cnn的情况下,与运行cnn相比,使用这些技术成为处理瓶颈。更快的r-cnn通过使用美国有线电视新闻网实施区域提案机制来解决这一问题,从而使区域提案成为美国有线电视新闻网培训和预测步骤的一部分。
在该中心中, 使用trainFasterRCNNObjectDetector
, 自机视觉系统工具箱 tm .该方案:
为我服务。
网络 (cnn)。
把他放在
h. p。
爱的人
* 请将设备与设备、设备和设备
已经成功,有3.0 或高价值使用需要并行计算工具箱™。
为我服务
本示例使用包含295张图像的小型车辆数据集。每个图像包含一个或两个标记的车辆实例。一个小的数据集对于探索更快的r-cnn训练过程很有用,但实际上,需要更多的标记图像来训练一个强大的探测器。
%加载车辆数据集
data = load('fasterRCNNVehicleTrainingData.mat');
vehicleDataset = data.vehicleTrainingData;
训练数据存储在表中。第一列包含图像文件的路径。其余列包含车辆的roi标签。
%显示数据集的前几行。
vehicleDataset(1:4,:)
ans = 4×2表
imageFilename车辆
__________________________ ____________ 'vehicles / image_00001.jpg'[1x4 double]
'vehicles / image_00002.jpg'[1x4 double]
'vehicles / image_00003.jpg'[1x4 double]
'vehicles / image_00004.jpg'[1x4 double]
显示数据集中的一个图像,以了解它所包含的图像类型。
%将完整路径添加到本地车辆数据文件夹。
dataDir = fullfile(toolboxdir('vision'),'visiondata');
vehicleDataset.imageFilename = fullfile(dataDir,vehicleDataset.imageFilename); %阅读其中一张图片。
我= imread(vehicleDataset.imageFilename {10}); %插入ROI标签。
I = insertShape(I,'Rectangle',vehicleDataset.vehicle {10}); %调整大小并显示图像。
我= imresize(I,3);
数字
imshow(I)
将数据集拆分为训练检测器的训练集和评估检测器的测试集。选择60%的培训数据。使用其余的进行评估。
%将数据拆分为训练和测试集。
idx = floor(0.6 * height(vehicleDataset));
trainingData = vehicleDataset(1:idx,:);
testData = vehicleDataset(idx:end,:);
创建一个卷积神经网络(cnn)
美国有线电视新闻网是更快的r-cnn物体探测器的基础。使用深度学习工具箱™功能逐层创建cnn。
从imageInputLayer
,它定义了输入层的类型和大小。对于分类任务,输入大小通常是训练图像的大小。对于检测任务,cnn需要分析图像的较小部分,因此输入大小必须与数据集中最小的对象相似。在此数据集中,所有对象都大于[16 16],因此请选择[32 32]的输入大小。此输入大小是cnn需要解析的处理时间和空间细节量之间的平衡。
%创建图像输入图层。
inputLayer = imageInputLayer([32 32 3]);
接下来,定义网络的中间层。中间层由convolution2dLayer
,reluLayer
单元和maxPooling2dLayer
的重复块组成。这些层构成了卷积神经网络的核心组成部分。
%定义卷积层参数。
filterSize = [3 3];
numFilters = 32; %创建中间层。
middleLayers = [ convolution2dLayer(filterSize,numFilters,'Padding',1)
reluLayer()
convolution2dLayer(filterSize,numFilters,'Padding',1)
reluLayer()
maxPooling2dLayer(3,'Stride',2) ]。
您可以通过重复这些基本图层来创建更深的网络。但是,为了避免过早地向下采样数据,请将池层的数量保持在较低的水平。在网络早期进行向下采样会丢弃对学习有用的图像信息。
有线电视美国新闻网的求最后一层通常由fullyConnectedLayer
状语从句:softmaxLayer
组成。
finalLayers = [ %添加具有64个输出神经元的完全连接的层。
此图层的输出大小%将是一个长度为64的数组。
fullyConnectedLayer(64) %添加ReLU非线性。
reluLayer() %添加最后一个完全连接的图层。此时,网络必须
%生成可用于测量输入图像
%
是否属于对象类或背景之一的输出。使用随后的损耗层进行该测量%。
fullyConnectedLayer(宽度(vehicleDataset)) %添加softmax损耗图层和分类图层。
softmaxLayer()
classificationLayer()
]。
合并输入,中间和最终图层。
layers = [
inputLayer
middleLayers
finalLayers
]
layers =
带有图层的11x1图层数组: 1''图像输入带有'zerocenter'标准化的32x32x3图像
2''卷积32 3x3卷积,步幅[1 1]和填充[1 1 1 1]
3''ReLU ReLU
4''卷积32 3x3卷积,步幅[1 1]和填充[1 1 1 1]
5''ReLU ReLU
6''Max Pooling 3x3 max pooling with stride [2 2]和padding [0 0 0 0]
7''完全连接64完全连接层
8''ReLU ReLU
9''完全连接2完全连接层
10''Softmax softmax
11''分类输出crossentropyex
配置培训选项
trainFasterRCNNObjectDetector
步骤训练探测器。前两个步骤培训了该地区的建议和检测网络,用于更快的r-cnn。最后两个步骤将前两个步骤中的网络组合在一起,以便创建一个用于检测的网络[1]。每个训练步骤可以有不同的收敛速度,因此为每个步骤指定独立的训练选项是有益的。若要指定网络培训选项,请使用trainingOptions
。
步骤1的选项%optionsStage1
= trainingOptions('sgdm',...
'MaxEpochs',10,...
'MiniBatchSize',1,......
'InitialLearnRate',1e-3,......
'CheckpointPath', TEMPDIR); 步骤2的选项%optionsStage2
= trainingOptions('sgdm',...
'MaxEpochs',10,...
'MiniBatchSize',1,......
'InitialLearnRate',1e-3,......
'CheckpointPath', TEMPDIR); 步骤3的选项%optionsStage3
= trainingOptions('sgdm',...
'MaxEpochs',10,...
'MiniBatchSize',1,......
'InitialLearnRate',1e-3,......
'CheckpointPath', TEMPDIR); %选项步骤4. optionsStage4
= trainingOptions('sgdm',...
'MaxEpochs',10,...
'MiniBatchSize',1,......
'InitialLearnRate',1e-3,......
'CheckpointPath', TEMPDIR); options = [
optionsStage1
optionsStage2
optionsStage3
optionsStage4
]。
在这里,前两个步骤的学习速率设置为高于最后两个步骤。由于最后两个步骤是微调步骤,因此网络权重的修改速度可能比前两个步骤慢。对于更快的r-cnn训练,迷你批处理大小必须为1,每次迭代都会从一个训练图像处理多个图像区域。
此外,'CheckpointPath'
设置为所有培训选项的临时位置。通过此名称值对,可以在训练过程中节省部分训练的检测器。如果培训中断(例如由于停电或系统故障),您可以从保存的检查点恢复培训。
火车更快r-cnn
现在已经定义了cnn和训练选项,您可以使用trainFasterRCNNObjectDetector
训练探测器。
在训练过程中,从训练图像中处理多个图像区域。每个图像的图像区域数由'NumRegionsToSample'
“控制。'PositiveOverlapRange'
和'NegativeOverlapRange'
名称 - 值对控制用于训练的图像区域。正训练样本是指那些与地面真相框重叠0.6到1.0的样本,用联合度量的边界框交点来衡量。负训练样本是那些重叠0到0.3的样本。应通过在验证集中测试训练的检测器来选择这些参数的最佳值。
对于更快的r-cnn培训,强烈建议使用一个并行的matlab工作人员池,以减少培训时间。trainFasterRCNNObjectDetector
您的并行首选项设置,自动创建并使用并行池。确保在培训之前启用了并行池的使用。
高度推荐具有cvida™以上计算能力的nvidia™依照gpu进行培训。
为了运动此示例时节省时间,将从磁盘加载预培训的网络。要自己训练网络,请将此处显示的doTrainingAndEval
变量设置为真。
%运行
%示例时,从磁盘加载经过训练的网络以节省时间。将此标志设置为true以训练网络。
doTrainingAndEval = false; if doTrainingAndEval
%设置随机种子以确保示例训练可重复性。
RNG(0); %训练更快的R-CNN探测器。选择BoxPyramidScale为1.2以允许
%以获得更精细的多尺度对象检测分辨率。
detector = trainFasterRCNNObjectDetector(trainingData,layers,options,...
'NegativeOverlapRange',[0 0.3],...
'PositiveOverlapRange',[0.6 1],...
'NumRegionsToSample',[256 128 256 128],.. 。
'BoxPyramidScale',1.2);
else
%负载预训练检测器的例子。
detector = data.detector;
结束
若要快速验证训练,请在测试图像上运行检测器。
%读取测试图像。
I = imread(testData.imageFilename {1}); %运行检测器。
[bboxes,scores] = detect(detector,I); %注释图像中的检测。
I = insertObjectAnnotation(I,'rectangle',bboxes,scores);
数字
imshow(I)
尽管测试一张图像显示出很有希望的结果,但并非所有测试图像都能产生检测结果。请在整个测试集中评估检测器,请按照下一节中概述的评估程序进行操作。
使用测试集评估检测器
计算机视觉系统工具箱™提供对象检测器评估功能,以测量常见的指标,如evaluateDetectionPrecision
平均精度()和对数平均漏诊率()。在这里,使用平均精度度量。平均精度提供了一个数字,其中包含了检测器进行正确分类的能力(精度)和检测器查找所有相关对象的能力(召回)。evaluateDetectionMissRate
检测器评估的第一步是通过在测试装置上运行检测器来收集检测结果。为了避免较长的评估时间,将从磁盘加载结果。将上一节doTrainingAndEval
标志设置为真,以便在本地执行评估。
if doTrainingAndEval
%在测试集中的每个图像上运行检测器并收集结果。
resultsStruct = struct([]);
for i = 1:height(testData) %阅读图像。
I = imread(testData.imageFilename {i}); %运行检测器。
[bbox,分数,标签] =检测(检测器,I); %收集结果。
resultsStruct(i).Boxes = bboxes;
resultsStruct(i).Scores =得分;
resultsStruct(i)。标签=标签;
结束 %将结果转换为表格。
results = struct2table(resultsStruct);
else
%从磁盘加载结果。
results = data.results;
结束 %从测试数据中提取预期的边界框位置。
expectedResults = testData(:,2:end); %使用“平均精度”度量标准评估对象检测器。
[ap,recall,precision] = evaluateDetectionPrecision(results,expectedResults);
精确召回(pr)曲线突出了探测器在不同召回水平下的精度。理想情况下,所有召回级别的精度为1. 在网络中使用其他图层有助于提高平均精度,但可能需要额外的培训数据和更长的培训时间。
%绘图精度/召回曲线
数字
图(召回,精度)
xlabel('召回')
ylabel('精确')
网格上
的标题(sprintf的('平均精密=%.2f',AP))
总结
这个例子展示了如何使用深度学习来训练车辆检测器。您可以按照类似的步骤为交通标志,行人或其他物体训练探测器。
引用
[1]任,s。,k。他,r。gershick和j。太阳。“更快的řCN:d ----使用区域建议网络实现实时目标检测”。模式分析与机器智能的IEEE交易。第39卷,第6期,2017年6月,1137至1149年页。
[2] girshick,r。,j。donahue,t。达雷尔和j。malik。“用于精确对象检测和语义分割的丰富特征层次结构。2014年ieee计算机视觉和模式识别会议论文集。俄亥俄州哥伦布市,2014年6月,580-587页。
[3] girshick,r。“快速r-nnn”。2015年ieee计算机视觉国际会议论文集。智利圣地亚哥,2015年12月,第1440-1448页。
[4] zitnick,cl,p。美元。“边缘框:边缘从定位对象建议欧洲计算机视觉会议。瑞士苏黎世,2014年9月,第3391-405页。
[5] uijlings,jrr,kea van de sande,t。gevers和awm meulders。“选择性搜索对象识别。国际计算机视觉杂志。第104卷,第2期,2013年9月,154-171页。
关注公众号: MATLAB基于模型的设计 (ID:xaxymaker) ,每天推送MATLAB学习最常见的问题,每天进步一点点,业精于勤荒于嬉。
打开微信扫一扫哦!
利用更快的r-cnn深度学习进行目标检测的更多相关文章
- 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN,Faster R-CNN
基于深度学习的目标检测技术演进:R-CNN.Fast R-CNN,Faster R-CNN object detection我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别.obj ...
- #Deep Learning回顾#之基于深度学习的目标检测(阅读小结)
原文链接:https://www.52ml.net/20287.html 这篇博文主要讲了深度学习在目标检测中的发展. 博文首先介绍了传统的目标检测算法过程: 传统的目标检测一般使用滑动窗口的框架,主 ...
- 基于深度学习的目标检测(object detection)—— rcnn、fast-rcnn、faster-rcnn
模型和方法: 在深度学习求解目标检测问题之前的主流 detection 方法是,DPM(Deformable parts models), 度量与评价: mAP:mean Average Precis ...
- 【深度学习】目标检测算法总结(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)
目标检测是很多计算机视觉任务的基础,不论我们需要实现图像与文字的交互还是需要识别精细类别,它都提供了可靠的信息.本文对目标检测进行了整体回顾,第一部分从RCNN开始介绍基于候选区域的目标检测器,包括F ...
- 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
object detection我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别.object detection要解决的问题就是物体在哪里,是什么这整个流程的问题.然而,这个问题 ...
- (转)基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
object detection我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别.object detection要解决的问题就是物体在哪里,是什么这整个流程的问题.然而,这个问题 ...
- 基于深度学习的目标检测算法:SSD——常见的目标检测算法
from:https://blog.csdn.net/u013989576/article/details/73439202 问题引入: 目前,常见的目标检测算法,如Faster R-CNN,存在着速 ...
- 深度学习中目标检测Object Detection的基础概念及常用方法
目录 关键术语 方法 two stage one stage 共同存在问题 多尺度 平移不变性 样本不均衡 各个步骤可能出现的问题 输入: 网络: 输出: 参考资料 What is detection ...
- 深度学习之目标检测:非极大值抑制源码解析(nms)
目标检测:nms源码解析 原理:选定一个阈值,例如为0.3,然后将所有3个窗口(bounding box)按照得分由高到低排序.选中得分最高的窗口,遍历计算剩余的2窗口与该窗口的IOU,如果IOU大于 ...
随机推荐
- .NET 平台上C#语言的基本技术点
第一次用画图3D画的知识点,有点丑..........开始Csharp之路
- 关于页面传参,decodeURI和decodeURIComponent
之前写过一个关于页面传参的,但是是前端相对于自己的页面做的跳转,也就是页面1,跳转到页面2,里面带的参数.这里可以参考我上一篇文章,包括里面参数中如果有数组和json格式的情况.但是需要注意的是,我前 ...
- 【表格】大于号转义符>---小于号转义符<
关于来源:百度及个人经验. 常用的都是个人尝试过或个人常用的,其它的都是从百度来的.使用前建议写个HTML的Demo试试看 ^_^ 比心 < < < 小于号 > > &g ...
- Percona XtraBackup 8.0, 安装与测试
Percona XtraBackup 8.0 是Percona XtraBackup新推出了一个针对MySQL8.0的版本,主要是MySQL8.0在Redo 和 数据库字典方面有了新的改进. Xtra ...
- Netty3:分隔符和定长解码器
回顾TCP粘包/拆包问题解决方案 上文详细说了TCP粘包/拆包问题产生的原因及解决方式,并以LineBasedFrameDecoder为例演示了粘包/拆包问题的实际解决方案,本文再介绍两种粘包/拆包问 ...
- [计算机视觉]100行python实现摄像机偏移、抖动告警
背景 在实际项目中,利用深度学习在检测道路车辆并分析车辆行为时,需要按照事先规定的方法绘制检测区(包含道路方向.车道区域等).由于各种原因(人为.天气),获取视频数据的摄像角度容易偏移原来设定的位置, ...
- 来一波C#发送邮件
1.所用工具和资源:VS2012 在.NET Frameword类库中提供SmtpClient类(System.NET.Mail) 2.运行截图 3.具体代码实现如下: using System; ...
- numpy操作
python中使用了numpy的一些操作,特此记录下来: 生成矩阵,替换值 import numpy as np # 生成一行10列的矩阵 dataset = np.zeros((1, 10)) # ...
- 让VS2019支持.NET Core WinForms和WPF设计器的临时办法(比微软给出的办法更方便)
参考以下代码片段,给项目添加NET Framework目标框架,切换到NET472运行时重新生成项目,然后打开设计器界面. 如果遇到设计器报错,尝试以NET472运行时为目标重新生成项目,并重新打开V ...
- Java集合详解4:HashMap和HashTable
今天我们来探索一下HashMap和HashTable机制与比较器的源码. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 喜欢的话麻烦star一下哈 ...