机器学习面试题汇总与解析——技术发展

本章讲解知识点

    1. 前言
    1. 分类网络发展
    1. 分割网络发展
    1. 检测网络发展
    1. 轻型网络发展


  • 本专栏适合于Python已经入门的学生或人士,有一定的编程基础。
  • 本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。
  • 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份面试题总结的正确打开方式。这样才方便背诵
  • 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。
  • 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。

  • 关于机器学习算法书籍,我强烈推荐一本《百面机器学习算法工程师带你面试》,这个就很类似面经,还有讲解,写得比较好。

  • 关于深度学习算法书籍,我强烈推荐一本《解析神经网络——深度学习实践手册》,简称 CNN book,通俗易懂。



1. 前言

深度学习真正广为人知是 2016 年阿尔法狗战胜围棋高手李世石九段,隔年战胜彼时的世界围棋第一人柯洁。深度学习其实是由机器学习中的神经网络发展而来,而神经网络早在上世纪 50 年代就开始发展了,历经三起两落。

提出神经网络的简单模型为第一个高峰

img

最开始的神经网络只有单层,并且是线性的,所以表示能力有限,解决不了“异或”问题。神经网络进入第一次低潮。

上世纪 80 年代,David Rumelhar 和 Geoffery E.Hinton提出了反向传播(back propagation)算法,解决了两层神经网络的复杂计算问题,因为引入了“隐藏层”,同时克服了“异或”问题。这是第二次高峰。

但受限于当时的数据获取、计算资源等,神经网络训练极容易过拟合,后来被 SVM 压住了一头,进入第二次低潮。

难能可贵的是,Hintion、Bengio、LeCun 三巨头依然在神经网络领域默默耕耘,Hintion 于 2006 年发明“深度置信网络”,通过逐层预训练解决了网络过拟合问题。随后为了回击质疑,在 2012 年 ImageNet 竞赛中以神经网络方法强势夺冠并大幅领先第二名20多个百分点,接下来便是我们所熟知的第三次高峰了。并且这次高峰开始深刻影响到我们生活的方方面面,也许人工智能时代真的要来临了。

Hintion 的精神很值得我们学习,科研不是一味追热点,追来追去成不了大牛,唯有埋头耕耘,才能在一个领域做出真正的有价值的东西


2. 分类网络发展

在图像领域,主要是卷积网络大放异彩。

2.1. LeNet-5

LeNet-5 由 Yann LeCun 等人在 1998 年提出,LeNet-5 是基于梯度学习的卷积神经网络,并成功应用于手写数字字符识别,在那时的技术条件下就取得了低于 1% 的错误率,因此被用于全美所有的邮政系统。它是深度学习发展过程中的重要里程碑,对后来的卷积神经网络的设计和发展产生了深远影响。

img

LeNet-5 包含两层卷积、两层池化、三层全连接。

这里多说几句,LeNet-5 绝对是开创了深度学习的先河,为后世提供了基本的网络框架,后面的深度学习发展基本没有跳脱出这个框架,大师之所以为大师,就是开宗立派、名垂青史。

2.2. Alex-Net

AlexNet 是由 Alex Krizhevsky 等人在 2012 年提出的一种深度卷积神经网络模型。它是在 ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 比赛中取得突破性成果的模型,标志着深度学习在计算机视觉领域的重要进展。

Alex-Net 在 2012 年 ImageNet 竞赛中力压群雄,强势夺冠并大幅领先第二名20多个百分点,当时学界业界表示受到了惊吓。

img

首先这幅图分为上下两个部分的网络,论文中提到这两部分网络是分别对应两个 GPU,当时是因为计算资源有限,所以利用两块 GPU 来将特征图分组卷积,所以单看一个分支就够了。为了更方便的理解,我们假设现在只有一块 GPU 或者我们用 CPU 进行运算,单看一个分支,网络层数为 8 层,5 层卷积,3 层全连接层。结构与 LeNet-5 区别不大,但是使用了 7x7、11x11 的大卷积核增大感受野。

Alex-Net 使用的新技术

  1. ReLU Nonlinearity(Rectified Linear Unit):用 ReLU 替代 sigmoid 作为激活函数,解决了深度网络梯度更新慢的问题。

  2. Local Response Normalization (局部响应归一化):在神经网络中,用激活函数将神经元的输出做一个非线性映射,但是 tanh 和 sigmoid 这些传统的激活函数的值域都是有范围的,而 ReLU 激活函数得到的值域没有一个区间,所以要对 ReLU 得到的结果进行归一化。也就是 Local Response Normalization。其实就是一个归一化。论文作者认为局部响应归一化有助于泛化,后来 VGG 证明其实没什么用(玄学玄学)。

  3. Overlapping Pooling (覆盖的池化操作):论文中说,在训练模型过程中,覆盖的池化层更不容易过拟合。

  4. Dropout:解决过拟合问题。

2.3. VGG

VGG 是 Oxford 的 Visual Geometry Group 提出的。该网络主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能。VGG 有两种结构,分别是 VGG16 和 VGG19,两者并没有本质上的区别,只是网络深度不一样。

VGG16 相比 AlexNet 的一个改进是采用连续的几个 3x3 的卷积核代替 AlexNet 中的较大卷积核(11x11,7x7,5x5)。对于给定的感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少,计算量少)

简单来说,在 VGG 中,使用了 3 个 3x3 卷积核来代替 7x7 卷积核,使用了 2 个 3x3 卷积核来代替 5x5 卷积核,这样做的主要目的是在保证具有相同感知野的条件下,提升了网络的深度,在一定程度上提升了神经网络的效果,同时减少计算量。

img
  • VGG16 包含了 16 个隐藏层(13 个卷积层和 3 个全连接层),如上图中的 D 列所示

  • VGG19 包含了 19 个隐藏层(16 个卷积层和 3 个全连接层),如上图中的 E 列所示

VGG 网络的结构非常一致,从头到尾全部使用的是 3x3 的卷积和 2x2 的 max pooling。这样的结构为后续的深度学习提供了范式。

VGG 使用的新技术

  1. VGGNet 的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2)。

  2. 几个小滤波器(3x3)卷积层的组合比一个大滤波器(5x5 或 7x7)卷积层好,保持同等感受野的情况下计算量更小。

  3. 验证了通过不断加深网络结构可以提升性能

2.4. GoogLeNet

GoogLeNet 与 VGG 不同,该网络主要工作是探索了增加网络的宽度。论文提出了名为 Inception 的结构来实现既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能

img
  1. 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;

  2. 之所以卷积核大小采用 1、3 和 5,主要是为了方便对齐。设定卷积步长 stride=1 之后,只要分别设定 pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了;

  3. 文章说很多地方都表明 pooling 挺有效,所以 Inception 里面也嵌入了。

  4. Inception 发展到后面,就是用 1x3 和 3x1 的卷积拼接 3x3 的卷积来降低计算量

GoogLeNet 使用的新技术

  1. 提出了Inception 结构

  2. 任意 n x n 的卷积都可以通过 1 x n 卷积后接 n x 1 卷积来替代。实际上,作者发现在网络的前期使用这种分解效果并不好,还有在中度大小的 feature map 上使用效果才会更好。

  3. 探索了网络宽度可以降低网络计算量同时表现优异。GoogLeNet 的计算效率明显高于 VGGNet,大约只有 500 万参数,只相当于 Alexnet 的 1/12 (GoogLeNet 的 caffemodel 大约 50M,VGGNet 的 caffemodel 则要超过 600M)。

  4. Average pooling 代替全连接层,有效减少参数。

  5. 探索了 1x1 卷积的作用,用于升维和降维信息、融合多个通道的特征。

2.5. ResNet

ResNet(Residual Neural Network)是由 Kaiming He 等人在 2015 年提出的一种深度残差网络模型。它在解决深度神经网络中的梯度消失和模型退化问题上取得了重要突破。

VGG 网络试着探寻了一下深度学习网络的深度究竟可以深几许以能持续地提高分类准确率。我们的一般印象当中,深度学习愈是深(复杂,参数多)愈是有着更强的表达能力。凭着这一基本准则 CNN 分类网络自 Alexnet 的 7 层发展到了 VGG 的 16 乃至 19 层,后来更有了 Googlenet 的 22 层。可后来发现深度 CNN 网络达到一定深度后再一味地增加层数并不能带来进一步地分类性能提高,反而会招致网络收敛变得更慢,test dataset 的分类准确率也变得更差。排除数据集过小带来的模型过拟合等问题后,发现过深的网络仍然还会使分类准确度下降(相对于较浅些的网络而言)。

作者提出,这可能是因为更深的网络会伴随梯度消失/爆炸问题,从而阻碍网络的收敛。这种加深网络深度但网络性能却下降的现象被称为退化问题。于是 ResNet 提出了 res-block 结构,对于更深层次的模型:添加恒等映射(identity mapping)(就是跳跃结构,直接把信息恒等传递到下一层)。在这种情况下,更深的模型不应该产生比其对应的较浅的网络更高的训练误差。

img

原先的网络输入 x,希望输出 H(x)。现在我们令 H(x)=F(x)+x,那么我们的网络就只需要学习输出一个残差 F(x)=H(x)-x。当残差为 0 时,此时堆积层仅仅做了恒等映射,至少网络性能不会下降,实际上残差不会为 0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能(这句话是理解残差的关键)。

思想其实很朴素,resblock 基于一个假设:当把浅层网络特征恒等映射传到深层网络时,深层网络的效果一定会比浅层网络好(至少不会差),所以 resblock 构造了一个恒等映射,就是增加了一个跳跃结构,让前面的信息直接流入后面的网络层,这样就不怕网络退化了。简化了学习过程,增强了梯度传播。实际上 resblock 个人认为没有严谨的数学证明,但实验证明确实很好。

正因为 resblock 的设计,ResNet 到达了上百层深度,越深效果越好,取得了 2015 年 ImageNet 挑战赛冠军,同时这是第一个错误率(3%)低于人类(5%)的模型。

2.6. Xception

Xception 是 Google 继 Inception 后提出的对 Inception-v3 的另一种改进。Xception 的结构基于 ResNet,但是将其中的卷积层换成了 Separable Convolution(极致的 Inception 模块)。

Depthwise Separable Convolution 与 Xception 区别:

  1. Depth-wise convolution 是先逐通道卷积,再进行 1x1 卷积,Xception 是先进行 1x1 卷积,再逐通道卷积

  2. Depth-wise convolution 中两个卷积之间不含有激活函数,而Xception 中经过 1x1 卷积后会带上一个 ReLU 激活函数

作者认为带激活函数的 Xception 相比于没有激活函数的 Depth-wise convolution 收敛过程更快、准确率更高,而两者关于 1x1 卷积和 3x3 通道卷积的顺序差异,作者认为影响不大。

2.7. SENet

ImageNet 最后一届竞赛的冠军,提出了SE 结构

对于 CNN 网络来说,其核心计算是卷积算子,其通过卷积核从输入特征图学习到新特征图。从本质上讲,卷积是对一个局部区域进行特征融合,这包括空间上(H 和 W 维度)以及通道间(C 维度)的特征融合

对于卷积操作,很大一部分改进工作是提高感受野,即空间上融合更多特征,或者是提取多尺度空间信息,如 Inception 网络的多分支结构。对于 channel 维度的特征融合,卷积操作基本上默认对输入特征图的所有 channel 进行融合。而 MobileNet 网络中的组卷积(Group Convolution)和深度可分离卷积(Depthwise Separable Convolution)对 channel 进行分组也主要是为了使模型更加轻量级,减少计算量。而SENet 网络的创新点在于关注 channel 之间的关系,希望模型可以自动学习到不同 channel 特征的重要程度。为此,SENet 提出了 Squeeze-and-Excitation (SE) 模块,如下图所示:

img

SENet 的核心思想是引入 SE 模块,用于自适应地调整每个通道的特征图权重。SE 模块首先对卷积得到的特征图进行 Squeeze 操作,得到 channel 级的全局特征(SENet 提出 Squeeze 操作,将一个 channel 上整个空间特征编码为一个全局特征,采用全局平均池化操作将输入特征图的空间维度降为1x1),然后对全局特征进行 Excitation 操作(这里采用 sigmoid 形式的 gating 机制),引入两个全连接层,学习各个 channel 间的关系,也得到不同 channel 的权重,最后乘以原来的特征图得到最终特征。本质上,SE 模块是在 channel 维度上做 attention 或者 gating 操作,这种注意力机制让模型可以更加关注信息量最大的 channel 特征,而抑制那些不重要的 channel 特征。另外一点是 SE 模块是通用的,这意味着其可以嵌入到现有的网络架构中。


正是因为各路豪杰的精彩共享,分类网络发展已经达到 ImageNet 竞赛的初衷,ImageNet竞赛的终止时间是在 2020 年,具体日期是 8月31 日。自从 2010 年开始,ImageNet 竞赛一直是计算机视觉领域最具影响力和权威性的竞赛之一。在该竞赛中,参赛者需要开发出能够对大规模图像数据集 ImageNet 进行准确分类的模型。这个竞赛推动了深度学习技术在图像识别领域的发展,为深度学习的普及和应用做出了巨大贡献。然而,由于 ImageNet 数据集的规模已经相对较小,且一些更大、更具挑战性的数据集的出现,使得 ImageNet 竞赛在 2020 年终止。尽管 ImageNet 竞赛已经结束,但其对深度学习研究和发展的影响仍然持续存在,并且在其他领域和任务上的应用也得到了广泛探索。


3. 分割网络发展

语义分割,简单来说就是像素级别的分类任务。将图片中的每一个像素都分类到对应的物体去,用不同的颜色标识。

img

比如上图每一个像素都属于一个类别,比如汽车,行人等,这对自动驾驶场景来说十分有意义。

语义分割网络的基础还是卷积神经网络,不过去掉了全连接层,变成了全卷积网络了。而且通常采用编码和解码的网络结构。为什么要采用编码解码的结构呢?因为前面的分类网络使得图片的分辨率越来越小,这其实是一个编码的过程,而语义分割要得到原图大小的结果图,所以很自然的还需要解码(上采样),将特征图还原至原图大小。

语义分割网络的发展过程,主要的改进方向就是想方设法地利用全局上下文信息。这一点大家要牢记。因为低层的特征语义信息比较少,但是目标位置准确,分辨率高;高层的特征语义信息比较丰富,但是目标位置比较粗略,分辨率低。

3.1. FCN

Fully Convolution Networks (FCNs) 全卷积网络是第一个端到端的语义分割网络,最大贡献就是成功将卷积网络应用于语义分割上。

img

在 VGG 的基础上,将最后一层替换成卷积层,采用线性插值实现上采样,输出原图大小的结果图。其实原理很简单,不过 FCN 只有编码结构,最后直接暴力上采样,缺少了解码结构,自然分割效果不会很好。

3.2. SegNet

SegNet 就是在 VGG 的基础上,增加了解码的结构,是对 FCN 的改进,保留了更多语义信息。

img

SegNet 在解码器中使用反池化对特征图进行上采样,并在分割中保持高频细节的完整性。反池化(up-poolong)我们之前讲过,不再赘述。

3.3. U-Net

U-Net 是一种用于图像分割的深度学习网络架构。它最初由Olaf Ronneberger等人于2015年提出,并被广泛应用于医学图像分割任务中。

  • U-Net 简单地将编码器的特征图拼接至每个阶段解码器的上采样特征图,从而形成一个梯形结构。该网络非常类似于 Ladder Network 类型的架构。

  • 通过跳跃-拼接-连接的架构,在每个阶段都允许解码器学习在编码器池化中丢失的相关特征。

  • 上采样采用转置卷积

img

U-Net 比较大的特点就是跳跃结构,充分利用了高低语义信息(上下文信息),实验结果更好。

U-Net 算是分割任务发展的里程碑,由于 U-Net 的网络结构简单且易于实现,因此在许多图像分割任务中被广泛采用。

3.4. DeepLab v1

DeepLab v1 认为语义分割的全局上下文信息十分重要,越大的感受野越能帮助语义分割的效果提升,基于这一点,

  • 提出 空洞卷积(atrous convolution)(又称扩张卷积(dilated convolution))。我们前面讲过,不再赘述。

  • 使用 CRF(条件随机场) 作为后处理,恢复边界细节,达到准确定位效果。

  • 附加输入图像和前四个最大池化层的每个输出到一个两层卷积,然后拼接到主网络的最后一层,达到多尺度预测效果。

3.5. DeepLab v2

论文中提出了语义分割中的三个挑战:

  • 由于池化和卷积而减少的特征分辨率。

  • 多尺度目标的存在。

  • 由于 CNN 不变性而减少的定位准确率。

DeepLab v2 最主要的贡献是提出了空洞空间金字塔池化(Atrous Spatial Pyramid Pooling),在不同的分支采用不同的空洞率以获得多尺度图像表征,如下图可以很好的说明。

img

3.6. DeepLab v3

DeepLab v3 使用 ResNet 作为主干网络。

  • 在残差块中使用多网格方法(MultiGrid),从而引入不同的空洞率。

  • deeplabv3 在 ASPP 模块加入图像级(Image-level)特征,并且使用 BatchNormalization 技巧。

img

3.7. Mask R-CNN

Mask R-CNN 架构相当简单,它是流行的 Faster R-CNN 架构的扩展,在其基础上进行必要的修改,以执行语义分割。

  • 在Faster R-CNN 上添加辅助分支以执行语义分割

  • 对每个实例进行的 RoIPool 操作已经被修改为 RoIAlign ,它避免了特征提取的空间量化,因为在最高分辨率中保持空间特征不变对于语义分割很重要。

  • Mask R-CNN 与 Feature Pyramid Networks(类似于 PSPNet,它对特征使用了金字塔池化)相结合,在 MS COCO 数据集上取得了最优结果。

img

3.8. PSPNet 与 RefineNet

PSPNet 与 RefineNet 都是想方设法利用上下文信息,PSPNet 是利用空间金字塔池化聚合全局上下文;RefineNet 则是利用远程残差结构聚合上下文。都取得了很好的效果。

PSPNet

img

RefineNet

img

4. 检测网络发展

图像的目标检测任务主要可以分为三大类:(1)目标分类:识别图片中物体是什么;(2)目标定位:识别物体的同时,还要定位物体;(3)目标检测:多目标的分类与定位。

随着手工特征的性能趋于饱和,目标检测研究在 2010 年之后达到了一个平稳期,2010-2012 年间进展缓慢。2012 年,卷积神经网络取得了重大突破(Alex-Net),其作为一个深度神经网络,能够学习一幅图像鲁棒的高级特征表示。紧接着 R. Girshick 等人率先提出了具有 CNN 区域特征(Regions with CNN,RCNN)的方法用于目标检测。从那时起,目标检测开始高速发展。在深度学习时代,目标检测可以分为两种类型:“两阶段(Two-stage)检测方法”和“单阶段(One-stage)检测方法”,前者将检测定义为“从粗到精”的过程,而后者将检测定义为“一步走”的过程。许多优秀的基于卷积神经网络的目标检测方法被提出,如基于两阶段的 SPPNet、Fast RCNN、Faster RCNN,这些算法首先生成图像中目标物体的建议候选区域,其次再对候选区域做进一步的分类和坐标框回归,得出最后的目标检测结果;还有基于单阶段的 YOLO、SSD 和 RetinaNet 等,这些算法直接通过回归的方式进行图像中目标物体的检测,即分类和回归同时进行。

两阶段检测精度高但速度慢;单阶段检测精度稍低但速度快,one-stage算法对小目标检测效果较差。

基于两阶段的CNN检测器

4.1. R-CNN

R-CNN 系统分为 3 个阶段,反映到架构上由 3 个模块完成。

  • 生成类别独立的候选区域,这些候选区域其中包含了 R-CNN 最终定位的结果。R-CNN 采用的是 Selective Search 算法生成候选区域。

  • 神经网络去针对每个候选区域提取固定长度的特征向量。R-CNN 采用的是 Alexnet

  • 一系列的 SVM 分类器,用于分类特征向量。

img

R-CNN的方法其实很简单,不再赘述。

测试阶段的目标检测

在测试阶段,R-CNN 在每张图片上抽取近 2000 个候选区域。

然后将每个候选区域进行尺寸的修整变换,送进神经网络以读取特征,然后用 SVM 进行类别的识别,并产生分数。

候选区域有 2000 个,所以很多会进行重叠。针对每个类,通过计算 IoU 指标,采取非极大性抑制,以最高分的区域为基础,剔除掉那些重叠位置的区域。

非极大性抑制

目标检测的过程中在同一目标的位置上会产生大量的候选框,这些候选框相互之间可能会有重叠,此时我们需要利用非极大值抑制找到最佳的目标边界框,消除冗余的边界框。

非极大值抑制的流程如下:

  • 根据候选框的置信度进行排序,将置信度最高的候选框作为起始框。
  • 逐个遍历剩余的候选框,计算其与起始框的重叠程度(如交并比 IoU)。
  • 如果重叠程度超过预设阈值(一般为0.5),则将该候选框剔除;否则保留该候选框。
  • 继续遍历下一个候选框,重复上述步骤。
  • 最终得到一组被保留的候选框,它们具有最高的置信度且没有明显重叠。

R-CNN 的缺点

R-CNN 的缺点第一是太慢,2000 多个候选框。第二个缺点不是端到端的方法。第三个缺点是所以特征图固定缩放,影响了精度。

4.2. SPPNet

2014 年,何凯明等人提出了空间金字塔池化网络(Spatial Pyramid Pooling Networks,SPPNet)。以前的 CNN 需要固定大小输入,例如 AlexNet 的输入为 224×224,R-CNN 也是固定缩放。SPPNet 的主要贡献是引入了空间金字塔池化层,支持 CNN 生成固定长度表示,而不考虑图像/感兴趣区域的大小,无需重新缩放。利用 SPPNet 进行目标检测,可以得到特征图,整个图像只计算一次,避免了重复计算卷积特征。在不牺牲准确率的情况下,比 RCNN 提升了2倍的速度。虽然 SPPNet 有效地提高了检测速度,但它还存在一些弊端:一是它仍然不是一个端对端的方法,二是它只微调了全连接层,而忽略了前面的层。空间金字塔池化层我们前面讲过,不再赘述。

4.3. Fast RCNN

2015 年,R. Girshick 提出了 Fast RCNN 检测器,这是对 RCNN 和 SPPNet 的进一步改进。Fast RCNN 使我们能够同时训练检测器和一个边界框(Bounding box)回归器,在相同的网络配置下,在 VOC07 数据集上,Fast RCNN 将 mAP从58.5%(RCNN)提升到 70.0%,同时检测速度比 RCNN 快 200 倍以上。虽然 Fast RCNN 成功地融合了 RCNN 和 SPPNet 的优点,但其检测速度仍然很慢。

Fast RCNN 主要有3个改进:

1、卷积不再是对每个 region proposal 进行,而是直接对整张图像,这样减少了很多重复计算。原来 RCNN 是对每个 region proposal 分别做卷积,因为一张图像中有 2000 左右的 region proposal,肯定相互之间的重叠率很高,因此产生重复计算。直接对整张图像卷积后,再使用 Selective Search 算法生成候选特征图

2、用 ROI pooling 进行特征的尺寸变换,因为全连接层的输入要求尺寸大小一样,因此不能直接把 region proposal 作为输入。

3、将 regressor 放进网络一起训练,每个类别对应一个 regressor,同时用 softmax 代替原来的 SVM 分类器。

img

Fast RCNN 将 RCNN 众多步骤整合在一起,不仅大大提高了检测速度,也提高了检测准确率。当然 Fast RCNN 的主要缺点在于 region proposal 的提取使用 selective search,目标检测时间大多消耗在这上面(提 region proposal 2~3s,而提特征分类只需0.32s),这也是后续 Faster RCNN 的改进方向之一。

4.4. Faster RCNN

2015 年,S. Ren 等人提出了 Faster RCNN 检测器。Faster RCNN 是第一个端到端的基于深度学习的目标检测方法,同时也是第一个近实时的深度学习探测器。Faster RCNN 的主要贡献是引入了区域候选网络(Region Proposal Network ,RPN)。从 RCNN 到 Faster RCNN,对象检测系统中的大多数单个网络块,例如候选检测、特征提取、边界框回归等,已逐渐融入到统一的端到端学习框架。

相比 FAST-RCNN,主要两处不同:

1、使用 RPN (Region Proposal Network) 代替原来的 Selective Search 方法产生建议窗口;

2、产生建议窗口的 CNN 和目标检测的 CNN 共享

就是因为优化了 Selective Search 方法,所以目标 Faster RCNN 速度很快,接近实时。

img

第一步是在一个滑动窗口上生成不同大小和长宽比例的 anchor box(如上图右边部分),取定 IoU 的阈值,按 Ground Truth 标定这些 anchor box 的正负。于是,传入 RPN 网络的样本数据被整理为 anchor box(坐标)和每个 anchor box 是否有物体(二分类标签)。RPN 网络将每个样本映射为一个概率值和四个坐标值,概率值反应这个 anchor box 有物体的概率,四个坐标值用于回归定义物体的位置。最后将二分类和坐标回归的损失统一起来,作为 RPN 网络的目标训练。

由 RPN 得到 Region Proposal 在根据概率值筛选后经过类似的标记过程,被传入 R-CNN 子网络,进行多分类和坐标回归,同样用多任务损失将二者的损失联合。

RPN(Region Proposal Network)网络的作用、实现细节

RPN 网络的作用: RPN 专门用来提取候选框,一方面 RPN 耗时少,另一方面 RPN 可以很容易结合到 Fast RCNN 中,成为一个整体。

RPN 网络的实现细节:一个特征图(Faster RCNN 的公共 Feature Map)经过 sliding window 处理,得到 256 维特征,对每个特征向量做两次全连接操作,一个得到 2 个分数,一个得到 4 个坐标 {然后通过两次全连接得到结果 2k 个分数和 4k 个坐标 [ k 指的是由锚点产生的 K 个框(K anchor boxes)]}

2 个分数,因为 RPN 是提候选框,还不用判断类别,所以只要求区分是不是物体就行,那么就有两个分数,前景(物体)的分数,和背景的分数; 4 个坐标是指针对原图坐标的偏移,首先一定要记住是原图;

预先设定好共有 9 种组合,所以 k 等于 9,最后我们的结果是针对这 9 种组合的,所以有 H x W x 9 个结果,也就是 18 个分数和 36 个坐标。

img

RPN的损失函数(多任务损失:二分类损失+SmoothL1损失)

img

RPN中的 anchor box 是怎么选取的?

滑窗的中心在原像素空间的映射点称为anchor,以此anchor为中心,生成k(paper中default k=9, 3 scales and 3 aspect ratios/不同尺寸和不同长宽比)个proposals。三个面积尺寸(128^2,256^2,512^2),然后在每个面积尺寸下,取三种不同的长宽比例(1:1,1:2,2:1)

为什么提出anchor box?

主要有两个原因:一个窗口只能检测一个目标、无法解决多尺度问题。

目前anchor box尺寸的选择主要有三种方式:人为经验选取、k-means聚类、作为超参数进行学习

为什么使用不同尺寸和不同长宽比? 为了得到更大的交并比(IOU)。


基于单阶段的CNN检测器

4.5. You Only Look Once(YOLO)

YOLO 意思是 You Only Look Once,创造性的将候选区和对象识别这两个阶段合二为一,看一眼图片(不用看两眼哦)就能知道有哪些对象以及它们的位置。YOLO 将图片划分为 7x7=49 个网格(grid),每个网格允许预测出 2 个边框(bounding box,包含某个对象的矩形框),总共 49x2=98 个 bounding box。可以理解为 98 个候选区,它们很粗略的覆盖了图片的整个区域。

img

去掉候选区这个步骤以后,YOLO 的结构非常简单,就是单纯的卷积、池化最后加了两层全连接。单看网络结构的话,和普通的 CNN 对象分类网络几乎没有本质的区别,最大的差异是最后输出层用线性函数做激活函数,因为需要预测 bounding box 的位置(数值型),而不仅仅是对象的概率。所以粗略来说,YOLO 的整个结构就是输入图片经过神经网络的变换得到一个输出的张量

根据 YOLO 的设计,输入图像被划分为 7x7 的网格(grid),输出张量中的 7x7 就对应着输入图像的 7x7 网格。或者我们把 7x7x30 的张量看作 7x7=49个30 维的向量,也就是输入图像中的每个网格对应输出一个 30 维的向量。具体来看每个网格对应的 30 维向量中包含了哪些信息。

img

20 个对象分类的概率:因为 YOLO 支持识别 20 种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有 20 个值表示该网格位置存在任一种对象的概率。

2 个 bounding box 的位置:每个 bounding box 需要 4 个数值来表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心点的x坐标,y 坐标,bounding box 的宽度,高度),2 个 bounding box 共需要 8 个数值来表示其位置。

2 个 bounding box 的置信度:bounding box 的置信度 = 该 bounding box 内存在对象的概率 x 该 bounding box 与该对象实际 bounding box 的 IOU

总的来说,30 维向量 = 20 个对象的概率 + 2 个 bounding box x 4 个坐标 + 2 个 bounding box 的置信度

创新点:1. 将整张图作为网络的输入,直接在输出层回归 bounding box 的位置和所属的类别。2. 速度快,one stage detection 的开山之作。

缺点:1. 首先,每个单元格只预测 2 个 bbox,然后每个单元格最后只取与 gt_bbox 的 IOU 高的那个最为最后的检测框,也只是说每个单元格最多只预测一个目标。2. 损失函数中,大物体 IOU 误差和小物体 IOU 误差对网络训练中 loss 贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的 IOU 误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。3. 由于输出层为全连接层,因此在检测时,YOLO 训练模型只支持与训练图像相同的输入分辨率的图片。4. 和 two-stage 方法相比,没有 region proposal 阶段,召回率较低。

4.6. Single Shot MultiBox Detector(SSD)

SSD 由 W. Liu 等人于 2015 年提出。这是最重要的第二个单阶段检测器。SSD 的主要贡献是引入多分辨率检测技术,这显著提高了检测效率,特别是对于一些小型检测物体,SSD 在检测速度和速度上都有优势。

SSD 和 Yolo 一样都是采用一个 CNN 网络来进行检测,但是却采用了多尺度的特征图,其基本架构如图所示。下面将 SSD 核心设计理念总结为以下三点:

img

1.采用多尺度特征图用于检测

所谓多尺度采用大小不同的特征图,CNN 网络一般前面的特征图比较大,后面会逐渐采用 stride=2 的卷积或者 pool 来降低特征图大小,这正如上图所示,一个比较大的特征图和一个比较小的特征图,它们都用来做检测。这样做的好处是比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标

2.采用卷积进行检测

与 Yolo 最后采用全连接层不同,SSD 直接采用卷积对不同的特征图来进行提取检测结果。对于形状为 n x m x p 的特征图,只需要采用 3 x 3 x p 这样比较小的卷积核得到检测值。

3.设置先验框

在 Yolo 中,每个单元预测多个边界框,但是其都是相对这个单元本身(正方块),但是真实目标的形状是多变的,Yolo 需要在训练过程中自适应目标的形状。而 SSD 借鉴了 Faster R-CNN 中 anchor 的理念,每个单元设置尺度或者长宽比不同的先验框,预测的边界框(bounding boxes)是以这些先验框为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异,如图所示,可以看到每个单元使用了 4 个不同的先验框,图片中猫和狗分别采用最适合它们形状的