目标检测算法原理

1.概述

1.1 目标检测的定义

识别图片中有哪些物体以及物体的位置(坐标位置)。

其中,需要识别哪些物体是人为设定限制的,仅识别需要检测的物体;物体的坐标位置由两种表示方法:极坐标表示(xmin, ymin, xmax, ymax)和中心点坐标表示(x_center, y_center, w, h)。

1.2 目标检测的发展

1.2.1 传统的目标检测算法(候选区域+手工特征提取+分类器)——two stage算法

     HOG+SVM、DPM

1.2.2 region proposal+CNN提取分类的目标检测框架——one stage算法

    R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN

1.2.3端到端(end-to-end)的目标检测框架

    YOLO、SSD

 

1.2 目标检测算法原理

目标:清晰记住算法的识别流程,解决某些问题用到的算法的关键技术点。

 

1.2.1 目标检测算法的分类

1) two stage算法

先进行区域推荐,再进行目标分类,典型算法是R-CNN系列算法(R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN);

2) one stage算法(end-to-end)

采用一个网络一步到位,代表算法是:YOLO、SSD

 

通常在算法中需要对数值进行处理,一般为归一化操作,即:

对于输出的位置信息是4个比较大的像素的值,在回归的时候不合适。目前统一的做法是,每个位置除以图片本身的像素大小。假设以中心点坐标方式表示,则:

$x=x/x_{image},y=y/y_{image},w=w/x_{image},h=h/y_{image}$

 

1.2.2 目标检测的任务

对于一张图片中有一个物体时,可以通过如下框架进行物体检测:将输入的图片经过一个CNN网络得到feature map,然后将feature map分别连接两个全连接层,一个是物体分类的全连接层(有多少个物体就多少个输出),另一个是输出位置信息,如图1所示:

                                                                图1 图片分类框架

 

对于单个物体的检测,还可以通过图像金字塔和滑动窗口的方式进行物体检测,可以参照《基于滑动窗口和全卷积网络的人脸检测》一节。 

 

2. R-CNN算法

 对于一张图片中有多个目标,多个类别时,对于图1所示的算法的无法实现,可能需要输出N个类别(N不固定),因此网络模型的输出是不固定的。因此需要一个能够输出多个目标的算法。

2.1 写在介绍R-CNN算法前面——overfeat模型

overfeat模型如图2所示:

                                                               图2 overfeat模型

 

该算法使用不同大小的候选框作为滑动窗口进行物体检测。这种方式是一种暴力穷举的方式,计算量巨大,而且不同大小的滑动窗口设置可能导致检测结果不准确,但确实为物体检测提供了一种思路。

 

2.2 R-CNN模型

        不使用暴力方法,而是用候选区域方法(region proposal method),创建目标检测的区域改变了图像领域实现物体检测的模型思路,R-CNN是以深度神经网络为基础的物体检测的模型 ,R-CNN在当时以优异的性能令世人瞩目,以R-CNN为基点,后续的SPPNet、Fast R-CNN、Faster R-CNN模型都是照着这个物体检测思路。R-CNN算法框架如图3所示:

                                                      图3 R-CNN算法模型框架

 

算法步骤如下(使用Alexnet网络提取特征,输入大小需要resize到227×227):

1)找到可能存在物体的候选区域region proposal;

2)图片大小调整到227×227,为了使用Alexnet网络的输入,通过CNN对候选区域提取特征向量,2000个建议框的CNN特征组成2000×4096为矩阵;

3)将2000×4096的特征矩阵和20个SVM组成的权重矩阵4096×20相乘,获得2000×20的矩阵;得到2000个类别得分矩阵,得分最高的即为候选框中物体的类别;

4)分别对2000×20的矩阵的每一列即每一类进行NMS来剔除重叠的建议框;

5)修正bbox,对bbox进行回归微调。通过线性回归实现:特征值是候选区域,目标是对应的GT,建立回归方程学习参数。

 

       R-CNN中的候选区域的选取,使用的是选择性搜索(SelectiveSearch, SS),如题4所示,首先将每个像素作为一组。然后,计算每一组的纹理,并将两个最接近的组结合起来。但是为了避免单个区域吞噬其他区域,我们首先对较小的组进行分组。我们继续合并区域,直到所有区域都结合在一起。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的 ROI。

                                                    图4 选择性搜索进行候选区域选取

 

大小统一使用的方法是Crop+Wrap方法。

 

SVM分类介绍:

假设一张图片的2000个侯选区域,那么提取出来的就是2000 x 4096这样的特征向量(R-CNN当中默认CNN层输出4096特征向量)。那么最后需要对这些特征进行分类,R-CNN选用SVM进行二分类。假设检测N个类别,那么会提供20个不同类别的SVM分类器,每个分类器都会对2000个候选区域的特征向量分别判断一次,这样得出[2000, 20]的得分矩阵,如图5所示:

 

                                                       图5 SVM分类器

 

2.3 R-CNN网络训练

R-CNN网络的训练过程分为:正负样本准备、预训练+fine tuning、训练SVM、训练边框回归网络。

1、  正负样本准备

其中

正样本:某个region proposal和当前图像上所有的ground truth重叠面积最大的IOU大于等于0.5,则该region proposal作为这个ground truth类别的正样本;

负样本:某个region proposal和当前图像上所有的ground truth重叠面积最大的IOU小于0.5,则该region proposal作为这个ground truth类别的负样本。

这样得到若干个候选区域以及对应的标记结果。

2、  预训练

别人已经在大数据上训练好的CNN网络参数(比如:本方法使用的Alexnet)

3、  微调(fine-tuning)

利用标记好的样本,输入到model1中,继续训练,得出model2(CNN网络)

4、  SVM训练

针对每一个类别训练一个SVM的二分类器。例如:猫的SVM分类器,输入维度是2000*4096,目标还是之前第一步标记(正负样本标记结果)的是否属于该类别。例如:100个猫样本,900个非猫样本。

5、  训练边框回归器

 

2.4 R-CNN测试过程

如图6所示,为R-CNN实现的过程。

                                            图6 R-CNN实现过程

 

3. SPP-NET

SPP(Spatial Pyramid Pooling,空间金字塔池化)

问题:如图6所示,R-CNN速度慢在哪里?卷积网络。每个选择的候选区域都要进行卷积操作。因此,SPP-Net的出发点就是提升R-CNN的速度。

SPP-NET相比R-CNN,需要从下面的两点进行改进,如图7所示。

1、  减少卷积计算(直接将图片输入一个卷积网络,不再是就将每个获得的候选区域都进行输入卷积网络)

2、  防止图片内容变形(不再使用Crop+Wrap方法)

                                                图7 R-CNN与SPPNet对比

 

R-CNN模型SPPNet模型
1、R-CNN是让每个候选区域经过crop/wrap等操作变换成固定大小的图像 2、固定大小的图像塞给CNN 传给后面的层做训练回归分类操作 1、SPPNet把全图塞给CNN得到全图的feature map 2、让候选区域(通过SS在原图筛选)与feature map直接映射,得到候选区域的映射特征向量 3、映射过来的特征向量大小不固定,这些特征向量塞给SPP层(空间金字塔变换层),SPP层接收任何大小的输入,输出固定大小的特征向量,再塞给FC层

 

3.1 映射

       原始图片经过CNN变成了feature map,原始图片通过选择性搜索(SS)得到了候选区域,现在需要将基于原始图片的候选区域映射到feature map中的特征向量。映射过程如图8所示:

                                                                    图8 映射过程

整个映射过程有具体的公式,如下

假设(x′,y′)(x′,y′)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关心与网络结构有关:(x,y)=(S∗x′,S∗y′),即:

  • 左上角的点:

    • x′=[x/S]+1
  • 右下角的点:

    • x′=[x/S]−1

其中S就是CNN中所有的strides的乘积,包含了池化、卷积的stride。论文中使用S的计算出来为=16。

 

3.2 SPP(spatial pyramid pooling)

通过spatial pyramid pooling 将任意大小的特征图转换成固定大小的特征向量。

假设原图输入是224x224,对于conv出来后的输出是13x13x256的,可以理解成有256个这样的Filter,每个Filter对应一张13x13的feature map。接着在这个特征图中找到每一个候选区域映射的区域,spp layer会将每一个候选区域分成1x1,2x2,4x4三张子图,对每个子图的每个区域作max pooling,得出的特征再连接到一起,就是(16+4+1)x256的特征向量,接着给全连接层做进一步处理,如图9所示。

                                                         图9 SPP层

 

3.3 SPP-NET总结

                                                         图10 SPP-NET总结

 

  • 优点
    • SPPNet在R-CNN的基础上提出了改进,通过候选区域和feature map的映射,配合SPP层的使用,从而达到了CNN层的共享计算,减少了运算时间, 后面的Fast R-CNN等也是受SPPNet的启发。
  • 缺点
    • 训练依然过慢、效率低,特征需要写入磁盘(因为SVM的存在)。
    • 分阶段训练网络:选取候选区域、训练CNN、训练SVM、训练bbox回归器, SPP-Net在fine-tuning阶段无法使用反向传播微调SPP-Net前面的Conv层。

 

4. Fast R-CNN

出发点:解决SPP-NET的网络之间不统一训练的问题。

4.1 Fast R-CNN改进

1)提出了ROI Pooling层(类似于SPP层),然后整合模型,将CNN、SPP变换层、分类器、bbox回归几个模块放在一起训练。是一个end-to-end模型,即输入端到输出端直接使用一个网络相连,整体优化目标函数;

2)SVM替换成了softmax分类;

 

                                                                             图11 Fast R-CNN

 

步骤

  • 首先将整个图片输入到一个基础卷积网络,得到整张图的feature map;
  • 将region proposal(RoI)映射到feature map中;
  • RoI pooling layer提取一个固定长度的特征向量,每个特征会输入到一系列全连接层,得到一个RoI特征向量(此步骤是对每一个候选区域都会进行同样的操作);
    • 其中一个是传统softmax层进行分类(不再使用SVM进行分类),输出类别有K个类别加上”背景”类;
    • 另一个是bounding box regressor;

 

4.2 RoI层和SPP层对比

RoI Pooling相当于简易版的SPP层,目的是为了减少计算时间并且得出固定长度的向量。和SPP层的对比如图12所示。

                                                                               图12 RoI层和SPP层对比

 

原来SPP是金字塔型:4×4、2×2、1×1;而RoI Pooling改成了单个块:K×M(论文中是4×4)

 

为什么要设计单个尺度呢?这要涉及到single scale与multi scale两者的优缺点

  • single scale(RoI Pooling),直接将image定为某种scale,直接输入网络来训练即可。(Fast R-CNN);
  • multi scale(SPP层),也就是要生成一个金字塔,然后对于object,在金字塔上找到一个大小比较接近227x227的投影版本。

后者比前者更加准确些,没有突更多,但是第一种时间要省很多,所以实际采用的是第一个策略,因此Fast R-CNN要比SPPNet快很多也是因为这里的原因。

 

接着我们来看为什么后面的整个网络能进行统一训练?

特征提取CNN的训练和SVM分类器的训练在时间上是先后顺序,两者的训练方式独立,因此SVMs的训练Loss无法更新SPP-Layer之前的卷积层参数,去掉了SVM分类这一过程,所有特征都存储在内存中,不占用硬盘空间,形成了End-to-End模型(proposal除外,end-to-end在Faster-RCNN中得以完善)

  • 使用了softmax分类;
  • RoI pooling能进行反向传播,SPP层不适合;

 

4.3 总结

Fast R-CNN结构如图13所示:

                                                          如图13 Fast R-CNN结构

 

缺点:使用Selective Search提取Region Proposals,没有实现真正意义上的端对端,操作也十分耗时。

 

5. Faster R-CNN

R-CNN、Fast R-CNN以及Faster R-CNN的对比如图14所示:

       

                                                                                                         图14 R-CNN、Fast R-CNN以及Faster R-CNN的对比

 

        在Fast R-CNN因为还使用Selective Search(选择性搜索),因此不是一个严格意义上的end-to-end模型。同时,要找出所有的候选框,这个也非常耗时。Faster R-CNN提出了一种更加高效的方法来求出这些候选框。Faster R-CNN可以简单地看成是区域生成网络+Fast R-CNN的模型,用区域生成网络(Region Proposal Network,简称RPN)来代替Fast R-CNN中的选择性搜索方法,结构如图15所示。

 

                          图15 RPN网络结构

 

步骤:

1)输入任意大小的图片,经过CNN网络输出特征图,特征图共享于后面两步;

2)特征图经过RPN层生成候选区域;

3)候选区域和特征图共同输入到RoI Pooling层,经过每个候选区域的特征图,然后进行softmax分类,bbox预测。 

 

 

5.1 RPN网络

RPN网络的主要作用是得出比较准确的候选区域。整个过程分为如下两步:

  • 用n×n(默认3×3=9)的大小窗口去扫描特征图,每个滑窗位置映射到一个低维的向量(默认256维),并为每个滑窗位置考虑k种(在论文设计中k=9)可能的参考窗口(论文中称为anchors)
  • 低维特征向量输入两个并行连接的1 x 1卷积层然后得出两个部分:reg窗口回归层(用于修正位置)和cls窗口分类层(是否为前景或背景概率)

5.1.1 anchors

 

3*3卷积核的中心点对应原图上的位置,将该点作为anchor的中心点,原图中框出多尺度、多种长宽比的anchors,三种尺度{ 128,256,512 }, 三种长宽比{1:1,1:2,2:1}

 

例如:

 

候选区域训练

  • 训练样本anchor标记
    • 1.每个ground-truth box有着最高的IoU的anchor标记为正样本
    • 2.剩下的anchor/anchors与任何ground-truth box的IoU大于0.7记为正样本,IoU小于0.3,记为负样本
    • 3.剩下的样本全部忽略
    • 正负样本比例为1:3
  • 训练损失
    • RPN classification (anchor good / bad) ,二分类,是否有物体,是、否
    • RPN regression (anchor -> proposal) ,回归
    • 注:这里使用的损失函数和Fast R-CNN内的损失函数原理类似,同时最小化两种代价

候选区域的训练是为了让得出来的正确的候选区域, 并且候选区域经过了回归微调。

在这基础之上做Fast RCNN训练是得到特征向量做分类预测和回归预测。

 

5.2 总结

  • 优点
    • 提出RPN网络
    • 端到端网络模型
  • 缺点
    • 训练参数过大
    • 对于真实训练使用来说还是依然过于耗时(RPN层,候选区域过多)

可以改进的需求:

  • RPN(Region Proposal Networks)改进对于小目标选择利用多尺度特征信息进行RPN;
  • 速度提升 如YOLO系列算法,删去了RPN,直接对proposal进行分类回归,极大的提升了网络的速度。

 

6. YOLO(You only look once)算法

6.1 流程理解

原始图片resize到448x448,经过前面卷积网络之后,将图片输出成了一个7×7×30的结构。

对于7×7的单元格,每个单元格预测两个bbox框,然后进行NMS筛选,筛选概率以及IoU。

6.2 单元格(grid)

最后输出网络的7×7×30的特征图怎么理解?

7×7=49个像素值,理解成49个单元格,每个单元格可以代表原图中的一个方块。单元格需要做两件事情:

1)每个单元格负责预测一个物体类别,并且直接预测物体的概率值。

2)每个单元格预测两个bbox位置,两个bbox的置信度(confidence):7×7×2=98个bbox。

一个物体类别+两个bbox位置+两个confidence:(4+1+4+1+20)=30

其中,4代表位置信息,1为置信度代表一个bbox的结果,20代表20类的预测结果。

 

6.3 训练过程

  • 预测框对应的目标值标记
    • confidence:格子内是否有目标
    • 20类概率:标记每个单元格的目标类别

怎么理解这个过程?同样以分类那种形式来对应,假设以一个单元格的预测值为结果,如下图

 

6.4 YOLO总结

优点:速度快

缺点:准确率较低,对于相互靠近的物体(挨在一起且中点落在同一个grid cell时),还有小物体的检测效果不好,主要是因为一个网格只预测了两个框。

 

7. SSD(Single Shot MultiBox Detector)算法

7.1简介

特点:SSD结合了YOLO的回归思想以及Faster R-CNN的Anchor机制,使用全图各个位置的多尺度区域进行 回归,既保持了YOLO速度快的特征,也保证了窗口预测的跟Faster R-CNN一样比较准确。

SSD的核心是在不同尺度的特征图上采用卷积核来预测一系列Detector Bounding Boxes的类别、坐标偏移。

 

7.2 SSD的结构

7.3 SSD流程

 

SSD中引入了Defalut Box,实际上与Faster R-CNN的anchor box机制类似,就是预设一些目标预选框,不同的是在不同尺度feature map所有特征点上是使用不同的prior boxes。

 

7.4 Detector&Classifier

 

Detector & classifier的三个部分:

  • 1.default boxes: 默认候选框

  • 2.localization:4个位置偏移

  • 3.confidence:21个类别置信度(要区分出背景)

 

上图中每个像素生成3个候选框,每个候选框都生成一个localization和confidence。

 

参考如下代码理解:

def ssd_multibox_layer(inputs,
                       num_classes,
                       sizes,
                       ratios=[1],
                       normalization=-1,
                       bn_normalization=False):
    """Construct a multibox layer, return a class and localization predictions.
    """
    net = inputs
    if normalization > 0:
        net = layers_utils.l2_normalization(net, scaling=True)
    # Number of anchors.
    num_anchors = len(sizes) + len(ratios)

    # Location.
    num_loc_pred = num_anchors * 4
    loc_pred = slim.conv2d(net, num_loc_pred, [3, 3], activation_fn=None,
                           scope='conv_loc')
    loc_pred = layers_utils.channel_to_last(loc_pred)
    loc_pred = tf.reshape(loc_pred,
                          tensor_shape(loc_pred, 4)[:-1]+[num_anchors, 4])
    # Class prediction.
    num_cls_pred = num_anchors * num_classes
    cls_pred = slim.conv2d(net, num_cls_pred, [3, 3], activation_fn=None,
                           scope='conv_cls')
    cls_pred = layers_utils.channel_to_last(cls_pred)
    cls_pred = tf.reshape(cls_pred,
                          tensor_shape(cls_pred, 4)[:-1]+[num_anchors, num_classes])
    return cls_pred, loc_pred

假设如上图的5×5×256的feature map。每个像素点对应3个default box。因此通过两个3×3的卷积,分别输出位置(3×4=12)和置信度(3×21(类别+背景)=63)。

 

        如上图所示,feature map上的每个像素生成3个bbox,一共有5*5*3=75个Default Box,类似Faster R-CNN的Anchor;其次,通过卷积得到5*5*12的feature map(12代表3*4,即3个Default Box的位置偏差);最后是通过卷积得到5*5*63的feature map(63=3*21,即3个Default Box的类别概率,一个21个类别,包括20个类别+1个背景)

总的输出是5*5*(3+12+63)=5*5*78的feature map。

 

7.5 Default Box

    default boxex类似于RPN当中的滑动窗口生成的候选框,SSD中也是对特征图中的每一个像素生成若干个框。

 

7.6 localization与confidence

这两者的意义如下,主要作用用来过滤,训练

经过这一次过滤操作,会将候选框筛选出数量较少的prior boxes。

 

关于三种boxes的解释区别:

  • gournd truth boxes:训练集中,标注好的待检测类别的的位置,即真实的位置,目标的左下角和右上角坐标;
  • default boxes:在feature map上每一个点上生成的某一类别图片的位置。feature map每个点生成4或6个box(数量是事先指定的),格式为转换过后的(x, y, w, h);
  • prior boxes:经过置信度阈值筛选后,剩下的可能性高的boxes。这个box才是会被真正去做回归;

 

SSD中的多个Detector & classifier有什么作用

SSD的核心是在不同尺度的特征图上来进行Detector & classifier 容易使得SSD观察到更小的物体

 

7.7 训练

7.7.1 训练流程

如下图所示:

输入->输出->结果与ground truth标记样本回归损失计算->反向传播, 更新权值

1)样本标记

利用anchor与对应的ground truth进行标记正负样本,每次并不训练8732张计算好的default boxes, 先进行置信度筛选,并且训练指定的正样本和负样本, 如下规则:

  • 正样本

    • 1.与GT重合最高的boxes, 其输出对应label设为对应物体;
    • 2.物体GT与anchor iou满足大于0.5;
  • 负样本:其它的样本标记为负样本

在训练时, default boxes按照正负样本控制positive:negative=1:3

 

2)损失

网络输出预测的predict box与ground truth回归变换之间的损失计算, 置信度是采用 Softmax Loss(Faster R-CNN是log loss),位置回归则是采用 Smooth L1 loss (与Faster R-CNN一样)

 

7.7.1 测试流程

输入->输出->nms->输出

 

8. 总结

 

物体检测项目在另一篇文章中介绍。

 

posted @ 2020-03-15 14:06  指间的执着  阅读(5031)  评论(0编辑  收藏  举报