目标检测


仅用于个人学习与总结,持续更新中......

简介

  传统目标检测算法通常分为区域选取、特征提取与特征分类3个阶段:

  • 区域选取:首先选取图像中可能出现物体的位置,由于物体位置、大小都不固定,因此传统算法通常使用滑动窗口(Sliding Windows)算法,但这种算法会存在大量的冗余框,并且计算复杂度高。
  • 特征提取:在得到物体位置后,通常使用人工精心设计的提取器进行特征提取,如SIFT和HOG等。由于提取器包含的参数较少,并且人工设计的鲁棒性较低,因此特征提取的质量并不高。
  • 特征分类:对上一步得到的特征进行分类,通常使用如SVM、AdaBoost的分类器。

  2014年的R-CNN(Regions with CNN features)是使用深度学习实现目标检测的经典之作,从此拉开了深度学习做目标检测的序幕。在R-CNN基础上,2015年的Fast R-CNN实现了端到端的检测与卷积共享,Faster R-CNN提出了锚框(Anchor)这一划时代的思想,将目标检测推向了第一个高峰。在2016年,YOLO v1实现了无锚框(Anchor-Free)的一阶检测,SSD实现了多特征图的一阶检测,这两种算法对随后的目标检测也产生了深远的影响。在2017年,FPN利用特征金字塔实现了更优秀的特征提取网络,Mask R-CNN则在实现了实例分割的同时,也提升了目标检测的性能。进入2018年后,目标检测的算法更为多样,如使用角点做检测的Corner-Net、使用多个感受野分支的Trident-Net、使用中心点做检测的Center-Net等。

  Anchor本质上是一系列大小宽高不等的先验框,均匀地分布在特征图上,利用特征去预测这些Anchors的类别,以及与真实物体边框存在的偏移。Anchor相当于给目标检测提供了一个梯子,使得检测器不至于直接从无到有地预测物体,精度往往较高,常见算法有Faster R-CNN和SSD等。

  现阶段基于深度学习的目标检测算法有两类,分别为Two-Stage目标检测算法和One-Stage目标检测算法。

  Two-Stage算法在第一步特征提取后会生成一个有可能包含待检测物体的候选区域(Region Proposal,RP),第二步通过卷积神经网络进行分类和定位回归。常见的Two-Stage算法有R-CNN(区域卷积神经网络)、SPP-Net、Fast R-CNN(快速区域卷积神经网络)、Faster R-CNN(更快区域卷积神经网络)等,此类算法以准确率高为特点。

  One-Stage算法不用生成候选区域,而是直接在网络中提取特征预测目标分类和位置,即在特征提取后直接分类加定位。常见的One-Stage算法有YOLOv5、SSD等。

目标检测算法

2.1 R-CNN

论文地址:https://arxiv.org/pdf/1311.2524v3.pdf

  区域卷积神经网络(Regions with CNN Features,R-CNN)首次将深度学习引入目标检测领域,是深度学习目标检测算法的开山之作,大幅提升了目标检测的识别精度。R-CNN还启发了一系列目标检测算法,如:Faster R-CNN,Faster R-CNN,Mask R-CNN。

  R-CNN原始模型应用的预训练数据集为1000万的图像,1000类的ImageNet ILSVC 2012;目标检测数据集为10000的图像,20类的PASCAL VOC2007。其首次将手动提取特征的方法更换为卷积神经网络提取特征,将经典目标检测算法中通过滑动窗法对所有可能区域的判断更换为提取一系列比较可能是物体的候选区域,并在候选区域上提取特征且进行判断。如图2-1所示,R-CNN算法的流程示意图。

 

图2-1  R-CNN算法流程示意图

  R-CNN算法步骤如下:

  (1)候选区域生成

  采用选择搜索(Selective Search,SS)方法生成候选区域。选择搜索方法是目前最为熟知的图像边界框提取算法,由Koen E.A于2011年提出。选择搜索的假设依据是物体存在的区域之间应该有相似性或连续性。首先使用分割手段,将图像分割成小区域,然后计算每两个相邻区域的相似度,并合并可能性最高的两个区域。其中,颜色直方图相近的、梯度直方图相近的(即纹理)、合并后总面积小的,以及在其边界框所占比例大的区域优先合并。因此,在合并过程中,操作的尺度较为均匀,这会避免大区域陆续合并其他小区域,并且保证合并后的形状规则。如此重复,直到将整张图像合并成一个区域位置,最终所有曾经存在过的区域都是候选区域。依据生成顺序对每个小图像块添加权重,此权重再乘一个随机数,依此对所有图像块排序。在此方法下,在所有颜色通道中,同时使用上述规则的不同组合进行区域合并。在全部合并结果去除重复后,按需选取候选区域进行输出。

  (2)候选区域缩放

  R-CNN使用的卷积神经网络需要一个227×227像素的固定大小输入,R-CNN论文中评估了两种不同的缩放方法:一种是长宽缩放倍数相同的各向同性缩放,即将候选区域边界扩展为正方形,缺失尺寸的部分用其他颜色填补,然后将正方形中包含的图像缩放到卷积神经网络的输入大小;另一种是长宽缩放倍数不同的各向异性缩放,即直接将候选区域长宽缩放到所需的尺寸。如图2-2,A为候选框,B为填补原始图片内容的各向同性缩放后的候选框,C为填补固定边界框的像素颜色均值的各向同性缩放后的候选框,D为各向异性缩放后的候选框。

图2-2  候选区域缩放

  (3)特征提取

  2012年Krizhevsky等人在ImageNet举办的ILSVRC目标识别挑战大赛中一战成名,豪夺当年的第一名,而他们团队提出来的网络结构以他们的导师名字命名,它就是AlexNet(论文地址:http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)。Alexnet包含5个卷积层,2个全连接层,R-CNN算法采用AlexNet对每个候选区域提取一个4096维的特征向量。

  (4)分类

  R-CNN算法最终并不是通过卷积神经网络框架中的SoftMax进行分类,而是通过训练二分类支持向量机模型对特征进行分类。当训练支持向量机时,将正样本定义为真实边界框,负样本定义为与真实边界框的IOU<0.3的候选区域,而0.3难分样本挖掘(Hard Negative Mining)策略。首先用初始的正样本和与正样本同规模的负样本的一个子集训练支持向量机,然后用SVM对样本进行分类,把其中错误分类样本中的困难样本放入负样本集合,再继续训练分类器,直到达到性能不再提升为止。

  对分好类的边界框使用非极大值抑制(Non-Maximum Suppression,NMS)。针对候选框数量大,且相互之间可能会有重叠的情况,使用非极大值抑制可以过滤多余的候选框。首先根据概率从大到小对候选区域排列,选中最大的候选区域,计算其与剩余候选区域的IOU,舍弃IOU超过某个阈值的候选区域,选中最大的候选区域并标记为保留候选框,且从候选区域集合中舍弃。然后从剩下的候选区域集合中选择概率最大的,重复上述步骤,直到候选区域集合为空集,此时保留的候选框的数量大大减少,目标分类任务完成。

  (5)位置精修

  由于目标检测最终的指标是IOU,因此要求候选框的定位足够准确,故下一步要进行边界框回归(Bounding Box Regression)。对每一类目标使用一个线性回归器进行精修,输入为4096维的特征图,输出为边界框的缩放和平移。边界框回归认为候选框和真实边界框之间近似是线性关系,第$i$个候选区域的中心点坐标及宽度和高度为$P^i=({P_x}^i+{P_y}^i+{P_w}^i+{P_h}^i)$,真实边界框为$G=(G_x+G_y+G_w+G_h)$,线性变换的参数为$d_x(P),d_y(P),d_w(P),d_h(P)$,前两个指定$P$边界框中心的比例不变平移,后两个指定$P$边界框宽度和高度的对数空间平移。初始值对候选区域的线性变化如下:

$\hat{G_x} = {P_w}{d_x(P)}+P_x$

$\hat{G_y} = {P_h}{d_y(P)}+P_y$

$\hat{G_w} = {P_w}exp(d_w(P))$

$\hat{G_h} = {P_h}exp(d_h(P))$

  假设任意一个线性变换的参数是特征$\Phi(P)$的一个线性映射,公式如下:

$d_*(P)={{w_*}^T}{\Phi(P)}$

  $w_*$是求解目标,损失函数使用带有L2范数的最小均方误差,${t_*}^i$是优化问题的目标值。

$w_*={\underset {\hat{w_*}}{\operatorname {argmin}}}\sum_{i}^{N}{({t_*}^i-{\hat{w_*}}^T{{\Phi}_5(P^i)})^2}+\lambda {\hat{w_*}}^2$

$t_x=(G_x-P_x)/P_w$

$t_y=(G_y-P_y)/P_h$

$t_w=log(G_w/P_w)$

$t_h=log(G_h/P_h)$

  采用反向传播算法即可对边界框回归进行求解,至此,目标边界框定位回归任务结束。

R-CNN算法优点:开创性地引入深度学习来提取特征。

R-CNN算法缺点:

(1)训练分阶段,步骤繁琐,CNN用来提取图像特征、SVM分类器用来预测类别、回归器精细修正建议框的位置;

(2)每个候选区域都需要卷积神经网络提取特征,产生大量特征文件,占用过多物理内存,且计算速度很慢。

2.2 Fast R-CNN

论文地址:https://arxiv.org/pdf/1504.08083.pdf

  虽然R-CNN开创性地引入深度学习来提取特征,但是需要做2000次卷积神经网络,其中候选框大量重复,计算速度很慢且大量特征冗余,目标分类和定位回归的特征存储需要占用大量的内存。在R-CNN之后,SPP-Net算法(论文地址:https://arxiv.org/pdf/1406.4729.pdf)解决了重复卷积计算与固定输出尺度的两个问题,但仍然存在R-CNN的其他弊端。为了解决以上问题,构思精巧、流程紧凑的Fast R-CNN应运而生,其大幅度提升了目标检测的速度和准确率。

  Fast R-CNN算法的重要创新点及算法核心如下:

  • 将一张图像归一化后直接输入卷积神经网络,接着直接提取这幅图像上候选区域的特征,候选区域的特征不需要重复计算。
  • 感兴趣区域池化(Region of Interest pooling,RoI pooling)生成固定尺寸特征,代替R-CNN算法中的区域图像缩放。
  • 利用深度神经网络的全连接神经网络,设计分类和回归同步的多任务损失(Multi-task loss),同步完成整个算法的目标分类和定位回归任务。

  Fast R-CNN的整体结构图如下:

图2-3  Fast R-CNN整体结构图

  Fast R-CNN算法内部采用VGG16卷积神经网络,先对输出的得分矩阵使用非极大值抑制方法选出每个类别的少数框,然后选择每一个框概率最大的类作为类别,位置和大小由网络结构的第二个输出给定。

  Fast R-CNN的算法步骤如下:

  首先使用选择搜索选取2000个候选区域,然后将原始图片输入卷积神经网络获取特征图,在卷积神经网络最后一个池化层之前的卷积层输出特征图,在特征中对每个候选区域按照比例寻找对应的位置,并截取同样深度(通道)的特征框,在将每个特征框划分为M×N个小网格,在每个网格内进行最大池化。这时,特征就被转换为固定尺寸的M×N×C矩阵,其中C为深度。将矩阵展平为向量,作为全连接层的输入。神经网络的输出结果分为分类器和边框回归,分类器是SoftMax的每一类的概率输出,边框回归输出一个20行的矩阵,20为目标检测的20个类,并分别对20个类计算边界框的位置和大小,最终输出对应的分类和边框坐标。

  感兴趣区域池化在生成M×N特征时,先将特征图在水平和竖直方向上分别分为M块和N块,整个分为M×N块。然后每一块取最大值,做最大池化运算,输出M×N块的特征,尺寸固定。感兴趣区域池化层位于深度神经网络卷积层的后面,全连接层的前面。最后将候选区域按比例截取的大小不一的特征图转换为大小统一的特征数据,送入全连接层,解决候选区域缩放的问题。感兴趣区域池化不需要对输入图片进行裁剪与缩放,避免了像素的损失,巧妙避免了尺度不一的问题。

  多任务损失函数是将分类的损失函数和回归的损失函数整合在一起,分类的损失函数为对数损失函数,即对真实分类的概率取对数的负数,回归的损失函数和R-CNN的基本一样。

  Fast R-CNN算法虽然取得了显著的成果,但在该算法中,选择搜索需要消耗2~3秒,而特征提取仅需要0.2秒,因此这种区域生成方法限制了Fast R-CNN算法的发挥空间,这也为后来的Faster R-CNN算法提供了改进方向。

2.3 Faster R-CNN

论文地址:https://arxiv.org/pdf/1506.01497.pdf

  在提取候选区域时,Fast R-CNN使用选择搜索算法,计算复杂度很高,浪费了大量时间。Faster R-CNN针对此问题,设计了以全卷积网络为基础的RPN(Region Proposal Network,区域候选生成网络),且其与目标检测的卷积神经网络共享,这使得目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)统一为一个端到端的神经网络,速度大大提高,将检测速度一举提升到了17 FPS(Frames Per Second),并在VOC2012测试集上实现了70.4%的检测结果。Faster R-CNN可以被视为区域生成网络+Fast R-CNN的综合系统。

  RPN提出了Anchor的设计,其为特征图的一个点上由大小和尺寸固定的不同组合形状的候选框。Anchor的三种尺寸,即面积范围是1282、2562、5122,三种长宽比例是1:1,1:2,2:1,它们组合成9种Anchor。利用9种Anchor在特征图上的移动,使每一个特征图上的点都有9个Anchor,这样可以实现对一张图片生成20000个左右的Anchor。

  Anchor本质是特征金字塔算法,适用于多尺度目标检测。由于9个Anchor在原始图片中的中心点完全一样,因此可以根据9个不同长宽比例、不同面积的Anchor逆向推导原始图片的9个区域,而这些区域的尺寸及坐标都是已知的,它们就是候选区域。每个候选区域会输出6个参数:候选区域和真实边框比较得到的2个分类概率(前景,背景,对应二分类);候选区域转换为真实边界框需要的4个线性变换参数(对应定位回归)。

  RPN的具体步骤:

  首先每次输入一个特征图,然后使用相同通道且填充成与原特征图同样尺寸的3×3大小的卷积核滑动全图,生成一个同等尺寸维度的特征图,目标是转换特征的语义空间,进一步集中特征信息。之后连接两个不同的分支,分别用作二分类(rpn_cls)和目标定位回归(rpn_BBox),左分支是改变维度的18个1×1卷积,其卷积神经网络针对每个点对应的9个Anchor实现二分类概率预测的目标,右分支是改变特征维度的36个1×1卷积,其卷积神经网络针对每个点对应的9个Anchor实现4个坐标值的边界框回归任务,如下图所示。

  

图2-4  RPN网络

  当逐像素对Anchors进行分类时,去除超过原始图边界的Anchor Box,如果Anchor Box与Ground Truth的IOU值最大或IOU>0.7,则将它们都标记为正样本,即Label=1。如果IOU<0.3,则标记为负样本,即Label=0。剩下的Anchor Box,不被用于训练,即Label=-1。

  当逐像素对Anchors进行边界框回归定位时,首先计算Anchor Box与Ground Truth之间的偏移量,然后通过Ground Truth Box与预测的Anchor Box的差异进行学习,更新RPN中的权重,以达到完成预测边界框定位回归的任务。

  RPN除了自身训练,还会提供RoIs给Fast R-CNN中的RoI Head作为训练样本。

  RPN生成RoIs的步骤:针对每张图片的特征图,计算所有Anchor属于目标的概率,以及对应的位置参数。选取概率较大的部分Anchor,利用回归的位置参数修正这些Anchor的位置,得到RoIs,然后利用非极大值抑制从RoIs中选出概率最大的区域。这部分的算法不需要反向传播,直接输出筛选后的RoIs即可。最后使用感兴趣区域池化将不同尺寸的区域全部池化到同一个尺度,再输入全连接神经网络来实现最后的分类和定位回归(此阶段时21类别分类(20个目标种类加1个背景),与RPN网络的二分类不同)。

  Faster R-CNN的算法流程如下:

  (1)输入数据集;

  (2)利用卷积层CNN等基础网络,提取特征得到特征图;

  (3)利用RPN生成一堆Anchors Box

  (4)利用1×1卷积对每个Anchor做二分类和初步定位回归,输出比较精确的RoIs;

  (5)把RoIs映射到卷积神经网络生成的特征图上;

  (6)把经过卷积层的特征图用感兴趣区域池化生成固定尺寸的特征图;

  (7)进行边界框回归和分类,利用SoftMax Loss和Smooth L1 Loss对分类概率和定位回归进行联合训练。

图2-5  Faster R-CNN算法图示