概念
目标检测的任务就是不仅要对图片中的物体进行定位,而且还要将物体进行分类,同时还要输出分为此类的置信度概率。如下图:
整体架构
- Dataset:数据,提供符合要求的数据格式(目前常用数据集是VOC和COCO)
- Extractor(有的文章也称为Backbone): 利用CNN提取图片特征features(原始论文用的是ZF和VGG16,后来人们又用ResNet101)
- RPN(Region Proposal Network): 负责提供候选区域rois(每张图给出大概2000个候选框)
- RoIHead: 负责对rois分类和微调。对RPN找出的rois,判断它是否包含目标,并修正框的位置和座标
Faster R-CNN整体的流程可以分为三步:
- 提特征: 图片(img)经过预训练的网络(Extractor),提取到了图片的特征(feature)
- Region Proposal: 利用提取的特征(feature),经过RPN网络,找出一定数量的rois(region of interests)。
- 分类与回归:将rois和图像特征features,输入到RoIHead,对这些rois进行分类,判断都属于什么类别,同时对这些rois的位置进行微调。
RPN
Faster R-CNN最突出的贡献就在于提出了Region Proposal Network(RPN)代替了Selective Search,从而将候选区域提取的时间开销几乎降为0(2s -> 0.01s)。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。那么锚框的宽为,高为。(设锚框宽高为x和y。面积,比例,计算出来,这里的计算出的都是归一化后的宽度和高度是相对原图,因此各自乘以原图像宽度和高度。)。
设定一组大小和宽高比,。显然有种组合,图像有个像素点,那么一共有个锚框。
RoIHead
RPN只是给出了2000个候选框,RoI Head在给出的2000候选框之上继续进行分类和位置参数的回归。RoIHead 架构图如下:
ROI Pooling
- ROIs Pooling是Pooling层的一种,特点是输入特征图尺寸不固定,但是输出特征层尺寸固定。
- ROI即region of interests,指的是特征图上的框。
- 在fast rcnn中,roi是指的是selective search完成之后得到的候选框在特征图上的映射。如下图:
- 而在faster rcnn中是在rpn之后产生的,然后再把各个候选框映射到特征图上,得到ROI。往往经过rpn之后得到的不仅仅只有一个候选框,所以一般指的是对多个ROI进行池化。
- roi的输入由两部分组成:第一部分是特征图:在faster rcnn中是与rpn共享那个特征图。第二部分是rois:在faster rcnn中指的是rpn的输出。
- roi polling的输出:输出是batch个vector,其中batch的值等于roi的个数,vector的大小为channel * w * h。
- roi pooling的过程就是将一个个大小不同的box矩形框,都映射成大小固定的矩形框(w * h)
最后再接两个全连接层,分别是:
- FC 21 用来分类,预测RoIs属于哪个类别(20个类+背景)
- FC 84 用来回归位置(21个类,每个类都有4个位置参数)
参考代码:simple-faster-rcnn-pytorch