本文介绍 FasterRCNN Anchor机制的再思考

FasterRCNN Anchor机制的再思考

This article was original written by Jin Tian, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat: jintianiloveu

anchor都知道,但是anchor的生成方式以及细节很多人不知道,为什么呢?因为很多人都知道 [16, 128, 256], [0.5, 1, 2], 根据anchor scale和ratio来确定9个anchor,但是这个9个anchor到底是怎么表示的?是长宽,还是四个点的坐标?以及为什么你看到的图,很多 图都是 跟你设想的不一样的?(按道理地一个尺寸3个框分别是 16x8, 16x16, 8x16, 这3个框放到同一个中心点,肯定不是你想的或者你大多数时候看到的那样子)。

anchor真正的生成与scale的根号有关

实际上anchor并不是这样生成的,它跟一个根号有关。这个根号,其实就是保证长宽比,同时长宽跟base_size有个区别。先梳理一下算法吧,然后在来看代码:

算法步骤:

  1. 首先,你要有base_size, 所有base size,其实就是某个尺寸的感受野,比如你的的featuremap尺寸是 32,你就要基于32生成anchor,然后你要有比例和scale,这个scale呢,实际上是根据ratio计算的,比如你ratio是0.5,再基础尺寸上缩小一半,那就是8;

  2. 然后你需要根据 8, 16, 32 3个scale,依次生成各自得到3个基础w和h,关键的点就在这里了, 比如在scale 8的情况下,高度和宽度应该是多少,按照 scale x sqrt(0.5) 和 scale x sqrt(2) 分别计算。这里每一步计算的结果可以看一下:

   scale: 8, ratio: 0.5, w: 90.50966799187809, h: 181.01933598375618
   scale: 8, ratio: 1, w: 128.0, h: 128.0
   scale: 8, ratio: 2, w: 181.01933598375618, h: 90.50966799187809
   scale: 16, ratio: 0.5, w: 181.01933598375618, h: 362.03867196751236
   scale: 16, ratio: 1, w: 256.0, h: 256.0
   scale: 16, ratio: 2, w: 362.03867196751236, h: 181.01933598375618
   scale: 32, ratio: 0.5, w: 362.03867196751236, h: 724.0773439350247
   scale: 32, ratio: 1, w: 512.0, h: 512.0
   scale: 32, ratio: 2, w: 724.0773439350247, h: 362.03867196751236
   
  1. 可以看出,scale是8,但是实际上并不是在16的基础上乘以8,实际上比16乘以8更大,变化范围ie在 [90, 181], 这啥意思?为什么要在16x16的基础上,再扩张成那么大的尺寸?其实重点是 最终生成的anchor是想对于原图的坐标点位置.

着重需要理解的事,假如生成的anchor是想对于原图的坐标位置,那如何与groudtruth结合起来?如何参与到网络的反响传播中去?