目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN

      深度学习的物体检测可以自己学习图片的特征,不再需要像传统的检测方法人工设计特征。所以随着数据量的增加,传统检测方法的性能会趋向饱和,而深度学习的物体检测性能会越好越好。

      目标检测器大概可分为2种,第一种为基于候选区域的2步目标检测器,其分为候选区域生成和区域分类2步,包括的算法为RCNN、SPPNET、 Fast R-CNN、Faster R-CNN 和 FPN等。第二种为单步检测器,其直接将特征提取,候选框回归和分类在同一个无分支的卷积网络中完成,包括YOLO、SSD和RetinaNet等。本文主要讨论第一种。

目标检测算法逻辑图如下(没有囊括全部的算法):

目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第1张图片

 

总述

深度学习早期的物体检测,大都使用滑动窗口的方式进行窗口提取,这种方式本质是穷举法 R-CNN。后来提出Selective Search等Proposal窗口提取算法,对于给定的图像,不需要再使用一个滑动窗口进行图像扫描,而是采用某种方式“提取”出一些候选窗口,在获得对待检测目标可接受的召回率的前提下,候选窗口的数量可以控制在几千个或者几百个。

               目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第2张图片   

之后又出现了SPP,其主要思想是去掉了原始图像上的crop/warp等操作,换成了在卷积特征上的空间金字塔池化层。引入SPP层的主要原因是CNN的全连接层要求输入图片是大小一致的,而实际中的输入图片往往大小不一,如果直接缩放到同一尺寸,很可能有的物体会充满整个图片,而有的物体可能只能占到图片的一角。SPP对整图提取固定维度的特征,首先把图片均分成4份,每份提取相同维度的特征,再把图片均分为16份,以此类推。可以看出,无论图片大小如何,提取出来的维度数据都是一致的,这样就可以统一送至全连接层。

实际上,尽管R-CNN 和SPP在检测方面有了较大的进步,但是其带来的重复计算问题让人头疼,而 Fast R-CNN 的出现正是为了解决这些问题。 Fast R-CNN使用一个简化的SPP层 —— RoI(Region of Interesting) Pooling层,其操作与SPP类似,同时它的训练和测试是不再分多步,不再需要额外的硬盘来存储中间层的特征,梯度也能够通过RoI Pooling层直接传播。Fast R-CNN还使用SVD分解全连接层的参数矩阵,压缩为两个规模小很多的全连接层。

Fast R-CNN使用Selective Search来进行区域提取,速度依然不够快。Faster R-CNN则直接利用RPN(Region Proposal Networks)网络来计算候选框。RPN以一张任意大小的图片为输入,输出一批矩形区域,每个区域对应一个目标分数和位置信息。

 

滑动窗口检测器

自从 AlexNet 获得 ILSVRC 2012 挑战赛冠军后,用 CNN 进行分类成为主流。一种用于目标检测的暴力方法是从左到右、从上到下滑动窗口,利用分类识别目标。为了在不同观察距离处检测不同的目标类型,我们使用不同大小和宽高比的窗口。

                                

                                 滑动窗口(从左到右,再从上到下)

我们根据滑动窗口从图像中剪切图像块。由于很多分类器只取固定大小的图像,因此这些图像块是经过变形转换的。但是,这不影响分类准确率,因为分类器可以处理变形后的图像。

                                                                目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第3张图片

变形图像块被输入 CNN 分类器中,提取出 4096 个特征。之后,我们使用 SVM 分类器识别类别和该边界框的另一个线性回归器。下面为滑动窗口检测器的系统工作流程图:

目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第4张图片

下面是伪代码。我们创建很多窗口来检测不同位置的不同目标。要提升性能,一个显而易见的办法就是减少窗口数量。

选择性搜索

暴力方法产生的窗口太多,为了减少窗口数量,用候选区域方法(region proposal method)创建目标检测的感兴趣区域(ROI)。在选择性搜索(selective search,SS)中,首先将每个像素作为一组。然后,计算每一组的纹理,并将两个最接近的组结合起来。但是为了避免单个区域吞噬其他区域,首先对较小的组进行分组。之后继续合并区域,直到所有区域都结合在一起。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的 ROI。

                         

                         图源:van de Sande et al. ICCV'11

 

R-CNN

R-CNN 利用候选区域方法创建了约 2000 个 ROI。这些区域被转换为固定大小的图像,并分别馈送到卷积神经网络中。该网络架构后面会跟几个全连接层,以实现目标分类并提炼边界框。

目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第5张图片

以下是 R-CNN 整个系统的流程图:

目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第6张图片

通过使用更少且更高质量的 ROI,R-CNN 要比滑动窗口方法更快速、更准确。

边界框回归器

候选区域方法有非常高的计算复杂度。为了加速这个过程,我们通常会使用计算量较少的候选区域选择方法构建 ROI,并在后面使用线性回归器(使用全连接层)进一步提炼边界框。

                               目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第7张图片

                              使用回归方法将蓝色的原始边界框提炼为红色的。

 

Fast R-CNN

R-CNN 需要非常多的候选区域以提升准确度,但其实有很多区域是彼此重叠的,因此 R-CNN 的训练和推断速度非常慢。如果我们有 2000 个候选区域,且每一个都需要独立地馈送到 CNN 中,那么对于不同的 ROI,我们需要重复提取 2000 次特征。

此外,CNN 中的特征图以一种密集的方式表征空间特征,那么我们能直接使用特征图代替原图来检测目标吗?

                          目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第8张图片

Fast R-CNN 使用特征提取器(CNN)先提取整个图像的特征,而不是从头开始对每个图像块提取多次。然后,我们可以将创建候选区域的方法直接应用到提取到的特征图上。例如,Fast R-CNN 选择了 VGG16 中的卷积层 conv5 来生成 ROI,这些关注区域随后会结合对应的特征图以裁剪为特征图块,并用于目标检测任务中。我们使用 ROI 池化将特征图块转换为固定的大小,并馈送到全连接层进行分类和定位。因为 Fast-RCNN 不会重复提取特征,因此它能显著地减少处理时间。

目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第9张图片

将候选区域直接应用于特征图,并使用 ROI 池化将其转化为固定大小的特征图块。

以下是 Fast R-CNN 的流程图:

目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第10张图片

在下面的伪代码中,计算量巨大的特征提取过程从 For 循环中移出来了,因此速度得到显著提升。Fast R-CNN 的训练速度是 R-CNN 的 10 倍,推断速度是后者的 150 倍。

Fast R-CNN 最重要的一点就是包含特征提取器、分类器和边界框回归器在内的整个网络能通过多任务损失函数进行端到端的训练,这种多任务损失即结合了分类损失和定位损失的方法,大大提升了模型准确度。

ROI 池化

因为 Fast R-CNN 使用全连接层,所以可以应用 ROI 池化将不同大小的 ROI 转换为固定大小。

为简洁起见,我们先将 8×8 特征图转换为预定义的 2×2 大小。

  • 下图左上角:特征图。

  • 右上角:将 ROI(蓝色区域)与特征图重叠。

  • 左下角:将 ROI 拆分为目标维度。例如,对于 2×2 目标,我们将 ROI 分割为 4 个大小相似或相等的部分。

  • 右下角:找到每个部分的最大值,得到变换后的特征图。

目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第11张图片

输入特征图(左上),输出特征图(右下),ROI (右上,蓝色框)。

 

Faster R-CNN

Fast R-CNN 依赖于外部候选区域方法,如选择性搜索。但这些算法在 CPU 上运行且速度很慢。在测试中,Fast R-CNN 需要 2.3 秒来进行预测,其中 2 秒用于生成 2000 个 ROI。

Faster R-CNN 采用与 Fast R-CNN 相同的设计,只是它用内部深层网络代替了候选区域方法。新的候选区域网络(RPN)在生成 ROI 时效率更高,并且以每幅图像 10 毫秒的速度运行。

下面为Faster R-CNN的流程图,其与 Fast R-CNN 相同。

目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第12张图片

 

 

目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第13张图片

外部候选区域方法代替了内部深层网络。

候选区域网络

候选区域网络(RPN)将第一个卷积网络的输出特征图作为输入。它在特征图上滑动一个 3×3 的卷积核,以使用卷积网络(如下所示的 ZF 网络)构建与类别无关的候选区域。其他深度网络(如 VGG 或 ResNet)可用于更全面的特征提取,但这需要以速度为代价。ZF 网络最后会输出 256 个值,它们将馈送到两个独立的全连接层,以预测边界框和两个 objectness 分数,这两个 objectness 分数度量了边界框是否包含目标。我们其实可以使用回归器计算单个 objectness 分数,但为简洁起见,Faster R-CNN 使用只有两个类别的分类器:即带有目标的类别和不带有目标的类别。

目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第14张图片

对于特征图中的每一个位置,RPN 会做 k 次预测。因此,RPN 将输出 4×k 个坐标和每个位置上 2×k 个得分。下图展示了 8×8 的特征图,且有一个 3×3 的卷积核执行运算,它最后输出 8×8×3 个 ROI(其中 k=3)。下图(右)展示了单个位置的 3 个候选区域。

                              目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第15张图片

此处有 3 种猜想,稍后我们将予以完善。由于只需要一个正确猜想,因此我们最初的猜想最好涵盖不同的形状和大小。因此,Faster R-CNN 不会创建随机边界框。相反,它会预测一些与左上角名为「锚点」的参考框相关的偏移量(如x、y)。我们限制这些偏移量的值,因此我们的猜想仍然类似于锚点。

                                                                  目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第16张图片

要对每个位置进行 k 个预测,我们需要以每个位置为中心的 k 个锚点。每个预测与特定锚点相关联,但不同位置共享相同形状的锚点。

                                                                      目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第17张图片

这些锚点是精心挑选的,因此它们是多样的,且覆盖具有不同比例和宽高比的现实目标。这使得我们可以以更好的猜想来指导初始训练,并允许每个预测专门用于特定的形状。该策略使早期训练更加稳定和简便。

            目标检测的算法简述一:从RCNN->SPPnet->Fast RCNN->Faster RCNN_第18张图片

 

 

 

 

参考的文章有:

(1)物体检测算法全概述:从传统检测方法到深度神经网络框架:https://www.sohu.com/a/131923395_465975

(2)从RCNN到SSD,这应该是最全的一份目标检测算法盘点:http://baijiahao.baidu.com/s?id=1598999301741831102&wfr=spider&for=pc

 

你可能感兴趣的:(深度学习,计算机视觉,目标检测的算法)