怎么理解anchor?

首先我们需要知道anchor的本质是什么,本质是SPP(spatial pyramid pooling)思想的逆向。而SPP本身是做什么的呢,就是将不同尺寸的输入resize成为相同尺寸的输出。所以SPP的逆向就是,将相同尺寸的输出,倒推得到不同尺寸的输入。

接下来是anchor的窗口尺寸,这个不难理解,三个面积尺寸(128^2,256^2,512^2),然后在每个面积尺寸下,取三种不同的长宽比例(1:1,1:2,2:1).这样一来,我们得到了一共9种面积尺寸各异的anchor。示意图如下:

至于这个anchor到底是怎么用的,这个是理解整个问题的关键。

下面是整个faster RCNN结构的示意图:

利用anchor是从第二列这个位置开始进行处理,这个时候,原始图片已经经过一系列卷积层和池化层以及relu,得到了这里的 feature:51x39x256(256是层数)

在这个特征参数的基础上,通过一个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 进行比较得到的前景概率和背景概率(2个参数)(对应图上的 cls_score);由于每个 proposal 和 ground truth 位置及尺寸上的差异,从 proposal 通过平移放缩得到 ground truth 需要的4个平移放缩参数(对应图上的 bbox_pred)。

所以根据我们刚才的计算,我们一共得到了多少个anchor box呢?

51 x 39 x 9 = 17900

约等于 20 k

bingo!

https://www.zhihu.com/question/42205480/answer/155759667

作者:冯建兴
链接:https://www.zhihu.com/question/42205480/answer/206500260
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

这篇文章的核心就是通过网络计算region proposal,也就是要通过feature map去拟合每个对象的bounding box的4个参数。

  1. 最直接的办法是:对于feature map上的每个window,如果里面有某个真实的对象,那么就用这个window的feature作为特征拟合这个对象的bounding box的4个参数。这样做至少有两个问题:
    1. 第一个问题:如果window里面有多个不同大小的对象怎么办?这个问题貌似不好解决。
    2. 第二个问题:如何调整scale?假设用L2(文章不是用的L2,但是基本意思一样),如果是一个大的对象,我们可以允许L2比较大,如果是小对象L2应该比较小才可以。这个问题其实比较好解决,用对象的大小作为分母对L2做归一化处理即可。
  2. 对上述两个问题(特别是第一个问题)作者的解决办法就是Anchor。
    1. 预先定义好不同大小,不同长宽比例的一些box(Anchor)。文中一共定义了9种。每个feature map上的window都对应9个这样的anchor。
    2. 可以想象,原始图像上的任意一个对象的bounding box都能在Feature map上找到某个window的某个anchor,使得二者在位置和大小上都能比较好的匹配。
    3. 如果一个window里面有多个大小不同的对象,那么就对应于这个window的不同的anchor。这就解决了第一个问题。
    4. 拟合的时候,欧式误差都用anchor的大小做scaling,从而解决了第二个问题。注意文章中方程(2),里面在计算box的中心位置的误差的时候实际上只有w_a和h_a起作用(Anchor的长宽被用来做了scaling),x_a和y_a(Anchor的中心)会被cancel掉,是没有作用的。在计算box的大小的时候,Anchor的参数没有任何作用,全都被cancel掉了。

首先我们先确定一点就是proposals是候选框的意思,就是RPN的输出;然后这张图是整个RPN的流程,其中sliding window,虽然叫sliding window,但是其实真实的操作却是一次3x3的卷积操作,得到一个256xHxW的特征图,也就是HxW个256维向量;而Anchor并不存在于这张图中,Anchor是在原图上的,HxW个256维向量,映射回原图就有HxW个Anchor,然后以每个Anchor为中心“瞎编”一堆框,论文中是9个框;

论文:《Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks》

摘要:算法主要解决两个问题:

1、提出区域建议网络RPN,快速生成候选区域;

2、通过交替训练,使RPN和Fast-RCNN网络共享参数。

一、 RPN网络结构

RPN网络的作用是输入一张图像,输出一批矩形候选区域,类似于以往目标检测中的Selective Search一步。网络结构是基于卷积神经网络,但输出包含二类softmax和bbox回归的多任务模型。网络结果如下(以ZF网络为参考模型):

其中,虚线以上是ZF网络最后一层卷积层前的结构,虚线以下是RPN网络特有的结构。首先是3*3的卷积,然后通过1*1卷积输出分为两路,其中一路输出是目标和非目标的概率,另一路输出box相关的四个参数,包括box的中心坐标x和y,box宽w和长h。

(至于之前为什么要用3*3的卷积核,我觉得是和感受野大小相对应的。在原来的ZF模型中,3*3卷积核对应map比例是3/13,相当于在型如1000*600的图片中采用180左右的感受野。对于1000*600的图片中大部分目标而言,这个大小的感受野是比较合适的吧。)

从卷积运算本身而言,卷积相当于滑窗。假如输入图像是1000*600,则经过了几次stride后,map大小缩小了16倍,最后一层卷积层输出大约为60*40大小,那么相当于用3*3的窗口滑窗(注意有padding),对于左边一支路而言,输出18个通道,每个通道map大小仍为60*40,代表每个滑窗中心对应感受野内存在目标与否的概率。右支路同理。

二、 anchor机制

anchor是rpn网络的核心。刚刚说到,需要确定每个滑窗中心对应感受野内存在目标与否。由于目标大小和长宽比例不一,需要多个尺度的窗。Anchor即给出一个基准窗大小,按照倍数和长宽比例得到不同大小的窗。例如论文中基准窗大小为16,给了(8、16、32)三种倍数和(0.5、1、2)三种比例,这样能够得到一共9种尺度的anchor,如图(摘自http://blog.csdn.net/shenxiaolu1984/article/details/51152614)。

因此,在对60*40的map进行滑窗时,以中心像素为基点构造9种anchor映射到原来的1000*600图像中,映射比例为16倍。那么总共可以得到60*40*9大约2万个anchor。

三、 训练

RPN网络训练,那么就涉及ground truth和loss function的问题。对于左支路,ground truth为anchor是否为目标,用0/1表示。那么怎么判定一个anchor内是否有目标呢?论文中采用了这样的规则:1)假如某anchor与任一目标区域的IoU最大,则该anchor判定为有目标;2)假如某anchor与任一目标区域的IoU>0.7,则判定为有目标;3)假如某anchor与任一目标区域的IoU<0.3,则判定为背景。所谓IoU,就是预测box和真实box的覆盖率,其值等于两个box的交集除以两个box的并集。其它的anchor不参与训练。

于是,代价函数定义为:

代价函数分为两部分,对应着RPN两条支路,即目标与否的分类误差和bbox的回归误差,其中Leg(ti,ti*) = R(ti-ti*)采用在Fast-RCNN中提出的平滑L1函数,作者认为其比L2形式的误差更容易调节学习率。注意到回归误差中Leg与pi相乘,因此bbox回归只对包含目标的anchor计算误差。也就是说,如果anchor不包含目标,box输出位置无所谓。所以对于bbox的groundtruth,只考虑判定为有目标的anchor,并将其标注的坐标作为ground truth。此外,计算bbox误差时,不是比较四个角的坐标,而是tx,ty,tw,th,具体计算如下:

四、 联合训练

作者采用四步训练法:

1) 单独训练RPN网络,网络参数由预训练模型载入;

2) 单独训练Fast-RCNN网络,将第一步RPN的输出候选区域作为检测网络的输入。具体而言,RPN输出一个候选框,通过候选框截取原图像,并将截取后的图像通过几次conv-pool,然后再通过roi-pooling和fc再输出两条支路,一条是目标分类softmax,另一条是bbox回归。截止到现在,两个网络并没有共享参数,只是分开训练了;

3) 再次训练RPN,此时固定网络公共部分的参数,只更新RPN独有部分的参数;

4) 那RPN的结果再次微调Fast-RCNN网络,固定网络公共部分的参数,只更新Fast-RCNN独有部分的参数。

至此,网络训练结束,网络集检测-识别于一体,测试阶段流程图如下:

有一些实现细节,比如RPN网络得到的大约2万个anchor不是都直接给Fast-RCNN,因为有很多重叠的框。文章通过非极大值抑制的方法,设定IoU为0.7的阈值,即仅保留覆盖率不超过0.7的局部最大分数的box(粗筛)。最后留下大约2000个anchor,然后再取前N个box(比如300个)给Fast-RCNN。Fast-RCNN将输出300个判定类别及其box,对类别分数采用阈值为0.3的非极大值抑制(精筛),并仅取分数大于某个分数的目标结果(比如,只取分数60分以上的结果)。

猜你喜欢

转载自blog.csdn.net/as472780551/article/details/81227408
今日推荐