目标检测之Faster R-CNN(附pytorch代码)

原论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

概念

目标检测的任务就是不仅要对图片中的物体进行定位,而且还要将物体进行分类,同时还要输出分为此类的置信度概率。如下图:
在这里插入图片描述

整体架构

在这里插入图片描述

  1. Dataset:数据,提供符合要求的数据格式(目前常用数据集是VOC和COCO)
  2. Extractor(有的文章也称为Backbone): 利用CNN提取图片特征features(原始论文用的是ZF和VGG16,后来人们又用ResNet101)
  3. RPN(Region Proposal Network): 负责提供候选区域rois(每张图给出大概2000个候选框)
  4. RoIHead: 负责对rois分类和微调。对RPN找出的rois,判断它是否包含目标,并修正框的位置和座标

Faster R-CNN整体的流程可以分为三步:

  1. 提特征: 图片(img)经过预训练的网络(Extractor),提取到了图片的特征(feature)
  2. Region Proposal: 利用提取的特征(feature),经过RPN网络,找出一定数量的rois(region of interests)。
  3. 分类与回归:将rois和图像特征features,输入到RoIHead,对这些rois进行分类,判断都属于什么类别,同时对这些rois的位置进行微调。

RPN

Faster R-CNN最突出的贡献就在于提出了Region Proposal Network(RPN)代替了Selective Search,从而将候选区域提取的时间开销几乎降为0(2s -> 0.01s)。RPN架构图如下:
RPN架构图

Anchor

在RPN中,作者提出了anchor。Anchor是大小和尺寸固定的候选框。论文中用到的anchor有三种尺寸和三种比例,如下图所示,三种尺寸分别是小(蓝128)中(红256)大(绿512),三个比例分别是1:1,1:2,2:1。3×3的组合总共有9种anchor。
在这里插入图片描述
然后用这9种anchor在特征图(feature)左右上下移动,每一个特征图上的点都有9个anchor,最终生成了 (H/16)× (W/16)×9个anchor. 对于一个512×62×37的feature map,有 62×37×9~ 20000个anchor。 也就是对一张图片,有20000个左右的anchor。这种做法很像是暴力穷举,20000多个anchor,哪怕是蒙也能够把绝大多数的ground truth bounding boxes蒙中。

anchor的数量和feature map相关,不同的feature map对应的anchor数量也不一样。RPN在Extractor输出的feature maps的基础之上,先增加了一个卷积,然后利用两个1x1的卷积分别进行二分类(是否为正样本)和位置回归。进行分类的卷积核通道数为9×2(9个anchor,每个anchor二分类,使用交叉熵损失),进行回归的卷积核通道数为9×4(9个anchor,每个anchor有4个位置参数)。RPN是一个全卷积网络(fully convolutional network),这样对输入图片的尺寸就没有要求了。

但进行RPN网络训练时,会利用(AnchorTargetCreator)将20000多个候选的anchor选出256个anchor进行分类和回归位置。

RPN在自身训练的同时,还会提供RoIs(region of interests)给Fast RCNN(RoIHead)作为训练样本 。

Anchor的生成过程:
假设图像高h,宽为w。以每个像素为中心,大小s∈(0,1](s为scale,经过缩放归一化后),宽高比r>0。那么锚框的宽为 w s r ws\sqrt{r} wsr ,高为 h s r \frac{hs}{\sqrt{r}} r hs。(设锚框宽高为x和y。面积 x y = s 2 xy=s^2 xy=s2,比例 x / y = r x/y=r x/y=r,计算出来 x = s ∗ r , y = s r x=s∗\sqrt{r} ,y=\frac{s}{\sqrt{r}} x=sr ,y=r s,这里的计算出的都是归一化后的宽度和高度是相对原图,因此各自乘以原图像宽度和高度。)。

设定一组大小和宽高比, s 1 , . . . , s n 和 r 1 , . . . . , r m s_1,...,s_n和r_1,....,r_m s1,...,snr1,....,rm。显然有 m ∗ n m*n mn种组合,图像有 w ∗ h w*h wh个像素点,那么一共有 w ∗ h ∗ m ∗ n w*h*m*n whmn个锚框。

RoIHead

RPN只是给出了2000个候选框,RoI Head在给出的2000候选框之上继续进行分类和位置参数的回归。RoIHead 架构图如下:
RoIHead 架构图

ROI Pooling

  1. ROIs Pooling是Pooling层的一种,特点是输入特征图尺寸不固定,但是输出特征层尺寸固定。
  2. ROI即region of interests,指的是特征图上的框。
  3. 在fast rcnn中,roi是指的是selective search完成之后得到的候选框在特征图上的映射。如下图:
    在这里插入图片描述
  4. 而在faster rcnn中是在rpn之后产生的,然后再把各个候选框映射到特征图上,得到ROI。往往经过rpn之后得到的不仅仅只有一个候选框,所以一般指的是对多个ROI进行池化。
  5. roi的输入由两部分组成:第一部分是特征图:在faster rcnn中是与rpn共享那个特征图。第二部分是rois:在faster rcnn中指的是rpn的输出。
  6. roi polling的输出:输出是batch个vector,其中batch的值等于roi的个数,vector的大小为channel * w * h。
  7. roi pooling的过程就是将一个个大小不同的box矩形框,都映射成大小固定的矩形框(w * h)

最后再接两个全连接层,分别是:

  1. FC 21 用来分类,预测RoIs属于哪个类别(20个类+背景)
  2. FC 84 用来回归位置(21个类,每个类都有4个位置参数)

参考代码:simple-faster-rcnn-pytorch

猜你喜欢

转载自blog.csdn.net/qq_35268841/article/details/107205444