Fast R-CNN 理论原理
一、Fast R-CNN介绍
在b站看到一位大神up主发布的CNN原理和代码的教学视频,发现非常有帮助,于是将他所讲的内容总结了下来供大家学习讨论。
下面是up的视频、代码、博客的连接:
b站视频链接:https://space.bilibili.com/18161609/channel/index
github代码和PPT:https://github.com/WZMIAOMIAO/deep-learning-for-image-processing
up主的CSDN博客:https://blog.csdn.net/qq_37541097/article/details/103482003
引言
Fast R-CNN原论文:Girshick R. Fast R-CNN[J]. Computer Science, 2015.
Fast R-CNN是作者Ross Girshick在RCNN基础上的改进。在PASCAL VOC数据集上,同样使用VGG16作为网络的backbone,训练时间比RCNN快9倍,测试推理时间快213倍,准确率从62%上升至66%。
二、Fast RCNN算法步骤
Fast RCNN目标检测算法总共分为三步:
1.将待检测图像生成1k到2k个候选区域(用Selective Search方法)
2.将整张图像输入CNN网络得到特征图,将SS算法生成的候选框投影到特征图上获取相应的特征矩阵
3.将每一个候选框的特征矩阵通过ROI pooling层缩放到7x7大小的特征图,接着讲特征图展平通过一系列全连接层得到预测结果
网络结构:
Fast RCNN相比RCNN的改进:
-
卷积不再是对每个候选区域(region proposal)进行,而是直接对整张图像如下图右,这样减少了很多重复计算。如下图左边原来RCNN是对2000个候选区域分别做卷积,候选区域之间的重叠率很高,产生大量不必要的重复计算。
-
用ROI pooling(下图绿框)进行特征的尺寸变换为7x7大小,因为全连接层的输入要求尺寸大小一样,不能直接把region proposal作为输入。
-
用softmax代替原来的SVM分类器(下图红框),同时将框回归器(regressor)放进网络与网络分类器并联一起训练(下图蓝框),每个类别对应一个regressor。
训练过程:
1.将输入的训练图片reshape至224*224再输入VGG16特征提取网络;
2.经过5个卷积层和2个降采样层(降采样层在第一和第二个卷积层后)后,先通过SS算法选出2000个候选区域(region proposal,简写为Rol),在实际训练中,每个mini-batch包含2张图像和128个候选区域,也就是每张图像有64个候选框。此外只采用随机水平翻转的方式增加数据集。在测试时直接使用所有的2000个候选区域。
注:每张图片的64个候选框一般是按照IoU值进行采样,规定这些候选框和ground truth(目标真实框,由数据集自带或者人工标注)的IoU值大于0.5为正样本(包含目标的前景)占总采样的25%左右,其余IoU值在0.1和0.4之间的为负样本(背景)。(必须要设置正负样本,这里的正负样本相当于标签,若训练分类模型时不具有负样本训练网络将会认为所有的情况都是正样本,在测试时不具有区分性,该模型就没有任何意义了)
3.将候选框输入Rol pooling层,将所有不同大小尺度的框都降采样为7x7大小,然后再输入两个都是output是4096的全连接层。最后分别经过output个数是21和84的两个全连接层(这两个全连接层是并列的),前者是分类的输出,代表每个候选框属于每个类别(21类:PASCAL VOC一共20个类别+背景类别)的得分,后者是边界框回归器的输出,84代表每个候选框的每个类别的四个回归参数(d x,d y,d w,d h)。最后是两个损失层,分类的是softmaxWithLoss,;回归器的是SmoothL1Loss。
21类:
84:
4.整个网络损失函数的定义是将分类的loss和回归的loss整合在一起称作Multi-task loss,然后训练过程就和普通CNN网络一样通过损失的反向传播进行更新权值,直到达到预设条件。
三、相关问题的解释
3.1 ROI pooling层:
ROI Pooling的作用是对SS选出的不同大小的候选框对应的最后卷积层输出的feature map,提取大小固定的feature map。是因为全连接层的输入尺寸是固定大小的,所以不能把不同大小的候选框feature map输入同一个全连接层,需要做尺寸变换。
原文中Rol pooling操作如下图,是将不同大小的候选框所得的feature map划分成7X7的模块,每一个模块都是一个小的块矩阵,然后对每个块矩阵分别做下采样操作得到一个7x7的矩阵,这样就可以将不同大小的输入都reshape成统一尺度,然后再展平输入全连接层。
3.2 边界框回归器:
**为什么要进行边框回归?**如下图所示绿色框为飞机的真实框(Ground Truth,由数据集自带的真实标签得到,或者人工标注而来),红色为模型所的预测框(foreground anchors,候选框由SS算法选出,预测框是候选框中由分类网络中得到的目标概率最大的那个(同RCNN)),就算红框被模型检测为飞机,但是由于定位不准其实这张图相当于没有检测成功的。所以我们希望采用一种方法对红色的框进行微调,使得预测框和真实框更加接近。
边框回归:如下图,对于窗口一般使用四维向量(x, y, w, h)表示,分别表示窗口的中心点坐标的横坐标、纵坐标、窗口的宽和高。黄色框口P表示SS得到的建议框Region Proposal,绿色窗口G表示真实框Ground Truth(由人为标出,或者认为是有标签的数据集中自带的),红色窗口 G ^ \hat{G} G^表示进行回归后的预测窗口Region Proposal。边框回归指的就是找到一个映射使建议框P尽可能接近真实框G,回归得到的预测框就是 G ^ \hat{G} G^。
我们的目标是寻找一种关系,使得输入原始的P经过映射得到一个跟真实窗口G更接近的回归窗口$ \hat{G}$,即:给定预测框 P=(Px,Py, Pw, Ph),
G=[Gx, Gy, Gw, Gh],寻找一种变换F:使得F(Px, Py, Pw, Ph)=( G ^ \hat{G} G^x, G ^ \hat{G} G^y, G ^ \hat{G} G^w, G ^ \hat{G} G^h),其中
( G ^ \hat{G} G^