python源码文件:Github链接
一些基本设定
- 输出的 anchor 格式:对应在原图上的位置,四个坐标值,为左上角和右下角的x, y坐标。
- ctr:center的意思,如(x_ctr, y_ctr) 表示anchor中心点的坐标。
- base_size:用来初始化一个anchor的边长,后续乘以ratio和scale即可得到实际使用的anchor的长宽,通常设为进行RPN的特征图的stride,如Faster RCNN中是在conv4上进行RPN的,那么base_size通常设置为16,这样就会初始化一个anchor,其坐标为[0, 0, 15, 15],如果scale设为[8, 16, 32],ratio设为[0.5, 1, 2],就会得到9种不同大小的anchor。注意,这里计算ratio的时候易出错,如ratio=2,那么长宽应为scale * base_size * sqrt(2),scale * base_size / sqrt(2),而不是scale * base_size * 2或者scale * base_size / 2,因为后者计算如果使用长/宽=4而不是2。
- 代码主要分为3步:
- 根据base_size生成初始的anchor
- 保持anchor的面积不变,改变ratio(代码中的_ratio_enums函数)
- 对上一步的结果,分别进行scale缩放,得到最终的anchor(代码中的_scale_enums函数)
- _whctrs(anchors)的作用是找出一个anchor的宽高和中心坐标 ;_mkanchors是根据宽高和中心坐标,生成一个新的anchor, generate_anchors是生成anchor的总函数。
源码分析
具体的代码分析,参考自链接1:
#功能描述:生成多尺度、多宽高比的anchors。
# 尺度为:128,256,512; 宽高比为:1:2,1:1,2:1
import numpy as np #提供矩阵运算功能的库
#生成anchors总函数:ratios为一个列表,表示宽高比为:1:2,