回顾R-CNN:链接
回顾Fast R-CNN:链接
1.1 简介
Faster R-CNN是作者Ross Girshick继Fast R-CNN后的又一力作。同样使用VGG16作推理速度在GPU上达到5fps(包括候选区域的生成),准确率为网络的backbone,也有进一步的提升。在2015年的ILSVRC以及COCO竞赛中获得多个项目的第一名。
Faster R-CNN是在Fast R-CNN基础上进一步改进的目标检测框架,旨在提高目标提议生成的效率,进而加速整个检测过程。Faster R-CNN主要通过引入一个新的组件——区域生成网络(Region Proposal Network, RPN)来实现这一目标。以下是Faster R-CNN的关键特点和工作流程:
关键组成部分
-
特征提取器(Feature Extractor):与Fast R-CNN类似,Faster R-CNN首先使用一个深度卷积神经网络(如VGG、ResNet等)作为特征提取器,从输入图像中提取丰富的特征图。
-
区域提议网络(RPN):这是Faster R-CNN的核心创新点。RPN直接在最后一个卷积层的特征图上滑动,使用小的卷积核(例如3x3)来预测每个位置的多个可能的物体边界框(称为anchors)及其对应的objectness得分。这个分数衡量了该区域包含对象的概率。RPN的设计允许它在提出区域提议的同时进行背景与前景的初步区分,从而替代了之前需要单独运行的选择性搜索或其它启发式方法。
-
分类器:基于RPN提出的区域提议,Faster R-CNN会进一步细化这些提议,使用RoI Pooling层将不同大小的提议映射到固定大小的特征图块上,然后送入一个或多个全连接层进行分类和边框回归。这一步骤与Fast R-CNN相似,但其输入现在来自于RPN而非外部区域提议方法。
训练流程
-
RPN网络训练:首先,使用一个预训练的ImageNet模型(如VGG16)初始化网络,并仅训练RPN部分,目的是让RPN学会生成高质量的区域提议。这一步骤产出模型M1。
-
生成提案并训练检测网络:利用训练好的RPN模型M1,从训练图像中生成提案P1。然后,使用这些提案训练Faster R-CNN的分类器和边框回归部分,这一步通常会微调特征提取器的参数,以适应检测任务。
-
端到端训练:在RPN和检测网络的参数都经过初步优化后,整个Faster R-CNN系统(包括RPN和后续的分类回归部分)可以进行端到端的微调,以最小化分类错误和边界框回归误差,进一步提升整体性能。
优势
- 速度快:由于RPN直接在特征图上操作,省去了耗时的区域提议生成步骤,使得整个检测流程更加高效,接近实时处理。
- 精度高:结合了深度学习的强大分类与回归能力,Faster R-CNN在多个数据集上展示了优越的检测精度。
- 端到端可训练:整个系统可以作为一个统一的模型进行训练,促进了参数间的协同优化,提升了模型的泛化能力。
Faster R-CNN通过整合区域提议和目标检测到一个统一的网络结构中,不仅大幅提高了目标检测的速度,同时也保持了较高的检测精度,是目标检测领域的一个重要里程碑。
该模型出自论文《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》下面我们来学习一下。
1.2 Faster R-CNN整体流程
Faster主要是用RPN替代了之前的SelectiveSearch算法,使得速度大幅上升,其余部分和fast基本相同。
1.输入图像
- 输入一张待检测的图像。
2. 特征提取
- 整张图像通过一个预训练的卷积神经网络(Backbone,如VGG16、ResNet等)进行前向传播,提取出特征图(Feature Map)。这个特征图保留了原始图像的空间信息,同时蕴含了丰富的视觉特征。
3. 区域提议网络(RPN)
-
生成Anchors:在特征图的每个位置上,预先定义一组不同尺度和长宽比的参考框(称为Anchors)。这些Anchors覆盖了图像中可能出现的各种大小和形状的目标。
-
滑动窗口预测:RPN在网络的最后一个卷积层特征图上滑动,对每个位置上的Anchors进行分类(前景/背景)和边界框回归(调整Anchors以更好地拟合目标)。
-
分类任务:使用小的卷积核(如3x3)后接一个1x1卷积层,预测每个Anchor属于目标(前景)还是背景的概率(2k)。
-
回归任务:同样使用1x1卷积层预测每个Anchor的边界框调整参数(4k),以便更精确地定位目标。
-
-
非极大值抑制(NMS):根据分类得分筛选出一定数量的高质量区域提议,并通过NMS去除高度重叠的提议,最终保留一定数量的候选框进入下一阶段。
4. 区域兴趣池化(RoI Pooling)
- 对于RPN生成的每个候选区域,应用RoI Pooling层将其映射到固定大小(如7x7)的特征图块。RoI Pooling确保不同大小的区域在进入全连接层之前能够被统一处理。
5. 目标分类与精确定位
-
将RoI Pooling后的特征输入到一系列全连接层,进行两部分处理:
-
分类:判断每个候选框内的物体属于哪一类,通常使用softmax函数输出每类的概率。
-
边框回归:进一步细化候选框的位置,通过回归预测更精确的边界框坐标。
-
6. 训练流程
Faster R-CNN的训练通常分为多个步骤,包括先训练RPN,然后使用RPN产生的提议训练Fast R-CNN部分,最后进行端到端的微调。训练过程中涉及损失函数的联合优化,包括RPN的分类和回归损失,以及Fast R-CNN部分的分类和回归损失。
7. 测试推理
- 在测试阶段,输入图像经过上述流程,RPN生成区域提议,然后对这些提议进行分类和精确定位,输出最终的检测结果,包括每个检测框的类别标签、置信度得分和精确位置。
通过这样的流程,Faster R-CNN能够在保证较高检测精度的同时,显著加快检测速度,成为当时目标检测领域的先进算法之一。
1.3 RPN结构
RPN整体流程
区域提议网络(Region Proposal Network, RPN)是Faster R-CNN中的一个核心组件,它负责高效地生成大量可能包含目标对象的候选区域(Region Proposals)。以下是RPN的具体工作流程:
1. 输入特征图:RPN基于特征提取网络(如VGG、ResNet)的最后一个卷积层的输出特征图进行操作。这个特征图不仅保留了图像的空间结构信息,还包含了丰富的高层语义特征。
2. Anchor生成:在特征图的每个位置上,预先定义一组不同尺度和纵横比的矩形框,称为Anchors。这些Anchors覆盖了多种大小和形状,旨在捕捉不同尺寸和长宽比的目标。Anchor的配置(如尺度、纵横比)是预先设定的,并在整个图像上均匀分布。
3. 滑动窗口:RPN在网络的特征图上采用滑动窗口(padding=1)的方式,对每个位置的多个Anchors进行处理。这意味着对于特征图上的每个像素位置,都会有一组固定的Anchors与其对应。
4. 特征提取:在每个Anchor对应的特征图位置上,使用小的卷积核(例如3x3)来提取特征,或者直接利用该位置的特征图值,这一步是为了为后续的分类和回归任务准备特征。
5. 分类与回归分支:对于每个Anchor,RPN同时执行两项任务:分类任务:通过一个全连接层(通常是1x1卷积层)预测每个Anchor是否包含目标(前景)或为背景。这通常使用softmax函数输出概率。回归任务:另一个全连接层(也是1x1卷积层)预测如何调整Anchor的边界框以更好地匹配潜在目标的真实边界。这通常输出四个坐标偏移量(dx, dy, dw, dh)。
6. 输出:RPN输出两组数据:一组是每个Anchor属于前景(目标)的概率分数。另一组是针对每个Anchor的边界框回归参数。
7. 非极大值抑制(NMS):基于分类得分,选择得分较高的Anchor,并通过NMS去除高度重叠的候选框,以减少冗余并提高检测效率。通常会设置一个阈值来控制保留的候选框数量。
8. 输出区域提议:经过NMS处理后,保留下来的候选框作为高质量的区域提议,供后续的Fast R-CNN部分进行精细的分类和定位。
参数解释
对于下图的参数,首先介绍一下各个量的意义:k是指anchor的数量,那么2k是指针对每个anchor生成了两个概率,一个是它为背景的概率,一个是它为前景的概率。4k是指每个anchor的4个回归参数。256是指将ZFnet作为backbone(骨干网络)生成的特征图的深度(channel)(如果骨干网络是VGG16,那么256就应当变成512)。
原图像素定位
对于下图,我们首先计算它在特征图的中心点在原图上对应的位置:以X轴为例(注意像素坐标系的XY轴,Y轴是垂直向下的),首先我们将原图的宽度除以特征图的宽度,然后取整得到一个步距stirde。假设我们在特征图的X为3,那么在原图的对应就是步距乘以特征图的位置。Y轴同理。
然后我们再以这个点为中心去计算K个anchor box。每个anchorbox都是给定的大小以及长宽比例。
Anchor
三种尺度,三种比例,一共有3x3=9个anchor,那么我们会生成9x2=18个目标概率和9x4=36个边界框回归参数。
通过一个小的感受野去预测比它大的目标是有可能的。
拓展:感受野
感受野描述了网络中某一层的神经元对输入图像响应的区域大小,即该神经元“看到”或“感受到”的输入空间区域。这个概念有助于理解网络如何逐步构建对输入数据的高级抽象表示,以及网络如何在空间上捕捉和整合信息。
举个例子:当某一层神经网络的感受野为5时,这意味着该层中的每个神经元或特征图上的每个元素,其所依赖并响应的输入图像区域大小为5x5(假设是二维卷积且感受野为正方形)。换句话说,这一层中的每个输出特征是通过考虑输入图像中一个5x5像素的局部区域计算得来的。
计算公式如下:(默认padding为0)
1.4 正负样本
正负样本采用1:1分配,加入有256个样本,那么正负样本各占128个,如果正样本少于128就用负样本来填充。例如正样本只有100个,那么负样本个数就是256-100=156个。
如何定义正负样本?
对于正样本有两种方式:(1)给出的anchor与GT有最大的IOU(2)某个anchor与GT的IOU>0.7,那么这个anchor就是一个正样本
负样本:与GT的IOU<0.3。
1.5 RPN的多任务损失函数
注意:这不是Faster的损失函数,Faster的损失函数和Fast是一样的。
1.6 Faster R-CNN 如何进行训练
1.7 总结
2. pytorch复现
待更新。。