2018-12-05 21:12:15

一、滑动窗口目标检测

首先通过卷积神经网络训练一个分类器,然后使用不同尺度的窗口去裁剪输入图片进行分类。我们期望的结果是通过不同的窗口可以将需要检测的物体完全覆盖到,此时分类器输出的置信值会大于阈值,这个时候我们就认为已经成功检测到一个物体,并且得到了其位置信息。

滑动窗口算法的缺点是很明显的就是计算量非常大,如果采用粗粒度的框进行框选,虽然可以减少计算量,但是毫无疑问会降低算法精度。

常见的目标检测算法介绍常见的目标检测算法介绍常见的目标检测算法介绍

 

 二、R-CNN系列 - Two Stage目标检测算法

以上提到的滑动窗口算法运行过慢的原因之一就是有很多裁剪下来的窗口是明显不符合条件的窗口,而这些窗口也将被传给分类器进行分类,为什么我们不能对这些窗口先进行一下过滤再进行分类操作呢?

1)Region Proposal : R-CNN

R-CNN即Region CNN,就是不再对滑动窗口产生的所有图片进行分类,而是只在一些特定的候选框上进行分类操作。早期的R-CNN挑选候选框的方式是通过一些图像的特征如颜色,纹理,边缘等信息来寻找可能存在目标物体的候选框,这些候选框被称为ROI,即Region of Interest,大概会产生2000个感兴趣的区域,然后使用分类器对这些ROIs进行分类操作。

R-CNN输出为label + bounding box,也就是说这个网络并不直接使用ROI的box作为最后的区域坐标,而是会对这个区域进行一次回归,得到预测的值。

常见的目标检测算法介绍

2)Fast RCNN : R-CNN网络的问题就是运行速度还是太慢了,如果我们有 2000 个候选区域,且每一个都需要独立地馈送到 CNN 中,那么对于不同的 ROI,我们需要重复提取 2000 次特征,这个是非常浪费时间的。另外,由于CNN网络的输入图像尺寸必须是固定的某一个大小(否则全连接时没法计算),故R-CNN中对大小形状不同的候选框,进行了裁剪和缩放,使得他们达到相同的尺寸。这个操作既浪费时间,又容易导致图像信息丢失和形变。

Fast R-CNN针对这两个问题做了相应的改进。

  • FCN,一次性对所有提取得到的图片进行预测,大大提高了速度。
  • ROI pooling层,使用ROI Pooling从而不需要对图像进行裁剪,很好的解决了这个问题。ROI pooling的思路是,如果最终我们要生成MxN的图片,那么先将特征图水平和竖直分为M和N份,然后每一份取最大值,输出MxN的特征图。这样就实现了固定尺寸的图片输出了。ROI pooling层位于卷积后,全连接前。

Fast R-CNN 的训练速度是 R-CNN 的 10 倍,推断速度是后者的 150 倍。

常见的目标检测算法介绍

3)Faster R-CNN : Fast R-CNN 依赖于外部候选区域方法,如选择性搜索。但这些算法在 CPU 上运行且速度很慢。在测试中,Fast R-CNN 需要 2.3 秒来进行预测,其中 2 秒用于生成 2000 个 ROI。Faster R-CNN 采用与 Fast R-CNN 相同的设计,只是它用内部深层网络代替了候选区域方法。新的候选区域网络(RPN)在生成 ROI 时效率更高,并且以每幅图像 10 毫秒的速度运行。

常见的目标检测算法介绍

主要分为四个步骤

  1. 卷积层。原始图片先经过conv-relu-pooling的多层卷积神经网络,提取出特征图。供后续的RPN网络和全连接层使用。faster R-CNN不像R-CNN需要对每个子图进行卷积层特征提取,它只需要对全图进行一次提取就可以了,从而大大减小了计算时间。

  2. RPN层,region proposal networks。RPN层用于生成候选框,并利用softmax判断候选框是前景还是背景,从中选取前景候选框(因为物体一般在前景中),并利用bounding box regression调整候选框的位置,从而得到特征子图,称为proposals。

  3. ROI层,fast R-CNN中已经讲过了ROI层了,它将大小尺寸不同的proposal池化成相同的大小,然后送入后续的全连接层进行物体分类和位置调整回归

  4. 分类层。利用ROI层输出的特征图proposal,判断proposal的类别,同时再次对bounding box进行regression从而得到精确的形状和位置。

作者:紫衣仙女
链接:https://www.imooc.com/article/37757
来源:慕课网

主要分为四个步骤

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

R-CNN系列的性能图:

常见的目标检测算法介绍

 

三、YOLO、SSD - One Stage目标检测算法

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

作者:紫衣仙女
链接:https://www.imooc.com/article/37757
来源:慕课网

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

作者:紫衣仙女
链接:https://www.imooc.com/article/37757
来源:慕课网

基于区域的检测器是很准确的,但需要付出性能的代价。采用One Stage的算法的效率往往要好于two stage算法,因为one stage可以一次性得到边界框和类别。

1)YOLO : You Only Look Once

针对于two-stage目标检测算法普遍存在的运算速度慢的缺点,yolo创造性的提出了one-stage。也就是将物体分类和物体定位在一个步骤中完成。yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式,yolo可实现45帧每秒的运算速度,完全能满足实时性要求

作者:紫衣仙女
链接:https://www.imooc.com/article/37757
来源:慕课网

针对于two-stage目标检测算法普遍存在的运算速度慢的缺点,yolo创造性的提出了one-stage。也就是将物体分类和物体定位在一个步骤中完成。yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式,yolo可实现45帧每秒的运算速度,完全能满足实时性要求。其网络结构如下:

常见的目标检测算法介绍

YOLO主要分为三个部分:卷积层,目标检测层,NMS筛选层。

卷积层:采用Google inceptionV1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionV1进行了改造,他没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception module中的一个分支,应该是为了简化网络结构)

采用Google inceptionV1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionV1进行了改造,他没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception module中的一个分支,应该是为了简化网络结构)

作者:紫衣仙女
链接:https://www.imooc.com/article/37757
来源:慕课网

主要分为三个部分:卷积层,目标检测层,NMS筛选层

作者:紫衣仙女
链接:https://www.imooc.com/article/37757
来源:慕课网

目标检测层:先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。yolo将一副448x448的原图分割成了7x7个网格,每个网格要预测两个bounding box的坐标(x,y,w,h)和box内包含物体的置信度confidence,以及物体属于20类别中每一类的概率(yolo的训练数据为voc2012,它是一个20分类的数据集)。所以一个网格对应的参数为(4x2+2+20) = 30。如下图:

常见的目标检测算法介绍

常见的目标检测算法介绍

NMS筛选层:筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box(NMS具体算法可以回顾上面faster R-CNN小节)。这样就得到了最终的最合适的几个box和他们的类别。

先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。yolo将一副448x448的原图分割成了7x7个网格,每个网格要预测两个bounding box的坐标(x,y,w,h)和box内包含物体的置信度confidence,以及物体属于20类别中每一类的概率(yolo的训练数据为voc2012,它是一个20分类的数据集)。所以一个网格对应的参数为(4x2+2+20) = 30。如下图

作者:紫衣仙女
链接:https://www.imooc.com/article/37757
来源:慕课网

YOLO算法的缺点:

对于图片中比较小的物体,效果很差。这其实是所有目标检测算法的通病,SSD对它有些优化,我们后面再看。

作者:紫衣仙女
链接:https://www.imooc.com/article/37757
来源:慕课网

  • 每个网格只对应两个bounding box,当物体的长宽比不常见(也就是训练数据集覆盖不到时),效果很差。
  • 原始图片只划分为7x7的网格,当两个物体靠的很近时,效果很差。
  • 最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。
  • 对于图片中比较小的物体,效果很差。这其实是所有目标检测算法的通病,SSD对它有些优化,我们后面再看。

2)SSD : Single Shot MultiBox Detector

Single Shot MultiBox Detector

作者:紫衣仙女
链接:https://www.imooc.com/article/37757
来源:慕课网

Faster R-CNN准确率mAP较高,漏检率recall较低,但速度较慢。而yolo则相反,速度快,但准确率和漏检率不尽人意。SSD综合了他们的优缺点,对输入300x300的图像,在voc2007数据集上test,能够达到58 帧每秒( Titan X 的 GPU ),72.1%的mAP。

SSD网络结构如下图:

SSD网络结构如下图

作者:紫衣仙女
链接:https://www.imooc.com/article/37757
来源:慕课网

常见的目标检测算法介绍

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

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

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

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

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

作者:紫衣仙女
链接:https://www.imooc.com/article/37757
来源:慕课网

Single Shot MultiBox Detector

作者:紫衣仙女
链接:https://www.imooc.com/article/37757
来源:慕课网