你不得不了解的目标检测发展史

喜你入骨 提交于 2020-02-07 15:48:21

计算机视觉

计算机视觉中的三大类任务:

  • 分类 Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标
  • 定位 Location:解决“在哪里”的问题,即定位出这个目标的位置
  • 检测 Detection:解决“是什么?在哪里”的问题,即定位出这个目标的位置并且知道目标物是什么
  • 分割 Segmentation:分为实例分割和场景分割,解决“每一个像素属于哪个目标物或场景”的问题。

一、目标检测

目标检测可以理解为是物体识别和物体定位的综合,不仅仅要识别物体属于哪个分类,更重要的是得到物体在图片中的具体位置。

为了完成这两个任务,目标检测模型分为两类。一类是two-stage算法;一类是one-stage算法。对于two-stage检测方法来说,它先生成了可能包含物体的候选区域Region Proposal,然后对这个候选区域做进一步的分类和校准,得到最终的检测结果,代表方法有R-CNN系列方法。而对于one-stage检测算法直接给出最终的检测结果,没有经过生成候选区域的步骤,典型代表为YOLO和SSD。

目标检测算法的3个模块:第一个是检测窗口的选择第二个是图像特征的提取第三个是分类器的设计

补充基础知识之检测窗口的选择

1.滑动窗口法

首先对输入图像进行不同窗口大小的滑窗进行从左往右、从上到下的滑动。每次滑动时候对当前窗口执行分类器(分类器是事先训练好的)。如果当前窗口得到较高的分类概率,则认为检测到了物体。对每个不同窗口大小的滑窗都进行检测后,会得到不同窗口检测到的物体标记,这些窗口大小会存在重复较高的部分,最后采用非极大值抑制(Non-Maximum Suppression, NMS)的方法进行筛选。最终,经过NMS筛选后获得检测到的物体。

2.选择性搜索(Selective Search)

为了在滑动窗口检测器的基础上提高搜索速度,可以采用候选区域方法(region proposal method)创建目标检测的感兴趣区域(ROI)。
图像中物体可能存在的区域应该是有某些相似性或者连续性区域的。因此,选择搜索基于上面这一想法采用子区域合并的方法进行提取bounding boxes候选边界框。首先,对输入图像进行分割算法产生许多小的子区域。其次,根据这些子区域之间相似性(相似性标准主要有颜色、纹理、大小等等)进行区域合并,不断的进行区域迭代合并。每次迭代过程中对这些合并的子区域做bounding boxes(外切矩形),这些子区域外切矩形就是通常所说的候选框。

3.区域候选网络(Region Proposal Network RPN)

anchor是固定尺寸的bbox。具体作法是:把feature map每个点映射回原图的感受野的中心点当成一个基准点,然后围绕这个基准点选取k个不同的尺寸和比例的anchor。对于W×H大小的卷积feature map(通常为2400),总共有W×H×k个锚点。默认使用3个尺度和3个纵横比,在每个滑动位置上产生k=9个anchor。在feature map上的每个特征点预测多个region proposals。例如对于像素点个数为 51×39 的一幅feature map上就会产生 51×39×9 个候选框。虽然anchors是基于卷积特征图定义的,但最终的 anchors是相对于原始图片的。

二、Two-Stage算法

1.R-CNN(Selective Search +CNN +SVM)

Region CNN由Ross Girshick提出,是利用深度学习进行目标检测的里程碑之作,奠定了这个子领域的基础。

步骤

  • 1.候选区域生成:一张图像采用 Selective Search生成1k~2k个候选区域Region Proposal
  • 2.特征提取:对每个候选区域,使用深度卷积网络提取CNN特征
  • 3.类别判断:特征送入每一类的SVM分类器,判别是否属于该类
  • 4.位置精修:使用回归器细修候选框位置

缺点

  • 1.重复计算。R-CNN虽然不在是穷举,但通过Proposal(Selective Search)的方案依然有两千个左右的候选框,这些候选框都需要单独经过backbone网络提取特征,计算量依然很大,候选框之间会有重叠,因此有不少重复计算。
  • 2.训练测试不简洁。候选区域提取、特征提取、分类、回归都是分开操作,中间数据还需要单独保存。

2.SPP-NET(ROI Pooing)

SPP:Spatial Pyrmid Pooling(空间金字塔池化)。

CNN一般都含有卷积部分和全连接部分。其中,卷积层不需要固定尺寸的图像,而全连接层是需要固定大小的输入。
所以当全连接层面对各种尺寸的输入数据时,就需要对输入数据进行crop(crop就是从一个大图中扣出网络输入大小的patch,比如227×227),或warp(把一个边界框bounding box的内容resize成227×227)等一系列操作以统一图片的尺寸大小。

SPP Net的作者何凯明考虑到,既然由于全连接FC层的存在,普通的CNN需要通过固定输入图片的大小来使得全连接层的输入固定。那借鉴卷积层可以适应任何尺寸,为何不能在卷积层的最后加入某种结构,使得后面全连接层得到的输入变成固定的呢?

这个“化腐朽为神奇”的结构就是spatial pyramid pooling layer。下图便是R-CNN和SPP Net检测流程的比较:

Spatial Pyramid Pooling层,对卷积特征图像进行空间金字塔采样获得固定长度的输出,可对特征层任意长宽比和尺度区域进行特征提取。具体做法是对特征图像区域进行固定数量的网格划分,对不同宽高的图像,每个网格的高度和宽度是不规定的,但对划分的每个网格进行池化,这样就可以得到固定长度的输出。SPP操作示意图:

步骤

  • 1.首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。
  • 2.特征提取阶段。这一步就是和R-CNN最大的区别了,同样是用卷积神经网络进行特征提取,但是SPP-Net用的是金字塔池化。这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度是大大地快啊。江湖传说可一个提高100倍的速度,因为R-CNN就相当于遍历一个CNN两千次,而SPP-Net只需要遍历1次。
  • 3.最后一步也是和R-CNN一样,采用SVM算法进行特征向量分类识别。

3.Fast R-CNN(Selective Search +CNN + ROI)

Fast R-CNN主要优化了两个问题:

  • 1.提出ROI Pooling池化层结果,解决了候选框子图必须将图像裁剪缩放到相同尺寸大小的问题。由于CNN网络的输入图像尺寸必须是固定的某一个固定大小(否则全连接没法计算),故R-CNN中对大小形状不同的候选框,进行了裁剪和缩放,使得他们达到相同的尺寸。这个操作既浪费时间,又容易导致图像信息丢失和形变。fast R-CNN在全连接层之前插入了ROI pooling层,从而不需要对图像进行裁剪,很好的解决了这个问题。

    • ROI Pooling的具体操作如下:

      • a.将region proposal划分成h * w大小的网格;
      • b.对每一个网格做MaxPooling(即每一个网格对应一个输出值);
      • c.将所有输出值组合起来便形成固定大小为h * w的feature map。

      这样我们就可以从不同大小的方框得到固定大小的相应 的feature maps。值得一提的是,输出的feature maps的大小不取决于ROI和卷积feature maps大小。ROI pooling 最大的好处就在于极大地提高了处理速度。

  • 2.提出多任务损失函数思想,将分类损失和边框定位回归损失结合在一起统一训练,最终输出对应分类和边框坐标。

步骤

  • 1.首先以整张图片为输入,利用CNN得到图片的特征层。
  • 2.然后,利用selective search算法得到原始图像空间中的候选框,并将这些候选框投影到特征层。
  • 3.针对特征层上的每个不同大小的候选框,使用RoI池化操作,得到固定维度的特征表示。
  • 4.最后通过两个全连接层,分别用softmax分类以及回归模型进行检测。

4.Faster R-CNN(RPN +CNN + ROI)


R-CNN和fast R-CNN均存在一个问题,那就是由选择性搜索来生成候选框,这个算法很慢。Faster R-CNN针对这个问题,提出了RPN网络来进行候选框的获取,从而摆脱了选择性搜索算法,也只需要一次卷积层操作,从而大大提高了识别速度。
主要步骤:

  • 1.卷积层。原始图片先经过conv-relu-pooling的多层卷积神经网络,提取出特征图。供后续的RPN网络和全连接层使用。Faster R-CNN不像R-CNN需要对每个子图进行卷积层特征提取,它只需要对全图进行一次提取就可以了,从而大大减少了计算时间。
  • 2.RPN层,Region Proposal Networks。RPN层用于生成候选框,并利用softmax判断候选框是前景还是背景,从中提取前景候选框,并利用bounding box regression调整候选框的位置,从而得到特征子图,称为proposals。
  • 3.ROI层。它将大小尺寸不同的proposal池化成相同的大小,然后送入后续的全连接层进行后续的全连接层进行物体分类和位置调整回归。
  • 4.分类层。利用ROI层输出的特征图proposal的类别,同时再次对bounding box进行regression从而得到精准的形状和位置。

5.R-FCN

R-FCN是Faster-RCNN的改进型,其速度提升了2.5倍以上,并略微提高了准确度。其主要贡献是提出Position-sentive score maps来解决目标检测的位置敏感性问题。

位置敏感性

分类网络的位置不敏感性

对于分类任务而言,我希望我的网络有一个很好的分类性能,随着目标在图片中不断的移动,但我的忘了仍然可以准确的将你区分为对应的类别。如上图左边所示,不管你这个鸟在图片中如何移动,我的分类网络都能准确的将你分类为鸟。即我的网络有很好的区分能力。

检测网络的位置敏感性

对于检测任务而言,我希望我的网络有一个很好的检测性能,可以准确的输出目标所在的位置值。随着某个目标的移动,我的网络希望能够和它一起移动,仍然能够准确的检测到它,即我对目标位置的移动很敏感。我需要计算对应的偏差值,我需要计算我的预测和GT的重合率等。但是,深的全卷积网络不具备这样的一个特征。

总之分类网络的位置不敏感性和检测网络的位置敏感性的一个矛盾问题,而我们的目标检测中不仅要分类也要定位,那么如何解决这个问题呢,R-FCN提出了Position-sensitive score maps来解决这个问题。

步骤:

  • 1.图片首先进图特征提取网络主干网络;
  • 2.然后进行分支操作;
    • a.RPN网络没什么改变,输出两个损失函数判断anchor是否是前景,然后筛选出特定个数的候选框;
    • b.下面支路进行卷积输出即为position-sensitive score map,本层不改变大小,输出维度是重点:K * K * (C+1)
    • c.还需一个卷积支路输出 K * K * 4通道的特征。称作位置敏感得分映射,用于回归位置修正。

骨干架构(backbone architecture)

R-FCN使用的是残差网络的ResNet-101结构,ResNet-101采用的是100层卷积+Global Averaging Pooling(GAP)+ FC分类器的结构,ResNet101卷积的最后一层的Feature Map的个数是2048。在R-FCN中,去掉了ResNet的GAP层和fc层,并在最后一个卷积层之后使用1024个1×1×2048卷积降维到1024-d,然后再使用k2*(C+1)个1×1×1024-d的卷积生成k2*(C+1)-d的位置敏感卷积层。其中ResNet部分使用在ImageNet上训练好的模型作为初始化参数。

位置敏感网络

该层的大小和ResNet-101最后一层的大小相同,维度是k^2×(C+1)。C+1C+1为类别数,表示CC类物体加上1类背景。k是一个超参数,表示把ROI划分grid的单位,一般情况下,k=3。在R-FCN中,一个ROI区域会被等比例划分成一个k×k的grid,每个位置为一个bin,分别表示该grid对应的物体的敏感位置(左上,正上,右上,正左,正中,正右,左下,正下,右下)编码。

三、One-Stage算法

1.YoLoV1

步骤:

  • 1.给定一个输入图像,YoLoV1会把图像看成一个s * s 的栅格,这的的s等于7。即首先将图像划分成7 * 7 的网格;
  • 2.对于上述每个栅格,每个栅格预测两个bounding boxe以及栅格含有对象的置信度,同时每个栅格还会预测栅格所属对象类别。
  • 3.根据上一步可以预测出的目标窗口,然后根据阈值去除可能性比较低的目标窗口,然后根据NMS去除冗余窗口。

架构:

YOLOv1由24层卷积层,4个最大池化层和2个全连接层组成。我们关注最后的输出是7x7x30,这里是7x7代表输入图像的7x7栅格,一一对应,30的前十个代表2个bounding boxes的坐标以及对象的置信度,后20个代表VOC数据集的20个类别。

标签定义:

YOLOv1是一个监督式的网络,有监督那就有标签,来看看标签是怎样定义,首先看狗,它被一个框框起来了,这个框就是真实的标签,框对应的中心在哪个栅格,就代表当前栅格是狗所在的栅格,这个栅格里就会记录狗的标签信息,自行车和小车和狗类似。

2.SSD(Single Shot MultiBox Detector)

SSD的全称是Single Shot MultiBox Detector,Single Shot表示SSD是像YOLO一样的单次检测算法,MultiBox指SSD每次可以检测多个物体,Detector表示SSD是用来进行物体检测的。
SSD做出的改进如下:

  • 使用了类似Faster R-CNN中RPN网络提出的锚点(Anchor)机制,增加了bounding box的多样性;
  • 使用全卷积的网络结构,提升了SSD的速度;
  • 使用网络中多个阶段的Feature Map,提升了特征多样性。

SSD的网络结构

  • 1.卷积层

SSD论文采用了VGG16的基础网络,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个CNN网络来提取特征,然后再进行后续的目标定位和目标分类识别。

  • 2.目标检测层

这一层由5个卷积层和一个平均池化层组成。去掉了最后的全连接层。SSD认为目标检测中的物体,只与周围信息相关,它的感受野不是全局的,故没必要也不应该做全连接。SSD的特点如下

  • a.多尺寸feature map上进行目标检测
    每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到多尺度检测的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。而yolo中,只在最后一个卷积层上做目标位置和类别的训练和预测。这是SSD相对于yolo能提高准确率的一个关键所在。
    在每个卷积层上都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。
  • b.多个anchors,每个anchor对应4个位置参数和21个类别参数

和faster R-CNN相似,SSD也提出了anchor的概念。卷积输出的feature map,每个点对应为原图的一个区域的中心点。以这个点为中心,构造出6个宽高比例不同,大小不同的anchor(SSD中称为default box)。每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类)。如下图所示

  • 3.筛选层

和yolo的筛选层基本一致,同样先过滤掉类别概率低于阈值的default box,再采用NMS非极大值抑制,筛掉重叠度较高的。只不过SSD综合了各个不同feature map上的目标检测输出的default box。

SSD基本已经可以满足我们手机端上实时物体检测需求了,TensorFlow在Android上的目标检测官方模型ssd_mobilenet_v1_android_export.pb,就是通过SSD算法实现的。它的基础卷积网络采用的是mobileNet,适合在终端上部署和运行。

3.YoLov2

  • 1.Better:批归一化,高分辨分类器,锚盒,维度聚类,细粒度特征以及多尺度训练。
    • a.批归一化的效果则是将数据分布映射到相对紧凑的分布,让网络可以更快以及更好地学习,避免过拟合,使用批归一化这一操作提升了2%mAP。
    • b.高分辨率的分类器,在YOLOv1中,将在imagenet预训练好的网络迁移到目标检测网络中,而训练imagenet数据集的输入的大小和目标检测网络的输入尺寸是不一致的,这意味目标检测网络需要同时取学习目标检测而且还要去适应新的分辨率输入,所以YOLOv2使用目标检测输入的分辨率微调了分类网络,然后迁移到目标检测网络中去,这样,目标检测网络就可以专攻学习目标检测了,通过这一技巧,使mAP上升了4%。
    • c.锚盒:在YOLOv1中,最后是使用全连接层来生成bounding box的坐标,然而使用全连接的缺点在于丢失了特征图的空间信息,造成定位不准,作者借鉴了Faster Rcnn中锚框的思想,利用锚框直接在卷积特征图滑窗采样,因为卷积不需要Reshape,所以很好的保留的空间信息,最终使特征图的每个特征点和原图的每个栅格一一对应。另外,与YOLOv1不同的是,YOLOv2是预测的是坐标相对于栅格左顶点的偏移量,通过变换公式得到最后的预测坐标。既然锚框是手动精选的先验框,设想能否一开始就选择了更好的、更有代表性的先验Boxes维度,那么网络就应该更容易学到准确的预测位置。所以作者通过K-means聚类算法将数据集中的ground truth进行了聚类。最后对模型复杂度和召回率的平衡,选择5个聚类中心,挑选了5个最具代表性的bounding box。一起提升了5%mAP。
    • d.细粒度特征对于检测小物体是有很大的影响,随着图像尺寸的一步步缩小,图片中的某些小物体的特征是会由于特征图的不断缩小而发生信息丢失,作者通过引入了一个Passthrough Layer,把浅层特征图连接到深层特征图,也就是图中这个26x26x512的特征图通过隔行隔列采样,变换成13x13x2048的特征图,然后和13x13x1024的特征图进行按通道concat,通过这一操作,可以使mAP提升一个百分点。
    • e.让YOLOv2对不同尺寸图片的具有鲁棒性,引入了多尺寸的训练,每10batch,选择新的图像尺寸对网络进行训练,最后使精度提升了2个百分点。
  • 2.Faster:YOLOv2简化了网络,只使用了19卷积层和5个池化层(Darknet-19),不仅通过一系列的改进使精度高了,速度方面依然比YOLOv1还要快。
  • 3.Stronger:强大之处体现在YOLO9000,YOLO9000是在YOLOv2的基础上提出的一种可以检测超过9000个类别的模型,其主要贡献点在于提出了一种分类和检测的联合训练策略。对于检测数据集,可以用来学习预测物体的边界框、置信度以及为物体分类,而对于分类数据集可以仅用来学习分类,但是其可以大大扩充模型所能检测的物体种类。但是遇到的一个问题是两个数据集的类别不是完全互斥的,比如ImageNet光狗的品种就有100多种,它们与COCO数据集中狗的类别产生冲突,两者是包含关系,针对这一问题,作者提出了一种层级分类方法,主要思路是根据各个类别之间的从属关系建立一种树结构,也就是WordTree。

4.YoLov3

在保持实时性的基础上,对YOLOv2进行了几点改进,主要有三点:采用逻辑回归预测置信度和进行分类,从三个尺度上预测b-box的坐标以及特征提取器发生变化。

  • 1.逻辑回归的使用:在YOLOv2中,每个cell是直接通过网络回归预测b-box坐标和置信度的,YOLOv3则将置信度和坐标分开预测,坐标预测还是通过网络进行预测,而置信度则是单独通过逻辑回归进行预测。在分类上,没有使用softmax多分类,作者也指出softmax最终对性能也没有提升,而且softmax假设是每个box只有一个类,这对迁移到更大有多种类别标签的数据集是没有好处的,所以作者使用多个逻辑回归来预测分类,使用二元交叉熵计算分类损失。
  • 2.特征提取器:YOLOv3重新训练了一个新的特征提取器——DarkNet-53,使用了残差网络,相比最先进的特征提取器,性能相当,但浮点数运算更少,速度更快,下采样没有使用池化操作,而是通过卷积步长来实现。图18是DarkNet-53的结构图。
  • 3.多尺度预测坐标:作者借由FPN的思想,引用中间层的输出与后层输出进行融合,进行三个尺度预测,每个尺度的每个cell预测3个坐标.
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!