【目标检测】FasterRcnn
目标检测模型的进化路线如下:
RCNN->SPP-NET->FastRcnn->FasterRcnn
FasterRcnn在目标检测领域继RCNN和FastRcnn之后的又一力作。把目标检测的速度提升到了实时的水准。谨以此文记录自己的学习心得。欢迎志同道合之士讨论(联系方式在后面)。
正文开始:
下表是RCNN、FastRcnn(二者参考这一片篇文章https://www.cnblogs.com/skyfsm/p/6806246.html)以及FasterRcnn的整体的模型结构图。图中显示出
Rcnn:
1、采用选择性搜索算法在输入图片中进行选择性搜索,选出可能具有目标的区域,并进行保存。
2、把第一步获取到的区域图片通过深度卷积网络进行特征提取,提取出区域图片的图像特征。
3、第二步获取到的区域图像特征输入到多个SVM二分类中,判断区域图片是否是本SVM负责的类别。
4、通过边界回归对选择框的位置进行修正。
FastRcnn:
1、采用选择性搜索算法在输入图片中进行选择性搜索,选出可能具有目标的区域,并进行保存。
2、把RCNN中的特征提取与分类以及对区域框位置的修正整合到一个深度网络模型中。
FasterRcnn:
FasterRcnn:
核心就是把FastRcnn模型中的由选择性搜索实现的区域推荐使用RPN( 区域推荐网络)来代替,真正的把网络模型给实现了端到端的训练。
现在来介绍一下RCNN系列每次进化都解决了什么问题。
Rcnn模型较之前的目标检测模型解决的问题:
问题一:速度
经典的目标检测算法使用滑动窗法依次判断所有可能的区域。RCNN则预先提取一系列较可能是物体的候选区域,之后仅在这些候选区域上提取特征,进行判断。
问题二:训练集
经典的目标检测算法在区域中提取人工设定的特征(Haar,HOG)。本文则需要训练深度网络进行特征提取。可供使用的有两个数据库:
一个较大的识别库(ImageNet ILSVC 2012):标定每张图片中物体的类别。一千万图像,1000类。 一个较小的检测库(PASCAL VOC 2007):标定每张图片中,物体的类别和位置。一万图像,20类。 RCNN使用识别库进行预训练,而后用检测库调优参数。最后在检测库上评测。
Rcnn存在问题:
问题一:测试时速度慢
RCNN一张图像内候选框之间大量重叠,提取特征操作冗余。
FastRcnn将整张图像归一化后直接送入深度网络。在邻接时,才加入候选框信息,在末尾的少数几层处理每个候选框。
问题二:训练时速度慢
原因同上。
在训练时,fastrcnn先将一张图像送入网络,紧接着送入从这幅图像上提取出的候选区域。这些候选区域的前几层特征不需要再重复计算。
问题三:训练所需空间大
RCNN中独立的分类器和回归器需要大量特征作为训练样本。 fastrcnn把类别判断和位置精调统一用深度网络实现,不再需要额外存储。
FastRcnn存在的问题:
还是需要选择推荐算法来单独对相关区域进行推荐。
FasterRcnn解决的就是这个问题:引入RPN区域推荐网络,把区域推荐的功能也整合到了整个的网络模型中。
下面,详细的说一下FaterRcnn的整个结构细节。(内容很丰富呦,要耐心呦!)
FaterRcnn整体的结构就是在FastRcnn的基础上加入了RPN网络模型实现区域推荐,代替原来的ss,这样整个网络模型就全部整合到一个深度网络模型中了。
网络模型示意图如下:(借用一下https://www.cnblogs.com/skyfsm/p/6806246.html当中的模型图)
在最后的一个卷积网路层的输出后面,加上RPN网络,经过RPN网络的特征图带有了推荐区域。
下面详细介绍一下这个RPN:
整个网路模型中有四个损失函数:
RPN calssification(anchor good.bad)
RPN regression(anchor->propoasal)
Fast R-CNNclassification(over classes)
Fast R-CNNregression(proposal ->box)
从前面阶段的多层卷积网络提取特征后获得到的输出图像特征feature为51*36*256(256为feature的深度)。这个feature就是RPN网络的输入图像。
在接下来的描述中,涉及到了两个关键词,一个是anchor(锚点),一个是sliding window(滑动窗口)。Feature输入到RPN网络中后,有一个3*3的滑动窗口,以stride=1,padding=2的方式,以feature中的51*36的每一个点为中心点进行相应操作。(这下放到后面说)。
在说操作之前我们需要知道 anchor 的本质是什么,本质是 SPP(spatial pyramid pooling)(空间金字塔池化) 思想的逆向。而SPP本身是做什么的呢,就是将不同尺寸的输入 resize 成为相同尺寸的输出(fastRcnn中)。所以SPP的逆向就是,将相同尺寸的输出,倒推得到不同尺寸的输入。接下来是 anchor 的窗口尺寸,这个不难理解,三个面积尺寸(128^2,256^2,512^2),然后在每个面积尺寸下,取三种不同的长宽比例(1:1,1:2,2:1).这样一来,我们得到了一共9种面积尺寸各异的 anchor 。示意图如下
三种颜色的方框代表三种不同大小,每种颜色三个方框代表在相同的大小下,不同的长宽比的方框。
下面说说上面提到的相应操作。原始图片已经经过一系列卷积层和池化层以及relu,得到了 feature:51x39x256(256是层数),就是要输入到RPN网络的特征图。
在这个特征参数的基础上,通过一个3x3的滑动窗口,在这个51x39的区域上进行滑动,stride=1,padding=2,这样一来,滑动得到的就是51x39个3x3的窗口。对于每个3x3的窗口,作者就计算这个滑动窗口的中心点所对应的原始图片的中心点。
然后作者假定,这个3x3窗口,是从原始图片上通过SPP池化得到的,而这个池化的区域的面积以及比例,就是一个个的anchor。换句话说,对于每个3x3窗口,作者假定它来自9种不同原始区域的池化,但是这些池化在原始图片中的中心点,都完全一样。这个中心点,就是刚才提到的,3x3窗口中心点所对应的原始图片中的中心点。
如此一来,在每个窗口位置,我们都可以根据9个不同长宽比例、不同面积的anchor,逆向推导出它所对应的原始图片中的一个区域,这个区域的尺寸以及坐标,都是已知的。而这个区域,就是我们想要的 proposal。所以我们通过滑动窗口和anchor,成功得到了 51x39x9 个原始图片的 proposal。
接下来,每个 proposal 我们只输出6个参数:每个 proposal 和 ground truth 进行比较,把与ground truth 中重叠最大的 bounding box 的iou当成是这个proposal的iou, iou>0.7, 认为这个proposal是positive;iou<0.3, 认为这proposal是negative,我们希望positive的proposal包含前景的概率高一些,negative包含背景的概率高一些;iou位于这之间的不做处理。
然后对每个proposal进行分类和bounding box regression:得到的前景概率和背景概率(2个参数)(就是RPN calssification);由于每个 proposal 和 ground truth 位置及尺寸上的差异,从 proposal 通过平移放缩得到 ground truth 需要的4个平移放缩参数(RPN regression(anchor->propoasal)。 所以根据我们刚才的计算,我们一共得到了多少个anchor box呢? 51x 39 x 9 = 17900
约等于 20 k。
经过RPN层就获得到了具有目标的区域,再通过ROI pooling层,把经过RPN网络中的regressing修正过的目标区域对应的feature进行统一到相同的输出,方便后面的的目标分类(论文中是20个类别)和进一步的bounding box位置回归。
接下来说一说整个网络模型中的损失函数。在RPN网络输出后,有两个损失函数,分别为判断是否为目标的损失函数,以及对目标框的修正的损失函数。此阶段在FastRcnn中就实现了多任务损失。
为了训练RPN,我们给每个anchor分配一个二进制的标签(是不是目标)。我们分配正标签给两类anchor:(i)与某个ground truth(GT)包围盒有最高的IoU(Intersection-over-Union,交集并集之比)重叠的anchor(也许不到0.7),(ii)与任意GT包围盒有大于0.7的IoU交叠的anchor。注意到一个GT包围盒可能分配正标签给多个anchor。我们分配负标签给与所有GT包围盒的IoU比率都低于0.3的anchor。非正非负的anchor对训练目标没有任何作用。
有了这些定义,我们遵循Fast R-CNN中的多任务损失,最小化目标函数。我们对一个图像的损失函数定义为
这里,i是一个mini-batch中anchor的索引,Pi是anchor i是目标的预测概率。如果anchor为正,GT标签Pi* 就是1,如果anchor为负,Pi* 就是0。ti是一个向量,表示预测的包围盒的4个参数化坐标,ti* 是与正anchor对应的GT包围盒的坐标向量。分类损失*Lcls是两个类别(目标vs.非目标)的对数损失
对于坐标位置的回归损失*,我们用来计算,其中R是论文中定义的鲁棒的损失函数(smooth L1)。 定义如下:
Pi* Lreg这一项意味着只有正anchor(Pi* =1)才有回归损失,其他情况就没有(Pi* =0)。cls层和reg层的输出分别由{pi}和{ti}组成,这两项分别由Ncls和Nreg以及一个平衡权重λ归一化(早期实现及公开的代码中,λ=10,cls项的归一化值为mini-batch的大小,即Ncls=256,reg项的归一化值为anchor位置的数量,即Nreg~2,400,这样cls和reg项差不多是等权重的。
对于回归,我们学习[6]采用4个坐标:
x,y,w,h指的是包围盒中心的(x, y)坐标、宽、高。变量x,xa,x*分别指预测的包围盒、anchor的包围盒、GT的包围盒(对y,w,h也是一样)的x坐标。可以理解为从anchor包围盒到附近的GT包围盒的包围盒回归。
无论如何,我们用了一种与之前的基于特征映射的方法[7, 5]不同的方法实现了包围盒算法。在[7, 5]中,包围盒回归在从任意大小的区域中pooling到的特征上执行,回归权重是所有不同大小的区域共享的。在我们的方法中,用于回归的特征在特征映射中具有相同的空间大小(nxn)。考虑到各种不同的大小,需要学习一系列k个包围盒回归量。每一个回归量对应于一个尺度和长宽比,k个回归量之间不共享权重。因此,即使特征具有固定的尺寸/尺度,预测各种尺寸的包围盒仍然是可能的。
参考:
https://blog.csdn.net/ture_dream/article/details/52896452
https://blog.csdn.net/shenxiaolu1984/article/details/51152614
https://blog.csdn.net/shenxiaolu1984/article/details/51036677