本文展示了如何使用MATLAB训练Faster R-CNN目标检测器,实现对车辆的检测。本例使用一个包含295张图像的小标记数据集。每个图像包含一个或两个已标记的车辆目标。一个小的数据集对于探索 Faster R-CNN 训练过程是有用的,但在实践中,需要更多的标注图像来训练一个鲁棒的检测器。

文章目录

  • 一、数据集准备
    • 1、数据集下载
    • 2、数据集加载
    • 3、数据集划分
    • 4、创建数据存储
  • 二、创建Faster R-CNN网络
    • 1、初始化参数
    • 2、创建网路
  • 三、训练网络
    • 1、设置训练选项
    • 2、加载模型训练
  • 四、车辆目标检测

一、数据集准备

1、数据集下载

本数据集中的许多图像来自加州理工学院1999年和2001年的汽车数据集,可以在加州理工学院计算视觉网站上获得,由Pietro Perona创建并经许可使用。

 % 下载一个预先训练过的检测器,以避免等待训练完成。如果您想训练检测器,请将doTraining变量设置为true。
doTraining = false;
if ~doTraining && ~exist('fasterRCNNResNet50EndToEndVehicleExample.mat','file')disp('Downloading pretrained detector (118 MB)...');pretrainedURL = 'https://www.mathworks.com/supportfiles/vision/data/fasterRCNNResNet50EndToEndVehicleExample.mat';websave('fasterRCNNResNet50EndToEndVehicleExample.mat',pretrainedURL);
end

2、数据集加载

下面进行解压缩车辆图像,加载数据集:

unzip vehicleDatasetImages.zip
data = load('vehicleDatasetGroundTruth.mat');
vehicleDataset = data.vehicleDataset;

车辆数据存储在一个两列表中,其中第一列包含图像文件路径,第二列包含车辆包围框。

3、数据集划分

将数据集分解为训练集、验证集和测试集。选择60%的数据用于训练,10%用于验证,其余的用于测试训练过的检测器。

rng(0)
shuffledIndices = randperm(height(vehicleDataset));
idx = floor(0.6 * height(vehicleDataset));trainingIdx = 1:idx;
trainingDataTbl = vehicleDataset(shuffledIndices(trainingIdx),:);validationIdx = idx+1 : idx + 1 + floor(0.1 * length(shuffledIndices) );
validationDataTbl = vehicleDataset(shuffledIndices(validationIdx),:);testIdx = validationIdx(end)+1 : length(shuffledIndices);
testDataTbl = vehicleDataset(shuffledIndices(testIdx),:);

4、创建数据存储

使用imageDatastore和boxLabelDatastore创建用于在培训和评估期间加载图像和标签数据的数据存储。

imdsTrain = imageDatastore(trainingDataTbl{:,'imageFilename'});
bldsTrain = boxLabelDatastore(trainingDataTbl(:,'vehicle'));imdsValidation = imageDatastore(validationDataTbl{:,'imageFilename'});
bldsValidation = boxLabelDatastore(validationDataTbl(:,'vehicle'));imdsTest = imageDatastore(testDataTbl{:,'imageFilename'});
bldsTest = boxLabelDatastore(testDataTbl(:,'vehicle'));

组合图像和标签数据存储:

trainingData = combine(imdsTrain,bldsTrain);
validationData = combine(imdsValidation,bldsValidation);
testData = combine(imdsTest,bldsTest);

下面来展示数据集中的一张图片和对应的标签框:

data = read(trainingData);
I = data{1};
bbox = data{2};
annotatedImage = insertShape(I,'Rectangle',bbox);
annotatedImage = imresize(annotatedImage,2);
figure
imshow(annotatedImage)

原图和标签如下:

二、创建Faster R-CNN网络

Faster R-CNN目标检测网络由特征提取网络和两个子网络组成。特征提取网络通常是预先训练的CNN,如ResNet-50或Inception v3。在特征提取网络之后的第一个子网络是区域建议网络(RPN),训练它生成候选区域——图像中可能存在目标的区域。第二个子网络被训练来预测每个对象提议的实际类别。

特征提取网络通常是预先训练的CNN,本例使用ResNet-50进行特征提取。您还可以使用其他预先训练过的网络,如MobileNet v2或ResNet-18,这取决于您的应用程序需求。

1、初始化参数

使用fasterRCNNLayers创建Faster R-CNN网络,需要你指定几个参数:

1)确定网络输入图片的大小

inputSize = [224 224 3];

2)指定锚框大小和个数

numAnchors = 3;
anchorBoxes = [29 17; 46 39; 136 116];

3)确定特征提取网络

featureExtractionNetwork = resnet50;

在使用 ResNet-50 之前,需要打开附加功能资源管理器,并点击安装Deep Learning Toolbox Model for ResNet-50
Network

2、创建网路

选择’activation_40_relu’作为特征提取层。该特征提取层输出特征映射,向下采样的因子为16。这种向下采样量是空间分辨率和提取特征强度之间的一个很好的权衡,因为进一步向下提取的特征以空间分辨率为代价编码更强的图像特征。选择最优的特征提取层需要实证分析。您可以使用analyzeNetwork来查找网络中其他潜在特征提取层的名称。

% 特征提取层
featureLayer = 'activation_40_relu';
% 定义类别
numClasses = width(vehicleDataset)-1;
% 创建网络
lgraph = fasterRCNNLayers(inputSize,numClasses,anchorBoxes,featureExtractionNetwork,featureLayer);

三、训练网络

1、设置训练选项

使用trainingOptions指定网络训练选项,设置’ValidationData’为预处理的验证数据。将CheckpointPath设置为临时位置。这使得在训练过程中能够保存部分训练过的检测器。如果训练被中断,例如断电或系统故障,您可以从保存的检查点恢复训练。

options = trainingOptions('sgdm',...'MaxEpochs',10,...'MiniBatchSize',2,...'InitialLearnRate',1e-3,...'CheckpointPath',tempdir,...'ValidationData',validationData);

2、加载模型训练

如果doTraining为true,则使用trainFasterRCNNObjectDetector训练Fast R-CNN对象检测器。否则,加载预训练的网络。

if doTraining[detector, info] = trainFasterRCNNObjectDetector(trainingData,lgraph,options, ...'NegativeOverlapRange',[0 0.3], ...'PositiveOverlapRange',[0.6 1]);
else% Load pretrained detector for the example.pretrained = load('fasterRCNNResNet50EndToEndVehicleExample.mat');detector = pretrained.detector;
end

四、车辆目标检测

为了检查训练效果,我们读取一张测试图像,并运行训练好的检测器。

% 读取图片
I = imread(testDataTbl.imageFilename{3});
% 将图像调整为与训练图像相同的大小
I = imresize(I,inputSize(1:2));
% 运行检测器
[bboxes,scores] = detect(detector,I);% 显示效果
I = insertObjectAnnotation(I,'rectangle',bboxes,scores);
figure
imshow(I)

显示检测结果:

【MATLAB深度学习】采用Faster R-CNN实现车辆目标检测相关推荐

  1. 基于Matlab深度学习Yolov4-tiny的交通标志识别道路标志识别检测

    交通标志检测是辅助驾驶.自动驾驶系统中的重要组成部分,针对交通标志检测任务中复杂环境下的小目标检测精度低的问题,提出一种基于YOLOv4-tiny的交通标志检测方法. 基于Matlab深度学习的道路标 ...

  2. 分割点云数据_3D点云深度学习综述:三维形状分类、目标检测与跟踪、点云分割等...

    3D点云学习( Point Clouds)作为近年来的研究热点之一,受到了广泛关注,每年在各大会议上都有大量的相关文章发表.当前,点云上的深度学习变得越来越流行,人们提出了许多方法来解决这一领域的不同 ...

  3. 温州大学《深度学习》课程课件(九、目标检测)

    这学期我上的另一门课是本科生的<深度学习>,主要用的是吴恩达老师的<深度学习>视频课的内容. 使用教材:吴恩达<深度学习>课程笔记 课外参考书:<深度学习&g ...

  4. 吴恩达深度学习4.3笔记_Convolutional Neural Networks_目标检测

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/weixin_42432468 学习心得: 1.每周的视频课程看一到两遍 2.做笔记 3.做每周的作业 ...

  5. 深度学习/自动驾驶数据集大集合(目标检测/图像分割/语义分割/图像分类/)

    CIFAR-10数据集 CIFAR-10数据集(加拿大高级研究所,10类)是 Tiny Images 数据集的一个子集,由60000个32x32彩色图像组成.这些图片被贴上了10个相互排斥类别的标签: ...

  6. 系统学习深度学习(四) --CNN原理,推导及实现源码分析

    之前看机器学习中,多层感知器部分,提到可以在设计多层感知器时,对NN的结构设计优化,例如结构化设计和权重共享,当时还没了解深度学习,现在看到CNN,原来CNN就是这方面的一个代表.CNN由纽约大学的Y ...

  7. 深度学习(03)-- CNN学习

    文章目录 目录 1.CNN学习 2.Keras深度学习框架 目录 1.CNN学习 卷积神经网络CNN总结 从神经网络到卷积神经网络(CNN) 我们知道神经网络的结构是这样的: 那卷积神经网络跟它是什么 ...

  8. Faster R CNN

    Faster R CNN 3 FASTER R-CNN 我们的Faster R CNN 由两个模块组成,第一个模块是 proposes regions 的全卷积网络,第二个是使用 proposed r ...

  9. 深度学习(主要是CNN)用于图片的分类和检测总结

     深度学习(主要是CNN)用于图片的分类和检测总结 2014-12-4阅读920 评论0 前言: 主要总结一下自己最近看文章和代码的心得. 1. CNN用于分类:具体的过程大家都知道,无非是卷积, ...

最新文章

  1. ASP.NET 2.0 中的新增安全功能
  2. TFS2008 + Windows2003 + Sql2005 安装注意事项
  3. Algorithms_算法专项_Hash算法的原理哈希冲突的解决办法
  4. SQL SERVER 常用日期计算
  5. [NOI2012(bzoj2879)(vijos1726)]美食节 (费用流)
  6. zabbix监控系列(5)之通过trap模式监控网络设备
  7. lua windows下编译
  8. 程序员找 Bug 福音!微软全新开源查找修复 Bug 工具——Project OneFuzz
  9. java统计空间占用_如何计算Java对象占用了多少空间?
  10. Android关于Theme和style的总结
  11. 网卡驱动修改服务器,改造INTEL网卡驱动使桌面型网卡支持Windows Server 2012、2016、2019系统...
  12. Mac彻底卸载搜狗输入法,看这一篇就够了
  13. Ant design
  14. 数据结构与算法面试题80道
  15. Win11新建不了文本文档?Win11右键无法新建文本文档的解决方法
  16. python回到本次循环开头_如何循环回到程序的开头?Python
  17. [java基础入门]java期末常考题。定义一个父类person,该类中有两个私有的属性姓名name和age,实现两个属性的封装 定义构造等等来初始化成员变量name和age,在定义显示show方法将
  18. Milvus 群星闪耀时|又一个小目标达成 :社区正式突破 15,000 星!
  19. C语言程序设计——结构体
  20. 先验分布/后验分布/似然估计/贝叶斯公式

热门文章

  1. 我知道的汽车VIN码
  2. 开发了一款Linux服务器管理软件,邀请你体验
  3. matlab dpsk,Matlab之DPSK
  4. 定位基站和定位信标的区别
  5. QQ上线新功能,微信用户要羡慕哭了!
  6. java_final、权限、内部类、引用类型
  7. 【ATA】基于FPGA的高速数据采集ATA (Advanced Technology Attachment)接口verilog开发
  8. 15s了解什么是物联网技术
  9. stm32控制直流电机的正反转及转速(2)
  10. Graph Algorithms(图算法)