目标检测:R-CNN, Fast R-CNN, Faster R-CNN

130 阅读9分钟

0. 前言

本文为我学习B站Up主霹雳吧啦Wz的R-CNN系列视频的学习笔记。

1. R-CNN (Region with CNN feature)

2014年提出,是有别于只能实现30%左右准确度的传统目标检测方法的划时代目标检测算法,将目标检测的准确度提升了30%。

Rich feature hierarchies for accurate object detection and semantic segmentation

1.1.四个步骤

image.png

  1. 首先通过一种名为Selective Search的算法去获取候选框。
  2. 其次通过深度网络对候选框进行特征提取。
  3. 随后通过一个SVM对提取的特征向量进行分类。
  4. 最后使用一个回归器精修候选框位置。

1.1.1. Selective Search算法

  1. 使用Efficient Graph-Based Image Segmentation中的方法分割图像得到nn个区域组成的区域集合SS
  2. 计算SS中各个区域之间的相似度(颜色、纹理、尺度、填充)并加权求和,得到一个n×nn\times n的相似度矩阵MM
  3. 如果SS不为空:
    • 获取相似度矩阵MM中的最大值;
    • 将其对应的两个区域有合并成新区域;
    • SS中删除这两个区域。
    • 合并所得新区域加入集合SS
    • 重新执行步骤2.生成新的相似度矩阵MM

每次迭代过程中对集合SS中的子区域做外切矩形(Bounding Boxes),这些Bounding Boxes就是通常所说的候选框。

这一算法相较于暴力的滑动窗口采样要快很多,且更有目的性,效率更高。

1.1.2. 深度网络特征提取

将上一步骤中得到的2000个候选框resize()227×227227\times 227的图像;

使用AlexNet(去掉最后的全连接层,直接输出flatten()的结果),将227×227227\times 227的图像提取出长40964096的特征向量;

总体上:2000×227×2272000×40962000\times 227\times 227\rightarrow 2000\times 4096

将这些特征向量保存于磁盘,准备训练SVM分类器。

1.1.3. SVM判断

对于含有20个类别的目标检测,我们使用20个SVM二分类器,判断当前的长为40964096的特征向量是否是某一类。

2000×40962000\times 4096的特征向量矩阵2000×20\rightarrow 2000\times 20的类别评分矩阵,这个矩阵表示当前2000个候选框归属于20个类别的可能概率。

2000行,20列的矩阵,对每一列(类)进行非极大值抑制,剔除重叠的候选框,得到该类最有可能的候选框。

非极大值抑制提出多余候选框:

  1. 在当前类的候选框集合AA中选择得分最高的候选框abesta_{best}
  2. abesta_{best}与剩余候选框AabestA-a_{best}进行IoU计算;
  3. IoU>ϵIoU>\epsilon阈值的说明重叠了,很可能是一个目标,所以从AA中剔除所有与abesta_{best}IoU超过阈值的候选框。将abesta_{best}另存。
  4. 重复1~3直至AA中候选框全部被遍历完。

如此,便可保留每一类得分最高的一系列建议框。

1.1.4. 回归器精修候选框位置

对上一步处理后剩余的边界框对应的长为40964096的特征向量进行进一步筛选。小于与Ground Truth之间IoU阈值的候选框被删除。剩余的候选框通过20个类别的回归器进行修正。

1.2. R-CNN缺陷

  1. 测试速度慢:Selective Search算法提取候选框满,候选框之间存在大量重叠,导致提取特征操作冗余。
  2. 训练速度慢:特征提取网络、SVM、回归器都是相互独立训练的。
  3. 存储资源需求大:特征向量都需要保存在磁盘。
graph TD
A[Region_Proposal] --> B[Feature_Extraction];
B --> Classifaction;
B --> Bounding-box_regression;

2. Fast R-CNN

2015年,使用VGG16作为backbone,训练比R-CNN快9倍,测试快213倍,准确率提升4%。

Fast R-CNN

image.png

2.1. 三个步骤:

  1. 仍然使用Selective Search的算法去获取候选框。
  2. 将整张图像输入特征提取网络,得到特征图feature map。将候选框投影在特征图上,得到对应的特征矩阵。
  3. ROI(Region of Interest) pooling层将特征矩阵缩放为7×77\times 7尺寸,接着flatten()为一维向量,通过若干全连接层得到预测结果。
    • SoftmaxOutputsSoftmax\rightarrow Outputs预测类别;
    • RegressorbboxRegressor\rightarrow bbox预测边界框。

2.2. 特征提取阶段的轻量化策略

在步骤1.中,我们从每张图像的2000个候选框中随机采样了64个RoIs。其中25%的RoIs要求与Ground Truth之间IoU0.5IoU\ge 0.5,剩余的RoIs要求与Ground Truth之间IoU[0.1,0.5)IoU\in [0.1,0.5) ,被认为是背景。

在步骤2.中得到的候选框在R-CNN中需要每输入一个候选框就进行一次前向传播Forward propagation,但实际上这些候选框有大量重叠区域,多次Forward propagation实际上涉及到大量的重复计算。为了避免这样的重复计算,Fast R-CNN将整张图送入进行特征提取,在从特征图中裁出对应的候选区域。

2.3. RoI Pooling Layer

先将feature map等分为7×77\times 7等份。

对每一份区域做max pooling,最后得到7×77 \times 7的特征尺寸。

所以候选框无论是什么尺寸,通过特征提取并RoI pooling都会输出7×77\times 7的池化结果,所以无需限制网络的输入图像尺寸。

Pooling操作对每一个通道都是一样的。

Pooling后的同等大小feature矩阵经过flatten()后连续经过一系列FC,得到RoI feature vector。

2.4. 预测

输出的RoI feature vector并联两个全连接层,一个FC与Softmax连接进行目标概率预测,一个FC与Regressor连接,用于回归参数的预测。

Softmax输出N+1N+1个类别的概率,即长度为N+1N+1的向量。第一个概率是当前候选框为背景的概率(类别标签u=0u=0),剩下的N为目标概率(类别标签u1u\ge 1)。与其连接的全连接层自然也需要N+1N+1个节点。

边界框回归器输出对应N+1N+1个类别的边界框回归参数(dx,dy,dw,dh)(d_x,d_y,d_w,d_h),总长度(N+1)×4(N+1)\times 4的输出。

候选框为(Px,Py,Pw,Ph)(P_x,P_y,P_w,P_h),回归参数(dx,dy,dw,dh)(d_x,d_y,d_w,d_h),真实目标框为(Gx,Gy,Gw,Gh)({G_x},{G_y},{G_w},{G_h}),最终预测的边界框为(Gx^,Gy^,Gw^,Gh^)(\hat{G_x},\hat{G_y},\hat{G_w},\hat{G_h})。 关系为:

(Gx^,Gy^,Gw^,Gh^)=(Px×dx+Px,Py×dy+Py,Pwdw,Phdh)\begin{array}{lr} (\hat{G_x},\hat{G_y},\hat{G_w},\hat{G_h})=(P_x\times d_x+P_x,P_y\times d_y+P_y,P_w^{d_w},P_h^{d_h}) \end{array}

2.5. 多任务损失函数

分类损失+边界框回归损失

L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)Lcls(p,u)=yulogpu=logpuy is onehotLloc(tu,v)=i{x,y,w,h}smoothL1(tiuvi)smoothL1(x)={ 0.5x2if x<1x0.5otherwise (vx,vy,vw,vh)=(GxPxPw,GyPyPh,ln(GwPw),ln(GhPh))\begin{array}{lr} L(p,u,t^u,v)=L_{cls}(p,u)+\lambda[u\ge 1]L_{loc}(t^u,v)\\ L_{cls}(p,u)=-\sum{y_ulogp_u}=-logp_u(y\ is\ onehot)\\ L_{loc}(t^u,v)=\sum_{i\in \{x,y,w,h\}}{smooth_{L_1}(t^u_i-v_i)}\\ smooth_{L_1}(x)=\left\{\ \begin{aligned} 0.5x^2&&if\ |x|<1\\ |x|-0.5&& otherwise \end{aligned}\ \right.\\ (v_x,v_y,v_w,v_h)=(\frac{G_x-P_x}{P_{w}},\frac{G_y-P_y}{P_{h}},ln(\frac{G_w}{P_w}),ln(\frac{G_h}{P_h})) \end{array}
符号含义
ppsoftmax分类器概率分布p=(p0,...,pk)p=(p_0,...,p_k)
uu真实类别标签u[0,k]u\in [0,k]
tut^u边界框回归器对类别uu的回归参数(txu,tyu,twu,thu)(t_x^u,t_y^u,t_w^u,t_h^u)
vv真实目标边界框的回归参数(vx,vy,vw,vh)(v_x,v_y,v_w,v_h)
λ\lambda任务平衡参数

2.6. Fast R-CNN与R-CNN前后融合程度对比

R-CNN:

graph TD
A[Region_Proposal] --> B[Feature_Extraction];
B --> Classifaction;
B --> Bounding-box_regression;

Fast R-CNN

graph TD
A[Region_Proposal] --> B[Feature_Extraction+Classification+Bounding-box_Regression];

可见,Fast R-CNN已将R-CNN的后三步融合,Fast R-CNN中SS算法的特征框生成步骤需要的时间比第二步慢很多,成为了瓶颈,因此,Faster R-CNN将会通过RPN把第一步也融合进来,组成端到端模型。

3. Faster R-CNN

2015年,同样使用VGG16作为backbone,将候选区域生成囊括在内的检测过程中,每秒能检测五张图片。

其核心在于RPN(Region Proposal Network)。

而整个Faster R-CNN = RPN + Fast R-CNN

FRCN_architecture.png

3.1. 三个步骤

  1. 通过Backbone特征提取器,提取图像的特征图feature map。
  2. 使用RPN生成候选框proposals,将这些候选框投影到feature map上获得相应的特征矩阵。
  3. 每个特征矩阵通过ROI Pooling层缩放到7×77\times 7的特征图,flatten()操作展平并通过一系列FC Layers得到分类和回归两个预测结果。

3.2. RPN(Region Proposal Network)

image.png

对于一个尺寸为W×HW\times H输入图像image,经过VGG16能够得到一个512 channels512\ channelsw×h×512w\times h\times 512的feature map,如果使用ZF则能够得到一个256 channels256\ channelsw×h×256w\times h\times 256的feature map,如上图所示。

对feature map进行一个stride=1,padding=1,kernel=[3,3]stride=1,padding=1,kernel=[3,3]的卷积,从而实现对feature map每一个点的滑动窗口操作,得到相应的长256256512512的特征向量feature vectors组成的新feature map。feature map的前后尺寸保持不变。

对于每一个feature vector的中心点位置(a,b)(a,b)就对应原图中的一个anchor中心点(x,y)(x,y)。通过反向映射,在原图image上得到其对应的kk个anchor boxes。

x=Ww×ay=Hh×bx=\lfloor\frac{W}{w}\rfloor\times a\\ y=\lfloor\frac{H}{h}\rfloor\times b

对于kk个anchor,生成:

  • 长为2k2k的分类结果clsclsclsclskk组数对组成,一个数对由该anchor为背景的概率pbp_b和为前景概率pfp_f组成,一组数对的和为1,即pb+pf=1p_b+p_f=1
  • 长为4k4k的边界框回归参数regreg,一个anchor的回归参数为dx,dy,dw,dhd_x,d_y,d_w,d_h与Fast R-CNN含义一直一致。

论文中根据坐着Ross的经验所得,一个中心点对应的anchor有三种尺度:{1282,2562,5122}\{128^2,256^2,512^2\},三种比例{1:1,1:2,2:1}\{1:1,1:2,2:1\},所以上文中提到的一个中心点对应的anchor数k=9k=9。如下图所示。

image.png

虽然ZF的感受野171×171171\times 171,VGG则是228×228228\times 228这意味着部分甚至全部的Anchor的面积都比这个感受野大,论文中对此的解释为虽然感受野小于候选框面积,猜测目标的大致区域仍然是可能的。

感受野计算方式 F(i)=(F(i+1)1)×Stride+KernelSizeF(i)=(F(i+1)-1)\times Stride+KernelSize

例如:

  1. 对于1000×600×31000\times 600\times 3的图像image,feature map的尺寸为60×40×25660\times 40\times 256,意味着有60×40×960\times 40\times 9个anchor。
  2. 忽略超出image边界的anchor,剩余约6K各anchor。
  3. 将anchor按照regreg回归参数结果调整为候选框。
  4. 基于clscls分类结果,采用IoU阈值0.7的非极大值抑制,淘汰候选框,得到2000个候选框proposals。

3.2.1. RPN网络训练集

训练过程与上述例子有出入,我们并不对每张图都用2000个proposals,而是先为训练集采样。

一个image可能有上万个anchor,所以从每个image中随机采样256个anchor用于训练。其中正负样本比为1:11:1。如果正样本不足,仅有xx个,则负样本采样个数为256x256-x个。

正样本:

  1. 与Ground Truth的IoU超过0.7的anchor为正样本;
  2. 如果没有IoU超过0.7的则选用与Ground Truth之间IoU最高的anchor作为正样本。

负样本: 与Ground Truth的IoU低于0.3的anchor为正样本。

其余Anchor非正非负则不纳入训练集。

3.2.2. RPN Multi-task Loss

L({pi},{ti})=1NclsiLcls(pi,pi)+λ1NregipiLreg(ti,ti)Lcls=log(pi)Softmax Cross Entropyti=(tx,ty,tw,th)=(GxPxPw,GyPyPh,ln(GwPw),ln(GhPh))\begin{array}{lr} L(\{p_i\},\{t_i\})=\frac{1}{N_cls}\sum_i L_{cls}(p_i,p_i^\star)+\lambda\frac{1}{N_{reg}}\sum_i p_i^\star L_{reg}(t_i,t_i^\star)\\ L_{cls}=-log(p_i)&& Softmax\ Cross\ Entropy\\ t_i^\star=(t_x^\star,t_y^\star,t_w^\star,t_h^\star)=(\frac{G_x-P_x}{P_{w}},\frac{G_y-P_y}{P_{h}},ln(\frac{G_w} {P_w}),ln(\frac{G_h}{P_h})) \end{array}
符号含义
pip_iii个anchor预测为其对应真实标签的概率,如果负样本真是标签为0,正样本真实标签为1.
pip_i^\star正样本为1,负样本为0
tit_iii个anchor的边界框回归参数
tit_i^\starii个anchor的GT box
NclsN_{cls}一张图有256个anchor作为样本,所以是256
NregN_{reg}特征图上中心点的个数,也就是所有anchor的个数。

其实该公式中1Ncls\frac{1}{N_cls}λ1Nreg\lambda\frac{1}{N_{reg}}可以是相等的,PyTorch中就是1Ncls\frac{1}{N_cls}

另外Softmax Cross Entropy也可以换成Binary Cross Entropy,但是cls的长度应该为k而非2k。

边界框回归损失与Fast R-CNN的边界框回归参数损失一致。

3.3. Faster R-CNN模型训练

直接采用Loss = RPN Loss + Fast R-CNN Loss 联合训练。原论文的分步训练方法太繁琐,实际实现并不使用。

3.4. 与Fast R-CNN融合程度对比

R-CNN:

graph TD
A[Region_Proposal] --> B[Feature_Extraction];
B --> Classifaction;
B --> Bounding-box_regression;

Fast R-CNN

graph TD
A[Region_Proposal] --> B[Feature_Extraction+Classification+Bounding-box_Regression];

Faster R-CNN

graph TD
Region_Proposal+Feature_Extraction+Classification+Bounding-box_Regression;

直接全部融合,突破了SS算法的时间瓶颈,得到端到端框架。