Faster rcnn(1)--- RPN原理及代码详解

一. 论文

二. RPN提出的目的

  • 用cnn来提取proposal,替代原始的slective search;由于原始的selective search获得proposal框的过程很费时,使用cnn提取后可以极大提高速度。
  • 如何提高?用CNN直接产生

三. RPN结构及原理

1)概述

  • 输入为原始图片,输出为矩形proposal框
  • backbone用的ZF(5个共享卷基层)或者VGG16(3个共享卷基层)
  • 对backbone出来的最后featuremap进行滑窗,每个滑动窗口出来的是一个256(ZF)或者512(VGG16)的向量,然后这些向量用于RPN的回归以及分类

Faster rcnn(1)--- RPN原理及代码详解

2)Anchors

  • 每个滑动窗口得到多个proposal框,是根据给定的先验anchor框得来的,先验框的中心在滑动窗口的中心,3个不同大小尺度以及3个长宽比从而有9个anchor
  • anchors具有转移不变性。因为论文中anchors的产生是通过卷积核中心的不同尺度和宽高比的采样,所以会有平移不变性能。
  • anchors多尺度特性。多尺度的方法有这么几种,1)图像金字塔,time-sonsuming;2)卷积核金字塔(即多个不同尺度的卷积核);3)所提anchor的方式,每个位置给多个不同尺度的参考anchor,更加高效.

Faster rcnn(1)--- RPN原理及代码详解

3)损失函数

  • RPN的损失包含两个部分,1) 二分类,判断是否包含目标;2) 框的回归
    Faster rcnn(1)--- RPN原理及代码详解
  • PART1 二分类部分
    • 正样本分类策略:1) 和ground truth的IOU最大的anchor为正类,2) 和任何gound truth的IOU超过0.7的anchor为正样本;一个ground truth可能会将多个anchor标注为正样本。通常方法 2) 更加高效,但是作者同时还采用了方法1是因为存在所有的anchor与groud truth的IOU不会超过0.7的情况
    • 负样本分类策略:anchor与所有ground truth的IOU小于0.3则判断为负样本
    • 如果anchor为positive则对应的pi_*为1,Lcls为L1 smooth;回归损失只对与positive anchor有联系的groundtruth框计算。
  • PART2 回归部分
    • 为了平衡比重,在回归损失的前面加了权重(因为Nreg比Ncls大太多)
    • 框的回归是在坐标归一化转换后的值基础上进行的,相当于与anchor最近的groudtruth框进行回归?另外一个考虑是如果不进行归一化转换,回归损失会在总损失中会占据比较大的比重。
    • 作者的框回归与之前的ROI方法不同,学到的是k个boungding-box回归器,每个回归器负责1个scale及1个aspect ratio,这k个回归器不共享权重,因此能在固定大小的features上预测不同尺度的框。(之前的是ROI出来多个尺度的feature再进行回归,回归器只有一个,即回归的系数是共享的)

Faster rcnn(1)--- RPN原理及代码详解

四. RPN代码阅读(pytorch版本)

  • RPN预测的坐标为对应论文中的tx,ty,tw,th;同时proposal要根据rpn的predict 坐标以及anchors进行一个转换得到(rpn.py中第36行->第77行->proposal_layer.py第106行->bbox_transform.py第88-92行)