Faster-Rcnn

Author Avatar
cooscao 6月 26, 2018

Faster R-CNN

在目标检测领域,在第一次出现了R-CNN之后,开始广泛使用了神经网络的方法,在R-CNN基础上出现了Fast R-CNN,其变得比R-CNN更快,但不能改变的是在产生候选区域的过程中,它们两者都采用的叫一种Selective search的方法,这种方法非常慢。而Faster R-CNN的出现,其利用卷积神经网络去提取候选区域,大大加快了训练速度,同样也提高了准确率,Faster-RCNN是在目标检测领域非常重要的一个方法。

R-CNN 和 Fast R-CNN

R-CNN步骤

  1. 训练或者下载一个分类模型(基于ImageNet),对该模型做fine-tuning,将分类数从1000改为20,并去掉最后一个全连接层。

  2. 利用选择性搜索(selective search),从图像中选取大约2000个候选框

  3. 对于所选择的每一个区域,修正区域的大小以适合CNN的输入,将每个候选区域传入网络中提取特征

  4. 特征送入每一类的SVM分类器,判断是否属于此类。并使用回归器精修候选框的位置。

由于R-CNN使用selective search方法选择出候选框之后,需将每个候选框传入神经网络中提取特征进行判断,所以这个过程非常慢,Fast R-CNN在此基础上提升了区域框的选取过程,不是先选取框再传入CNN之中一个一个训练,而是直接将整张图片传入CNN之中提取特征。由于选择出的RoIs的大小都各不相同,所以在Fast R-CNN之中引入了RoI pooling,可将不同区域大小的候选区pooling为相同尺寸的特征区域。

Fast R-CNN步骤:

  1. 任意大小的图片传入ImageNet预训练网络(VGG)之中,得到feature map
  2. 在此图像中通过selective search选取2000个左右的候选框
  3. 通过特征图和原图的映射关系,将在原图中提取到的候选框,映射到feature map中
  4. 通过RoI Pooling 将特征图上的2000个候选框池化为固定大小(VGG中为7x7大小),经过一个全连接层得到固定的特征向量。
  5. 所得到的特征向量再经过两个全连接层分别得到两个输出向量:一个是softmax的分类得分,一个是Bounding-box的窗口回归
  6. 利用窗口得到的score分别对每一类物体进行非极大值抑制(nms),剔除重叠的建议框,最终得到每个类别回归修正得分最高的窗口。

Faster R-CNN

论文

整体流程:

大致分为三个区域:

  1. Extractor,为常用的预训练模型,通过输入图像,以此来提取特征。
  2. RPN,Faster-RCNN中新提出的区域生成方法,摈除了之前采用的Selective search,而采用了卷积神经网络去生成RoIs,这样大大提高了网络的速度。
  3. ROIHead,通过传入RPN中生成的区域,对每个区域进行分类和坐标回归,此处和之前的Fast R-CNN类似。

数据预处理

数据采用常用的目标检测数据库VOC或COCO,需做以下处理:

  • 对每个图片,reshape为边长小于或等于1000和600,其中(至少一个等于)
  • 对相应的ground truth也做同样尺度的缩放

最后训练过程中所需要的四个值分别为:

  • images: $3HW$大小
  • bboxes: $4*K$, 其中$K$为bboxes数量,坐标形如(Y_min, X_min, Y_max, X_max)
  • labels: $(K, )$, 对应K个bboxes的labels,在VOC中为(0~19)
  • scale: 图像缩放的倍数,原图$H^{‘} W^{‘}$reshape到$H W$,则$scale=H^{‘} / H$

Extractor

img

这里使用VGG16,当然也可以使用ResNet101,在VGG的前四层,由于训练时为了节约显存,所以将其学习率设置为0,在Extractor部分,只用到了conv5_3之前,及图像reshape到大小为$1000600$之后,传入到VGG16中,在conv5_3处输出图像的feature map,到此图像下采样了16倍,得到了$C(H/16)(W/16)$特征图,在此具体为$51262*38$。在conv5_3之后还有两个全连接层,在extractor中并未使用,但在之后的ROIHead中用到了。

Region Proposal Network

Anchor

作者首先一改之前,提出了Anchor,即尺寸大小固定的候选框,在论文中使用了三种尺寸(1:1,1:2,2:1),三种大小(128,256,512),得到了9个不同的anchor

这9个anchor在刚生成的feature map中左右上下移动,对于每个点都得到了9个anchor,这样就得到了共$62389$~20000个anchor.当然这20000个anchor并不会全部传给ROIHead训练,只会从中选取2000个传给之后。

在RPN中就需要对候选框进行分类,但此处不是20分类,而是二分类,即判断是否含有物体。在特征图的基础上,在一个3x3卷积之后,分别使用$92$和$94$个1x1的卷积核进行卷积操作,这样原本特征图为512x62x38,则分别卷积到62x38x9*2,和62x38x9x4,这样得到大约20000个框的score和坐标。

RPN生成RoIs

RPN的主要作用就是为之后的ROIHead生成大约RoIs,在代码中为(Proposal Creator)

  • 对于每张图片的大约20000个候选框,首先先选取score较大的12000个anchor
  • 利用回归的位置参数,修正这12000个anchor,得到RoIs
  • 利用非极大值抑制(NMS),选出概率最大的2000个RoIs。

注意:在Test时,12000和2000分别变为6000和300

RPN训练

RPN自身也要训练,以此选取更好的RoIs,此处RPN从20000个选出大约256个供自身训练,其中正负样本各占一半,选择过程如下,代码中为Anchor Target creator

  • 对于每个ground truth bbox,选择和它IOU最高的一个anchor作为正样本
  • 对于每个anchor,若有ground truth和它的IOU大于0.7,则选取它作为正样本,正样本的数目不超过128,若不够,则由负样本凑
  • 随机选取和任意ground truth的IOU都小于0.3的anchor作为负样本,数目为128

对于分类只有二分类,即要么为1(前景),0(背景),回归坐标则需要改变一下

其中分类采用交叉熵损失,而计算回归则采用的是Smooth L1损失,同样在计算回归损失时,只计算正样本的损失,而不计算负样本的损失。

ROIHead

RPN会产生大约2000个ROIs,但并不是全部都要在ROIHead中训练,而是通过ProposalTargetCreator选取128个RoIs进行训练。选择的规则如下:

  • RoIs和gt_bboxes的IoU大于0.5的选择32个作为正样本
  • IoU小于等于0或0.1(自己设置)选择96个作为负样本

但由于这些候选框的大小都不相同,所以采用RoIPooling将这些候选框pooling成相同的大小(7x7,在VGG中)。选取的框需要映射到feature map 中,所以RoIpooling将区域都统一下采样到$512\times7\times7$,由于选取了128个,所以就得到了$128\times512\times7\times7$大小的特征向量,之前VGG的全连接层在这里还需要用到,将特征向量reshape为一维的之后,传入全连接层,再分别传入FC21FC84得到分类结果和坐标结果,损失函数和之前RPN中采用的相同。

完整结构如上所示。

参考