RPN(RegionProposal Network),ROI Pooling, roi align,双线性插值

目录

一:回顾

二:anchor boxes基本概念与作用:

 三:RPN

介绍:

第一步:

第二步:

第三步:

四:具体过程

 1、fetaure map 到 intermediate layer 的卷积过程

2、intermediate layer 的256维向量后面对应两条分支(定位层,分类层)

3、proposals layer

4、为什么要softmax分类器提取fg anchors?

5、如果不用softmax分类器提取fg anchors?:

6、RoI Pooling 层

7、Loss

8、RPN小结

五:RoI Pooling 层的工作原理。

1、介绍

2、roi pooling做的第一件事情:

3、roi pooling做的第二件事情:

3、改进:

roi align

六:双线性插值

1、先介绍单线性插值法:根据距离,比例(权重)来计算

2、双线性插值

​编辑

​编辑

所有项目代码+UI界面


一:回顾

        上一篇我们了解了dense net网络的结构以及具体的细节,其主要特点是在网络的每一层都将前面层的特征图作为输入,这使得网络中每一层都可以利用前面所有层的信息,从而大大增强了网络的特征复用能力。

二:anchor boxes基本概念与作用:

        feature map 上的一个点可以映射回输入图片上的一个点,以特征图上这个点为中心,预先人为设定 k 个 boxes,这些 boxes 就称为在这个点上生成的 k 个 anchor boxes(所有anchor boxes的中心点坐标是一样的)。一个 m ∗ n 的特征图就有 m∗n∗k 个 anchor boxes。

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aWU6LeR55qE5aSn6KW_5ZCJ,size_20,color_FFFFFF,t_70,g_se,x_16

                                                                        图1

         anchor boxes 的作用是将 boxes 传给 RPN, 让 RPN 判断其中哪些 anchor boxes 可能存在目标,并进一步回归坐标(后面会提到),得到 proposals 输给后面的网络。模型回归的目标是真实 boxes 与 anchor boxes 之间坐标的偏移量偏移量和 anchor boxes 的坐标带入预先设定的公式中,就得到了最终预测的boxes坐标。

恢复过程大概:

fcd46813ee3b4e1784915db1d142a329.png

 三:RPN

介绍:

        RPN的本质是 “ 基于滑窗的无类别obejct检测器 ”。因为它是用来生成区域建议的,而不是直接对图像进行分类或检测。RPN通过滑动窗口在图像上生成一系列的候选区域(即region proposals),然后利用这些候选区域作为ROI(region of interest)送入后续的分类器或检测器中进行分类或检测。因此,RPN更准确地说是一种用于生成候选区域的算法,而非直接进行目标检测的算法。

        对于提取候选框最常用的 SelectiveSearch 方法,提取一副图像大概需要2s的时间,改进的 EdgeBoxes 算法将效率提高到了0.2s,但是这还不够。候选框提取不一定要在原图上做,特征图上同样可以,低分辨率特征图意味着更少的计算量,基于这个假设,MSRA的任少卿等人提出RPN(RegionProposal Network, 区域候选网络),完美解决了这个问题,它的主要功能是生成区域候选(Region Proposal)(可以看做是许多潜在的边界框,也叫 anchor,它是包含4个坐标的矩形框),如图1所示。

        RPN简单来说就是:假设输入一张图片,经过前面骨干网络的一系列的卷积或者池化之后之后,得到一个尺寸 m ∗ n 的特征图(暂且不说通道),对应将原图划分为 m ∗ n 个区域,原图的每个区域的中心由这个特征图上的一个像素点坐标表示。通过anchor机制,可以在每个像素点对应原图的区域生成k个可能存在目标的候选框(称为anchor box),如上图所示(k=9)。RPN就是用来判断每个像素点对应的k个区域是不是包含目标,如果包含(那么先根据输出的坐标偏移量修正box位置)则输给后面的RCNN做进一步判断。(意思就是要从m*n=9个候选框中做筛选,提取proposals)

        RPN  的结构如下图所示,backbone 输出的特征图经过一个 3 ∗3 卷积之后分别进入了不同的分支,对应不同的 1 ∗ 1 卷积。第一个卷积为定位层,输出 anchor 的4个坐标偏移。第二个分支(也称为分类层)对应于二分类任务,它生成每个锚点的前景和背景概率。前景指锚点内部是包含目标,背景指锚点内部不包含目标。在分类层中,锚点的前景和背景概率通过一个sigmoid函数进行归一化,以保证它们在0到1之间。

        最后,RPN使用非极大值抑制(NMS)对锚点进行后处理,以去除重叠的候选框。通常,根据预测的前景概率对锚点进行排序,并选择具有最高分数的锚点作为最终输出。如果多个锚点具有相似的位置和尺度,则只保留具有最高前景分数的锚点,并删除其他锚点。

通过backbone之后的特征图大小为(60,40,512).

17e2caea67f44550aba3036b7a696e1a.png

 看完了RPN的大致结构,下面来看RPN的详细过程。主要看一下,RPN是如何生成以及处理anchor的。下图表示了rpn网络的详细结构。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdsZXBlbmc=,size_16,color_FFFFFF,t_70

第一步:

        定义生成基础 anchor(base_anchor),基础锚框base_anchor的数目 = 长宽比的数目 * anchor 的缩放比例数目, 即 anchors_num = len(ratios) * len(scales)。这里,设置了3种长宽比(1:1, 1:2,2:1)和3种缩放尺度(8, 16, 32),因此 anchor_num = 9. 下图表示了其中一个位置对应的9个尺寸的 anchor。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdsZXBlbmc=,size_16,color_FFFFFF,t_70

第二步:

        根据 base_anchor,对特征图上的每一个像素,都会以它为中心生成9种不同尺寸的边界框,所以总共生成 60×40×9=21600 个anchor。需要注意的是,所有生成的 anchor 都是相对于原图的(只不过变成特征图后像素点少了,计算量少了)。        

        牢记:特征图上的每个点生成一个Anchors,Anchors 可以理解成9个不同的框(框的属性是长宽了,再进一步是四个点的坐标)。这个框的数据(框的左上角坐标(x0,y0),右下角坐标(x1,y1))这四个值都是对应于原图的。下面这个就是原图,红色点就是特征图上的点对应于原图的位置。每一个位置使用 9 个锚点,每个位置会生成 2×9 个目标分数和 4×9 个坐标分数显然,通过一个中心定义9个不同的框,就是为实现多尺度这个想法。当然这样做获得检测框很不准确,后面会做2次 bounding box regression 修正检测框位置。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdsZXBlbmc=,size_16,color_FFFFFF,t_70

第三步:

        anchor的筛选。首先将定位层输出的坐标偏移应用到所有生成的 anchor,定位层的输出即为坐标偏移量。具体来说,RPN会对每一个生成的anchor box输出四个坐标偏移量,分别表示将当前anchor box的左上角、右下角坐标分别沿着x轴、y轴方向偏移的距离,这些偏移量是通过与标注框计算损失进行训练得到的。。这四个偏移量是由定位层输出的,通过这些偏移量,可以将anchor box精确地调整到目标的位置。

 定位层实现的具体方式如下:(跟SSD篇介绍的计算锚框的偏移量是一样的!)

1ed780e63fb24602867af522f5ca3fe1.png

a27374db44bd4316b61e59b5abce5ee7.png

         注意:定位层的输出在训练和预测时都会使用在训练阶段,在RPN的训练阶段,定位层的输出会与真实边界框计算回归损失,并用于更新网络的参数。在预测阶段,定位层的输出会被应用到生成的锚框上,用于调整锚框的位置以更好地匹配目标物体。

        定位层的参数是训练和预测阶段共享的但是在训练和预测阶段的具体操作是不同的:在训练阶段,定位层的输出被用来计算回归损失,而在预测阶段,定位层的输出被应用到生成的锚框上,用于调整锚框的位置因此,训练和预测可以视为独立的操作,但它们共享相同的定位层参数。

四:具体过程

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdsZXBlbmc=,size_16,color_FFFFFF,t_70

 1、fetaure map 到 intermediate layer 的卷积过程

        RPN网络前面是一个提特征的网络,比如VGG,Resnet等,传给RPN网络的是一个特征图,其实也就是一个 tensor,比如用ZF网络(论文里面用的),输入特征图:13 ∗ 13 ∗ 256。拿到模型的特征(先做一个3*3的卷积,上面图1也有说到),RPN网络首先加了一个 3 ∗ 3 ∗ 256 步长为 1 的卷积层(可能是为了扩大感受野)

        这样就会得到 11 ∗ 11 ∗ 256的输出,前面 11 ∗ 11 是图形矩阵,其中每一个点在原图中都是一个很大的区域,256表示这个区域的特征。

        在这个区域内可能有目标,为了能更能逼近目标,我们需要3种尺度,和3种形状,就是图中的那9种物体框。假设原图中有一个物体,那我们通过在原图上平移框,就总能找到一个颜色框能正好把物体框在里面(真是厉害这想法),而且尺度啊形状最接近。

        那么如何平移的呢?在原图上你一个像素一个像素平移没意义啊,难道要重复提取特征?所以平移必须在特征图上平移,因为特征图最后总能映射回原图。11 ∗ 11  的特征图区域,在原图中就表示 11 ∗ 11 1 个大黑框,每个大黑框里面又有9个小颜色框,这样就会产生 11 ∗ 11 ∗ 9  个不同位置,不同尺度,不同形状的物体框,基本足够框出所有物体了。

        问:为什么不在原图上偏移?

        答:这样可以避免特征图带来的信息损失。因为特征图是原图通过卷积层等操作得到的,经过了一定的压缩和信息损失,所以在特征图上偏移可能会带来一定的误差。

          虽然但是,在实际应用中,通过不断优化网络结构和训练方法,可以减小这种误差的影响使得在特征图上偏移的方法也能够获得较好的检测效果。

        至于在原图上偏移的方法,虽然可以避免特征图带来的信息损失,但是需要对原图进行不同尺度和形状的变换,计算量较大,同时也可能会出现过多的不必要计算。因此,在实践中,综合考虑计算效率和检测精度等因素,特征图上偏移的方法更为常用和有效。

2、intermediate layer 的256维向量后面对应两条分支(定位层,分类层)

先做一次3*3的卷积层:

7d25b4a0d5cd4bb3bcb1f7f31a2a4e81.png

  • cls layer (分类层)分支是目标和背景的二分类(classification),因为k等于9,所以通过 1 × 1 × 256 × 18的卷积核得到 2 × 9 = 18  个分数,分别是目标和背景的评分。
  • reg layer分支(回归层)。如果候选框是目标区域,就去判断该目标区域的候选框位置在哪,这个时候另一条分支就过 1 × 1 × 256 × 36 的卷积得到 4 × 9 个值,每个框包含4个值(x,y,w,h),就是9个候选区域对应的框应该偏移的具体位置Δxcenter,Δycenter,Δwidth,Δheight。如果候选框不是目标区域,就直接将该候选框去除掉,不再进行后续位置信息的判断操作这里预测的值都是通过模型不断训练得到的。
  • RPNcls layer和RPNreg layer是同时进行的。具体来说,对于每个anchor box,分类分支会输出该anchor box为目标物体的概率(即前景概率),以及该anchor box为背景的概率(即背景概率),而回归分支会输出将当前anchor box调整为目标物体位置的坐标偏移量。通过这两个分支的输出,可以确定哪些anchor box可能包含目标物体,并且精确地调整这些anchor box的位置以更好地匹配目标物体。

3、proposals layer

proposals layer 3个输入:一个是分类器结果 foreground softmax scores,一个是 anchor 回归 regression的偏移量:[dx​(A),dy​(A),dw​(A),dh​(A)] ,还有一个是 im-info(((具体来说,im-info包含图像的原始宽高以及缩放后的宽高比例,这些信息可以在计算边界框位置时进行调整。所以,im-info也是RPN网络输入的一部分,im-info可以用于调整 anchor 的尺寸和比例,以适应不同尺寸和比例的目标物体。通过学习从 im-info 到边界框调整的映射关系,模型可以根据输入图像的特征和 im-info 的信息来预测更准确的边界框位置)))

proposal layer 步骤:

  1. 生成 anchors(anchors 的坐标是相对于原图的坐标),然后利用 [ d x ( A ) , d y ( A ) , d w ( A ) , d h ( A ) ] 对所有的 anchors 做 bbox regression 回归。
  2. 这里的 anchors 生成和训练时完全一致,这句话的意思是在生成anchors的过程中,所用的参数和训练时使用的参数完全一致,)这样可以确保在训练时网络学习到的回归系数对锚框的调整在测试时仍然有效,如果在生成anchors时使用了不同的参数,那么在测试时生成的锚框可能与训练时使用的锚框不同,导致网络预测的结果不准确。
  3. 按照输入的 foreground softmax scores 由大到小排序 anchors,提取前pre_nms_topN(e.g. 6000) 个anchors,即提取修正位置后的 foreground anchors。
  4. 判断fg anchors是否大范围超过边界,剔除严重超出边界fg anchors,剔除非常小(width<threshold or height<threshold)的 foreground anchors(
  5. 进行 nms,按照 nms 后的 foreground softmax scores 由大到小排序fg anchors,提取前 post_nms_topN(e.g. 300) 结果作为 proposal 输出。(其实这里的NMS就包含 3,4部分了,具体可以看我的NMS那篇博客)

        总结起来就是:生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals。

proposals layer 的主要作用是生成候选框(也称为 proposals)。

4、为什么要softmax分类器提取fg anchors?

        因为在RPN阶段,为了从大量的候选框中筛选出正样本和负样本,需要使用分类器对每个anchor进行分类。其中,正样本指的是与真实边界框高度重合的anchors,而负样本则指的是与真实边界框高度不重合的anchors。

5、如果不用softmax分类器提取fg anchors?:

        分类器的情况下,我们只能根据锚点与真实边界框的 IoU 来区分前景和背景锚点(类似与传统的那种锚框步骤),但是这样的方法可能会出现一个锚点同时与多个物体边界框具有高 IoU 的情况,从而难以判断其前景还是背景。

  1. 无法筛选出具有高置信度的前景锚点:使用 softmax 分类器可以将前景锚点与背景锚点更加清晰地分开,从而可以筛选出具有高置信度的前景锚点,提高检测准确率。

  2. 无法进行多物体检测:在没有分类器的情况下,每个锚点只能被归为前景或者背景,无法进行多物体的检测。而使用 softmax 分类器可以将每个锚点分为多个物体类别,从而实现多物体的检测。

6、RoI Pooling 层

         在 Faster R-CNN 中,RoI Pooling 层的输入是特征图(feature map)和经过提取后的 RoI 边界框(两条路合起来),因此可以直接从特征图中提取感兴趣区域(RoI),而无需对整张图像进行复杂的计算。这是因为在 RPN 阶段已经生成了一组锚框,这些锚框在特征图上滑动时会形成一组候选区域,这些候选区域与特征图相对应。

48729f89224244d0ac8c2d43755d1159.png

        RoI Pooling 层可以通过对 RoI 进行空间划分并在每个子区域内执行最大池化来提取与感兴趣区域相对应的特征向量。这些特征向量被用于对 RoI 进行分类和回归。回归指的是对于每个RoI,需要通过回归的方法来精细调整其位置和大小,具体来说,RoI Pooling层提取到的特征向量被送入两个全连接层,一个用于分类任务,一个用于边界框回归任务。在边界框回归任务中,模型会通过学习得到每个RoI的位置和大小的微调量,使得其更加精确地匹配目标物体虽然RPN已经生成了候选框,但是这些候选框仍然需要进一步的微调以得到更加精确的结果。

7、Loss

计算 softmax loss 需要的是 anchors 对应的 ground truth 标定结果和预测结果,计算regression loss 需要三组信息:

  1. 预测框,即 RPN 网络预测出的 proposal 的中心位置坐标x,y和宽高w,h;
  2. 锚点 reference box:之前的9个锚点对应9个reference boxes,每一个reference boxes都有一个中心点位置坐标 x a , y a x_a,y_axa​,ya​ 和宽高 w a , h a w_a,h_awa​,ha​;
  3. ground truth:标定的框也对应一个中心点位置坐标x,y和宽高w,h.因此计算regression loss和总Loss方式如下:
    20210615112212997.png
    2021061511222778.png

60654829db8a4a468a7b3e75555616be.png

92939610fd244baf8b9379b986b83787.png

8、RPN小结

  • 只有在train时,cls+reg 才能得到强监督信息(来源于ground truth)。即ground truth会告诉 cls+reg 结构,哪些才是真的前景,从而引导cls+reg结构学得正确区分前后景的能力;在 reference 阶段,就要靠 cls+reg 自力更生了。
  • 在train阶段,会输出约2000个proposal,但只会抽取其中256个proposal来训练RPN的cls+reg结构;到了reference阶段,则直接输出最高score的300个proposal。此时由于没有了监督信息所有RPN并不知道这些 proposal 是否为前景,整个过程只是惯性地推送一波无tag的proposal给后面的Fast R-CNN。
  • RPN的运用使得region proposal的额外开销就只有一个两层网络。
  • two stage型的检测算法在 RPN 之后还会进行再一次的分类任务和边框回归任务,以进一步提升检测精度。
  • 在 RPN 末端,通过对两个分支的结果进行汇总,来实现对 anchor 的初步筛除(先剔除越界的 anchor,再根据 cls 结果通过NMS算法去重)和 初步偏移(根据 bbox reg结果),此时输出的都改头换面叫 proposal 了。
  • RPN之后,proposal 成为 RoI (感兴趣区域) ,被输入 RoIPooling 或 RoIAlign 中进行 size上的归一化。当然,这些都是 RPN网络 之后的操作了,严格来说并不属于 RPN 的范围了。
  • 但是如果只在最后一层 feature map 上映射回原图像,且初始产生的 anchor 被限定了尺寸下限,那么低于最小 anchor 尺寸的小目标虽然被 anchor 圈入,在后面的过程中依然容易被漏检。
  • 但是FPN的出现,大大降低了小目标的漏检率,使得RPN如虎添翼。

从模型训练的角度来看,通过使用共享特征交替训练的方式,达到接近实时的性能,交替训练方式描述为: 1)根据现有网络初始化权值w,训练RPN; 2)用RPN提取训练集上的候选区域,用候选区域训练FastRCNN,更新权值w; 3)重复1、2,直到收敛。

参考:

  • https://blog.csdn.net/ying86615791/article/details/72788414
  • https://www.cnblogs.com/chaofn/p/9310912.html
  • ttps://blog.csdn.net/sinat_33486980/article/details/81099093#commentBox

五:RoI Pooling 层的工作原理。

1、介绍

        RPN它认为在生成的这么多各种各样的候选框框内有检测到我们目标的框,得到之后再把候选框投影到特征图上,但是投影完之后有各种各样大小的框,不同大小的框不能直接输入到特征提取层,所以需要roi pooling。

cea1e09bffa7492893ff5a6532cbe6d5.png

        假设统一为2*2的大小的特征图,那么有第三个候选框就会有多少个2*2(划分为四个子区域)的特征图,所以在进入roi feature vector之前,先统一为2*2(划分为四个子区域)的大小的特征图。1654790d6c444e338e6e8ce0300d4f70.png

         一个像素通常可以用三个参数表示。第一个参数横坐标,第二个点纵坐标,第三个参数是像素值,但是只有一个平面只有二维表示不了,所以解决办法是将第三个参数写在了方框里面,之前误解了因为每一个框的值就是它的像素值,其实只是整个框的左上角的像素值。(0.2,0.53,0.64,0.33、、、、因为faster-rcnn中,在这个阶段已经进行归一化了)

9a63a23547d24028b466aade6bd2da44.png

2、roi pooling做的第一件事情:

        把绿色的方框移动到蓝色的框去,为什么呢?:因为绿色的四个角都不是含有像素值的点!所以需要找到离他最近的点或者取整操作。

3、roi pooling做的第二件事情:

        上面说了,假设需要统一为2*2的特征图,但是整个是5*5的网格,不好处理。不像是2的倍数好处理。解决办法是: 首先看结果:利用最大池化层 ,先划分成这样的2*2(划分为四个子区域),然后每个网格都有像素点,看有像素点的那个网格,采用最大池化层来(这里取了0.9)表示这一部分网格整体像素值,进而表示为这个整个新生成的左上角的像素值,同理:这样可以取到四个顶点的像素值。

80cf2065280547708691b9089fb8180e.png

那么是怎么做的呢?:

        先对width除以2,可知width可分为两个长度为2的网格,再看heigh除以2为2.5,先向下取整,得2,那么先把heigh的分为2和5-2=3,这样就解决了表示二的倍数的区域(这里是5*4)的划分。 

205dad82c3a44902a20d44cf34011007.png

存在的问题:

1:硬性偏移,四个顶点必须落在像素的坐标点上面

2:四个顶点像素值的值可能有偏差,因为不是平均值,因为划分的子区域可能不均匀,这个就是。

3、改进:

roi align

首先把绿色的框投影到特征图上面,每个子区域分为四个点(这个是试出来的,是固定的,并不是模型不一样点个数就一样,每个模型都是四个点),如果四个点是平均的7baa80368b194b029fb788c858a837e4.png是利用红线,分为四个子区域,分别取这四个子区域的中心点即可。目前还不知道这四个点的像素值是多少,但是可以通过一个方法来近似这四个像素点。所以问题就转化成:平均分完之后这四个像素点如何求了。(需要用到双线性插值法)

 首先找到这个点,找到这个点最近的四个有像素值的点,fce5806337794fa4b48db79ab337dee5.png然后 通过双线性插值法求解这个落在空白处(不是像素点,小格子里面的点都不是像素点,那些顶角才是像素点)的点的像素值,每条边每条边的比例是完全已知的,已经证明过了,因为坐标点都知道,只是现在要求像素点。

11c4619e4b814edf8f92a17f3045df60.png

最后算出来每四个的像素值的平均值当成7fd7fcfef6ef423e8021d0c93685347d.png 一个新的像素值,然后最后变成了一个真正的2*2的网格

 24d60b7cc8fe4818a6ab88955aa4c9bb.png

六:双线性插值

1、先介绍单线性插值法:根据距离,比例(权重)来计算

16e8938de48b4912a6f1f918f2616824.png

         求出待求的点到两边的权重,然后用权重分别对应左右像素点的值。得到待求的点的像素值。 

a64f75b2768940e29c83b1c5f4b90be6.png

2、双线性插值

1、第一步:先用单单线性插值求出R1和R2的像素值。 

2:再看y轴的方向,当成新的y轴的单线性插值计算,

d5d2ba6c9f9a4d73aad8a8fae2f7a81a.png

801dce819275447db5639ce7d43129a4.png

 仔细看,简单的公式推导

dc4f09b568f44e9ea58e8775283dbee2.png

 单位长度加起来是1

aa78b99b55e44cdb810e6d851b3ea042.png

最后转换为矩阵的形式,只是用y的变化量表示除法了,结果都一样,只是简写了。24828b3b7d02457c8e3390d1dabbcfa5.png

所有项目代码+UI界面

视频,笔记和代码,以及注释都已经上传网盘,放在主页置顶文章

  • 12
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值