MENU

【目标识别】浅谈目标识别发展史

July 28, 2021 • 神经网络

本文将简要的整理一下我做的目标识别方向近几年的发展历程.

7 月 4 日 新开这个博客,也为了督促自己下个学期多下些苦功。先要整完手头的这个神经网络。

7 月 13 日 apex。

7 月 14 日 apex。

7 月 15 日 apex。

7 月 16 日 胡适之啊胡适之!你怎么能如此堕落!先前订下的学习计划你都忘了吗?子曰:“吾日三省吾身。”不能再这样下去了!

7 月 17 日 apex。

7 月 18 日 apex。

咳咳咳,总而言之,派派是真好玩。哪天搞个 switch 打方块可能会更好玩(不是

那么今天,我就根据上学期老师讲的深度学习发展史来简要的整理一下我做的目标识别方向的发展历程。

前言

从人工神经网络被提出开始,这个话题就备受关注,计算机视觉在其中更是占据着重要的地位。而目标识别,作为计算机视觉最基本的方向以及应用,更是人们关注的焦点之一。随着算力的增长,技术也愈发成熟。本文将按照时间顺序来对整个目标识别的发展史进行叙述和整理。

SIFT(1999)

SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。该方法于 1999 年由 David Lowe 首先发表于计算机视觉国际会议上。SIFT 算子是把图像中检测到的特征点用一个 128 维的特征向量进行描述,因此一幅图像经过 SIFT 算法后表示为一个 128 维的特征向量集,该特征向量集具有对图像缩放,平移,旋转不变的特征,对于光照、仿射和投影变换也有一定的不变性,是一种非常优秀的局部特征描述算法。

VJ 检测器--人脸识别的突破(2001)

VJ 检测器在 2001 年被 Paul Viola 和 Michael Jones 第一次提出,VJ 检测器在没有任何约束条件(如肤色分割)的情况下首次实现了人脸的实时检测,在当时的条件下,图像分类速度达到了惊人的 25fps,这在当时的算力条件下几乎是一个不可能的结果。这不仅是一个人脸识别方向上的里程碑,更预示着计算机视觉已经初步具备了步入实际应用的能力。VJ 检测器采用了滑动窗口的检测方法,VJ 检测器采用了三种方法来大大增加他的检测效率:

  1. 特征的快速计算————积分图
  2. 高效的分类学习方法————AdaBoost
  3. 高效的分类策略————级联结构
    #HOG 特征算法(2005)#

HOG(Histogram of Oriented Gridients 定向梯度直方图)本质上来说是一种特征提取算法,也是对当时的尺度不变特征变换(scale-invariant feature transform)和形状上下文(shape contexts)的重要改进。从名字上来看,我们不能难理解他所描述的是什么东西,百度百科中写出了其中心思想:

在一副图像中,局部目标的表象和形状能够被梯度或边缘的方向密度分布很好地描述。其本质为:梯度的统计信息,而梯度主要存在于边缘的地方。
换句话说,HOG 主要是靠边缘的纹理(梯度)来进行特征的提取。HOG 最终提取到的是梯度的统计信息。
在 HOG 中,图像被从小到大分为了:细胞(cells),块(blocks),检测窗口,整个图像。在具体操作中,由于我们统计的是梯度信息,因此我们并不需要色彩等,我们先对图像进行色彩和伽马归一化。然后我们对每一个 cell 中的像素进行梯度的计算,这个计算包括幅值和角度并把它按照一定的格式存放在直方图中,这就是这个 cell 的 descriptor(描述子)。以此类推,几个 cell 的 descriptor 可以组成 blocks 的 descriptor(当然这里需要正则化)。blocks 又可以构成检测窗口的描述子。而这个结果就可以送到 SVM 中来进行分类了。

Deformable Part-based Model (基于可变形部件的模型,DPM)(2008)

DPM 最初是由 P. Felzenszwalb 提出的,于 2008 年作为 HOG 检测器的扩展,之后 R. Girshick 进行了各种改进。DPM,顾名思义,其采用了分而治之的思想,例如我们要识别人体,其将人体看作为手臂、腿、身体和头的有机组合,并且手和头、躯干距离不能太远,否则也会影响评分。这种方法看似非常简单,但其中所蕴含的数学原理非常深厚。虽然当下的物体检测器的准确度已经远远超过当时,但是其混合模型、硬负挖掘、边界盒回归等应用依旧经常出现在我们的视野中。

RCNN 家族———“ two-stage detection ”

RCNN(2014)

RCNN,刚开始入门的时候就听过的及其著名的算法。在目标检测方面,RCNN 绝对是祖师爷级别的地位。他属于典型的“ two-stage detection ”,其原理并不难懂:首先提出了很多先验框,每个提案都被看作是一个固定大小的图像,接着再去判断这些图像是否包含所需要识别的东西。RCNN 的原文属实让人一言难尽,归纳起来大概步骤如下:

  1. ROI(region of interest 感兴趣区域)的生成。该网络将输入的图像进行初步的提取与拼接(包括梯度、颜色、面积等等),初步形成有一定语义的 ROI
  2. 接着进行特征的提取,在这里区别于之前的方法,RCNN 采用了卷积神经网络来进行特征的提取。训练使用的是 SGD
  3. 预测,这里会给每个先验框一个分数。紧接着将分数不高的先验框完全抛弃。
  4. 对先验框进行线性变换来达到精修的目的。
    ##SPPNET(2014)##

显而易见,RCNN 的缺点是致命的,在每幅图像上,RCNN 会生成近两千个先验框,其庞大的运算导致了该方法在速度上并不占优。事实上,在 GPU 下,每张图片的运算时间达到了 14 秒。而 2014 年晚些时候 SPPNET 的提出,解决了这一问题。
我们知道,在卷积这一过程中,卷积核可以适应任何大小的输入,但是全连接层则不可以。如果输入的大小不确定,全连接层连参数的数量都没有办法确定。也正因如此,在之前的 CNN 网络中采用了固定尺寸的输入。而在 SPPNET 中给出的解决方案是:在最后一个卷积层上,使用了一个相对比例的池化层,这个池化层可以将输出固定尺寸的矩阵供全连接层使用。在这里,SPPNET 引入了 SPM 的思路。对于卷积层的特征,我们先将其分成了不同的尺寸,在每个尺寸中提取一个维度的特征,接着进行拼接,就形成了一个固定维度的输入。
SPPNET 对于这些方法的使用,大大增加了原本 RCNN 的速度。但其也有不足之处。SPPNET 只对全连接层进行了微调,而对之前的层进行了忽略,其次,在 RCNN 中使用的 selective search 的方法提取特征是在 CPU 上进行的,相对于 GPU 来说还是比较慢的。这些都是限制 SPPNET 的因素。
##Fast RCNN(2015)##
FAST-RCNN 是对之前的进一步改进,从 RCNN 我们可以看到,在先验框的计算上我们耗费了太多的时间。FAST-RCNN 在这一点上进行了改进,其先将整个图片进行了输入,在得到特征图后,再特征图上来寻找相对应的先验框。这样做使得原来先验框重叠部分的卷积运算只计算了一次。大大减少了计算数量。此外,该模型在经过 fc 层之后,直接取消了 SVM 分类器和回归器,取而代之的是两个训练器。一个 softmax 用于分类,另一个 regressor 用于先验框的精修。因为有两个任务,所以使用了多人损失将分类和回归损失结合起来,然后对整个网络进行训练即可。
##Faster RCNN(2015)##
不难看出,虽然 Fast RCNN 解决了很大一部分重复计算的问题,但是从根本上,2000 多个先验框还是一个庞大的计算量。于是一个问题自然而然的浮现:我们是否可以用 CNN 模型来自己生成对象建议呢?Faster RCNN 则解决了这一问题。
Faster RCNN 最主要的贡献是引入了区域建议网络 RPN。在特征提取之后,用 RPN 先生成一堆 Anchor box,对其进行裁剪过滤后通过 softmax 判断 anchors 属于前景(foreground)或者后景(background),即是物体 or 不是物体,所以这是一个二分类;同时,另一分支 bounding box regression 修正 anchor box,形成较精确的 proposal(注:这里的较精确是相对于后面全连接层的再一次 box regression 而言)。至此,对象建议被神经网络生成完毕。
Faster RCNN 是第一个端到端的神经网络检测器,提案、提取、检测、回归等都集成在了一个神经网络当中。这个成就是前所未有的。Faster RCNN 将原本的 2000 多个先验框创造性的减少到了 300 个左右,并且其先验框的质量有了明显的提升。当然,Faster RCNN 的这 300 个先验框还是有提升的空间,在之后出现了各种版本的改进,在此不一一介绍。

“ one-stage detection ”家族

区别于“ two-stage detection ”,“ one-stage detection ”并没有使用 RPN 网络,而是利用主干网络一步到位,直接给出目标的位置和大小。这样做的算法速度更快,但是精度相应的会损失一部分。目前其中的 yolo、ssd 等算法非常热门,资料也非常多,不像我找个 SIFT 的论文费劲的要死(笑),这一部分我就会进行简要的介绍,毕竟资料太多了。

You Only Look Once (YOLO)(2015)

YOLO 算是最近非常火爆的框架之一了。我身边有不少同学都在使用 opencv 加 yolo 做一些目标识别方面的项目。
YOLO 在 2015 年被第一次提出作为最具标志性的深度学习产物,该网络将图像分割成多个区域,同时预测每个区域的边界框和概率。后来 R. Joseph 在 YOLO 的基础上进行了一系列改进,提出了其 v2 和 v3 版本,在保持很高检测速度的同时进一步提高了检测精度。至今为止 yolo 已经有多个版本。

Single Shot MultiBox Detector (SSD)(2015)

相比 Yolo,SSD 采用 CNN 来直接进行检测,而不是像 Yolo 那样在全连接层之后做检测。其实采用卷积直接做检测只是 SSD 相比 Yolo 的其中一个不同点,另外还有两个重要的改变,一是 SSD 提取了不同尺度的特征图来做检测,大尺度特征图(较靠前的特征图)可以用来检测小物体,而小尺度特征图(较靠后的特征图)用来检测大物体;二是 SSD 采用了不同尺度和长宽比的先验框。Yolo 算法缺点是难以检测小目标,而且定位不准,但是这几点重要改进使得 SSD 在一定程度上克服这些缺点。

RetinaNet(2017)

单级检测器速度快、结构简单,但多年来一直落后于两级检测器的精度。T.-Y.Lin 等人发现了背后的原因,并在 2017 年提出了 RetinaNet。他们声称,在密集探测器训练过程中所遇到的极端的前景-背景阶层不平衡(the extreme foreground-background class imbalance)是主要原因。为此,在 RetinaNet 中引入了一个新的损失函数 “ 焦损失(focal loss)”,通过对标准交叉熵损失的重构,使检测器在训练过程中更加关注难分类的样本。焦损耗使得单级检测器在保持很高的检测速度的同时,可以达到与两级检测器相当的精度。

后记

期末考试之后贪图玩乐,确实耽误了不少时间,整理这篇文章所用到的资料也着实令人头痛。很多想写的东西因为着实不知道该怎么下笔而没有落在纸面上,比如非常重要的 FPN、Faster RCNN 后面涉及到的各种各样的改良版本、前一阵想去研究的 FBNET 等等网络在这里都没有一一介绍。后续我会将这些内容一一补上。

(全文完)

Last Modified: August 1, 2021