‘壹’ 目标检测算法---faster rcnn 知识简要回顾(测试篇)
Faster RCNN检测部分主要可以分为四个模块:
1.特征抽取:用于抽取图像特征,一般可以使用vgg、resnet和mobilenet等backbone;
2.RPN(Region Proposal Network):用于产生候选框,主要做一些粗糙的分类和回归操作;
3.RoI Pooling:主要是为了解决全连接层需要固定尺寸输入,而实际输入大小不一的问题;
4.Classification and Regression:精细化分类和回归。
faster rcnn算法大致流程如下:
彩色图像通过backbone进行特征提取,输出最后一层的feature map。接着将这些feature map进一步做基于3x3卷积核的特征提取,该目的是增强模型的鲁棒性。将输出送入两个分支,第一个分支跟类别有关,这里主要是用于简单分类,区分是背景还是物体,这是针对anchor而言的;第二个分支则是用于初步预测候选框的偏移量,这个也是基于anchor而言的;再将前两个分支的结果送入图中的proposal中,首先会根据positive类的score筛选前6000个候选框,再将anchor的坐标和得到的偏移进行整合,得到初步候选框坐标,接着在做NMS,除去重叠严重的框,再经过了NMS后的框中,根据类别score取前300个框。然后将结果送入roi pooing层,用于生成固定尺寸的特征区域,以方便后边的全连接层接受信息;全连接层用于最后提取特征,得到精细的类别和框的偏移量。
‘贰’ R-CNN, Fast R-CNN, Faster R-CNN, YOLO:目标检测算法总结
参考链接
以下是文中涉及的算法的最原始的文章:
一个最直接的解决办法是从图中取不同的感兴趣区域,然后对这些区域用CNN进行分类,检测这些区域中是否有物体的存在。
但是待检测物体可能存在于图片的不同位置而且有不同的长宽比例。所以以上方法需要选取量非常大的区域并需要非常大的计算量。
因此,R-CNN, Fast R-CNN, Faster R-CNN, YOLO被开发去又快又准地找物体。
为了解决上述提到的有大量区域被选择的问题, Ross Girshick et al 提出了一种方法:用了选择性搜索从图片提取了2000个区域,这些区域被称为”region proposals“。
用这种办法,我们不需要去分类巨大数量的区域了,我们只需要去处理2000个区域。这2000个区域是用如下的选择性搜索算法(selective search algorithm)来找到的:
这篇文章 介绍了更多关于选择性搜索算法(selective search algorithm)的内容。
RCNN步骤:
R-CNN存在的问题:
Fast R-CNN的几个改进:
The same author of the previous paper(R-CNN) solved some of the drawbacks of R-CNN to build a faster object detection algorithm and it was called Fast R-CNN. The approach is similar to the R-CNN algorithm.
Fast R-CNN更快的原因是:
Fast R-CNN更快:
From the above graphs, you can infer that Fast R-CNN is significantly faster in training and testing sessions over R-CNN. When you look at the performance of Fast R-CNN ring testing time, including region proposals slows down the algorithm significantly when compared to not using region proposals. Therefore, region proposals become bottlenecks in Fast R-CNN algorithm affecting its performance.
上面两个算法的缺点:
selective search耗时
Both of the above algorithms(R-CNN & Fast R-CNN) uses selective search to find out the region proposals . Selective search is a slow and time-consuming process affecting the performance of the network.
Faster R-CNN的改进:
不用selective search去找region proposals;
用network去找region proposals;
Therefore, Shaoqing Ren et al . came up with an object detection algorithm that eliminates the selective search algorithm and lets the network learn the region proposals .
Faster R-CNN的步骤:
时间上的对比:
Faster R-CNN最快并且能用作实时目标检测
之前几种算法的缺点:
产生region的时候没有纵览整幅图。其实图的某些部分有更高的可能性包含物体。
All of the previous object detection algorithms use regions to localize the object within the image. The network does not look at the complete image. Instead, parts of the image which have high probabilities of containing the object .
YOLO的思想:
用一个单独的网络去预测bounding boxes和bounding boxes中存在物体的概率
YOLO or You Only Look Once is an object detection algorithm much different from the region based algorithms seen above.
In YOLO, a single convolutional network predicts (1) the bounding boxes and (2)the class probabilities for these boxes.
YOLO的具体步骤:
How YOLO works is that:
YOLO的优缺点:
‘叁’ 目标检测算法的分步介绍(第 1 部分)
英文原文: https://www.analyticsvidhya.com/blog/2018/10/a-step-by-step-introction-to-the-basic-object-detection-algorithms-part-1/
对原文的表达有部分改动
在本文中,我们将更深入地研究可用于目标检测的各种算法。我们将从 RCNN 家族的算法开始,即 RCNN、Fast RCNN 和 Faster RCNN。在本系列即将发布的文章中,我们将介绍更高级的算法,如 YOLO、SSD 等。
下图是说明目标检测算法如何工作的一个流行示例。图像中的每个物体,从一个人到一只风筝,都以一定的精度被定位和识别。
让我们从最简单的深度学习方法开始,也是一种广泛使用的方法,用于检测图像中的目标——卷积神经网络( CNN)。CNN 的内部工作原理如下:
我们将图像传递给网络,然后通过各种卷积和池化层处理,发送给全连接层。最后,我们以目标类别的形式获得输出。这相当简单,不是吗?对于每个输入图像,我们得到一个相应的类作为输出。我们可以使用这种技术来检测图像中的各种目标吗?让我们看看如何使用 CNN 解决一般的目标检测问题。
使用这种方法的问题在于图像中的目标可能具有不同的纵横比和空间位置。例如,在某些情况下,目标可能覆盖图像的大部分,而在某些情况下,目标可能仅覆盖图像的一小部分。目标的形状也可能不同(在现实生活中经常发生)。由于这些因素,我们将需要大量的区域,从而导致大量的计算时间。因此,为了解决这个问题并减少区域数量,我们可以使用基于区域的 CNN,它使用提案法选择区域。让我们了解这个基于区域的 CNN 可以为我们做什么。
与在大量区域上工作不同的是,RCNN 算法是在图像中选取一堆框并检查这些框中是否有任何一个包含任何目标。 RCNN 使用 selective search 从图像中提取这些框(这些框称为 regions)。
让我们首先了解什么是 selective search 以及它如何识别不同的 regions。基本上四个模式可以构成一个物体:不同的尺度、颜色、纹理和外壳。selective search 识别图像中的这些模式,并在此基础上提出各种regions。以下是selective search 工作原理的简要概述:
举个例子:
到目前为止,我们已经看到了 RCNN 如何实现目标检测。但是这种技术有其自身的局限性。由于以下步骤,训练 RCNN 模型既昂贵又缓慢:
所有这些过程结合起来使 RCNN 非常慢。对每张新图像进行预测大约需要 40-50 秒,这实质上使得模型在面对庞大的数据集时变得笨重且几乎无法构建。
好消息是——我们有另一种目标检测技术,它修复了我们在 RCNN 中看到的大部分问题。
我们还能做些什么来减少 RCNN 算法通常需要的计算时间?我们是否可以每张图像只运行一次并获取所有感兴趣的区域(包含某个目标的区域)。
RCNN 的作者 Ross Girshick 提出了这个想法,即每张图像只运行一次 CNN,然后找到一种方法在 2,000 个区域之间共享该计算。在 Fast RCNN 中,我们将输入图像提供给 CNN,后者反过来生成卷积特征图。使用这些地图,提取提议的区域。然后我们使用 RoI 池化层将所有提议的区域重塑为固定大小,以便可以将其馈入全连接网络。
让我们将其分解为简化概念的步骤:
因此,Fast RCNN 不是使用三个不同的模型(如 RCNN),而是使用单个模型从区域中提取特征,将它们分成不同的类,并同时返回识别类的边界框。
为了进一步分解,我将对每个步骤进行可视化。
这就是 Fast RCNN 如何解决 RCNN 的两个主要问题,1. 将每个图像的一个而不是 2,000 个区域传递给 ConvNet。2. 使用一个而不是三个不同的模型来提取特征、分类和生成边界框。
但即使是 Fast RCNN 也存在某些问题。它还使用 selective search 作为寻找感兴趣区域的建议方法,这是一个缓慢且耗时的过程。每张图像检测目标大约需要 2 秒,这与 RCNN 相比要好得多。但是当我们考虑大型现实生活数据集时,即使是 Fast RCNN 看起来也不那么快了。
Faster RCNN 是 Fast RCNN 的修改版本。它们之间的主要区别在于 Fast RCNN 使用 selective search 来生成感兴趣的区域,而 Faster RCNN 使用 Region Proposal Network ,又名 RPN。 RPN 将图像特征图作为输入并生成一组目标提议,每个提议的目标以分数作为输出。
Faster RCNN 方法通常遵循以下步骤:
让我简要解释一下这个区域提议网络(RPN)实际上是如何工作的。
首先,Faster RCNN 从 CNN 获取特征图并将它们传递给区域提议网络。 RPN 在这些特征图上使用一个滑动窗口,在每个窗口,它生成 k 个不同形状和大小的 Anchor 框:
Anchor 框是固定大小的边界框,它们放置在整个图像中,具有不同的形状和大小。对于每个 Anchor,RPN 预测两件事:
我们现在有不同形状和大小的边界框,它们被传递到 RoI 池化层。在 RPN 步骤之后,有可能存在没有分配给它们的类别提议。我们可以获取每个建议并对其进行裁剪,以便每个建议都包含一个目标。这就是 RoI 池化层所做的。它为每个锚点提取固定大小的特征图:
然后将这些特征图传递到具有 softmax 和线性回归层的全连接层。它最终对目标进行分类并预测已识别目标的边界框。
到目前为止,我们讨论的所有目标检测算法都使用区域来识别目标。网络不会一次性查看完整图像,而是依次关注图像的各个部分。这会造成两个并发症:
‘肆’ 超详细解读Faster R-CNN-FPN
2021年了,竟然还有人写关于Faster R-CNN的文章?我的原因主要有两点:
我们先从全局上了解Faster R-CNN-FPN,然后再关注其中涉及的细节。下面是Faster R-CNN-FPN的网络框架图(或称为tensor流动图)。
众所周知,Faster R-CNN-FPN(主要是Faster R-CNN)是个两阶段的对象检测方法,主要由两部分网络组成,RPN和Fast R-CNN。
RPN的作用是以bouding box(后简称为box)的方式预测出图片中对象可能的位置,并过滤掉图片中绝大部分的背景区域,目标是达到尽量召回图像中感兴趣的对象,预测box尽量能够与实际对象的box贴合,并且保证一定的预测精度(Precision)。另外,RPN并不需要指出预测的box中对象具体的类别,RPN预测的box称为RoI(Region of Interest),由于是以box的方式输出,所以后面我们统一将其称为proposal box。
Fast R-CNN则是在FPN预测的proposal box基础上进一步预测box中对象具体的类别,并对proposal box进行微调,使得最终预测的box尽量贴合目标对象。大致的做法是根据RPN预测的proposal box,从原图backbone的feature map上通过RoIPooling或RoIAlign(Faster R-CNN-FPN使用RoIAlign)提取每个proposal box对应区域的feature map,在这些区域feature map上进一步预测box的类别和相对proposal box的偏移量(微调)。另外,RPN和Fast R-CNN共用同一个backbone网络提取图像的feature map,大大减少了推理耗时。
从上面的介绍可以看出,RPN和Fast R-CNN的配合作用其实可以理解为一种注意力机制,先大致确定目标在视野中的位置,然后再锁定目标仔细观察,确定目标的类别和更加精确的位置,简单来说就是look twice,相比单阶段的look once,当然是比较耗时的,但也换来了更好的效果(虽然很多单阶段方法号称已经获得相当或好于两阶段的效果)。
下面以Faster R-CNN-FPN发展顺序的汇总介绍每个改进的核心思想。
在R-CNN中,CNN只被用来作为特征抽取,后接SVM和线性回归模型分别用于分类和box修正回归。在此基础上,Fast R-CNN直接对原输入图进行特征抽取,然后在整张图片的特征图上分别对每个RoI使用RoIPooling提取(后面会介绍RoIPooling的原理)特定长度的特征向量(论文中空降尺寸为7*7),去掉SVM和线性回归模型,在特征向量上直接使用若干FC层进行回归,然后分别使用两个FC分支预测RoI相关的类别和box,从而显着提升速度和预测效果。 整体框架图如下:
在Fast RCNN的基础上进一步优化,用CNN网络代替Fast R-CNN中的region proposal模块(使用传统Selective Search方法),从而实现了全神经网络的检测方法,在召回和速度上都超过了传统的Selective Search。作者将提供proposal region的网络称为RPN(Region Proposal Network),与检测网络Fast RCNN共享同一backbone,大大缩减了推理速度。
RPN在backbone产生的feature map(图中的conv feature map)之上执行 的滑窗操作,每个滑窗范围内的feature map会被映射为多个proposal box(图中的reg layer分支)以及每个box对应是否存在对象的类别信息(图中的cls layer分支)。由于CNN天然就是滑窗操作,所以RPN使用CNN作为窗口内特征的提取器(对应图中的intermediate layer,后面简称为“新增CNN层”),窗口大小 ,将feature map映射为较低维的feature map以节省计算量(论文中为256)。虽然只使用了 的卷积,但是在原图上的有效的感受野还是很大的,感受野大小不等于网络的降采样率,对于VGG网络,降采样率为16,但是感受野为228像素。类似于Fast-RCNN,为了分别得到box和box对应的类别(此处类别只是表示有没有目标,不识别具体类别),CNN操作之后会分为两个子网络,它们的输入都是新增CNN层输出的feature map,一个子网络负责box回归,一个负责类别回归。由于新增CNN层产生的feature map的每个空间位置的特征(包括通道方向,shape为 )都被用来预测映射前窗口对应位置是否存在对象(类别)和对象的box,那么使用 的CNN进行计算正合适(等效于FC层),这便是RPN的做法。综上所述,所有滑窗位置共享一个新增CNN层和后续的分类和box回归分支网络。下图是RPN在一个窗口位置上执行计算的原理示意。
由于滑窗操作是通过正方形的CNN卷积实现的,为了训练网络适应不同长宽比和尺寸的对象,RPN引入了anchor box的概念。每个滑窗位置会预置k个anchor box,每个anchor box的位置便是滑窗的中心点,k个anchor box的长宽比和尺寸不同,作者使用了9种,分别是长宽比为 、 和 ,尺寸为 , 和 的9种不同组合。分类分支和box回归分支会将新增CNN层输出的feature map的每个空间位置的tensor(shape为 )映射为k个box和与之对应的类别,假设每个位置的anchor box数量为k(如前所述, ),则分类分支输出的特征向量为2k(两个类别),box回归分支输出为4k(4为box信息,box中心点x坐标、box中心点y坐标、box宽w和box高h)。box分支预测的位置(x,y,w,h)都是相对anchor box的偏移量。从功能上来看,anchor box的作用有点类似于提供给Fast RCNN的propsal box的作用,也表示目标可能出现的位置box,但是anchor box是均匀采样的,而proposal box是通过特征抽取(或包含训练)回归得到的。由此可以看出,anchor box与预测的box是一一对应的。从后文将会了解到,通过anchor box与gt box的IoU的关系,可以确定每个预测box的正负样本类别。通过监督的方式让特定的box负责特定位置、特定尺寸和特定长宽比的对象,模型就学会了拟合不同尺寸和大小的对象。另外,由于预测的box是相对anchor box的偏移量,而anchor box是均匀分布在feature map上的,只有距离和尺寸与gt box接近(IoU较大)的anchor box对应的预测box才会与gt box计算损失,这大大简化了训练,不然会有大量的预测box与gt box计算损失,尤其是在训练初始阶段,当一切都是瞎猜的时候。
在Faster RCNN基础上,将backbone替换为ResNet50或ResNet101,涉及部分细节的改动,我们放在本文的细节部分进行描述。
在Faster RCNN-ResNet基础上,引入FPN(特征金字塔网络)模块,利用CNN网络天然的特征金字塔特点,模拟图像金字塔功能,使得RPN和Fast RCNN可以在多个尺度级别(scale level)的feature map上分别预测不同尺寸的对象,大大提高了Faster RCNN的检测能力。相比图像金字塔大大节省了推理时间。原理如下图所示:
从上图中可以看出,FPN并不是简单地使用backbone的多个CNN层输出的feature map进行box回归和分类,而是将不同层的feature map进行了top-down和lateral connection形式的融合后使用。这样便将CNN网络前向传播(bottom-up)产生的深层语义低分辨率特征与浅层的浅语义高分辨率的特征进行融合,从而弥补低层特征语义抽象不足的问题,类似增加上下文信息。其中,top-down过程只是简单地使用最近邻插值将低分辨率的feature map上采样到即将与之融合的下层feature map相同的尺寸(尺寸上采样到2倍),lateral connection则是先将低层的feature map使用 的卷积缩放为即将与之融合的上层feature map相同的通道数(减少计算量),然后执行像素级相加。融合后的feature map不仅会用于预测,还会继续沿着top-down方向向下传播用于下层的特征融合,直到最后一层。
mask R-CNN提出的RoI Align缓解了RoIPooling的缺陷,能够显着提升小目标物体的检测能力。网上介绍RoIPooling和RoIAlign的文章很多,此处不再赘述,推荐阅读个人觉得比较好的两篇博客: RoIPooling 和 RoIAlign 。
此处稍微啰嗦下个人对RoIPooling的思考: 为什么RoIPooling不使用自适应的池化操作,即根据输入的feature map的尺寸和希望输出的feature map尺寸,自动调整池化窗口的大小和步长以计算想要尺寸的feature map,类似于自适应池化操作,而不是将输入的feature map划分成均匀的小区域(bins,论文中划分为 个bins),然后每个小区域中分别计算MaxPooling。不管计算上是否高效,至少这种做法在输入的feature map尺寸(比如 )小于期望的输出feature map尺寸(比如 )时会失效,因为在3*3的feature map上如果不使用padding的话是无法得到 的特征的,而使用padding又是很低效的操作,因为要扩展局部feature map的尺寸,而使用划分bins的方法,即使输出的feature map尺寸远小于要输出的feature map尺寸,也仅仅是在同一位置采样多次而已。
本人之前介绍YOLOv3的 文章 也介绍过anchor box的作用,再加上本文1.1.2节中的介绍应该比较全面了,不再赘述。
此处的绝大部分细节来自论文,论文中未提及的部分,主要参考了mmdetection中的 实现 。
整个模型的网络结构可以划分为四个部分,分别为backbone、FPN、RPN head和Fast RCNN head。
1.backbone: 原图短边被resize到800像素,这里值得注意的是,如此resize后一个batch内的每张图片的大小很有可能并不一致,所以还无法合并为一个输入矩阵,普遍的做法是将batch内的每张图片的左上角对齐,然后计算resize后batch内所有图片的最大宽和高,最后按照最大宽或高分别对每张图片的宽或高进行0值padding;输出为4个不同尺寸的feature map(C2、C3、C4、C5)。
2.FPN: ResNet backbone产生的4个不同尺寸的feature map(C2、C3、C4、C5)作为输入,输出5个不同尺寸的feature map(P2、P3、P4、P5、P6),P6是对P5进行2倍降采样得到,每个feature map的通道数为固定的256;使用P6的原因是为了预测更大尺寸的对象。
3.RPN:输入为FPN产生的feature map(P2、P3、P4、P5、P6);由于RPN是在5个输入feature map上进行独立的预测,则每个feature map都会输出 proposal box,因此不可能将所有的proposal box都提供给Fast R-CNN,这里的做法是对每个feature map上产生的proposal box按类别概率进行排序(每个feature map上的proposal box独立进行),然后选择前k个proposal box, 5个feature map一共会 产生 个proposal box,训练时 ,推理时 。最后,将所有的 个proposal box合并后统一进行NMS(IoU threshold=0.7)去掉冗余的box,最后选择前m个输出给Fast R-CNN,训练和测试时m都取1000。
训练时将gt box通过下面的公式转换为相对anchor box的偏移值,与网络的预测计算loss,至于将每个gt与具体的哪个anchor box计算偏移,则需要根据2.3.1节中的正负样本方法来确定。测试时将预测的box通过该公式中的逆运算计算出当前box相对原图的位置和大小, , , , 指相对全图的box中心点坐标以及宽和高, , , , 指每个anchor相对全图的box中心点坐标以及宽和高。由此可以看出,box回归分支直接预测的便是相对anchor的偏移值,即公式中的 、 、 和 。
以上提到的2000和1000是作为Fast R-CNN的输入proposal box,在训练时参与RPN loss计算的anchor boxs数量为256个,正负样本数量为 ,正样本不足128的用负样本补足。这里的256是从所有feature map中的anchor box中选择的,并非每个feature map都独立取得256个正负样本。这也是合理的,因为每个gt box由于尺寸的原因,几乎不可能与所有feature map上的anchor box的IoU都大于一定的阈值(原因参考2.3.1节)。注意选择前并未进行NMS处理,而是直接根据2.3.1节中确定正负样本的方式确定每个预测box正负类别,然后分别在正样本中随机选择128个正样本,在负样本中随机选择128个负样本。
4.Fast R-CNN:输入为FPN产生的前4个feature map和RPN输出的proposal box,4个feature map为P2、P3、P4、P5,与backbone对应,不使用P6。那么,如何确定在哪个feature map上执行每个proposal box对应的RoIAlign操作并得到 大大小的feature map呢?论文中的做法是通过下面的公式将特定尺寸的proposal box与FPN产生的4个feature map中尺寸最适合的对应起来,即让感受野更接近对象尺寸的feature map预测该对象 ,其中224为backbone在ImageNet上预训练的尺寸,w和h为proposal box的长和宽,k表示适合尺寸为w和h的propsal box的feature map的位置,即4个feature map为P2、P3、P4、P5的下标,k_0为proposal box大致为224*224时对应feature map位置值( ),表示proposal box大致为 时在P4上执行RoIAlign,小于 时,在P2或P3上执行,大于则在P5上。
网络都会针对每个RoI会输出一个类别概率分布(包括背景类别)和一个相对RoI box的长度为4的box偏移向量。概率分支由softmax激活函数得到。与RPN的类似,训练时,如2.4.2节loss计算中所述,会将gt box通过下面的公式转换为相对proposal box(前提是该RoI是正样本)的偏移量,然后使用loss计算公式直接与预测的相对偏移量进行loss计算;测试时,会通过下列公式的逆运算将偏移值换算回相对原图的位置box,然后使用NMS去掉冗余的box,最终输出。
训练时,通过2.3.2中的方式确定每个proposal box属于正样本或负样本后,随机选择512个样本,其中正负比例为1:3进行loss计算,正样本不足的由负样本补足。
在RPN中,由于每个feature map的每个滑窗位置上的张量( 维张量,C为feature map的通道数)会被用来预测k个box和每个box对应的类别概率,那么具体哪个box才能参与gt box的损失计算(包括类别和box回归损失)?这便需要在所有预测的box中确定正负样本,因为一个anchor对应一个预测的box和类别,那么确定预测的box是正例还是负例等价于确定anchor box的是正例还是反例。为了便于训练,RPN中使用双IoU阈值的方式确定正负样本,与gt box的IoU为最大或者大于0.7的anchor box被设置为正样本,这会导致一个gt box与多个预测box计算损失,即允许多个box预测同一对象,与gt box的IoU小于0.3的anchor box被设置为负样本,其余的忽略掉,即不参与loss计算。在此基础上,如2.2节中所述,会对正负样本进行随机采样,总数为256,其他不参与损失函数计算。
与gt box的IoU大于0.5的proposal box作为正样本,注意,是将proposal box与gt box计算IoU,Fast-RCNN中的proposal box的作用与anchor box有些类似,即确定正负样本和预测的box 都是针对它们的偏移值 ,其余IoU在 之间的作为负样本,低于0.1的作为难例挖掘时的启发式样本(mmdetection中的做法是单阈值方式,与gt box的IoU大于0.5的proposal box作为正样本,小于的都是负样本)。
Faster R-CNN中是以分步的方式联合训练RPN和Fast R-CNN,大致的过程为:
但在mmdetection中,已经将RPN和Fast R-CNN的loss进行权重加和,从而进行联合训练,训练流程简化很多,且能够达到相同的效果。
确定了每个预测box或anchor box的正负类别后,便可以计算损失函数了,类似于Fast RCNN的做法,只有正样本的box才会参与box损失计算,损失函数如下:
为类别损失为类别损失函数,使用交叉熵损失, 为box回归损失,使用smooth L1损失,论文中平衡因子lambda为10。 表示第i个anchor box对应的gt 类别(背景为0,对象为1), 为gt box相对anchor box的偏移量(如果该anchor box被确定为正样本),通过下面的公式计算得到, 即表示只有 ,即为正样本时才会计算box的损失。
Fast R-CNN的loss类似于RPN,只有proposal box为非背景类别(正样本)时才计算box损失, 为类别损失, 为box损失, 表示proposal box的 , 时表示背景(通过2.3.2的方式确定proposal box的类别)。 为平衡因子,作者所有实验中 。为了防止box回归的L2 loss放大噪声(异常loss)从而影响训练,作者将L2 loss修改为 loss,当box尺寸的差异较大时使用L1 loss,抑制异常值对梯度的贡献。
其中v是通过下面的公式将gt box( , , , )转换得到,其中,( , , , )为proposal box的在原图中的中心点坐标和宽与高。
在Faster R-CNN和Faster R-CNN-ResNet中,由于RPN只是在单尺寸的feature map上进行滑窗,为了缓解多尺寸的问题,每个滑窗位置会设计多个尺寸的anchor,但是在Faster R-CNN-FPN中使用了FPN,则天然就具有了适应对象多尺寸的问题,因此不用再为每个滑窗设计多个尺寸的anchor。即在Faster RCNN-FPN中,为每种尺寸feature map上的滑窗只设计了单一尺寸多种长宽比的anchor,长宽比有 、 和 ,不同feature map上anchor的尺寸为: , , , 和 ,依次对应P2、P3、P4、P5和P6。
COCO上的训练细节:RPN的weight decay为0.0001,SGD的 ,初始学习率为0.002,学习率调整使用step decay方式。
‘伍’ SPP-net文章详细解读
文章 《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》 是在RCNN之后,是对RCNN的改进(关于RCNN可以查看 R-CNN文章详细解读 ),先给出SPP-net总的框架图如下
该文章主要改进两点:
1. CNN需要固定输入图像的尺寸,导致不必要的精度损失
2. R-CNN对候选区域进行重复卷积计算,造成计算冗余
1.为什么CNNs要固定输入图像的尺寸?
CNN主要有两部分组成:卷积层和全连接层。卷积层以滑动窗口方式操作并输出表示各个响应激活空间分布的特征图。实际上,卷积层不需要输入的图像尺寸固定,并且可以产生任意尺寸的特征图。但另一方面,完全连接层需要具有固定大小/长度的输入。 因此,固定输入大小的约束只是来自存在于网络更深层阶段的全连接层。
解决办法(对比R-CNN, SPP-net):
如下图所示
第一行中的图像即为要求固定尺寸输入的CNN对图像的处理方式
第二行为要求固定尺寸输入的CNN (如R-CNN)的处理流程,先将图片按照类似第一行中的方式进行处理,然后输入卷积以及全连接层,最后输出结果
第三行为SPP-net的处理方式,不固定图像的大小,直接输入给卷积层处理,卷积出来的特征并不是直接输入给全连接层,而是先给SPP层处理,然后得到一个固定长度的输出传给全连接层,最后输出结果。
2.R-CNN为什么会有计算冗余?
如下图所示
R-CNN对于一张图片,先使用segment seletive方法提取出约2000个候选区域,然后将这两千个候选区域分别送入网络中,即一张图片要经历2000次前向传播,这样会造成大量冗余。
SPP-net则提出了一种从候选区域到全图的特征(feature map)之间的对应映射关系,通过此种映射关系可以直接获取到候选区域的特征向量,不需要重复使用CNN提取特征,从而大幅度缩短训练时间。每张图片只需进行一次前向传播即可。
下面来详细讲解一下改进的方法:
1.SPP层(spatial pyramid pooling)
首先要明确的是这一层的位置,这一层加在最后一个卷积层与全连接层之间,目的就是为了输出固定长度的特征传给要求固定输入的全连接层
SPP层的结构如下图所示
SPP层的输入:
如下图灰色框所示
最后一层卷积输出的特征(我们称为feature map),feature map为下图的黑色部分表示,SPP层的输入为与候选区域对应的在feature map上的一块区域
上面这句话可能有点绕,我们可以理解为一张图有约2000个候选区域,而对一张图做完卷积后得到feature map,在这个feature map上也有约2000个与候选区域对应的区域(这里的对应关系下面会详细讲解)
SPP层的输出:
SPP layer分成1x1,2x2,4x4三个pooling结构(这部分结构如下图所示),对每个输入(这里每个输入大小是不一样的)都作max pooling(论文使用的),出来的特征再连接到一起,就是(16+4+1)x256的特征向量。
无论输入图像大小如何,出来的特征固定是(16+4+1)x256维度。这样就实现了不管图像中候选区域尺寸如何,SPP层的输出永远是(16+4+1)x256特征向量。
2.候选区域在原图与feature map之间的映射关系
这部分的计算其实就是感受野大小的计算。
在CNN中感受野(receptive fields)是指某一层输出结果中一个元素所对应的上一层的区域大小,如下图所示。
先定义几个参数,参数的定义参考吴恩达在cousera讲解中对符号的定义,然后再讲解怎么计算
输入的尺寸大小与输出的尺寸大小有如下关系:
上面是区域尺寸大小的对应关系,下面看一下坐标点之间的对应关系
SPP-net对上面的坐标对应关系作了一定的简化,简化过程如下:
而 是坐标值,不可能取小数 所以基本上可以认为 。公式得到了化简:感受野中心点的坐标 只跟前一层 有关。
那么对于下图的做法,就是SPP-net的映射方法,SPP-net 是把原始ROI的左上角和右下角 映射到 feature map上的两个对应点。 有了feature map上的两队角点就确定了 对应的 feature map 区域(下图中橙色)。
从原图坐标 到特征图中坐标 的映射关系为
到这里就把SPPNet的核心思想讲完了,SPPNet网络后面和R-CNN类似,详细参考 R-CNN文章详细解读 。该文章还用这些思想做了图像分类的实验,感兴趣可以细读原文的分类部分。
参考:
‘陆’ 目标检测算法图解:一文看懂RCNN系列算法
姓名:王咫毅
学号:19021211150
【嵌牛导读】CNN如此风靡,其衍生算法也是层出不穷,各种衍生算法也可以应用于各种应用场景,各类场合。本文则是了解每个衍生算法的各个使用场景、原理及方法。
【嵌牛鼻子】RCNN 目标检测
【嵌牛提问】RCNN系列算法有何区别和联系?
【嵌牛正文】
在生活中,经常会遇到这样的一种情况,上班要出门的时候,突然找不到一件东西了,比如钥匙、手机或者手表等。这个时候一般在房间翻一遍各个角落来寻找不见的物品,最后突然一拍大脑,想到在某一个地方,在整个过程中有时候是很着急的,并且越着急越找不到,真是令人沮丧。但是,如果一个简单的计算机算法可以在几毫秒内就找到你要找的物品,你的感受如何?是不是很惊奇!这就是对象检测算法(object detection)的力量。虽然上述举的生活例子只是一个很简单的例子,但对象检测的应用范围很广,跨越多个不同的行业,从全天候监控到智能城市的实时车辆检qian测等。简而言之,物体检测是强大的深度学习算法中的一个分支。
在本文中,我们将深入探讨可以用于对象检测的各种算法。首先从属于RCNN系列算法开始,即RCNN、 Fast RCNN和 Faster RCNN。在之后的文章中,将介绍更多高级算法,如YOLO、SSD等。
1.解决对象检测任务的简单方法(使用深度学习)
下图说明了对象检测算法是如何工作。图像中的每个对象,从人到风筝都以一定的精度进行了定位和识别。
下面从最简单的深度学习方法开始,一种广泛用于检测图像中的方法——卷积神经网络(CNN)。如果读者对CNN算法有点生疏,建议 阅读此文 。
这里仅简要总结一下CNN的内部运作方式:
首先将图像作为输入传递到网络,然后通过各种卷积和池化层处理,最后以对象类别的形式获得输出。
对于每个输入图像,会得到一个相应的类别作为输出。因此可以使用这种技术来检测图像中的各种对象。
1.首先,将图像作为输入;
2.然后,将图像分成不同的区域;
3.然后,将每个区域视为单独的图像;
4.将所有这些区域传递给CNN并将它们分类为各种类别;
5.一旦将每个区域划分为相应的类后,就可以组合所有这些区域来获取具有检测到的对象的原始图像:
使用这种方法会面临的问题在于,图像中的对象可以具有不同的宽高比和空间位置。例如,在某些情况下,对象可能覆盖了大部分图像,而在其他情况下,对象可能只覆盖图像的一小部分,并且对象的形状也可能不同。
基于此,需要划分大量的区域,这会花费大量的计算时间。因此,为了解决这个问题并减少区域数量,可以使用基于区域的CNN,它使用提议方法选择区域。
2.基于区域的卷积神经网络
2.1 RCNN的思想
RCNN算法不是在大量区域上工作,而是在图像中提出了一堆方框,并检查这些方框中是否包含任何对象。RCNN 使用选择性搜索从图像中提取这些框。
下面介绍选择性搜索以及它如何识别不同的区域。基本上四个区域形成一个对象:不同的比例、颜色、纹理和形状。选择性搜索在图像中识别这些模式,并基于此提出各种区域。以下是选择性搜索如何工作的简要概述:
首先, 将图像作为输入:
然后,它生成初始子分段,以便获得多个区域:
之后,该技术组合相似区域以形成更大的区域(基于颜色相似性、纹理相似性、尺寸相似性和形状兼容性):
最后,这些区域产生最终的对象位置(感兴趣的区域);
下面是RCNN检测对象所遵循的步骤的简要总结:
1.首先采用预先训练的卷积神经网络;
2.重新训练该模型模型——根据需要检测的类别数量来训练网络的最后一层(迁移学习);
3.第三步是获取每个图像的感兴趣区域。然后,对这些区域调整尺寸,以便其可以匹配CNN输入大小;
4.获取区域后,使用SVM算法对对象和背景进行分类。对于每个类,都训练一个二分类SVM;
最后,训练线性回归模型,为图像中每个识别出的对象生成更严格的边界框;
[对上述步骤进行图解分析]( http://www.robots.ox.ac.uk/~tvg/publications/talks/Fast-rcnn-slides.pdf ):
首先,将图像作为输入:
然后,使用一些提议方法获得感兴趣区域(ROI)(例如,选择性搜索):
之后,对所有这些区域调整尺寸,并将每个区域传递给卷积神经网络:
然后,CNN为每个区域提取特征,SVM用于将这些区域划分为不同的类别:
最后,边界框回归(Bbox reg)用于预测每个已识别区域的边界框:
以上就是RCNN检测物体的全部流程。
2.2 RCNN的问题
从上节内容可以了解到RCNN是如何进行对象检测的,但这种技术有其自身的局限性。以下原因使得训练RCNN模型既昂贵又缓慢:
基于选择性搜索算法为每个图像提取2,000个候选区域;
使用CNN为每个图像区域提取特征;
RCNN整个物体检测过程用到三种模型:
CNN模型用于特征提取;
线性svm分类器用于识别对象的的类别;
回归模型用于收紧边界框;
这些过程相结合使得RCNN非常慢,对每个新图像进行预测需要大约40-50秒,这实际上使得模型在面对巨大的数据集时变得复杂且几乎不可能应用。
好消息是存在另一种物体检测技术,它解决了RCNN中大部分问题。
3.了解Fast RCNN
3.1Fast RCNN的思想
RCNN的提出者Ross Girshick提出了这样的想法,即每个图像只运行一次CNN,然后找到一种在2,000个区域内共享该计算的方法。在Fast RCNN中,将输入图像馈送到CNN,CNN生成卷积特征映射。使用这些特征图提取候选区域。然后,使用RoI池化层将所有建议的区域重新整形为固定大小,以便将其馈送到全连接网络中。
下面将其分解为简化概念的步骤:
1.首先将图像作为输入;
2.将图像传递给卷积神经网络,生成感兴趣的区域;
3.在所有的感兴趣的区域上应用RoI池化层,并调整区域的尺寸。然后,每个区域被传递到全连接层的网络中;
4.softmax层用于全连接网以输出类别。与softmax层一起,也并行使用线性回归层,以输出预测类的边界框坐标。
因此,Fast RCNN算法中没有使用三个不同的模型,而使用单个模型从区域中提取特征,将它们分成不同的类,并同时返回所标识类的边界框。
对上述过程进行可视化讲解:
将图像作为输入:
将图像传递给卷积神经网络t,后者相应地返回感兴趣的区域:
然后,在提取的感兴趣区域上应用RoI池层,以确保所有区域具有相同的大小:
最后,这些区域被传递到一个全连接网络,对其进行分类,并同时使用softmax和线性回归层返回边界框:
上述过程说明了Fast RCNN是如何解决RCNN的两个主要问题,即将每个图像中的1个而不是2,000个区域传递给卷积神经网络,并使用一个模型来实现提取特征、分类和生成边界框。
3.2Fast RCNN的问题
Fast RCNN也存在一定的问题,它仍然使用选择性搜索作为查找感兴趣区域的提议方法,这是一个缓慢且耗时的过程,每个图像检测对象大约需要2秒钟。
因此,又开发了另一种物体检测算法——Faster RCNN。
4.了解Faster RCNN
4.1. Faster RCNN的思想
Faster RCNN是Fast RCNN的修改版本,二者之间的主要区别在于,Fast RCNN使用选择性搜索来生成感兴趣区域,而Faster RCNN使用“区域提议网络”,即RPN。RPN将图像特征映射作为输入,并生成一组提议对象,每个对象提议都以对象分数作为输出。
以下步骤通常采用Faster RCNN方法:
1.将图像作为输入并将其传递给卷积神经网络,后者返回该图像的特征图;
2.在这些特征图上应用RPN,返回提议对象及其分数;
3.在这些提议对象上应用RoI池层,以将所有提案降低到相同的大小;
4.最后,将提议传递到全连接层,该层在其顶部具有softmax层和线性回归层,以对对象的边界框进行分类和输出;
这里简要解释一下RPN是如何运作的:
首先,Faster RCNN从CNN获取特征图并将它们传递到区域提议网络。RPN在这些特征图上使用滑动窗口,每个窗口生成不同形状和大小的k个方框( Anchor boxe):
方框是固定尺寸的边界箱,具有不同的形状和尺寸。对于每个方框,RPN预测两件事:
预测锚是对象的概率;
用于边界框回归器调整锚点以更好地适合物体的形状;
在有了不同形状和大小的边界框后,将其传递到RoI池层。对每个提案并对其进行裁剪,以便每个提案都包含一个对象。这就是RoI池层所做的事情,它为每个方框提取固定大小的特征图:
然后将这些特征图传递到全连接层,该层具有softmax和线性回归层,最终对对象进行分类并预测已识别对象的边界框。
4.2Faster RCNN的问题
上述讨论过的所有对象检测算法都使用区域来识别对象,且网络不会一次查看完整图像,而是按顺序关注图像的某些部分,这样会带来两个复杂性的问题:
该算法需要多次通过单个图像来提取到所有对象;
由于不是端到端的算法,不同的系统一个接一个地工作,整体系统的性能进一步取决于先前系统的表现效果。
链接: https://www.jianshu.com/p/51fc039ae7a4
‘柒’ R-CNN 系列 object detection 算法
在 object detection 领域,近 5 年的突破性进展似乎都与一个名字有关系:Ross Girshick。梳理从 R-CNN,Fast R-CNN, Faster R-CNN 到 Mask R-CNN 等各种经典模型,Ross Girshick 都是作者之一,甚至连 YOLO 的作者中也出现了 Ross Girshick 的名字。
这位大神简历如下:
从算法到实现框架再到数据集,这位大神实现了一条龙的突破~
本文的目的是整理总结 R-CNN 系列算法的发展历程和模型本身的核心思想,不涉及太多技术细节(例如训练数据预处理,超参数设置等)。
参考文献主要是上述各算法的原文以及下列资源:
R-CNN,一般认为全称是 Region-based CNN 或者作者原文中提到的 Regions with CNN features。
概括地说,R-CNN 的步骤如下图所示:
下面详细介绍 R-CNN 中的关键环节。
对于输入的图片,首先利用 selective search 算法 生成约 2000 个 region。关于 selective search 算法可以参考 原文 ,也可以参考 我们之前的博客文章 。原文中提到 R-CNN 对各种 region proposal 算法没有偏好,之所以选择 selective search 算法仅仅是为了方便与前人工作做对比。
这一部分的目的是对于每一个 region,通过 CNN (原文选用 AlexNet) 进行特征提取,得到统一长度的 feature vector,以便后续的分类。
由于每个 region 的大小差别比较大,而 AlexNet 默认接收 227×227 pixel 的图片,这里就需要对 region 做一些预处理,主要是 region 大小的转化。
要把一个任意大小的图片转化成 227×227 像素的图片方法有很多,原文中介绍了 4 种方式:
分别是:
最终作者选择了 warp + padding 的方式,一方面 warp 相对来说是最简单的,直接把任意大小的图片缩放成 227×227 即可,另外 padding 是在原 region 周围稍微添加了一些像素点,从实际效果看提高了检测正确率。
将统一大小的 region 送入 CNN 中,进行特征提取。 如何得到这个 CNN 也是一个问题。
针对目标检测的数据集 ILSVRC detection dataset 包含了 200 类物体,PASCAL VOC (Visual Object Classes) 包含了 20 类物体。相对来说带有标签的训练数据比较少,不足以训练一个大型的 CNN,因此采用了 transfer learning 的技术。原文中并没有提到 transfer learning 这个名词,只是说 fine-tuning 。
首先借用在 ImageNet 上已经训练好的 CNN 模型(最初的文章中用了 AlexNet,后来 arXiv 上新版文章中用了 VGG,效果提升很明显),然后在 PASCAL 数据集上进行 fine-tuning。这里对 AlexNet 网络结构的改变只是将原本对应 ImageNet 1000 类输出的 classification layer 替换成了对应 N+1 类输出的 classification layer,该层权重随机初始化。对于 PASCAL 数据集 N=20,ILSVRC 数据集 N=200,另外 +1 对应 background 类型。
经过 fine-tuning 之后,CNN softmax layer 之前的 4096 维向量即为该 region 的 feature vector.
得到 region 的 feature vector 之后,送入 SVM 进行最后的分类。
这里 SVM 的训练是针对不同类型的物体分开进行的,每一类训练一个 SVM,它只给出针对这一类物体的分类结果。之所以最后用 SVM 分类,而不是直接用 CNN 的 softmax 进行分类,原文作者的解释是尝试过 softmax 之后发现效果比 SVM 差一些,但是同时指出如果调整一些训练策略,softmax 和 SVM 之间的差距有可能缩小。这也为后来基于 R-CNN 的改进埋下了伏笔。
得到所有 region 对应的检测结果(即包含某种类型物体的概率 score)之后,还有一步操作: Non-Maximum Suppression (NMS) 。如果两个 region 检测到同一类物体,比如都检测到了行人,一个 region score 较高,而另一个 score 较低,当这两个 region 的 IoU (intersection-over-union) 超过某个阈值时,即它们重合较多时,只保留那个 score 较高的 region.
object detection 的任务除了检测图中的物体,还要给出定位,即用 bounding box 尽量准确的圈出该物体。前边基于 region 的分类过程可能能够正确辨识出 region 中的物体,但是初始的 region 并不一定是一个合适的 bbox。在 R-CNN 最后又添加了一个线性回归模型,基于 feature vector 来预测正确的 bbox 相对于 region 的位置变换,即预测 bbox 应该如何调整。这个训练过程也是 class-specific 的。
在最终使用时,R-CNN 输出包含两部分:
理论上来说,更新 bbox 的位置之后,应该在新的 bbox 中重新进行分类,这样准确度可能更高一些,但是原文作者发现实际上并没有明显改进。因此,实际使用中并没有对新的 bbox 重新分类。
总的来说,上述 R-CNN 的训练是分多步走的:先是 fine-tuning 一个 CNN 得到 feature vector,然后训练 SVM 进行分类,最后还要再训练一个线性回归环节预测 bounding box 的调整。
Fast R-CNN 的改进是不再使用独立的 SVM 和线性回归,而是统一用 CNN 将这三个环节整合起来。Fast R-CNN 在训练时间和检测时间方面比当时已有的其他算法快若干数量级。
Fast R-CNN 整体框架如下:
基本步骤:
在上述各环节中,我认为比较关键的有两个:一是 RoI projection,即将 image 上的 RoI 映射到 feature map 上的 RoI。二是通过 RoI pooling layer 将 feature map 上不同大小的 RoI 转化成统一大小的 sub feature map。而这两个环节都借鉴了 SPPnets ,其中 RoI pooling layer 是 SPPnets 中 Spatial Pyramid Pooling layer 的特例。
原本 R-CNN 是在原图上选取若干RoI,然后经过 CNN 处理,最后提取出 feature vector。对于每个图片上不同的 RoI 来说,从输入到输出没有任何共享的东西。
RoI projection 的作用是将 R-CNN 中对 image RoI 的处理推迟到了 feature map 上,这样可以让一个 image 的所有 RoI 共享从 image 到 feature map 的卷积处理过程。这很显然会加速训练和测试过程。至于如何将 image RoI 映射到 feature map RoI,已经有了 非常细致的讨论 ,这里不再赘述。
如何将 feature map 上不同大小的 RoI 转化成统一大小的 sub feature map? 这里 有非常直观的动画演示。
概括如下:
假设我们已经得到下面的 feature map (只考虑 2D)
其中 RoI 为黑框部分,大小为 。
我们希望将 RoI 转化成 2×2 大小,可以选择一个 2×2 的窗口如下
对每一个格子进行 max pooling 操作,得到如下的 2×2 的 feature map
总的来说,如果 RoI 大小为 ,希望得到的 feature map 大小为 ,则窗口中格子数目为 。可以根据具体情况向上或向下取整。
结合实际应用,如果 CNN 网络选用 VGG16,结构如下:
将最后一个 max pooling layer 替换为 RoI pooling layer。前部的卷积层对输入图片的大小没有严格限制,这一限制主要是在 fully connected layer,所以为了配合 VGG16 网络结构,要确保每个 RoI 输出的 feature map 依然为 。
对于 VGG16 网络结构的修改还包括:
在 Fast R-CNN 中,region proposal 是由 CNN 网络之外的算法提供的,例如 selective search。相对于后续的 region recognition 过程,region proposal 这一步实际上是整个算法的速度瓶颈。
Faster R-CNN 之所以 "Faster",就是因为提出了 Region Proposal Network (RPN) ,加速了 region proposal 过程。Faster R-CNN 本质上就是 RPN + Fast R-CNN.
整个 Faster R-CNN 结构如下:
或者更加详细的结构如下:
RPN 和 Fast R-CNN 共享从 image 到最后一层 CNN 输出的 feature map 这一段网络结构。 有些文章 也将 Faster R-CNN 看做三个模块:用于生成 feature map 的 Feature network,用于生成 region proposal 的 RPN,以及用于最终的 object detection 的 Detection network。我们这里还是采用 RPN + Fast R-CNN 的形式。
RPN 的输入是原始 image,输出是 region proposals。在具体实现中,RPN 是 fully convolutional network (FCN),只包含 convolutional layer,原本在分类/回归中常用的全连通层也由卷积操作替代。
有了 region proposals,后边的操作与 Fast R-CNN 是相同的。
原文中采用 alternating training 的方式: