搞懂faster—rcnn中anchors生成(附代码)

搞懂faster—rcnn中anchors生成(附代码)

源头

原文中说:对于该图像的每一个位置,考虑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()

后续

待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值