Region Proposal Network(RPN)

1. 简介

经典的检测方法生成检测框都非常耗时,Faster-RCNN 直接使用 RPN 生成检测框,能极大提升检测框的生成速度。RPN (Region Proposal Network) 用于生成候选区域(Region Proposal)。

图1 Faster-RCNN 的基本结构 (来自原论文)

RPN 的输入为 backbone (VGG16, ResNet, etc) 的输出(简称 feature maps)。

作为初学者,在学习 RPN 之前,我遇到过以下几个疑问:

  1. RPN 是如何由 feature maps 来产生边界框(bounding boxes) ?
  2. 什么是 anchors?
  3. anchors 是如何 reshape 成各种形状的?
  4. 如何 RPN 的训练效果?

2. RPN 产生边界框的方法

Just like how CNNs learn classification from feature maps, RPN also learns the proposals from feature maps.

图2 以VGG16为backbone的Faster-RCNN的框架示意图(来自https://zhuanlan.zhihu.com/p/31426458)

RPN 包括以下部分:

  • 生成 anchor boxes
  • 判断每个 anchor box 为 foreground(包含物体) 或者 background(背景) ,二分类
  • 边界框回归(bounding box regression) 对 anchor box 进行微调,使得 positive anchor 和真实框(Ground Truth Box)更加接近

3. anchor boxes

anchor boxes,又称为『锚框』,实际是直接运行以下代码就能产生的矩阵框:

import numpy as np

def generate_anchors(base_size=16, ratios=[0.5, 1, 2],
scales=2**np.arange(3, 6)):
"""
Generate anchor (reference) windows by enumerating aspect ratios X
scales wrt a reference (0, 0, 15, 15) window.
"""
base_anchor = np.array([1, 1, base_size, base_size]) - 1
ratio_anchors = _ratio_enum(base_anchor, ratios)
anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)
for i in range(ratio_anchors.shape[0])])
return anchors

def _whctrs(anchor):
"""
Return width, height, x center, and y center for an anchor (window).
"""
w = anchor[2] - anchor[0] + 1
h = anchor[3] - anchor[1] + 1
x_ctr = anchor[0] + 0.5 * (w - 1)
y_ctr = anchor[1] + 0.5 * (h - 1)
return w, h, x_ctr, y_ctr

def _mkanchors(ws, hs, x_ctr, y_ctr):
"""
Given a vector of widths (ws) and heights (hs) around a center
(x_ctr, y_ctr), output a set of anchors (windows).
"""
ws = ws[:, np.newaxis]
hs = hs[:, np.newaxis]
anchors = np.hstack((x_ctr - 0.5 * (ws - 1),
y_ctr - 0.5 * (hs - 1),
x_ctr + 0.5 * (ws - 1),
y_ctr + 0.5 * (hs - 1)))
return anchors

def _ratio_enum(anchor, ratios):
"""
Enumerate a set of anchors for each aspect ratio wrt an anchor.
"""
w, h, x_ctr, y_ctr = _whctrs(anchor)
size = w * h
size_ratios = size / ratios
ws = np.round(np.sqrt(size_ratios))
hs = np.round(ws * ratios)
anchors = _mkanchors(ws, hs, x_ctr, y_ctr)
return anchors

def _scale_enum(anchor, scales):
"""
Enumerate a set of anchors for each scale wrt an anchor.
"""
w, h, x_ctr, y_ctr = _whctrs(anchor)
ws = w * scales
hs = h * scales
anchors = _mkanchors(ws, hs, x_ctr, y_ctr)
return anchors

if __name__ == '__main__':
a = generate_anchors()
print(a)

<< · Back Index ·>>

发表回复

相关推荐

接触器相关知识归纳

什么是接触器 接触器是用来频繁的接通和断开交、直流主电路及大容量控制电路的自动控制电器。接触器主要控制对象是电动机, ...

· 16秒前

跨境电商erp全球交易助手有什么功能?

随着全球市场的不断扩大和数字化趋势的崛起,跨境电商平台运营变得越来越重要。而运营多个平台多个店铺,必定需要一款优秀的 ...

· 1分钟前

儲罐內壁犧牲陽極陰極保護

  原油罐金屬底板的腐蝕與防護  地上鋼質儲油罐使用過程中經常遭受內外環境介質的腐蝕,其中罐底板腐蝕穿孔事故占儲罐腐...

· 2分钟前

微型光纤光谱仪薄膜测量解决方案

薄膜是沉积在另一种物质表面的非常薄的物质层,广泛应用于技术工艺行业,如钝化绝缘层、防扩散层、硬涂层等。集成电路就主要 ...

· 5分钟前

三國亂世裡,曹魏十大名將排行榜,誰才是你心中的第一

魏國的武將是三國裡面最多的,而且名將是也是最多的,這將武將多次救曹操於水火之中,如果不是這些大將為曹操出生入死,曹操...

· 6分钟前