目标检测算法:Two-Stage

R-CNN

论文原文

算法步骤

  1. 一张图片生成1k-2k个候选区域(使用Selective Search(SS)方法)
  2. 对每个候选区域,遂用深度网络提取特征
  3. 特征送入每一类SVM(支持向量机)分类器,判别是否属于该类
  4. 使用回归器精细修正候选框位置

1、候选区域的生成

利用Selective Search算法通过图像分割的方法得到一些原始区域,然后使用一些合并策略将这些区域合并得到一个层次化的区域结构,而这些结构就包含着可能合要的物体。

2、对每个候选区域,使用深度网络提取特征(fome-tunning阶段)

将2000个候选区域缩放到277x277像素大小(无论什么形状都会转为277x277),将候选区域输入实现训练好的AlexNet-CNN图像分类网络,得到4096维的特征。最终总共获得2000x4096的矩阵(共2000候选框,每个候选框4096维特征)。

特征提取网络训练

对使CNN适应目标检测任务(与真实物体框部分重叠的框)。输出为21路(VOC的20分类+背景类)。IoU>0.5为正例,其余为负例。获得模型后使用到网络的FC7层,即4096维,作为特征提取结果。

3、特征送入每一类SVM分类器,判定类别

将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘,获得2000×20维矩阵表示每个建议框是某个目标类别的得分。分别对上述2000× 20维短阵中每一列即每一类进行非极大值抑制(NMS)剔除重叠建议框,得到该列即该类中得分最高的一些建议框。

SVM是二分类分类器,针对每一个类别都有一个分类器

PASCAL VOC数据集共有20个类别,所以有20个SVM分类器

下图中应该是行向量,不是列向量!

2000x4096:共2000行,每一行都是一个候选框得到的4096维特征

4096x20:共20列,每一列对应一个类别的权值向量

2000x20:第1行第1列代表第1个候选框是类别1的概率。

SVM的训练

检测区域区域与实际区域完全一致为正例,与物体无关的为负例,但是与物体部分重叠的区域的标记成为了一个问题。于是设定阈值IoU=0.3,低于阈值的全部标记为负例,IOU=1的是正例,0.3-1之间的不考虑。简单设置为0.5会降低准确度

非极大值抑制剔除重叠建议框

首先寻找的分最高的目标,计其他目标与改目标的IoU值,删除所有IoU值大于给定阈值的目标(大于阈值即为同一个物体,小雨阈值但是置信度比较高的,认为是其他目标)。重复前面的步骤。这种方法可以识别图中多个同一种类的物体,只要小于阈值就被删除。

在fine-tunning和SVM训练两个阶段,定义正负样例不同的原因

fine-tunning阶段是由于CNN对小样本容易过拟合,需要大量训练数据,故对IoU限制较松: IoU>0.5的建议框为正样本,否则为负样本; SVM这种机制是由于其适用于小样本训练,故对样本IoU限制严格:Ground Truth为正样本,与Ground Truth相交IoU<0.3的建议框为负样本。

为什么训练一个分类器的原因

为什么单独训练了一个SVM而不是直接用softmax。论文中说,因为微调时和训练SVM时所采用的正负样本阈值不同,微调阶段正样本定义并不强调精准的位置,而SVM正样本只有Ground Truth;并且微调阶段的负样本是随机抽样的,而SVM的负样本是经过hard negative mining方法筛选的(难负例挖掘算法,用途就是正负例数量不均衡,而负例分散代表性又不够的问题,hard negative就是每次把那些顽固的棘手的错误,再送回去继续练,练到不再提升为止),是更加严格的负样本;导致在采用SoftMax会使PSACAL VOC 2007测试集上mAP从54.2%降低到50.9%。

4、使用回归器精细修正候选框位置

对NMS处理后剩余的建议框进一步筛选。接着分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的休整后的的分最高的Bounding box。

Region Proposal为建议框,Ground Truth为实际框,G‘表示Region Proposal进行回归后的预测窗口,可以用最小二乘法解决线性回归问题。

通过回归分类器之后得到4个参数,分别代表Region Proposal中心点的x偏移量、y的偏移量,高度缩放因子、宽度缩放因子。通过得到的四个值对建议框进行修正即G‘

存在问题

  • 测试速度慢:一张图片53s(CPU)。SS算法提取候选框2s,候选框大量重叠,特征提取冗余。

  • 训练速度慢

  • 训练所需空间大

Fast R-CNN

论文原文

算法步骤

  1. 使用SS方法生成1-2k候选区域
  2. 将图像输入网络得到特征图,将SS算法生成的候选框投影到特征图上获得相应的特征矩阵
  3. 将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图,接着将特征图展平并通过一些列FC层得到预测结果

计算整张特征图

将整张图像送入网络,得到特征图,从特征图向上提取对应的候选区域,这些候选区域的特征不需要重复计算。在R-CNN中是把每个候选框都进行特征计算。

ROI pooling 缩放

将候选区域在特征图上对应的特征矩阵划分为7x7的49等份,然后对每个区域进行最大池化下采样(max pooling)得到7x7xchannel大小的特征矩阵

Softmax 分类器

输出N+1个类别的概率,共N+1个节点

边界框回归器 (BBR)

输出对应N+1个类别的候选边界框回归参数($d_{x}$,$d_{y}$,$d_{w}$,$d_{h}$),共(N+1)x4个节点。在我的理解中虽然输出了(N+1)x4个节点,但其实只有对应类别的4个节点是有意义的。

边界框回归的思路可以理解为平移尺度放缩

平移:$\Delta x=P_{w}d_{x}(P),\Delta y=P_{h}d_{y}(P)$。

尺度放缩:$S_{w}=exp(d_{w}(P))$,$S_{h}=exp(d_{h}(P))$。

$ P_{x},P_{y},P_{w},P_{h}$分别为候选框的中心x,y坐标以及宽高

$ \hat{G}_{x},\hat{G}_{y},\hat{G}_{w},\hat{G}_{h} $分别为最终预测的边界框的中心x,y坐标以及宽高

损失计算

损失函数:

分类损失 $Loss_{cls}(p,u)=-logp_{u}$

$p$是分类器预测的softmax概率分布,$p=(p_{0},…,p_{k})$

$u$是目标真实类别标签

边界框回归损失

$\lambda$是一个平衡系数,$[u\ge1]$是艾弗森括号,当括号内条件不满足时即为背景时,则没有边界框回归损失这部分。

$t^{u}$是边界框回归器预测的对应类别$u$的回归参数$(t^{u}_{x},t^{u}_{y},t^{u}_{w},t^{u}_{h})$

$v$是真实目标的边界框回归参数$(v_{x},v_{y},v_{w},v_{h})$

$v_{x}=\frac{\hat{G}_{x}-P_{x}}{P_{w}}$,$v_{y}=\frac{\hat{G}_{y}-P_{y}}{P_{h}}$

$v_{w}=ln\frac{\hat{G}_{w}}{P_{w}}$,$v_{h}=ln\frac{\hat{G}_{h}}{P_{h}}$

缺点

SS步骤耗时占据检测总时长太多,需要2s成为了速度瓶颈,而后面步骤仅需要不到1s

Faster R-CNN

论文原文

算法步骤

  1. 将图像输入网络得到特征图
  2. 使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上,获得对应的特征矩阵
  3. 将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图,并将特征图展平通过一系列FC层得到预测结果

Faster = RPN+Fast R-CNN

RPN

RPN结构

  • 使用一个3x3的滑动窗口(sliding window)在通道数为256的特征图(conv feature map)上滑动,采用步距为1,padding为1的方式进行滑动,得到与宽高与fearure map完全一样的特征矩阵
  • 每滑动到一个位置上会生成一个1x256的向量通过并联两个全连接层cls layer与reg layer分别输出目标概率2$k$ scores (2是背景或者物体的2分类)以及边界框回归参数4$k$ coordinates($k$是$k$个anchor boxes)

anchor box

  • 计算滑动窗口的中心点在原图上的对应位置:(原图的宽度/特征图宽度)取整得到$x$轴步距,$x$轴步距x滑动窗口中心点的$x$坐标得到原图上的$x$坐标,$y$坐标同理,得到原图中对应的点坐标$(x,y)$。
  • 以得到的点$(x,y)$为中心算出$k$个anchor boxes,每一个anchor boxes都是给定的大小和长宽比例。
  • 论文中给出三个尺度(面积):($128^{2},256^{2},512^{2}$)。三种尺度:(1:1,1:2,2:1)。即每个位置在原图上都对应9个anchor,即$k$=9

其中特征图的通道数以及生成的向量与特征提取网络的backbone有关,论文中使用的ZF网络输出通道数是256,如果是VGG16的话通道数将会是512。

论文提到:对于一张1000x600x3的图像,大约有60x40x9(21600)个anchor,忽略跨越边界的anchor后,剩下6k左右个,对于RPN生成的候选框之间有大量重叠的问题,基于候选框的cls的得分,使用NMS方法,IoU设置为0.7,每张图大约剩下2k个候选框。

RPN损失函数

$p_{i}$表示第i个anchor预测为物体object(非背景)的概率

$p^{*}_{i}$当为正样本(object)时为1,当为负样本(background)时为0

$t_{i}$表示预测第$i$个anchor的边界框回归参数

$t^{*}_{i}$表示第$i$个anchor对应的GT Box(Ground Truth Box)

$N_{cls}$表示一个mini-batch中的所有样本数量256(尽量保证每个mini-batch中正负样本比例为1:1)

$N_{reg}$表示anchor位置的个数(不是anchor的个数)约2400

分类损失

  • 虽然是二分类,但原文中使用的是Softmax Cross Entropy这种多分类交叉熵,用的one-hot编码的形式,[1,0]是物体,[0,1]是背景。
  • Pytorch官方的实现中使用的是Binary Cross Entropy,意味着cls layer只输出1k个scores,0代表背景,1代表物体。

边界框回归损失

Faster RCNN训练

Pytorch中采用RPN Loss + Fast R-CNN Loss的联合训练方法

原论文方法:分别训练RPN于Fast R-CNN

  1. 利用ImageNEt与训练分类模型初始化前置卷积神经网络层参数,并开始单独训练RPN网络参数。
  2. 固定RPN网络独有的卷积层以及全连接层参数,再利用ImageNet与训练分类模型初始化前置卷积网络参数,并利用RPN网络生成的目标建议框去训练Fast RCNN网络参数。
  3. 固定利用Fast RCNN训练好的前置卷积网络层参数,微调RPN网络独有的卷积层以及全连接层参数。
  4. 同样保持固定前置卷积层参数,微调Fast RCNN网络的全连接层参数。最后RPN网络与Fast RCNN网络共享前置卷积层参数,构成一个统一网络/

存在问题

  • 对小目标检测效果较差

  • 模型大,检测速度较慢

mAP\Precision(精度) 与Recall(召回率)

  • TP(True Positives):被分为正样本,并且分对了
  • TN(True Negatives):被分为负样本,并且分对了
  • FP(False Positives):被分为正样本,但是分错了
  • FN(False Negatives):被分为负样本,但是分错了

Precision是$\frac{TP}{TP+FP}$:预测是正类并且确实是正类的部分占所有预测中认为是正类的比例

Recall是$\frac{TP}{TP+FN}$:预测是正类并且确实是正类的部分占所有确实是正类的比例

mAP:mean Average Precision,就是各个类别AP的平均值。

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信