首先,根据给定的base_size,生成一个所谓的base_anchor,其值为[0,0,base_size-1,base_szie-1]。例如当base_size=16的时候就生成一个坐标为[0,0,15,15]的矩形。
第二步根据上面的上面得到base_anchor进行坐标变换,计算出中心点xc,yc和矩形的高和宽w,h.即将我们说xmin,ymin,xmax,ymax形式的坐标转化为w,h,xc,yc的坐标形式。用我们的例子就是从[0,0,15,15]变成了[16,16,7.5,7.5]。再依据w和h计算矩形的面积,这里记为base_anchor的size。将size除以不同的ratio得到一个数组,称之为size_ratios。此时size=256, size_ratios=[512,256,128]。接下来将每一个size_ratio开平方得到的值记为ws,而将ws*ratio的值记为hs,而每一对(ws,hs)和(xc,yc)则可以重新变换坐标生成一个anchor,三个size_ratio对应三对(ws,hs),即可以变换为三个anchor.将之堆叠在一起称为ratio_anchors. size_ratios=[512,256,128],对应的ws=[22,16,11],hs=[12,16,22]。则ratio_anchors=[[ -3.5 2. 18.5 13. ] ,[ 0. 0. 15. 15. ],[ 2.5 -3. 12.5 18. ]]
坐标转化的方法如下图,非常简单
[xmin,ymin,ymax,ymax]-->[ws,hs,xc,yc]
[ws,hs,xc,yc]->[xmin,ymin,ymax,ymax]à->ratio_anchors
ratio_anchors坐标轴上表示
第三步将上一步得到ratio_anchors的每一个anchor的w和h 乘上scales得到新的(ws,hs).如果scales=[8,16,32]三个scale,那么我们就可以得到3*3=9对(ws,hs),从而通过坐标变换得到9个anchors,这里是在(0,0)点处生成anchor,再进行滑动就可以得到所有的propsal区域
9个anchor 的坐标及对应的ws,hs
Anchor 的坐标绘制
根据上文,我的理解是在某一层上先生成这一层对应大小的anchors即ratio_anchors,乘上scales得到的anchors应该是指对应于不同尺度上的大小,相当于将这个anchor分别放大了8,16,32 倍来对应原图上不同尺度的物体,再和gt进行匹配。但之所以实验出错,推测还是在匹配上处理的有问题。
转自:
faster rcnn中anchor的生成过程理解