参考:https://blog.csdn.net/xzzppp/article/details/51377731
首先我们需要知道anchor的本质是什么,本质是SPP(spatial pyramid pooling,空间金字塔池化)思想的逆向。
而SPP本身是做什么的呢?
就是将不同尺寸的输入resize成为相同尺寸的输出,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的意义(多尺度特征提取出固定大小的特征向量)。
这个是怎么做到的呢?
假设有一个很简单的两层网络,输入一张任意大小的图片,假设其大小为(w,h),输出到1个神经单元,也就是我们输入一张任意大小的特征图的时候,我们希望提取出21个特征,空间金字塔特征提取的过程如下:
如图所示,当我们输入一张图片的时候,我们利用不同大小的刻度,对一张图片进行了划分,上面示意图中,利用了三种不同大小的刻度(4*4,2*2,1*1),对一张输入的图片进行了划分,最后总共可以得到这16+4+1=21个块,我们即将从这21个块中,每个块提取出一个特征,这样刚好就是我们需要提取的21维特征向量,
第一次:我们把一张完整的图片,分成了16个块,也就是每个块的大小就是(w/4,h/4);
第二次:划分了4块,每个块的大小就是(w/2,h/2)
第三次: 把一整张图片作为了一个块,也就是块的大小为(w,h)
空间金字塔最大池化的过程, 其实就是从这21个图片块中,分别计算出每个块的最大值,从而得到一个输出神经元,最后把一张任意大小的图片转换成了一个固定大小的21维特征(当然你也可以设计其他维数的输出,增加金字塔的层数,或者改变划分网格的大小),上面的三种不同刻度的划分,每一种刻度我们称之为,金字塔的一层,每一个图片块大小我们称之为window size了,如果你希望,金字塔的每一层输出n*n个特征,那么你就要用windows size大小为(w/n,h/n)进行池化了.
哪里用了SPP呢?
RCNN
有什么作用?
提升检测速度
所以SPP的逆向就是,将相同尺寸的输出,倒推得到不同尺寸的输入。
接下来是anchor的窗口尺寸,这个不难理解,三个面积尺寸(128*128,256*256,512*512),然后在每个面积尺寸下,取三种不同的长宽比例(1:1,1:2,2:1).这样一来,我们得到了一共9种面积尺寸各异的anchor。示意图如下:
至于这个anchor到底是怎么用的,这个是理解整个问题的关键。
下面是整个faster RCNN结构的示意图:
利用anchor是从第二列这个位置开始进行处理,这个时候,原始图片已经经过一系列卷积层和池化层以及relu,得到了这里的 feature:51x39x256(256是层数)
在这个特征参数的基础上,通过一个3x3的滑动窗口,在这个51x39的区域上进行滑动,stride=1,padding=2,这样一来,滑动得到的就是51x39个3x3的窗口。
备注:
具体得到的窗口的个数计算方式为:若原始图片为mxn,则经过一个3x3的滑动窗口后,得出的新的图片的尺寸为
(m-stridx2)x(n-stridx2),
当然了,为了避免上述的图片尺寸缩小的情况出现,都会对图片进行补边,一般补边是四周都补上stride个像素,所以经过补边后,一个mxn的图片就变成了(m+2stride)x(n+2stride)大小了。
对于每个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
具体计算步骤
step 1. 先设置基础anchor, base=16, base_anchor为[0,0,15,15],anchor中心为(7.5,7.5),以及面积(size=256, 为什么不是15*15=225呢?)
step 2.计算基础anchor的面积, 分别除以ratio[0.5, 1,2],得到=[256/0.5, 256/1,256/2]=[512,256,128]
https://blog.csdn.net/mljsuc/article/details/90514955