源头
原文中说:对于该图像的每一个位置,考虑9个可能的候选窗口:三种面积三种比例。这些候选窗口称为anchors。下图示出51*39个anchor中心,以及9种anchor示例。
理解后参照源码进行重写,可能更好理解些
原理
自己的理解,就是特征提取已经完成了,针对特征层(VGG 是 conv5)开始做RPN了,目的就是按像素把特征层的每一个像素点来做分类和回归,这也是其优于R-cnn的地方,原文给出了9个框,覆盖了三种比例,三种尺寸(这里是面积)的框。目的就是以不同尺寸框覆盖目标物。
重要参数
1、原始框,原文给的是 (0,0,16-1,16-1)也就是 左上坐标0,0 宽15 高15这么一个框,也就是这么一个框后面会生成9个
2、比率也就是ratio,原文给的(0.5,1,2),原始框就是1,另外两个就是对应w:h=1:2和2:1
3、缩放大小也就是scales,原文给的(8,16,32)红的是原始放大8倍,绿的是红的2倍,蓝的是红的4倍这么理解吧
生成anchor
好了,有了以上3个参赛就可以生成9个框了。
生成结果如下 ,格式为(左上(x,y),w,h) 注:与原文有偏差
[-82.50966799187809, -37.254833995939045, 97, 52]
[-56.0, -56.0, 71, 71]
[-37.254833995939045, -82.50966799187809, 52, 97]
[-173.01933598375618, -82.50966799187809, 188, 97]
[-120.0, -120.0, 135, 135]
[-82.50966799187809, -173.01933598375618, 97, 188]
[-354.03867196751236, -173.01933598375618, 369, 188]
[-248.0, -248.0, 263, 263]
[-173.01933598375618, -354.03867196751236, 188, 369]
画出来的图是这样滴
生成代码
import numpy as np
import matplotlib.pyplot as plt
def trans(anchor): #将原始anchor转换成 w,h,中心x,中心y
w = anchor[2] - anchor[0] + 1
h = anchor[3] - anchor [1] +1
x_c = anchor[0] + 0.5 * (w - 1)
y_c = anchor[1] + 0.5 * (h - 1)
return w,h,x_c,y_c
def v_trans(w, h, x_c, y_c): #将计算好的w,h,中心x,中心y转化回坐标系表示,用来画图
anchor[0] = x_c - 0.5 * (w - 1)
anchor[1] = y_c - 0.5 * (h - 1)
anchor[2] = int(w - 1 + anchor[0])
anchor[3] = int(h - 1 + anchor [1])
return anchor
def makeanchors(tr_anchor, ratio, ax): #在不同比值下画框
size = tr_anchor[0] * tr_anchor[1]
for i, rat in enumerate(ratio):
size_ratios = size/rat
ws = np.sqrt(size_ratios)
hs = ws * rat
anchor_ = v_trans(ws, hs, tr_anchor[2], tr_anchor[3])
rect = plt.Rectangle((anchor_[0], anchor_[1])
, anchor_[2]-anchor_[0], anchor_[3]-anchor_[1], fill=False)
ax.add_patch(rect)
print(anchor_)
if __name__ == '__main__':
base_size = 16
ratio = (0.5, 1, 2)
anchor = [0, 0, base_size - 1, base_size - 1]
scales = (8 ,16, 32)
fig = plt.figure(figsize=(9, 9))
ax = fig.add_subplot(111)
plt.xlim((-400, 400))
plt.ylim((-400, 400))
w, h, x_c, y_c = trans(anchor)
for i in scales: #放大8,16,32倍
ws = w * i
hs = h * i
tr_anchor = [ws, hs, x_c, y_c]
anchor_ = makeanchors(tr_anchor, ratio, ax)
plt.show()
后续
待续