先放一个大神博客吧,膜拜~
http://www.rossgirshick.info/
有空还需要把细节和补充材料review一下!
参考:
https://cloud.tencent.com/developer/news/281788
其他人的博文整理:
https://www.cnblogs.com/yhyue/p/9247962.html
https://blog.csdn.net/briblue/article/details/82012575
目标检测前沿及回顾(2018)
脉络清晰,有延伸
关于目标检测的论文集锦参看下面这个GitHub:
https://github.com/hoya012/deep_learning_object_detection
HoG特征 梯度直方图
参考:HoG特征
① 对图像进行预处理,主要是伽马矫正和灰度化,尽量去除光照的影响
② 对原图中的每一点,计算其梯度值,得到其梯度的大小和方向
例如,水平方向梯度gx:做水平差分;竖直方向梯度gy:做竖直差分。
总的梯度大小g = sqrt(gx2+gy2)
总的梯度方向θ = arctan(gx/gy)
③ 计算梯度直方图
将8x8大小的区域划分为一个cell,其元素共有8x8x2=128个关于梯度的值,将其按角度分到9个bin中,这9个bin是将180度划分为9份得到。这样,就得到一个长度为9的数组(梯度的直方图)。一般来说,观察梯度方向的主要分布范围,就可以大致认为该8x8区域的具有某个方向的边缘。HoG是对边界敏感,对灰度变化平坦的区域不敏感。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UvMmOvNR-1586676325899)(en-resource://database/2775:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EJhlpGAa-1586676325901)(en-resource://database/2777:1)]
④ 以4个cell为一个block进行归一化,进一步降低光照影响。
一个block事实上对应16x16的区域。4个cell,每个cell经过梯度直方图计算已经转化为一个长度为9的vector,现在一个block相当于包含一个长度为4x9=36的vector。这里的归一化,就是对这个长度为36的向量进行归一化。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4wJ9nQW6-1586676325906)(en-resource://database/2773:1)]
⑤ 得到HoG特征向量
注意block是在整张图上滑动的,因此对于64x128的图像,共7x15个block。
因此一张图像的HoG向量为7x15x36 = 3780
得到HoG特征向量之后,一般用svm进行分类。
sift特征
包含了候选特征提取、特征描述两个部分。其中特征描述为重点,因为特征提取可以用很多方法实现,并不是sift的核心。
① 特征提取
a 候选关键点
通过高斯尺度差分(DoG)实现,DoG是高斯金字塔和差分金字塔的结合。所谓高斯金字塔,是多组图像金字塔,在每组金字塔中,图像尺寸不变,也就是分辨率相同,但高斯核的方差按一定比例增长,也就是模糊程度不同。在不同组之间,尺寸每次减半,也就是进行步长为2的下采样。而差分金字塔,就是高斯金字塔中,同一组内的相邻图像两两差分形成。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d4RNPCrI-1586676325909)(en-resource://database/2779:1)]
对DoG的图像进行归一化,可以看到差分图像所蕴含的特征。并且有的特征是在不同模糊程度、不同尺度下都存在的,这些特征正是sift要提取的特征。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wTUaXhdp-1586676325911)(en-resource://database/2781:1)]
b 关键点定位
通过DoG筛选出候选关键点后,对这些关键点进行精确的拟合,来进一步确定位置和尺度
② 特征描述
类似简易版hog
https://www.cnblogs.com/wangguchangqing/p/4853263.html
Rich feature hierarchies for accurate object detection and semantic segmentation | [CVPR’ 14] |
参考:
https://blog.csdn.net/wopawn/article/details/52133338(非常详细的解读了rcnn各个部分是如何训练,如何选择和构造样本,以及输入输出形式。(重点关注bbox回归的部分))
创新点:
1.采用CNN网络提取图像特征,从经验驱动的人造特征范式HOG、SIFT到数据驱动的表示学习范式,提高特征对样本的表示能力;
2.采用大样本下有监督预训练+小样本微调的方式解决小样本难以训练甚至过拟合等问题。
编辑于2019/12/26
**在AlexNet在ImageNet上获得成功之后,R-CNN作者思考是否能将其用到目标检测领域的Pascal VOC数据集上来。由于目标检测的数据集较少,采用了迁移学习的方法,即对ImageNet上的预训练模型进行fine-tune。于是R-CNN的基本思路为:
CNN和SVM各自的训练策略:
此外,作者还讨论了为什么单独训练一个svm分类器,而不是使用cnn层的fc层(见补充材料):
阈值0.3,导致cnn效果不好,改为0.5后,导致定位不准确,所以干脆分开CNN和svm?
在完成这部分工作后,作者进行了一个误差分析(3.4节),分析在false positive增多时,各种错误情况所占百分比。见下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hLk2js2n-1586676325916)(en-resource://database/1264:1)]
作者发现最大的分类错误来源于定位误差,也就是图中的Loc项。于是基于这个误差分析,作者进一步进行了bbox回归来减小定位误差。这通过训练一个线性回归模型来对region porposal的pool5数据预测一个新的bbox位置(见补充材料)
**
2019/12/18
下面是详细介绍。
SIFT与HOG
①需要对同一张图中的多个物体进行localizing
②常规的目标检测中难以获得大量有标注的训练数据集
the labeled data is scarce and the amount currently available is insufficient for traning a large CNN
针对问题①:
[31] 用回归的方法去解决
[28,29,33] sliding-window detector (为了保证高分辨率,这类网络往往只有两个卷积和池化层,但是本文所用的卷积核很大,195x195,步长也很长,32,这就很难用滑动窗口去进行精准定位了)
针对问题②:
无监督的预训练+有监督的fine-tuning
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fbMWJXdC-1586676325918)(en-resource://database/962:1)]
问题①:
[18] 基于区域提议的识别
具体为:
在测试阶段,为每张图像生成2000个提议区域,输入到CNN网络中进行特征提取,然后将每个区域的特征用线性SVM进行分类。这些区域在输入到CNN之前,都会进行简单的仿射变形(affine image warping),以适配网络的输入尺寸。
因此本文事实上是将region proposal和CNN结合在了一起,作者将其称之为R-CNN。
问题②:
有监督预训+小数据集上fine-tuning
supervised pre-traning on large auxiliary dataset, followed by domain-specific fine-tuning on a small dataset, is an effective paradigm for leaning high-capacity CNNs when data is scarce.
此外,本工作中class-specific的计算仅仅在于最后的矩阵向量积和贪心非极大值抑制。即便如此,用CNN提取到的特征数量还是比人工构造的区域特征少了2个数量级。
① CNN内容可视化,发现绝大多数多余的参数是可以被remove掉的,而accuracy却不会下降多少,并且在CNN中提取到了丰富的特征信息(rich features)
② failure分析
results from detection analysis tool [20]
发现如果加上一个简单的bounding box回归就能极大的降低mislocalization
③ 该网络很容易迁移到语义分割上,也可以实现效果的提升
总体思路分为3个module:
生成无标签的区域提议→CNN特征提取→特定分类的线性SVM
① 提议区域
生成region proposal的方法包括:
objectness
selective search (本文选用此种方法)
参考:Selective Search for Object Recognition解读
category-independent object proposals
constrained parametric min-cuts
multi-scale combinatorial grouping
② 特征提取
采用alexnet作为base model, 提取4096维特征;输入的是去均值的RGB图像,大小277x277;网络结构为5个卷积层和2个全连接层。
image warping:本文采用的最简单的方法,也就是直接将bbox中的图像变形到指定尺寸。注意先将回归框往外扩展16个像素(也就是回归框的宽度)。其他变换方法可参考本文的supplementary material。(各向异性缩放,作者还将其与各向同性缩放做了对比)
对每张图片提取提议区域后,将每个提议区域输入到CNN获得特征向量,然后用训练好的各个class的SVM分类器对每个区域进行打分。对打分后的区域,采用贪心非极大值抑制来剔除那些和打分更高的区域重合程度超过一定阈值的回归框。下图是计算IoU的例子。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PEBWqAG6-1586676325919)(en-resource://database/963:1)]
参考:IoU,IU
运行时间分析:
CNN权值共享,特征维数下降,都显著降低了单幅图片的处理时间。
class-specific的计算主要是特征向量和SVM权重之间的点积运算和非极大值抑制。这事实上被转换为了矩阵乘积。
特征矩阵:2000x4096
SVM weights:4096xN
这意味着,RCNN完全可以拓展到更多类别的检测上。即使类别数达到了100k,这里的矩阵乘法耗时也不过10s左右(CPU)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R0luXbRd-1586676325921)(en-resource://database/1262:1)]
① 有监督预训练
在ILSVRC 2012数据集上,图片级的标注(也就是没有标注回归框)。top 1 error比[22]要高2.2个百分点,主要是因为本文对训练过程进行了一些简化。
② fine-tuning
用region proposals 继续对CNN进行训练,将原本对imagenet的1000个类别输出替换为voc的20+1(background),其他网络结构不变。
将和groud truth的IoU>=0.5的bb标注为positive,其他为negative。
同时将学习率调至与训练时的1/10,保证网络能够得到训练,但是不至于完全改变预训练的权重。
在每个SDG迭代中,采用32个positive window和96个background组成一个batch。
③ 训练分类器
为每个类别都训练一个分类器。采取standard hard negative mining method来避免OOM (详见补充材料)
补充材料中还讨论了训练分类器的必要性。
对比UVA,mAP提升了接近20个百分点。
反卷积方法:[36]
本文所用:
将某个特定卷积核作为一个detector,如pool5的256个卷积核。用10million个region proposal去激活它,提取其打分最高的那个区域。
结果表明这些卷积核都能识别到一定的特征(rich features),而后续的fc层能很好的利用这些特征来compose各种类别。
实验发现:
① 无fine-tune时,卷积层效果比fc层好,预示着以后可以采用dense feature map
② 有fine-tune时,fc层提升非常明显,这说明卷积层学到的是非常general的特征,mAP的提升主要在于fc层学到了具体到各个类别的特征(依靠分类器)
工具: [20]
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZuV6AKTu-1586676325922)(en-resource://database/964:1)]
经分析,主要误差来源为定位误差,而不是和其他类别发送混淆,这驱使作者考虑加入一个bbox回归,来降低错误率。
在原来的pool5之后,对每个region proposal拿到的feature,都做一个bbox回归,来重新定位。详见补充材料。
参考:
https://blog.csdn.net/wopawn/article/details/52133338
详述了一些结果分析以及问题
official implementation:https://github.com/ShaoqingRen/SPP_net
紧随r-cnn之后出现在2014年ECCV的工作,by何恺铭大神。论文
Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
两个主要工作:
很好的博客:
https://blog.csdn.net/WoPawn/article/details/52463853
R-CNN的问题:
对一张图像中的每个提议区域都用CNN进行一次特征提取,相当于对图像各区域进行了大量的重复计算,导致时间和空间消耗非常大。
解决:
借鉴SPPnet [11]的空间金字塔池化,其为整张图片计算一个特征map,然后在分类时采用从特征map上抽取得到的各个区域的特征向量。
抽取各个proposal的特征向量,通过一系列不同大小的最大池化来实现,池化结果形成一个空间金字塔。
SPP也依然不是端到端的,它后面还是用的svm(同rcnn),边框回归也是单独做的。SPP还有一个问题,它在sp之前的卷积层都不能进行fine-tune?
原R-CNN和SPP-Net的共同点:
Fast R-CNN实际上提出了一种single stage的目标检测pipeline,并且训练中所有层都是可以更新的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JxbOh3GI-1586676325924)(en-resource://database/1266:1)]
网络结构如上。输入图像经过DNN后,成为特征图,然后将region proposal的ROI投影到feature map上,找到这个投影区域后,对其进行ROI pooling,然后经过fc后,分为两路,一路经过fc和softmax用于k+1(background)分类,另一路作为bbox的回归器(4xk个实数),这样将分类预测和边框回归统一到一起,而无需分阶段训练。
RoI区域用(r,c,h,w)来描述,其中r、c为top-left值,h、w为高度和宽度。RoI池化使用的是最大池化。它将边长为h×w的RoI区域用H×W的池化算子划分为许多的子窗口,这些子窗口的size为h/H×w/W,然后对每个子窗口使用最大池化。这种RoI池化事实上是SPPnet中金字塔池化的一种特例,这里只有一个金字塔层,其池化计算方法同SPPNet中的描述。
注意,在这种池化操作后,各个特征框被池化到同一大小,也就是HxW的大小,对VGG来说是7x7。
其实现方法是:
将hxw的特征框划分为h/H×w/W个子窗口,在每个子窗口里面做最大池化,最后就得到一个HxW大小的池化结果。
作者在这里解释了SPPNet在SP之前的层为什么不可以fine-tune的原因:是由于SP本身结构所致。
在SPPNet和R-CNN中,训练时,是用的SGD,一个batch中,输入的ROIs通常是随机crop自不同图像,这就导致,在一个batch中,对每个RoI来自的图像,都要计算一次forward propagation,计算效率很低;而在fast R-CNN中,提出一种分层采样的思想,也就是先从总数据集中抽取N张图片,然后再从每幅图像中各抽取R/N个RoI作为这个batch的训练样本。可以把N取小一点,R取大一点,这样每个batch的运算效率会更高,这能大大缩短运算时间、减少运算消耗。
有一个担心是,每个batch中都是用来自同样几张图像的RoI,会不会导致收敛变慢?作者实验发现并不会。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GN4HyTli-1586676325926)(en-resource://database/1267:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ov9O3QTG-1586676325928)(en-resource://database/1272:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KsjKJxpg-1586676325929)(en-resource://database/1273:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DtIBI9QT-1586676325930)(en-resource://database/1268:1)]
包括分类损失和bbox回归损失两个部分。分类损失是log损失;回归损失采用的是smooth L1
注意λ在背景的时候是0,不是背景的时候是1。
smooth L1的定义如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oa07ueXl-1586676325932)(en-resource://database/1269:1)]
这种损失函数与l1相比,在原点处更平滑,无突变,参见这个知乎解释:请问 faster RCNN 和 SSD 中为什么用smooth L1 loss,和L2有什么区别?
这里从L1、L2、smooth L1的梯度出发来讨论,认为L2在初期网络预测值和真实值差异很大时,损失函数梯度也很大,导致训练初期非常不稳定;而L1在差异很大时虽然是1的上限,但是在差异很小时,也就是训练后期,还是保持着较大的梯度(-1),这就导致训练后期loss可能无法很好收敛,而是稳定在某个值;而smooth L1很好的解决了了这个问题,能够规避二者的缺点,因此说它的鲁棒性更好。
相比R-CNN和spp-net,他们用分阶段的方式,但是fast rcnn是直接一步到位的。
SGD中,每个batch的128个ROI只来自2张图像,每张图采64个proposal。
这些proposal中,有25%和GroundTruth的IoU>0.5,这些RoI的label是u>=1,也就是前景,是有具体类别的;而剩下的RoI和GT的IoU[0.1, 0.5),标记为背景,u=0;IoU低于0.1的,好像被用在了困难样本挖掘?
一般的maxpooling层:最大位置的神经元偏导数为1,其他为0,因此将梯度反向传播会上一层时,是传到对应原最大像素的位置上,而其他位置为0(保持总梯度值不变,平均池化同理)
RoI pooling:因为RoI区域是高度重叠的,可能很多输出节点反向计算回去是在同一像素位置上,这样就要把所有该位置上的梯度求和
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8dGW9uCa-1586676325933)(en-resource://database/1270:1)]
https://blog.csdn.net/xunan003/article/details/86597954
另:CNN中卷积层,池化层的反向传播 https://www.cnblogs.com/WSX1994/p/11230121.html
也就是大小目标具有相近的检测性能,两种方法
问题:非极大值抑制,窗口得分是怎么计算的?应该是算的和ground truth的 IoU,或者GIoU
一般的图像分类,卷积层耗时比全连接层多;但是目标检测中,特别是这种region proposal型的,每一个proposal都需要经过一次fc层,如果有2k个proposal就要经过2k次,因此非常耗时。
思路是对全连接层的参数矩阵进行特征值分解,取部分特征值进行代替,减少计算量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D0yupjRr-1586676325934)(en-resource://database/1271:1)]
这个系列博文每篇都写的不错,很清晰:
https://blog.csdn.net/WoPawn/article/details/52223282
faster r-cnn中的region proposal network(RPN),作者说其实是相当于将一个small network在深度网络提取出来的**特征图(大小为H×W)**上滑动。。这个小网络将featuremap上的一个nxn窗口作为输入,将其映射成低维特征向量(256d、512d)。这个小网络的组成包括一个nxn的卷积层,和两个孪生的1x1卷积层,分别接bbox regression(4参数)、类别评分(2参数)
作者在RPN所取的滑窗大小3x3,因为是在特征图上进行,特征图是多次采样得来,在原图中的感受野其实很大。
而Anchor,可以做如下理解:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1pzIVvYz-1586676325936)(en-resource://database/1274:1)]
首先,我们从深层网络获取到了特征图,然后我们用3x3的窗口在上面滑动。窗口中心每次停留在特征图的一个像素上,这个特征图上的像素对应的原image位置就是anchor。而文中提到的边长128、256、512和长宽比1:1、1:2、2:1的9种anchor,是指在原image上的尺寸。
训练RPN的时候,假设每个feature map种的像素可能是由9个anchor区域池化得到的,因此这些区域的位置和坐标都是可以反向计算得到的(这里理解为spp的逆过程),得到proposal的位置和坐标后,一方面和gt类别标签计算前景、背景概率;另一方面和gt的bbox位置比较,得到平移和缩放参数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2RSUFMAp-1586676325937)(en-resource://database/1275:1)]
anchor数目:对于1000x600的图像,如果得到一个60x40的特征图,就有大约20000(~60×40×9)个anchors,忽略超出边界的,剩下6000个,nms去掉重叠的剩2000个用于训练;测试时,选top-300个用于检测
作者认为multibox方法不能保证平移不变性,而这里的anchor是可以保证的,这同时还减小了模型的size
这里只使用了单一尺度的图像、特征图、filter,而采用了anchor金字塔,计算效率更高
使用anchor后,关于bbox的回归所用loss函数也有所不同,分别是计算预测值与anchor的平移缩放量(t_x,t_y,t_w,t_h),GT与anchor的平移缩放量(t*_x,t_y,t*_w,t_h),然后在这两组量之间计算回归loss
如果单独训练二者,他们对网络的调整是不一样的,因此有必要找一个合适的训练策略:
仍然存在的问题:实时性有待提高,这在yolo种得到了改进
该系列的一个参考RCNN, Fast-RCNN, Faster-RCNN的一些事
这里先讨论,不管用selective research还是rpn方法获得proposal后,怎么对rcnn网络进行训练,也就是对proposal进行修正,分为assign和sample两个步骤:
首先把gt bbox assign给每个候选框,每个框将被赋值为-1, 0 或正值。-1代表忽略, 0是负样本,正数是匹配上的gt的编号。
流程:
匹配完事了就开始采样,因为一般情况下负样本比正样本多得多,所以为了避免一个batch 里面绝大多数都是负样本,会设置一个正样本的比例,尽可能采样正样本,先满足正样本的需求。
对于Faster RCNN来讲,与RCNN和Fast RCNN最大的区别就是,目标检测所需要的四个步骤,即候选区域生成,特征提取,分类器分类,回归器回归,这四步全都交给深度神经网络来做,并且全部运行在 GPU上,这大大提高了操作的效率。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nDS1OQHa-1586676325943)(en-resource://database/1281:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JjBoHyvC-1586676325943)(en-resource://database/1282:1)]
如果没有用到FPN,一般输入到RPN的featuremap都很小了,相当于整个特征图上每个像素点,都产生9个anchor,也就是都会产生cls(2x9)+reg(4x9)个输出,所有像素产生的proposal加在一起为这个RPN阶段产生的所有proposal,然后经过上面的assign和sample送入到主干网络中。
另外,个人理解,训练时为了提高效率应该是需要对rpn的proposal进行nms和sample的,然后取top300这样,但是测试时,应该取更多,也就是放松proposal的限制,这样有利于更多目标的检出。(又是recall和precision的balance问题)
论文:feature pyramid networks for object detection 2017
博文:https://blog.csdn.net/u014380165/article/details/72890275
作者提出的多尺度的object detection算法:FPN(feature pyramid networks)。原来多数的object detection算法都是只采用顶层特征做预测,但我们知道低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。另外虽然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做预测,而本文不一样的地方在于预测是在不同特征层独立进行的。
下图FIg1展示了4种利用特征的形式:
(a)图像金字塔,即将图像做成不同的scale,然后不同scale的图像生成对应的不同scale的特征。这种方法的缺点在于增加了时间成本。有些算法会在测试时候采用图像金字塔。
(b)像SPP net,Fast RCNN,Faster RCNN是采用这种方式,即仅采用网络最后一层的特征。
(c)像SSD(Single Shot Detector)采用这种多尺度特征融合的方式,没有上采样过程,即从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量。作者认为SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而在作者看来足够低层的特征对于检测小物体是很有帮助的。
(d)本文作者是采用这种方式,顶层特征通过上采样和低层特征做融合,而且每层都是独立预测的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HmVII4Nk-1586676325945)(en-resource://database/1278:1)]
作者的主网络采用ResNet。
作者的算法大致结构如下:一个自底向上的线路,一个自顶向下的线路,横向连接(lateral connection)。图中放大的区域就是横向连接,这里1*1的卷积核的主要作用是减少卷积核的个数,也就是减少了feature map的个数,并不改变feature map的尺寸大小。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-76NHJwkm-1586676325946)(en-resource://database/1279:1)]
自底向上其实就是网络的前向过程。在前向过程中,feature map的大小在经过某些层后会改变,而在经过其他一些层的时候不会改变,作者将不改变feature map大小的层归为一个stage,因此每次抽取的特征都是每个stage的最后一个层输出,这样就能构成特征金字塔。
自顶向下的过程采用上采样(upsampling)进行,而横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合(merge)。在融合之后还会再采用3*3的卷积核对每个融合结果进行卷积,目的是消除上采样的混叠效应(aliasing effect)。并假设生成的feature map结果是P2,P3,P4,P5,和原来自底向上的卷积结果C2,C3,C4,C5一一对应。
作者一方面将FPN放在RPN网络中用于生成proposal,原来的RPN网络是以主网络的某个卷积层输出的feature map作为输入,简单讲就是只用这一个尺度的feature map。但是现在要将FPN嵌在RPN网络中,生成不同尺度特征并融合作为RPN网络的输入。在每一个scale层,都定义了不同大小的anchor,对于P2,P3,P4,P5,P6这些层,定义anchor的大小为322,642,1282,2562,512^2,另外每个scale层都有3个长宽对比度:1:2,1:1,2:1。所以整个特征金字塔有15种anchor。
如上图所示,FPN能够很好地处理小目标的主要原因是:
tf源码解析:
https://zhuanlan.zhihu.com/p/35854548
Faster R-CNN+FPN细节图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XqquPItl-1586676325948)(en-resource://database/1280:1)]