作者:永和邮政 | 来源:互联网 | 2023-10-15 15:28
本文就fasterrcnn中anchors的函数generate_anchors.py为例,介绍anchors的生成过程。 首先看下主函数入口。论文中提到a
本文就faster rcnn中anchors的函数generate_anchors.py为例,介绍anchors的生成过程。
首先看下主函数入口。论文中提到anchor两个参数:ratios和scales,长宽比和尺度变换都需要有个基础anchor的大小,也就是base_size的由来,至于16的由来,则等于网络的输入大小 / 特征图大小(生成anchor的feature map层)
def generate_anchors(base_size=16, ratios=[0.5, 1, 2],
scales=2**np.arange(3, 6))
这样," base_anchor = np.array([1, 1, base_size, base_size]) - 1 "就表示基础anchor的大小了。
其次,看下如何生成长宽比不同的anchors。这里是对anchor的宽高都进行了改变,具体是将宽变为
整个计算流程如下:
>>> base_size=16
>>> ratios=[0.5, 1, 2]
>>> scales=2**np.arange(3, 6)
>>> base_anchor = np.array([1, 1, base_size, base_size]) - 1
>>> ratio_anchors = _ratio_enum(base_anchor, ratios)
>>> scale_anchors_0 =_scale_enum(ratio_anchors[0, :], scales)
>>> ratio_anchors.shape
(3, 4)
>>> scale_anchors_0.shape
(3, 4)
>>> ratio_anchors
array([[-3.5, 2. , 18.5, 13. ],
[ 0. , 0. , 15. , 15. ],
[ 2.5, -3. , 12.5, 18. ]])
>>> scale_anchors_0
array([[ -84., -40., 99., 55.],
[-176., -88., 191., 103.],
[-360., -184., 375., 199.]])
>>> anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales) for i in xrange(ratio_anchors.shape[0])])
>>> anchors.shape
(9, 4)
>>> anchors
array([[ -84., -40., 99., 55.],
[-176., -88., 191., 103.],
[-360., -184., 375., 199.],
[ -56., -56., 71., 71.],
[-120., -120., 135., 135.],
[-248., -248., 263., 263.],
[ -36., -80., 51., 95.],
[ -80., -168., 95., 183.],
[-168., -344., 183., 359.]])
参考文献:
- https://github.com/smallcorgi/Faster-RCNN_TF/blob/master/lib/rpn_msr/generate_anchors.py