【目标检测】目标检测篇--初识R-CNN系列

目标检测篇–初识R-CNN

题目名称:Rich feature hierarchies for accurate object detection and semantic segmentation
论文地址:https://arxiv.org/pdf/1311.2524.pdf
提出时间:2014年

1.R-CNN:Region with CNN features

用CNN提取出Region Proposals中的features,然后进行SVM分类与bbox的回归。
网络描述如下:
网络描述
R-CNN算法流程:
1.一张图片使用Selective Search算法生成1k~2k个候选区域
2.对每个候选区域使用CNN提取特征
3.特征送入每一类的SVM分类器中,判断是否属于该类
4.使用回归器精细修正候选框位置·

2. SS:Selective Search

该算法由IJCV 2012的论文《Selective Search for Object Recognition》Uijlings,et.提出,是R-CNN和Fast R-CNN的区域推荐算法。在R-CNN中,其结果为在训练过程中该算法用于从输入图像中搜索出2000个Region Proposal。R-CNN系列算法属于two-stage目标检测算法,首先算法产生目标候选框(RP:Region Proposal),然后对候选框进行分类与回归。一般可以在图片上使用穷举法或者滑动窗口法选出所有物体可能出现的区域框,对这些区域框提取特征并进行使用图像识别分类方法,得到所有分类成功的区域后,通过非极大抑制输出结果。穷举法或者滑动窗口法都是在原始图片上进行不同尺度大小的滑窗,这样做复杂度太高,而且产生了很多不包含物体的框,而且框的大小不可能每一个尺寸都有,所以框住物体的框很可能位置不准确,而选用SS就能有效地去除冗余候选区域,使得计算量大大减小。

SS采用一种具备层次结构的算法来解决不同尺寸的候选框检测物体的问题,得到一个层次化的区域结构,而这些结构中就包含着可能需要的物体,SS只负责快速地生成可能是物体的区域,而不做具体的检测。

SS算法主要步骤:
在这里插入图片描述
图片来自博文:选择性搜索算法(Selective Search)超详解(通俗易懂版)

3.提取特征送入分类器

在实际测试中,模型需要通过CNN提取出Region Proposal中的特征,用于后面的分类与回归,但是由于物体标签训练数据少,如果直接采用随机初始化CNN参数的方法,无法从零训练出一个好的CNN模型,因此采用一个大数据集来训练AlexNet,再进行微调,微调时使用的时从每张VOC训练图像中搜索到的Region Proposal。

将2000个候选框缩放到227x227像素,接着将候选框区域输入事先训练好的AlexNet网络,获取4096维的特征,即得到2000x4096维矩阵。(因为R-CNN模型实际测试时,是通过CNN对VOC数据集中每张输入图像上搜索到的2000个Region Proposal提取特征的,而建议框大小不一致,且AlexNet要求输入图像大小为227x227,所以需要对RP进行Resize操作,变形到227x227,变形之前,在候选框周围加上16的padding,再进行各向异性缩放,可以使得mAP提高3到5个百分点。)

将获得的2000x4096维矩阵与20个(分类个数,VOC数据集有20个类别)SVM组成权值矩阵(4096x20)相乘,得到,每个候选框是某个目标类别的得分矩阵(2000x20),分别对得分矩阵中的每一列进行非极大值抑制(Non Maximum Suppression),剔除重叠的候选框,得到该类别中得分最高的一些候选框。

NMS剔除重叠的建议框,采用IoU(Intersection over Union:A与B的交集/A与B的并集,又称交并比)寻找得分最高的目标,计算其他目标与该目标的IoU值,删除所有IoU值大于给定阈值的目标,再次寻找得分最高的目标。

  • 先针对每一个类别,找到得分最高的候选框A
  • 计算其他候选框B与A的IoU
  • 如果IoU大于设定的阈值,则删除B
  • 执行第二步,删除某一类别所有IoU大于阈值的候选框
  • 执行第一步,直到遍历完所有的类别

最后得到一个类别只有一个最完美的候选框。

4.使用回归器修正候选框位置

对NMS处理后剩余的候选框进行进一步筛选和剔除后,分别用20个回归器对上述20个类别中剩余的候选框进行回归操作,最终得到每个类别修正后得分最高的bounding box。在回归过程中,依然使用CNN的输出向量(2000x4096)。

5.测试过程

1.RP的确定
使用SS算法,根据相似度从大到小排序,筛出2000个region proposals;

2.RP的特征提取

将RP resize成227x227,然后分别输入进CNN特征提取网络,得到2000个4096维的特征;

3.SVM分类
将2000x4096维矩阵输入进SVM分类器中,最终得到2000x20(或者2000x21,计算上背景)矩阵,每一行的20个列值,分别代表了这个RP属于每一个类的可能性,通过提前设置好的背景阈值和类别阈值,筛选出满足条件的m个RP区域;

4.边界框回归
将2000x4096维矩阵输入到4096x4的回归矩阵d中,最后输出2000x4维的偏移矩阵。代表RP中心点的位置偏移和bbox的尺寸变换,将SVM筛选出的m个RP区域对应的特征向量,组成m x 4096维矩阵,代入4096x4的回归矩阵d中,最后输出m x 4维偏移矩阵;

5.NMS处理
只画出SVM筛选出的m个RP区域的修正后的检测框。考虑到bbox的大量重叠,进行非极大抑制,得到最终检测结果。

NMS过程
图片来源:R-CNN史上最全讲解

6.R-CNN算法存在的问题

1.测试速度慢

  • 测试一张图片约53s(CPU)

    • 用Selective Search算法提取候选框用时越2s
    • 一张图像内候选框之间存在大量重叠,导致提取特征操作冗余。

2.训练速度慢

  • 训练过程极其繁琐

3.训练所需空间大

训练SVM和BBox回归需要从每个图片中的每个目标候选框提取特征并写入磁盘。对于非常深的网络,如VGG-16, 从VOC 2007训练集上的5k图片上提取的特征需要数百GB的存储空间。

初识Fast R-CNN

题目名称:Fast R-CNN
论文地址:https://arxiv.org/pdf/1504.08083.pdf
代码链接:https://github.com/rbgirshick/fast-rcnn
提出时间:2015年

Fast R-CNN是R-CNN的升级版,同样使用VGG-16作为网络的backbone。Fast R-CNN主要是为了解决R-CNN的以下问题:

  • 训练分多步进行,R-CNN首先要预训练一个CNN网络用于提取特征,还要经过fine-tunning即微调,然后对每个类别训练一个分类器,还要用回归器对bbox进行回归,另外使用SS生成RP步骤繁琐。
  • 同时,时间和内存消耗较大,再训练和回归的时候需要用网络训练的特征作为输入,特征保存再磁盘上,读取时间消耗巨大。
  • 测试时也较慢,每张图片的每个RP区域都要做卷积,重复操作太多。
    Fast R-CNN模型结构
    由模型图可知,Fast R-CNN剔除了R-CNN中的SVM分类器和bbox线性回归器,而是将两者都放在一体化网络中,运用ROI-Pooling层,将大小不一的RP转换成同样的size,因此将整张图像经过SS操作后,直接输入进CNN层,一次性对所有的RP完成分类和bbox回归。将整张图使用SS算法提取出2000个候选区域,将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到特征图上获得相应的特征矩阵,将每个矩阵通过ROI Pooling层缩放到7x7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果。

Fast R-CNN主要有以下三个改进:

1.卷积不再是对每个region proposal进行,而是直接对整张图像,这样减少了很多重复计算,原来的R-CNN对每个RP区域分别做卷积,因为一张图像中有2000左右的RP,相互之间重叠率极高,产生了不少重复计算。
2.用RoI Polling进行特征的尺寸变换,因为全连接层的输入要求尺寸大小一样,因此不能直接把RP作为输入。
3.将回归器放进网络一起训练,每个类别对应一个回归器,同时用softmax代替原来的SVM分类器

因此,Fast R-CNN相对于R-CNN来说,在训练速度上比R-CNN快了将近9倍,比SPPnet快大概3倍;测试速度比R-CNN快了近213倍,比SPPnet快了10倍。在VOC2012上的mAP在66%左右。

1.训练步骤

首先用ILSVRC 20XX数据集对VGG-16进行有监督的分类预训练。
VGG16网络结构含有参数的网络层一共有16层,即13个卷积层,5个池化层,3个全连接层。
VGG网络
图片来自:经典卷积神经网络—VGG16详解

2.Fine-tunning

进行完训练之后,需要对模型加以修改,然后在PASCAL VOC样本上进行调优训练。

1.转化预训练模型

微调前,需要先对有监督预训练后的模型进行3步转化:

  • RoI池化层取代有监督预训练后的VGG-16网络最后一层池化层;
  • 两个并行层取代VGG-16网络的最后一层全连接层和softmax层,并行层之一是新全连接层1+原softmax层1000个分类输出修改为21个分类输出【20种类+背景】,并行层之二是新全连接层2+候选区域窗口回归层;
  • 上述网络由原来的单输入:一系列图像 -> 双输入:一系列图像和这些图像中的一系列候选区域。

2.训练图像的RP与ROI选择
在调优训练时,每一个mini-batch中首先加入N张完整图片,而后加入从N张图片中选取的R个ROI,这R个ROI可以复用N张图片前5个阶段的网络特征,这里取N=2,R=128,即每个mini-batch中包含2张图像,对他们进行SS区域搜索算法后,采样出128个ROI,也就是每张图像有64个ROI。(对于每张图片上的2000个候选区域,我们并不是全都使用,我们只使用其中的64个候选框作为我们的ROI:Region of Interest)
在这里插入图片描述

相比于R-CNN、SPP-net,有一个明显改进时采用了多任务策略,Fast R-CNN网络有两个并行的输出分支,对于每个ROI,第一个分支计算k个目标类别+1个背景类别的分类概率,第二个输出分支计算候选框归一化的偏移量和缩放尺度。

3.输入网络中进行调优训练
输入图像是224*224,不满足的先resize。经过5个卷积层和2个降采样层(降采样层跟在第一个和第二个卷积层后面)后,进入ROI Pooling层,该层的输入是conv5层的输出和region proposal(约为2000个),然后再经过两个都是output是4096的全连接层,最后分别经过output个数是21和84的两个全连接层,这两个全连接层是并列的不是前后关系,前者是分类的输出,代表每个region proposal属于每个类别的得分,后者是回归的输出,代表每个RP的四个坐标,最后是两个损失层,分类softmaxWithLoss,输入的是label和分类层的得分,回归的是SmoothL1Loss,输入的是回归层的输出和target坐标以及weights。

两个全连接层
图片来自:【目标检测】Fast RCNN算法详解
cls_score层用于分类,输出K+1维数组p,表示K类和背景的概率
bbox_predict层用于调整候选区域位置,输出4*k维数组t。

2.测试步骤

每个输入图像经过SS后得到2000个候选区域ROI,经过网络后输出每一个ROI的分类结果,根据分类阈值留下有效ROI,并结合bbox回归预测调整预测框,最后再经过NMS,去除重叠现象,留下最终的检测框。

Fast R_CNN基本结构
图片来自:【目标检测】Fast RCNN算法详解

3.Fast R-CNN的缺点

RP的提取使用的仍是SS算法,耗时严重。

Faster R-CNN

题目名称:Fast R-CNN
论文地址:https://arxiv.org/abs/1506.01497
代码链接:https://github.com/rbgirshick/py-faster-rcnn
提出时间:2016年
在这里插入图片描述
图片来自:一文读懂Faster RCNN(大白话,超详细解析)

Fast R-CNN虽然提出了ROI Pooling的特征提取方式,很好地解决了传统R-CNN中将RP区域分别输入CNN网络的弊端,但是始终用的是传统的SS算法来缺点RP,训练和测试时消耗了大量的时间在RP搜索上,而Faster R-CNN突破性地使用了RPN网络直接提取出RP,并将其融入进整体网络中,使得综合性能有较大提高,在检测速度方面尤为明显。
区域建议网络(Region Proposal Network简称RPN),RPN进行端到端训练以生成高质量的区域提议,Fast R-CNN使用这些区域提议进行检测。通过共享RPN和Fast R-CNN的卷积特征,进一步将RPN和Fast R-CNN合并成一个单独的网络。
Faster R-CNN抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。

RPN全流程:
1.RPN的输入是公共Feature Map特征图,形状N*(HW),经过33卷积层输出得到256*(H*W)的conv feature map特征图;
2.conv feature map特征图的每个点(256d特征向量)经过FC全连接层后得到2个分数和4个坐标(2个分数:前景得分和背景得分,不需要判断类别,4个坐标是中心点位置以及宽高);
3.以上过程每个点一共计算k次(k为每个点的anchor数量,作者实验默认给出9个)。

Faster R-CNN算法流程:

  • 将图像输入网络得到相应的特征图;
  • 使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵;
  • 将每个特征矩阵通过ROI Pooling层缩放到7x7大小的特征图,接着将特征图展平,通过一系列全连接层得到预测结果。
    在这里插入图片描述

1.Conv Layers

Conv Layers包含了conv,pooling,relu三层。VGG16中所有的conv层都是kernel_size=3,padding=1,stride=1;所有的pooling层都是kernel_size=2,padding=0,stride=2。经过conv layers模块后,一个MxN大小的输入图像就变为了(M/16)x(N/16)的Feature Map。(以python版本中的VGG16模型中faster_rcnn_test.pt的网络结构为例。onv layers部分共有13个conv层,13个relu层,4个pooling层。卷积层计算公式n=(W-F+2P)/S+1 其中n为输出大小,W为输入大小,F为卷积核大小,P为填充值大小,S为步长大小,在这里,取N=800,M=600,那么,卷积得n=(800-3+2)/1+1=800,池化得n=800/2=400,所以经过四次池化即为M/16,N/16)

2.Region Proposal Networks

在这里插入图片描述
图片来自:一文读懂Faster RCNN(大白话,超详细解析)
RPN结构有两条线,上面一条通过softmax分类,anchors获得positive和negative分类,下面一条用于计算对于anchors得bounding box regression偏移量,以获得精确得proposal。
最后得Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取修正后的proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposals Layer这里,就完成了相当于目标定位的功能。
原论文图
首先在经过conv layers提取到的feature map上,用3x3的滑动窗口进行滑动,每滑动到一个地方就生成一个一维的向量,再经过两个全连接层生成目标概率和边界框回归参数,生成2k个目标概率,分别是前景概率和背景概率,其中k是锚框数量(anchor大小固定),论文中取9。一维向量256-d是使用的backbone的深度即channel数。
anchor的选取有三种尺度(面积){128 ^2, 256 ^2, 512 ^2}
三种比例{1:1,1:2,2:1},每个位置在原图上都应有3x3=9个anchor。对于一张1000x600x3的图像,大约有60x40x9(约20000)个anchor,忽略跨越边界的anchor后,剩下约6k个anchor,对于RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IOU设置为7,这样每张图片只剩下2k个候选框。

3.训练RPN的正负样本

从每张图片中随机采样256个anchors取计算每一个mini-batch的损失函数,其中正负样本数应为1:1,如果正样本数量低于128,则用负样本进行填充,即正样本和负样本之和仍为256。正样本即与Ground-Truth的IoU达0.7的或在每一个anchor与GT的IoU值都不到0.7的时候,把IoU值最大的标记为正样本,负样本为与所有的GT的IoU值都低于0.3的。正负样本之外的样本全部丢弃掉。

4.RPN的损失

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
图片来自up

Faster R-CNN训练

原论文中采用分别训练RPN Loss、Fast R-CNN Loss的训练方法

  1. 利用ImageNet预训练分类模型,初始化前置卷积网络层参数,并开始单独训练RPN网络参数;
  2. 固定RPN网络独有的卷积层以及全连接层参数,再利用ImageNet预训练分类模型,初始化前置卷积网络参数,并利用RPN网络生成的目标建议框去训练Fast R-CNN网络参数;
  3. 固定利用Fast R-CNN训练好的前置卷积网络层参数,去微调RPN网络独有的卷积层以及全连接层参数;
  4. 同样保持固定前置卷积网络层参数,去微调Fast R-CNN网络的全连接层参数,最后RPN网络与Fast R-CNN网络共享前置卷积层网络参数,构成一个同一网络。
    在这里插入图片描述
    图片来自:一文读懂Faster RCNN(大白话,超详细解析)

总结:

这篇博客写的很不错,可以看看目标检测之 R-CNN系列
刚刚开始在目标检测领域的学习,还有很多很多很多不会的东西,要继续加油学呀!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值