文章目录

  • 0. 概述(整理完后随时修改)
  • 1. 人工神经网络
    • 1.1. 人工神经网络发展历程
    • 1.2. 一些神经元节点的工作原理
      • 1.2.1. 基本神经元
      • 1.2.2. 卷积神经元(Convolutional cells)
      • 1.2.3. 解卷积神经元
      • 1.2.4. 池化神经元和插值神经元(Pooling and Interpolating cells)
      • 1.2.5. 均值神经元和标准方差神经元(Mean and standard deviation cells)
      • 1.2.6. 循环神经元(Recurrent cells)
      • 1.2.7. 长短期记忆神经元(Long short term memory cells)
      • 1.2.8. 门控循环神经元(Gated Recurrent Units(cells))
      • 1.2.9. 神经细胞层(Layers)
      • 1.2.10. 卷积连接层(Convolutionally Connected Layers)
      • 1.2.11. 时间滞后连接(Time Delayed Connections)
    • 1.3. 25个神经网络模型
      • 1.3.1. 前馈神经网络FFNN与感知机
      • 1.3.2. 径向基神经网络(RBF)
      • 1.3.3. 霍普菲尔网络(HN)
      • 1.3.4. 马尔可夫链(MC)
      • 1.3.5. 玻尔兹曼机(BM)
      • 1.3.6. 受限玻尔兹曼机(RBM)
      • 1.3.7. 自编码机(AE)
      • 1.3.8. 稀疏自编码机(SAE)
      • 1.3.9. 变分自编码机(VAE)
      • 1.3.10. 去噪自编码机(DAE)
      • 1.3.11. 卷积神经网络(CNN)
      • 1.3.12. 循环神经网络(RNN)
      • 1.3.13. 深度信念网络(DBN)
      • 1.3.14. 解卷积网络(DN)
      • 1.3.15. 深度卷积逆向图网络(DCIGN)
      • 1.3.16. 生成式对抗网络(GAN)
      • 1.3.17. 长短期记忆(LSTM)
      • 1.3.18. 门循环单元(GRU)
      • 1.3.19. 神经图灵机(NTM)
      • 1.3.20. 深度残差网络(DRN)
      • 1.3.21. 回声状态网络(ESN)
      • 1.3.22. 极限学习机(ELM)
      • 1.3.23. 液态机(LSM)
      • 1.3.24. Kohonen网络
      • 1.3.25. Attention Networks (AN)
      • 1.3.26. 支持向量机(SVM)
  • 2. 经典的卷积神经网络(CNN)架构总结
    • 2.1. LeNet5
    • 2.2. Dan Ciresan Net
    • 2.3. AlexNet
    • 2.4. ZFNet
    • 2.5. VGGNet
    • 2.6. GoogLeNet / Inception v1
    • 2.7. Inception v2/v3
    • 2.8. ResNet
    • 2.9. SqueezeNet
  • 3. 循环神经网络RNN(Recurrent Neural Network)
    • 3.1. RNN的多种结构
      • 3.1.1. 单层网络结构
      • 3.1.2. 经典RNN网络结构
      • 3.1.3. 其他RNN结构
    • 3.2. Encoder-Decoder
      • 3.2.1. Encoder-Decoder的基本结构
      • 3.2.2. Encoder-Decoder应用范围
      • 3.2.3. Encoder-Decoder的局限性
    • 3.3. LSTM
  • 4. 目标检测(Object detection)算法综述
    • 4.1. 传统检测算法
    • 4.2. 基于区域建议的算法
      • 4.2.1. 几个基本概念
      • 4.2.2. R-CNN
      • 4.2.3. Fast R-CNN
      • 4.2.4. Faster R-CNN
      • 4.2.5. Mask R-CNN
      • 4.2.6. Cascade R-CNN
    • 4.3. 基于目标回归的检测算法
      • 4.3.1. YOLO v1
      • 4.3.2. YOLOv2(YOLO9000)算法
      • 4.3.3. YOLO v3
      • 4.3.4. YOLO v4
      • 4.3.5. YOLO v5
      • 4.3.6. SSD
  • 5. 语义分割(Semantic Segmentation)算法综述
    • 5.1. 数据集与评价指标
      • 5.1.1. 常用数据集
      • 5.1.2. 评价指标
    • 5.2. 基于滑窗的语义分割模型
    • 5.3. 基于候选区域的语义分割模型
    • 5.4. 几个基于编码器-解码器(上采样/反卷积)结构的语义分割模型
      • 5.4.1. FCN(2014/11/14)
      • 5.4.2. U-Net(2015/5/18)
  • 6. 知识点补充
    • 6.1. 关于图像的基本知识点
    • 6.2. OTSU算法
    • 6.3. Softmax详解
    • 6.4. 特征融合
      • 6.4.1. 基本概念
      • 6.4.2. add与concat
    • 6.5. 多尺度模型

内容简述:

  • 关于NN发展历程
  • CNN架构

说明:

  • 学习笔记内容整理自网络, 如有错误请指正

0. 概述(整理完后随时修改)

本文第一章简要回顾了人工神经网络自1998年以来模型的发展历程,并介绍了神经元节点的工作原理,引出26个(现存)神经元网络模型。该部分内容主要参见自:

  • NEURAL NETWORK ZOO PREQUEL: CELLS NAD LAYERS
  • THE NEURAL NETWORK ZOO

本文第二章第三章按照架构更迭顺序,整理了经典的卷积神经网络与循环神经网络架构。相关论文可参见参考文献(论文见整理压缩包)。

本文第四章按照传统目标检测算法以及基于深度学习的目标检测算法分类,分别介绍目标检测的重要算法。鉴于目标检测算法更迭速度较快,全部罗列较为困难,此处附上近三年目标检测最新算法介绍博客连接,参见:

  • 目标检测:CVPR2018的目标检测总结
  • CVPR2019目标检测论文汇总
  • 2020CVPR目标检测方向论文整理

本文第五章,简要介绍语义分割。

本文第六章对一些知识点进行简要补充。

1. 人工神经网络

1.1. 人工神经网络发展历程

人工神经网络(Artificial Neural Network, ANN),简称神经网络(NN),是机器学习中的一种运算模型,也是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。

神经网络发展的起点是McCulloch和Pitts发表的神经网络开山大作:A Logical Calculus if Ideas Immanent in Nervous Activity,paper提出了神经元计算模型。

在人工智能出现之初,科学家们分成了两个派别,一派是写实的符号派,认为一定要通过逻辑和符号系统实现人工智能;另一派是写意的仿生派,弄个人脑出来人工智能不就有了吗?神经网络就是写意派的产物。生物神经元有轴突、神经元、树突,神经元可视为一个只有激活和抑制两种状态的细胞,在计算机上也就是1和0,兴奋状态在不同的神经元之间传递,神经元计算模型可以说是神经网络理论的基础。

图1 俗称“三起两落”的神经网络发展过程

从上图中可以清晰的看到,神经网络的第一次兴起在1958,Rosenblatt提出感知器,并提出一种接近于人类学习过程的学习算法。1969,遭遇第一落,Marvin Minsky出版《感知机》,挑了感知机的两大毛病,无法处理异或问题和计算能力不足。 往后十多年,神经网络的研究一直没有太大进展。到了1986,Hinton等人将重新改进的反向传播算法引入多层感知器,神经网络重新成为热点。反向传播算法是神经网络中极为重要的学习算法,直到现在仍然占据着重要地位,由此迎来神经网络的第二次兴起。1995-2006是神经网络的第二次衰落,由于计算机性能无法支持大规模的神经网络训练,SVM和线性分类器等简单的方法反而更流行。2006年,随着大规模并行计算和GPU的反战,计算能力大大提高,在此支持下,神经网络迎来第三次高潮。

随着神经网络的不断进化,深度学习算法成为近年来最流行也是应用最为广泛的算法,然而深度学习或者深度神经网络的成功得益于层出不穷的神经网络模型架构。 基于此,本章节将回顾从1998年开始,20年来深度神经网络模型的发展情况。

1.2. 一些神经元节点的工作原理

图 2 神经元模型示意图

上图展示了神经元模型示意图,在新的网络层出不穷的今日,想要罗列所有模型是不现实的。将所有的结构做成节点图,会存在一个问题:它无法展示神经网络架构内部的工作原理。举例来说,变分自编码机(VAE:variational autoencoders)看起来跟自编码机(AE:autoencoders)差不多,但它们的训练过程却大不相同。训练后的模型在使用场景上差别更大:VAE是生成器,通过插入噪音数据来获取新样本;而AE仅仅是把他们所收到的任何信息作为输入,映射到“记忆中”最相似的训练样本上。

在展示不同模型的神经元和神经细胞层之间的连接方式前,我们先来了解不同的神经元节点内部是如何工作的。

1.2.1. 基本神经元

基本的人工神经网络神经元(basic neural network cell)相当简单,这种简单的类型可以在常规的前馈人工神经网络架构里面找到。这种神经元与其它神经元之间的连接具有权重,也就是说,它可以和前一层神经网络层中的所有神经元有连接。

每一个连接都有各自的权重,通常情况下是一些随机值 (关于如何对人工神经网络的权重进行初始化是一个非常重要的话题,这将会直接影响到之后的训练过程,以及最终整个模型的性能)。这个权重可以是负值,正值,非常小,或者非常大,也可以是零。和这个神经元连接的所有神经元的值都会乘以各自对应的权重。然后,把这些值都求和。

在这个基础上,会额外加上一个bias,它可以用来避免输出为零的情况,并且能够加速某些操作,这让解决某个问题所需要的神经元数量也有所减少。这个bias也是一个数字,有些时候是一个常量(经常是-1或者1),有些时候会有所变化。这个总和最终被输入到一个激活函数,这个激活函数的输出最终就成为这个神经元的输出。

1.2.2. 卷积神经元(Convolutional cells)

和前馈神经元非常相似,除了它们只跟前一神经细胞层的部分神经元有连接。因为它们不是和某些神经元随机连接的,而是与特定范围内的神经元相连接,通常用来保存空间信息。这让它们对于那些拥有大量局部信息,比如图像数据、语音数据(但多数情况下是图像数据),会非常实用。

1.2.3. 解卷积神经元

恰好相反:它们是通过跟下一神经细胞层的连接来解码空间信息。这两种神经元都有很多副本,它们都是独立训练的;每个副本都有自己的权重,但连接方式却完全相同。可以认为,这些副本是被放在了具备相同结构的不同神经网络中。 这两种神经元本质上都是一般意义上的神经元,但它们的使用方式却不同。

1.2.4. 池化神经元和插值神经元(Pooling and Interpolating cells)

池化神经元和插值神经元经常和卷积神经元结合起来使用。它们不是真正意义上的神经元,只能进行一些简单的操作。

池化神经元接受到来自其它神经元的输出过后,决定哪些值可以通过,哪些值不能通过。在图像领域,可以理解成是把一个图像缩小了(在查看图片的时候,一般软件都有一个放大、缩小的功能;这里的图像缩小,就相当于软件上的缩小图像;也就是说我们能看到图像的内容更加少了;在这个池化的过程当中,图像的大小也会相应地减少)。这样,你就再也不能看到所有的像素了,池化函数会知道什么像素该保留,什么像素该舍弃。

插值神经元恰好是相反的操作:它们获取一些信息,然后映射出更多的信息。额外的信息都是按照某种方式制造出来的,这就好像在一张小分辨率的图片上面进行放大。插值神经元不仅仅是池化神经元的反向操作,而且,它们也是很常见,因为它们运行非常快,同时,实现起来也很简单。池化神经元和插值神经元之间的关系,就像卷积神经元和解卷积神经元之间的关系。

1.2.5. 均值神经元和标准方差神经元(Mean and standard deviation cells)

均值神经元和标准方差神经元是一类用来描述数据概率分布的神经元,作为概率神经元他们总是成对的出现。均值就是所有值的平均值,而标准方差描述的是这些数据偏离(两个方向)均值有多远。比如:一个用于图像处理的概率神经元可以包含一些信息,比如:在某个特定的像素里面有多少红色。举个例来说,均值可能是0.5,同时标准方差是0.2。当要从这些概率神经元取样的时候,你可以把这些值输入到一个高斯随机数生成器,这样就会生成一些分布在0.4和0.6之间的值;值离0.5越远,对应生成的概率也就越小。它们一般和前一神经元层或者下一神经元层是全连接,而且没有偏差。

1.2.6. 循环神经元(Recurrent cells)

循环神经元不仅仅在神经细胞层之间有连接,而且在时间轴上也有相应的连接。每一个神经元内部都会保存它先前的值,它们跟一般的神经元一样更新,但是具有额外的权重:与当前神经元之前值之间的权重,以及大多数情况下,与同一神经细胞层各个神经元之间的权重。当前值和存储的先前值之间权重的工作机制,与非永久性存储器(比如RAM)的工作机制很相似:第一,维持一个特定的状态;第二:如果不对其持续进行更新(输入),这个状态就会消失。

由于先前的值是通过激活函数得到的,而在每一次的更新时,都会把这个值和其它权重一起输入到激活函数,因此,信息会不断地流失。实际上,信息的保存率非常的低,以至于仅仅四次或者五次迭代更新过后,几乎之前所有的信息都会流失掉。

1.2.7. 长短期记忆神经元(Long short term memory cells)

LSTM是一个逻辑回路,用于克服循环神经元中信息快速流失的问题,其设计受到了计算机内存单元设计的启发。与只存储两个状态的循环神经元相比,LSTM可以存储四个状态:输出值的当前和先前值,记忆神经元状态的当前值和先前值。它们都有三个门:输入门,输出门,遗忘门,同时,它们也还有常规的输入。

这些门它们都有各自的权重,也就是说,与这种类型的神经元细胞连接需要设置四个权重(而不是一个)。这些门的工作机制与流门(flow gates)很相似,而不是栅栏门(fence gates):它们可以让所有的信息都通过,或者只是通过部分,也可以什么都不让通过,或者通过某个区间的信息。

这种运行机制的实现是通过把输入信息和一个在0到1之间的系数相乘,这个系数存储在当前门中。这样,输入门决定输入的信息有多少可以被叠加到当前门值。输出门决定有多少输出信息是可以传递到后面的神经网络中。 遗忘门并不是和输出神经元的先前值相连接,而是,和前一记忆神经元相连接。它决定了保留多少记忆神经元最新的状态信息。因为没有和输出相连接,以及没有激活函数在这个循环中,因此只会有更少的信息流失。

1.2.8. 门控循环神经元(Gated Recurrent Units(cells))

GRU是LSTM的变体,它们同样使用门来抑制信息的流失,但是只用两个门:更新门和重置门。这使得构建它们付出的代价没有那么高,而且运行速度更加快了,因为它们在所有的地方使用了更少的连接。从本质上来说LSTM和GRU有两个不同的地方:第一:GRU神经元没有被输出门保护的隐神经元;第二:GRU把输出门和遗忘门整合在了一起,形成了更新门。核心的思想就是如果你想要一些新的信息,那么你就可以遗忘掉一些陈旧的信息(反过来也可以)。

1.2.9. 神经细胞层(Layers)

形成一个神经网络最简单的连接神经元方式是——把所有的神经元与其它所有的神经元相连接。这就好像Hopfield神经网络和玻尔兹曼机(Boltzmann machines)的连接方式。当然,这也就意味着连接数量会随着神经元个数的增加呈指数级地增加,但是对应的函数表达力也会越来越强。这就是所谓的全连接(completely (or fully)connected)。

1.2.10. 卷积连接层(Convolutionally Connected Layers)

卷积连接层相对于全连接层要有更多的限制:在卷积连接层中的每一个神经元只与相邻的神经元层连接。卷积连接的形成,受益于保留空间信息更为重要的观察。这种连接方式所需的代价远远低于全连接层的形式。从本质上来讲,卷积连接方式起到重要性过滤的作用,决定哪些紧紧联系在一起的信息包是重要的;卷积连接对于数据降维非常有用

除此之外还有另外一种选择,就是随机连接神经元(randomly connected neurons)。这种形式的连接主要有两种变体:第一,允许部分神经元进行全连接。第二,神经元层之间只有部分连接。

随机连接方式有助于线性地降低人工神经网络的性能;当全连接层遇到性能问题的时候,在大规模人工神经网络中,使用随机连接方式非常有益。拥有更多神经元且更加稀疏的神经元层在某些情况下运行效果更好,特别是很多的信息需要被存储起来,但是,需要交换的信息并不多(这与卷积连接层的运行机制很相似,但是,它们是随机的)。非常稀疏的连接网络(1%或2%)也有被使用,比如ELMs, ESNs 和LSMs。这特别适用于脉冲网络(spiking networks),因为一个神经元拥有更多的连接,它对应的权重具有的能量也就更少,这也就意味着将会有更少的扩展和重复模式。

1.2.11. 时间滞后连接(Time Delayed Connections)

时间滞后连接是指相连的神经元(通常是在同一个神经元层,甚至于一个神经元自己跟自己连接),它们不从前面的神经元层获取信息,而是从神经元层先前的状态获取信息。这使得暂时(时间上或者序列上)联系在一起的信息可以被存储起来。这些形式的连接经常被手工重新进行设置,从而可以清除神经网络的状态。和常规连接的主要区别是,这种连接会持续不断地改变,即便这个神经网络当前没有处于训练状态。

1.3. 25个神经网络模型

图 3 近乎所有的神经网络模型示意图

1.3.1. 前馈神经网络FFNN与感知机

前馈神经感知网络1与感知机(FF or FFNN:Feed forward neural networks and P:perceptrons)非常简单,信息从前往后流动(分别对应输入和输出)。一般在描述神经网络的时候,都是从它的层说起,即相互平行的输入层、隐含层或者输出层神经结构。单独的神经细胞层内部,神经元之间互不相连;而一般相邻的两个神经细胞层则是全连接(一层的每个神经元和另一层的每一个神经元相连)。一个最简单却最具有实用性的神经网络由两个输入神经元和一个输出神经元构成,也就是一个逻辑门模型。给神经网络一对数据集(分别是“输入数据集”和“我们期望的输出数据集”),一般通过反向传播算法来训练前馈神经网络(FFNNs)。

这就是所谓的监督式学习。与此相反的是无监督学习:我们只给输入,然后让神经网络去寻找数据当中的规律。反向传播的误差往往是神经网络当前输出和给定输出之间差值的某种变体(比如MSE或者仅仅是差值的线性变化)。如果神经网络具有足够的隐层神经元,那么理论上它总是能够建立输入数据和输出数据之间的关系。在实践中,FFNN的使用具有很大的局限性,但它们通常和其它神经网络一起组合成新的架构。

图 4 感知机M-P神经元

感知机的基本概念非常简单,此处就不再介绍。如果要训练一个感知机,我们会从随机的权值开始,反复地应用这个感知机到每个训练样例,只要它误分类样例就修改感知机的权值。重复这个过程,直到感知机正确分类所有的样例。

1.3.2. 径向基神经网络(RBF)

径向神经网络(RBF:Radial basis function)是一种以径向基核函数作为激活函数的前馈神经网络。大多数以其它函数作为激活函数的FFNNs都没有它们自己的名字这或许跟它们的发明年代有关系。

径向基函数神经网络的优点:逼近能力,分类能力和学习速度等方面都优于BP神经网络,结构简单、训练简洁、学习收敛速度快、能够逼近任意非线性函数,克服局部极小值问题。 原因在于其参数初始化具有一定的方法,并非随机初始化。

1.3.3. 霍普菲尔网络(HN)

霍普菲尔网络2 (HN:Hopfield network)是一种每一个神经元都跟其它神经元相互连接的网络。这就像一盘完全搅在一起的意大利面,因为每个神经元都在充当所有角色:训练前的每一个节点都是输入神经元,训练阶段是隐神经元,输出阶段则是输出神经元。

该神经网络的训练,是先把神经元的值设置到期望模式,然后计算相应的权重。在这以后,权重将不会再改变了。一旦网络被训练包含一种或者多种模式,这个神经网络总是会收敛于其中的某一种学习到的模式,因为它只会在某一个状态才会稳定。值得注意的是,它并不一定遵从那个期望的状态(很遗憾,它并不是那个具有魔法的黑盒子)。它之所以会稳定下来,部分要归功于在训练期间整个网络的“能量(Energy)”或“温度(Temperature)”会逐渐地减少。每一个神经元的激活函数阈值都会被设置成这个温度的值,一旦神经元输入的总和超过了这个阈值,那么就会让当前神经元选择状态(通常是-1或1,有时也是0或1)。

HN可以多个神经元同步,也可以一个神经元一个神经元地对网络进行更新。一旦所有的神经元都已经被更新,并且它们再也没有改变,整个网络就算稳定了,那你就可以说这个网络已经收敛了。这种类型的网络被称为“联想记忆(associative memory)”,因为它们会收敛到和输入最相似的状态;比如,人类看到桌子的一半就可以想象出另外一半;与之相似,如果输入一半噪音+一半桌子,这个网络就能收敛到整张桌子。

1.3.4. 马尔可夫链(MC)

马尔可夫链3 (MC:Markov Chain)或离散时间马尔可夫链(DTMC:MC or discrete time Markov Chain)在某种意义上是BMs和HNs的前身。可以这样来理解:从我当前所处的节点开始,走到任意相邻节点的概率是多少呢?它们没有记忆(所谓的马尔可夫特性):你所得到的每一个状态都完全依赖于前一个状态。尽管算不上神经网络,但它却跟神经网络类似,并且奠定了BM和HN的理论基础。跟BM、RBM、HN一样,MC并不总被认为是神经网络。此外,它也并不总是全连接的。

1.3.5. 玻尔兹曼机(BM)

玻尔兹曼机(BM:Boltzmann machines)和霍普菲尔网络很接近,差别只是一些神经元作为输入神经元,剩余的则是作为隐神经元。

在整个神经网络更新过后,输入神经元成为输出神经元。刚开始神经元的权重都是随机的,通过反向传播(back-propagation)算法进行学习,或是最近常用的对比散度(contrastive divergence)算法(马尔可夫链用于计算两个信息增益之间的梯度)。

相比HN,大多数BM的神经元激活模式都是二元的。BM由MC训练获得,因而是一个随机网络。BM的训练和运行过程,跟HN大同小异:为输入神经元设好钳位值,而后让神经网络自行学习。因为这些神经元可能会得到任意的值,我们反复地在输入和输出神经元之间来回地进行计算。激活函数的激活受全局温度的控制,如果全局温度降低了,那么神经元的能量也会相应地降低。这个能量上的降低导致了它们激活模式的稳定。在正确的温度下,这个网络会抵达一个平衡状态。

1.3.6. 受限玻尔兹曼机(RBM)

受限玻尔兹曼机4 (RBM:Restricted Boltzmann machines)与BM出奇地相似,因而也同HN相似。

它们的最大区别在于:RBM更具实用价值,因为它们受到了更多的限制。它们不会随意在所有神经元间建立连接,而只在不同神经元群之间建立连接,因此任何输入神经元都不会同其他输入神经元相连,任何隐神经元也不会同其他隐神经元相连。

RBM的训练方式就像稍微修改过的FFNN:前向通过数据之后再将这些数据反向传回(回到第一层),而非前向通过数据然后反向传播误差。之后,再使用前向和反向传播进行训练。

1.3.7. 自编码机(AE)

自编码机5 (AE:Autoencoders)和FFNN有些相近,因为它更像是FFNN的另一种用法,而非本质上完全不同的另一种架构。

自编码机的基本思想是自动对信息进行编码(像压缩一样,而非加密),它也因此而得名。整个网络的形状酷似一个沙漏计时器,中间的隐含层较小,两边的输入层、输出层较大。自编码机总是对称的,以中间层(一层还是两层取决于神经网络层数的奇偶)为轴。最小的层(一层或者多层)总是在中间,在这里信息压缩程度最大(整个网络的关隘口)。在中间层之前为编码部分,中间层之后为解码部分,中间层则是编码部分。

自编码机可用反向传播算法进行训练,给定输入,将误差设为输入和输出之差。自编码机的权重也是对称的,因此编码部分权重与解码部分权重完全一样。

1.3.8. 稀疏自编码机(SAE)

稀疏自编码机6 (SAE:Sparse autoencoders)某种程度上同自编码机相反。稀疏自编码机不是用更小的空间表征大量信息,而是把原本的信息编码到更大的空间内。因此,中间层不是收敛,而是扩张,然后再还原到输入大小。它可以用于提取数据集内的小特征。

如果用训练自编码机的方式来训练稀疏自编码机,几乎所有的情况,都是得到毫无用处的恒等网络(输入=输出,没有任何形式的变换或分解)。为避免这种情况,需要在反馈输入中加上稀疏驱动数据。稀疏驱动的形式可以是阈值过滤,这样就只有特定的误差才会反向传播用于训练,而其它的误差则被忽略为0,不会用于反向传播。这很像脉冲神经网络(并不是所有的神经元一直都会输出)。

1.3.9. 变分自编码机(VAE)

变分自编码机7 (VAE:Variational autoencoders)和AE有着相同的架构,却被教会了不同的事情:输入样本的一个近似概率分布,这让它跟BM、RBM更相近。

不过,VAE却依赖于贝叶斯理论来处理概率推断和独立(probabilistic inference and independence),以及重新参数化(re-parametrisation)来进行不同的表征。推断和独立非常直观,但却依赖于复杂的数学理论。基本原理是:把影响纳入考虑。如果在一个地方发生了一件事情,另外一件事情在其它地方发生了,它们不一定就是关联在一起的。如果它们不相关,那么误差传播应该考虑这个因素。 这是一个有用的方法,因为神经网络是一个非常大的图表,如果你能在某些节点排除一些来自于其它节点的影响,随着网络深度地增加,这将会非常有用。

1.3.10. 去噪自编码机(DAE)

去噪自编码机8 (DAE:Denoising autoencoders)是一种自编码机,它的训练过程,不仅要输入数据,还有再加上噪音数据(就好像让图像变得更加模糊一样)。但在计算误差的时候跟自动编码机一样,降噪自动编码机的输出也是和原始的输入数据进行对比。这种形式的训练旨在鼓励降噪自编码机不要去学习细节,而是一些更加宏观的特征,因为细微特征受到噪音的影响,学习细微特征得到的模型最终表现出来的性能总是很差。

1.3.11. 卷积神经网络(CNN)

谈到机器学习,我们往往还会跟上一个词语,叫做模式识别,但是真实环境中的模式识别往往会出现各种问题。比如:

  • 图像分割:真实场景中总是掺杂着其它物体。很难判断哪些部分属于同一个对象。对象的某些部分可以隐藏在其他对象的后面;
  • 物体光照:像素的强度被光照强烈影响;
  • 图像变形:物体可以以各种非仿射方式变形。例如,手写也可以有一个大的圆圈或只是一个尖头;
  • 情景支持:物体所属类别通常由它们的使用方式来定义。

卷积神经网络9 与普通神经网络的区别在于,卷积神经网络包含了一个由卷积层和子采样层构成的特征抽取器。卷积神经网络由三部分构成。第一部分是输入层;第二部分由n个卷积层和池化层的组合组成;第三部分由一个全连结的多层感知机分类器构成。在卷积神经网络的卷积层中,一个神经元只与部分邻层神经元连接。

在CNN的一个卷积层中,通常包含若干个特征平面(Feature Map),每个特征平面由一些矩形排列的神经元组成,同一特征平面的神经元共享权值,这里共享的权值就是卷积核。卷积核一般以随机小数矩阵的形式初始化,在网络的训练过程中卷积核将学习得到合理的权值。共享权值(卷积核)带来的直接好处是减少网络各层之间的连接,同时又降低了过拟合的风险。子采样也叫做池化(pooling),通常有均值子采样(mean pooling)和最大值子采样(max pooling)两种形式。子采样可以看作一种特殊的卷积过程。卷积和子采样大大简化了模型复杂度,减少了模型的参数。

1.3.12. 循环神经网络(RNN)

传统的神经网络对于很多问题难以处理,比如你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNN之所以称为循环神经d网路,是因为一个序列当前的输出与前面的输出也有关。

循环神经网络具体的表现形式为,网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNN能够对任何长度的序列数据进行处理。图 5 所示是一个简单的RNN结构,可以看出隐藏层自己是可以跟自己进行连接的。

图 5 RNN结构

1.3.13. 深度信念网络(DBN)

深度信念网络10 是一个概率生成模型,与传统的判别模型的神经网络相对,生成模型是建立一个观察数据和标签之间的联合分布。DBNs由多个限制玻尔兹曼机(Restricted Boltzmann Machines)层组成,一个典型的网络结构如图 6所示。这些网络被“限制”为一个可视层和一个隐层,层间存在连接,但层内的单元间不存在连接。隐层单元被训练去捕捉在可视层表现出来的高阶数据的相关性。

图 6 深度信念网络DBN结构

DBN在训练模型的过程中主要分为两步:

第一步-预训练:分别单独无监督地训练每一层RBM网络,确保特征向量映射到不同特征空间时,都尽可能多的保留特征信息;

第二步-微调:在DBN的最后一层设置BP网络,接收RBM的输出特征向量作为它的输入特征向量,有监督地训练实体关系分类器。每一层RBM网络只能确保自身层内的权值对该层特征向量映射达到最优,并不是对整个DBM的特征向量映射达到最优,所以反向传播网络还将错误信息自顶向下传播到每一层RBM,微调整个DBM网络。RBM网络训练模型的过程可以看作对一个深层BP网络权值参数的初始化,DBN克服了BP网络因随机初始化权值参数而容易陷入局部最优和训练时间长的缺点。

DBN的灵活性使得它的拓展比较容易。一个拓展就是DBNs(Convolutoinal Deep Belief Networks(CDBN))。DBN并没有考虑到图像的2维结构信息,因为输入是一个简单的从一个图像矩阵一维向量化的。而CDBN就是考虑到了这个问题,它利用邻域像素的空域关系,通过一个称为卷积RBM的模型区达到生成模型的变换不变性,而且可以容易得变换到高维图像。DBN并没有明确地处理对观察变量的时间联系的学习上,虽然目前已经有这方面的研究,例如堆叠时间RBMs,以此为推广,有序列学习的dubbed temporal convolution machines,这种序列学习的应用,给语音信号处理问题带来了一个让人激动的未来研究方向。

1.3.14. 解卷积网络(DN)

解卷积网络11 (DN:Deconvolutional networks),又称为逆图形网络(IGNs:inverse graphics networks),是逆向的卷积神经网络。

想象一下,给一个神经网络输入一个“猫”的词,就可以生成一个像猫一样的图像,通过比对它和真实的猫的图片来进行训练。跟常规CNN一样,DN也可以结合FFNN使用,但没必要为这个新的缩写重新做图解释。它们可被称为深度解卷积网络,但把FFNN放到DNN前面和后面是不同的,那是两种架构(也就需要两个名字),对于是否需要两个不同的名字你们可能会有争论。需要注意的是,绝大多数应用都不会把文本数据直接输入到神经网络,而是用二元输入向量。比如<0,1>代表猫,<1,0>代表狗,<1,1>代表猫和狗。

CNN的池化层往往也是被对应的逆向操作替换了,主要是插值和外推(基于一个基本的假设:如果一个池化层使用了最大池化,你可以在逆操作的时候生成一些相对于最大值更小的数据)。

1.3.15. 深度卷积逆向图网络(DCIGN)

深度卷积逆向图网络12 (DCIGN:Deep convolutional inverse graphics networks),这个名字具有误导性,因为它们实际上是VAE,但分别用CNN、DNN来作编码和解码的部分。

这些网络尝试在编码过程中对“特征”进行概率建模,这样一来,你只要用猫和狗的独照,就能让它们生成一张猫和狗的合照。同理,你可以输入一张猫的照片,如果猫旁边有一只恼人的邻家狗,你可以让它们把狗去掉。很多演示表明,这种类型的网络能学会基于图像的复杂变换,比如灯光强弱的变化、3D物体的旋转。一般也是用反向传播算法来训练此类网络。

1.3.16. 生成式对抗网络(GAN)

生成式对抗网络13 (GAN:Generative adversarial networks)是一类不同的网络,它们有一对“双胞胎”:两个网络协同工作。GAN可由任意两种网络组成(但通常是FF和CNN),其中一个用于生成内容,另一个则用于鉴别生成的内容。

鉴别网络(discriminating network)同时接收训练数据和生成网络(generative network)生成的数据。鉴别网络的准确率,被用作生成网络误差的一部分。这就形成了一种竞争:鉴别网络越来越擅长于区分真实的数据和生成数据,而生成网络也越来越善于生成难以预测的数据。这种方式非常有效,部分是因为:即便相当复杂的类噪音模式最终都是可预测的,但跟输入数据有着极为相似特征的生成数据,则很难区分。

训练GAN极具挑战性,因为你不仅要训练两个神经网络(其中的任何一个都会出现它自己的问题),同时还要平衡两者的运行机制。如果预测或生成相比对方表现得过好,这个GAN就不会收敛,因为它会内部发散。

1.3.17. 长短期记忆(LSTM)

长短期记忆14 (LSTM:Long / short term memory)网络试图通过引入门结构与明确定义的记忆单元来解决梯度消失/爆炸的问题。

这更多的是受电路图设计的启发,而非生物学上某种和记忆相关机制。每个神经元都有一个记忆单元和三个门:输入门、输出门、遗忘门。这三个门的功能就是通过禁止或允许信息流动来保护信息。

输入门决定了有多少前一神经细胞层的信息可留在当前记忆单元,输出层在另一端决定下一神经细胞层能从当前神经元获取多少信息。遗忘门乍看很奇怪,但有时候遗忘部分信息是很有用的:比如说它在学习一本书,并开始学一个新的章节,那遗忘前面章节的部分角色就很有必要了。

实践证明,LSTM可用来学习复杂的序列,比如像莎士比亚一样写作,或创作全新的音乐。值得注意的是,每一个门都对前一神经元的记忆单元赋有一个权重,因此会需要更多的计算资源。

1.3.18. 门循环单元(GRU)

门循环单元15 (GRU : Gated recurrent units)是LSTM的一种轻量级变体。它们少了一个门,同时连接方式也稍有不同:它们采用了一个更新门(update gate),而非LSTM所用的输入门、输出门、遗忘门。

更新门决定了保留多少上一个状态的信息,还决定了收取多少来自前一神经细胞层的信息。重置门(reset gate)跟LSTM遗忘门的功能很相似,但它存在的位置却稍有不同。它们总是输出完整的状态,没有输出门。多数情况下,它们跟LSTM类似,但最大的不同是:GRU速度更快、运行更容易(但函数表达力稍弱)。

在实践中,这里的优势和劣势会相互抵消:当你需要更大的网络来获取函数表达力时,这样反过来,性能优势就被抵消了。在不需要额外的函数表达力时,GRU的综合性能要好于LSTM。

1.3.19. 神经图灵机(NTM)

神经图灵机16 (NTM: Neural Turing machines)可以理解为对LSTM的抽象,它试图把神经网络去黑箱化,以窥探其内部发生的细节。

NTM不是把记忆单元设计在神经元内,而是分离出来。NTM试图结合常规数字信息存储的高效性、永久性与神经网络的效率及函数表达能力。它的想法是设计一个可作内容寻址的记忆库,并让神经网络对其进行读写操作。NTM名字中的“图灵(Turing)”是表明,它是图灵完备(Turing complete)的,即具备基于它所读取的内容来读取、写入、修改状态的能力,也就是能表达一个通用图灵机所能表达的一切。

1.3.20. 深度残差网络(DRN)

深度残差网络17 (DRN: Deep residual networks)是非常深的FFNN网络,它有一种特殊的连接,可以把信息从某一神经细胞层传至后面几层(通常是2到5层)。

该网络的目的不是要找输入数据与输出数据之间的映射,而是致力于构建输入数据与输出数据+输入数据之间的映射函数。 本质上,它在结果中增加一个恒等函数,并跟前面的输入一起作为后一层的新输入。结果表明,当层数超过150后,这一网络将非常擅于学习模式,这比常规的2到5层要多得多。然而,有证据表明这些网络本质上只是没有时间结构的RNN,它们总是与没有门结构的LSTM相提并论。

1.3.21. 回声状态网络(ESN)

回声状态网络18 (ESN:Echo state networks)是另一种不同类型的(循环)网络。它的不同之处在于:神经元之间的连接是随机的(没有整齐划一的神经细胞层),其训练过程也有所不同。不同于输入数据后反向传播误差,ESN先输入数据、前馈、而后更新神经元状态,最后来观察结果。它的输入层和输出层在这里扮演的角色不太常规,输入层用来主导网络,输出层作为激活模式的观测器随时间展开。在训练过程中,只有观测和隐藏单元之间连接会被改变。

1.3.22. 极限学习机(ELM)

极限学习机19 (ELM:Extreme learning machines)本质上是拥有随机连接的FFNN。它们与LSM、ESN极为相似,除了循环特征和脉冲性质,它们还不使用反向传播。相反,它们先给权重设定随机值,然后根据最小二乘法拟合来一次性训练权重(在所有函数中误差最小)。这使ELM的函数拟合能力较弱,但其运行速度比反向传播快多了。

1.3.23. 液态机(LSM)

液态机20 (LSM:Liquid state machines)换汤不换药,跟ESN同样相近。区别在于,LSM是一种脉冲神经网络(spiking neural networks),用阈值激活函数(threshold functions)取代了sigmoid激活函数,每个神经元同时也是具有累加性质的记忆单元。因此,当神经元状态更新时,其值不是相邻神经元的累加值,而是它自身状态值的累加。一旦累加到阈值,它就释放能量至其它神经元。这就形成了一种类似于脉冲的模式:神经元不会进行任何操作,直至到达阈值的那一刻。

1.3.24. Kohonen网络

Kohonen网络21 (KN,也称之为自组织(特征)映射(SOM/SOFM:self organising (feature) map))。

KN利用竞争学习来对数据进行分类,不需要监督。先给神经网络一个输入,而后它会评估哪个神经元最匹配该输入。然后这个神经元会继续调整以更好地匹配输入数据,同时带动相邻的神经元。相邻神经元移动的距离,取决于它们与最佳匹配单元之间的距离。KN有时也不被认为是神经网络。

1.3.25. Attention Networks (AN)

注意力网络(AN)可以被视为一类网络22 ,其中包括Transformer体系结构。他们通过单独存储先前的网络状态并在状态之间切换注意力,使用注意力机制来消除信息衰减。

编码层中每次迭代的隐藏状态都存储在存储单元中。解码层连接到编码层,但它也从存储单元接收通过注意上下文过滤的数据。该过滤步骤为解码层添加了上下文,从而强调了特定功能的重要性。使用来自解码层输出的错误信号来训练产生这种上下文的注意力网络。此外,可以将注意力上下文可视化,从而提供有价值的见解,以了解哪些输入特征对应于哪些输出特征。

1.3.26. 支持向量机(SVM)

SVM是由模式识别中广义肖像算法(generalized portrait algorithm)发展而来的分类器。支持向量机23 (SVM:Support vector machines)能为分类问题找出最优方案。定义上讲支持向量机并不算神经网络的一种。

传统意义上,它们只能处理线性可分的数据;比如找出哪张图片是加菲猫、哪张是史努比,此外就无法做其它输出了。

训练过程中,SVM可以理解为:先在平面图表上标绘所有数据(加菲猫、史努比),然后找出到那条能够最好区分这两类数据点的线。这条线能把数据分为两部分,线的这边全是史努比,线的那边全是加菲猫。而后移动并优化该直线,令两边数据点到直线的距离最大化。分类新的数据,则将该数据点画在这个图表上,然后察看这个数据点在分隔线的哪一边(史努比一侧,还是加菲猫一侧)。

通过使用核方法,SVM便可用来分类n维空间的数据。这就引出了在3维空间中标绘数据点,从而让SVM可以区分史努比、加菲猫与西蒙,甚至在更高的维度对更多卡通人物进行分类。SVM并不总被视为神经网络。

2. 经典的卷积神经网络(CNN)架构总结

卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一。在第一章的介绍里,人们对卷积神经网络的研究起始于二十世纪80至90年代。在图像分类数据集上卷积神经网络有非常突出的表现,由于一般正常的图像信息过大,如果使用全连接神经网络,需要设置大量的权值w和basic值,这样会导致运算效率较低,还容易导致过分拟合的问题。

图 7 经典的神经网络架构

由图 7中的坐标轴我们可以看出横坐标是操作的复杂度,纵坐标是精度。模型设计一开始的时候模型权重越多模型越大,其精度越高,后来出现了ResNet、GoogLeNet、Inception等网络架构之后,在取得相同或者更高精度之下,其权重参数不断下降。值得注意的是,并不是意味着横坐标越往右,它的运算时间越大。在这里并没有对时间进行统计,而是对模型参数和网络的精度进行了纵横对比。

2.1. LeNet5

LeNet5诞生于1994年,是最早的卷积神经网络之一,并且推动了深度学习领域的发展24 。自从1988年开始,在许多次成功的迭代后,这项由Yann LeCun完成的开拓性成果被命名为LeNet5。

图 8 LetNet5 架构结构

LeNet5的架构基于这样的观点:(尤其是)图像的特征分布在整张图像上,以及带有可学习参数的卷积是一种用少量参数在多个位置上提取相似特征的有效方式。 在那时候,没有 GPU 帮助训练,甚至 CPU 的速度也很慢。因此,能够保存参数以及计算过程是一个关键进展。这和将每个像素用作一个大型多层神经网络的单独输入相反。LeNet5 阐述了哪些像素不应该被使用在第一层,因为图像具有很强的空间相关性,而使用图像中独立的像素作为不同的输入特征则利用不到这些相关性。LeNet5 特征能够总结为如下几点:

  1. 使用卷积提取空间特征;
  2. 使用映射到空间均值下采样(subsample);
  3. 双曲正切(tanh)或S型(sigmoid)形式的非线性;
  4. 多层神经网络(MLP)作为最后的分类器;
  5. 层与层之间的稀疏连接矩阵避免大的计算成本。

总体来看,这个网络是最近大量架构的起点,并且也给这个领域的许多带来了灵感。从1998年到2010年,神经网络处于孵化阶段。大多数人没有意识到它们不断增长的力量,与此同时其他研究者则进展缓慢。由于手机相机以及便宜的数字相机的出现,越来越多的数据可被利用。并且计算能力也在成长,CPU变得更快,GPU变成了多种用途的计算工具。这些趋势使得神经网络有所进展,虽然速度很慢。数据和计算能力使得神经网络能完成的任务越来越有趣。

2.2. Dan Ciresan Net

在2010年的时候,Dan Claudiu Ciresan和Jurgen Schmidhuber发布了最早的GPU神经网络的一个实现。该实现是在一块NVIDIA GTX 280图形处理器上运行9层的神经网络,包含前向与反向传播。

2.3. AlexNet

2012年,Alex Krizhevsky发表了AlexNet25 ,它是LeNet的一种更深更宽的版本,并以显著优势赢得了困难的ImageNet竞赛。

图 9 AlexNet的网络结构

AlexNet将LeNet的思想扩展到了更大的能学习到远远更复杂的对象与对象层次的神经网络上。由于当时的GPU计算能力不够,显存容量不够大,为了完成模型的训练,作者使用了两块显卡来进行分布式的训练,所以在图 9中可以看到,它的网络结构被分成了两支。从结构上看,AlexNet输入层是224 * 224的数据,然后进行了多轮卷积(提取特征),其中包括11 * 11的卷积核,5 * 5的卷积核, 3 * 3的卷积核。虽然在图片上只画了卷积层,但我们应该知道,每一个卷积层之后都会跟上一个激活层(用来增加模型的非线性表达能力),一个降采样pooling层(减小数据量,提取主要特征),以及一个局部归一化处理(对数据进行一定的约束,使我们的数据约束在一定的范围内,使网络更好的收敛)。经过多个卷积层之后,就会有三个fc层(全连接层)。同样的,在每一个fc层之后,也会有一个ReLU激活层,以及一个dropout层(减小参数量,防止过拟合,增加网络结构变化)。最后呢,通过一个全连接层 + softmax层来将数据映射到一个一千维的向量上去(因为实现的是一千种物品的分类网络),这个向量就是我们输入的图像在这一千个类别上的概率分布。其中概率值最高的那个类别就是网络判断出来图像所属的类别。

对比LeNet,AlexNet在结构上并没有很大的改变,但是它的网络深度更深,并且成功运用了GPU进行运算,为后人打开了新世界大门。整个网络的参数量在60M以上,最终训练出来的模型文件在200M以上。它最大的意义在于,通过这次实验,证明了更深层次的卷积神经网络,可以提取出更加鲁棒的特征信息,并且这些特征信息能更好的区分物品类别。相较于LeNet,AlexNet具有以下特点:

  1. 增加了ReLU非线性激活函数,增强了模型的非线性表达能力,成为以后卷积层的标配;
  2. 在训练的时候使用dropout技术有选择地忽视单个神经元,以避免模型过拟合成为以后fc层的标配;
  3. 引入标准化层(Local Response Normalization):通过放大那些对分类贡献较大的神经元,抑制那些对分类贡献较小的神经元,通过局部归一的手段,来达到作用;
  4. 使用GPU NVIDIA GTX 580减少训练时间。

在那时,GPU相比CPU可以提供更多数量的核,训练效率可以提升10倍,这又反过来允许使用更大的数据集和更大的图像。

AlexNet的成功掀起了一场小革命。在2013年的12月,纽约大学的Yann LeCun实验室提出了AlexNet的衍生——Overfeat(参见paper:OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks)。这篇文章也提出了学习边界框(learning bounding box),并导致之后出现了很多研究这同一主题的论文。

2.4. ZFNet

ZFNet在AlexNet的基础上做了一些细节上的改动,网络结构上并没有太大的突破,最主要的贡献在于使用可视化技术揭示了神经网络各层到底在干什么,起到了什么作用26 。毕竟,如果不知道神经网络为什么取得了如此好的效果,那么只能靠不停的实验来寻找更好的模型。

ZFNet将AlexNet第一层卷积核大小调整为7*7,并且设置卷积参数stride=2,通过更小的卷积核和更小的步长,来提取更多的信息,确保网络提取出来的信息更加有效。其次,它增加了卷积核数量,导致网络更加庞大。

图 10 ZFNet网络结构

如图 10所示,右半边是我们一个正常的神经网络的数据流向:对于一副输入图像,我们通过pooling层来进行下采样,再通过卷积层进行特征提取,通过ReLU层来提升非线性表达能力。左半边ZFNet通过反卷积网络实现可视化,将特征还原成原始图片,100%还原是不可能的,因为每次的pooling层都会丢失一些信息。因此我们在可视化的时候,更主要的是对它的特征的语义进行更高层次的分析。通过对输出层进行上采样,可以得到与我们原始图像大小一致的特征图。

2.5. VGGNet

VGGNet由牛津大学计算机视觉组和Google Deepmind共同设计27 。主要是为了研究网络深度对模型准确度的影响,在各个卷积层使用更小的3*3过滤器(filter),并把它们组合作为一个卷积序列进行处理的网络。它的参数量达到了138M,整个模型的大小>500M。

图 11 VGGNet网络结构

从图 11中可以看到,VGGNet的网络结构被分为11,13,16和19层,每层都包含了不同数量的卷积层,(需要注意的是,每层卷积层之后都有激活层和池化层,只是由于长度限制没有在表中列出来),最后通过三个FC层来将我们的特征进行最后的向量化,最终得到一个1000维的向量,这个向量经过softmax之后,就会得到最终我们类别上的概率分布。而概率值最高的那个,就是我们所要分类的那个类别。

VGG巨大的进展是通过依次采用多个33卷积,能够模仿出更大的感受野(receptive field)的效果,例如55与7*7。这些思想也被用在了最近更多的网络架构中,如Inception与ResNet。VGGNet证明了更深的网络,能更好的提取体征,并且成为了后续很多网络的backbone。

p.s.详细内容参见:VGG-16架构

2.6. GoogLeNet / Inception v1

2014年秋季,深度学习模型正在变得在图像与视频帧的分类中非常有用。大多数怀疑者已经不再怀疑深度学习与神经网络这一次是真的回来了,而且将一直发展下去。鉴于这些技术的用处,谷歌这样的互联网巨头非常有兴趣在他们的服务器上高效且大规模庞大地部署这些架构。来自谷歌的Christian Szegedy开始追求减少深度神经网络的计算开销,并设计出GoogLeNet——第一个Inception架构28 。在计网络结构时,不仅要考虑网络的深度,也会考虑网络的宽度,这种网中网(Network in Network)的结构被定义为Inception。GoogLeNet网络的参数量只有6.9M,模型大小约为50M。

图 12 Inception模型结构

GoogLeNet之所以高效是因为它有效的利用了11的卷积核。不同于VGGNet从上到下的类似于一个串的结构,Inception的结构表现为一个网中网的结构。也就是说,对于我们中间的一个隐藏层层,它的每个节点也都是一个卷积网络。对于前一层传入进来的特征图,这层的每一个节点对它进行了11,33,55的卷积和33的pooling操作。其中值得一提的是,在33和55的卷积操作之前,该网络用11的卷积核降低了输入层的channel的数量。例如:我们的输入是一个5656128维的这么一个特征(这时候128就是我们channel的数量)。我们通过一个11的卷积核,可以将通道数降为32,然后我们将它再输入到33的卷积核中,大大减少了计算量。最后,我们将所有的Feature Map进行连接,最后得到这个层的输出。Inception 的伟大思路是用 1×1 的卷积块(NiN)在昂贵的并行模块之前减少特征的数量。这一般被称为瓶颈(bottleneck),受到NiN的启发,Inception的瓶颈层减少了每一层的特征的数量,并由此减少了运算的数量;所以可以保持较低的推理时间。在将数据通入昂贵的卷积模块之前,特征的数量会减少4倍。在计算成本上这是很大的节约,也是该架构的成功之处。事实证明瓶颈层在ImageNet这样的数据集上已经表现出了顶尖水平,而且它也被用于接下来介绍的ResNet这样的架构中。它之所以成功是因为输入特征是相关联的,因此可通过将它们与1*1卷积适当结合来减少冗余。然后,在小数量的特征进行卷积之后,它们能在下一层被再次扩展成有意义的结合。

在ZFNet的学习中我们知道,更深层的网络收敛的速度就越慢。在GoogLeNet中,为了保证网络更深之后,能够收敛的比较好,它采用了两个loss来对网络参数进行调节,进而确保在网络变深之后,依然能够达到一个比较好的收敛效果。

这里需要解释一下什么叫网络宽度:网络深度指的是当前的这个网络一共有多少层,宽度则是说在同一层上channel的数量。

2.7. Inception v2/v3

在提出了Inception v1之后,google又提出了Inception v2/v3/v4。2015年2月,Batch-normalized Inception被引入作为Inception V2[6]。Batch-normalization在一层的输出上计算所有特征映射的均值和标准差,并且使用这些值规范化它们的响应。这相当于数据增白(whitening),因此使得所有神经图(neural maps)在同样范围有响应,而且是零均值。在下一层不需要从输入数据中学习 offset 时,这有助于训练,还能重点关注如何最好的结合这些特征。2015年12月,该团队发布Inception模块和类似架构的一个新版本29 。该论文更好地解释了原始的 GoogLeNet架构,在设计选择上给出了更多的细节。其原始思路如下:

  • 通过谨慎建筑网络,平衡深度与宽度,从而最大化进入网络的信息流。在每次池化之前,增加特征映射;
  • 当深度增加时,网络层的深度或者特征的数量也系统性的增加;
  • 使用每一层深度增加在下一层之前增加特征的结合;
  • 只使用33的卷积,可能的情况下给定的55和77过滤器能分成多个33,如图 13所示。

图 13 小的网络取代5*5卷积

此时,新的inception成为了图 14所示:

图 14 Inception模块n*n卷积后的初始模块

在进行inception计算的同时,inception模块也能通过提供池化降低数据的大小,类似于在运行一个卷积的时候并行一个简单的池化层:

图 15 可以减小网格大小同时扩展滤波组的初始模块

Inception v2/v3的一系列操作实现了显著的效果,诸如降低参数量,减少了计算量;网络变深,网络的非线性表达能力更强。

2.8. ResNet

2015年,何恺明团队提出ResNet,引入了跳连的结构来防止梯度消失的问题,进而可以进一步加大网络深度30 。其网络结构如图 16所示。

图 16 ResNet网络结构

ResNet有着简单的思路:供给两个连续卷积层的输出,并分流(bypassing)输入进入下一层,ResNet分流两个层并被应用于更大的规模。可以发现,其他的网络中,都是从上到下的串联的结构 ,而ResNet网络则是跳连结构,它的意思是将输入特征直接传输到输出层,和经过卷积之后的特征相加,共同组成输出层的一部分。在VGG网络中,我们知道当网络深度达到一定界限的时候,在训练中就较难收敛。较难收敛的原因就是随着网络深度的加深,产生了梯度消失的问题。那么ResNet是如何解决梯度消失问题的呢?跳连结构实际上也被称为恒等映射:H(x)=F(x)+x。当F(x)=0时,H(x)=x,这就是所谓的恒等映射。这个跳连的这根线,可以实现差分放大的效果,将梯度放大,来缓解梯度的消失。

图 17 ResNet中的跳连结构

图 18展示了ResNet中的两种跳连结构,左边是当层数较小时,不使用11的卷积核来降低参数量和计算量;右边的是在50,101,152层的网络中,用1 1的卷积核来降低参数量和计算量。这种层通过首先是由带有更小输出(通常是输入的1/4)的11卷积较少特征的数量,然后使用一个33的层,再使用1*1的层处理更大量的特征。类似于Inception模块,这样做能保证计算量低,同时提供丰富的特征结合。

图 18 ResNet中的两种跳连结构

2.9. SqueezeNet

Squ论文链接:http://arxiv.org/abs/1602.07360
代码链接(Caffe):https://github.com/DeepScale/SqueezeNet
代码链接(Keras):https://github.com/rcmalli/keras-squeezenet

SqueezeNet是轻量级深度神经网络,提出了一种新的卷积组合方式来替代原来的3*3卷积,类似于bottleneck layer减少参数数目来进行模型压缩,但并没有提出新的卷积计算方式来减少参数。其最初设计目标就是在保持和AlexNet同样的准确度上,参数比他少50倍。

图 19 SqueezeNet 体系结构

图 19所示是SqueezeNet的网络结构,核心结构是FireModule的组合形式,左图是SqueezeNet的整体结构,中图和右图是将ResNet网络中的shortcut引入所构建的网络。FireModule由squeeze模块和expand模块构成,如图 20所示,该模块主要有两大特征:Squeeze模块利用11卷积进行降维,expand模块利用11和3*3的卷积组合升维。

图 20 SqueezeNet网络框架

SqueezeNet网络整体还有一个特性,在将poolint采样操作延后,可以给卷积层提供更大的激活图:更大的激活图保留了更多的信息,可以提供更高的分类准确率,即在参数数量受限的情况下提高准确率。因为大量采用11和33,所以相对于AlexNet这样的网络,SqueezeNet本身就小,如果一个参数在内存中是32bit,那么AlexNet不经过压缩的内存是 240MB,而SqueezeNet是4.8 MB。

3. 循环神经网络RNN(Recurrent Neural Network)

3.1. RNN的多种结构

与CNN不同的是,RNN具有多种网络结构。联系实际很容易想到,在不同的时间段内,序列数据的长短总是不一致的。就像我们说话,每一句的长度都是不确定的。由此我们得出了以上五种基本结构。

图 21 RNN网络的多种结构

3.1.1. 单层网络结构

3.1.2. 经典RNN网络结构

序列型的数据不太好用原始的神经网络处理。为了处理序列建模问题,RNN引入了隐藏态h(hidden state)的概念。h可以对序列型的数据提取特征,接着再转换为输出。


如上图,我们从h1开始逐步推到其计算过程。首选阐述图中网络结构的基本含义:

  • 圆圈或方块表示向量
  • 一个箭头表示对该向量做一次变换

如图所示,h0和x1分别有一个箭头连接h1,表示对h0和x1分别做了一次变化。图中U和W是参数矩阵,b是偏置项参数,f是激活函数。在经典的RNN网络中,通常使用tanh作为激活函数。有了h1的计算,我们可以很容易的推出之后的计算流程,每一步的过程与第一步类似。

在计算过程中使用的参数U、W、b都是一样的,每一个步骤的参数都是共享的,这也是RNN的重要特征。根据以上计算法则,把对应的四个x输入全部计算,得到下图。


此时得到的是一些列的隐藏层hi,要得到真正的输出y,还需要进行以下计算:

一般我们在处理多分类问题时,都会使用softmax函数将输出转换为各个类别的概率。我们在前文说过,一个箭头表示一次转换操作,这里h1经过Softmax(V⋅h1+c)得到y1。同样地,我们通过相同的转换将剩下的隐藏层h转换为对应的输出。从最后得到的记过可以看出,输入序列是Xi,经过RNN循环神经网络的计算得到输出序列Yi。此时的输入序列和输出序列是等长的。

3.1.3. 其他RNN结构

CSDN - RNN基本结构解读

3.2. Encoder-Decoder

3.2.1. Encoder-Decoder的基本结构

Seq2Seq是RNN的一个变种形式,其出现源自具体的现实需求,正如我们所说,在大多数时候,文本序列的输入和输出是不等长的,例如翻译过程中:"I hava a pen, I hava an apple, en… apple pen."翻译成中文是:“我有一支笔,我有一个苹果,嗯……苹果笔”。这里英文和中文的长度明显就是不一样的,而且大多数情况下,目标语言和源语言之间的长度都是不一致的。为此,Encoder-Decoder结构先将输入数据编码成一个上下文语义向量c:

拿到c之后,就用另一个RNN网络对其进行解码,这部分RNN网络被称为Decoder。Decoder的RNN可以与Encoder的一样,也可以不一样。具体做法就是将c当做之前的初始状态h0输入到Decoder中:

3.2.2. Encoder-Decoder应用范围

由于这种Encoder-Decoder结构不限制输入和输出的序列长度,因此应用的范围非常广泛,比如:

  • 机器翻译:Encoder-Decoder的最经典应用,事实上这结构就是在机器翻译领域最先提出的;
  • 文本摘要:输入是一段文本序列,输出是这段文本序列的摘要序列;
  • 阅读理解:将输入的文章和问题分别编码,再对其进行解码得到问题的答案;
  • 语音识别:输入是语音信号序列,输出是文字序列。

3.2.3. Encoder-Decoder的局限性

  • 最大的局限性:编码和解码之间的唯一联系是固定长度的语义向量c;
  • 编码要把整个序列的信息压缩进一个固定长度的语义向量c;
  • 语义向量c无法完全表达整个序列的信息;
  • 先输入的内容携带的信息,会被后输入的信息稀释掉,或者被覆盖掉;
  • 输入序列越长,这样的现象越严重,这样使得在Decoder解码时一开始就没有获得足够的输入序列信息,解码效果会打折扣。

3.3. LSTM

Understanding LSTM Networks

从外部结构看,LSTM和RNN的输入输出是一模一样的,同样是在每一步接受外部输入和前一阶段的隐藏态,并输出一个值。因此,RNN中可以使用的每一结构都可以无缝切换到LSTM,而不会产生任何问题。

回顾RNN的公式我们可以看出,RNN每一层的隐藏态都由前一层的隐藏态经过变换和激活函数得到,反向传播求导时,最终得到的导数会包含每一步梯度的连乘,这会引起梯度爆炸或梯度消失,所以RNN很难处理"长程依赖"问题,也就是我们所说的"记忆力"不足的问题,即无法学到序列中蕴含的间隔距离较长的规律。LSTM在隐藏态计算时,使用加法替换了这里的迭代变换,可以避免梯度消失的问题,能够学到长程的规律。

  • 黄色方框(Neural Network Layer)代表网络层
  • 粉色圆圈(Pointwise Operation)表示各点的具体计算操作,具体指两个形状完全相同的矩阵进行相加、相乘或其他运算
  • 单箭头表示向量转换
  • 归一箭头表示合并
  • 拆分箭头表示复制

与经典RNN结构不同的是,LSTM的隐藏层有两部分组成,分别是ht和Ct。Ct是在各个步骤中传到的主要信息,下图中的水平线可以看做是信息传递的"主干道",通过加法,Ct可以在主干道上进行传递,因此较远的梯度也可以在长程上传播,这是LSTM的主要思想。


Ct是一个向量,其长度是我们自行设定的,如果我们选择256,就表示我们想用256位来保存记忆信息,这个维度越大,相当于记忆的容量越大,可保存的信息自然越多,但是需要训练的参数也会越多。从Ct-1到Ct经过了两次运算,一次乘法和一次加法,第一步是忘记一些不再有用的记忆,第二步是把Xt中有用的信息加道记忆中。遗忘过程如下图所示结构:

经过sigmoid函数后,原有矩阵中的值会被归一到区间[0, 1]之间,然后经过乘法运算,矩阵中数值接近于0的元素将会被弱化,相反的,矩阵中数值接近于1的元素将会被增强。正是通过这种操作,LSTM实现了"遗忘"的功能,能够将一些不重要的信息忘记。

那么sigmoid函数中的矩阵式怎么得来的呢?

输入到sigmoid函数中的矩阵式由上一层的隐藏态 ht-1 和本层输入 xt 拼接得来的,在PyTorch上可以通过concat函数实现其拼接,拼接后的矩阵与权重矩阵 Wf 相乘,最后加上对应的偏置项 bf ,以此得到输入到sigmoid函数中的参数矩阵。

除了LSTM的遗忘门以外,还有记忆们,其记忆结构如下:

tanh函数可以看作是sigmoid的“长高”版:

两个函数对输入起到了不同的调节作用,sigmoid使用来将数据映射到[0, 1]空间,而tanh将函数映射到[-1, 1],it 对Ct 同样起到了增强和衰弱的作用,将要记住的东西记忆的更牢靠,不想记住的进一步淡化。

到这里,我们已经完成了"遗忘"和"记忆"的工作,还有一项工作没有做,就是计算输出项,同样地,我们给出流程图如下:

右边的公式看着是不是依然很熟悉,我们首先通过原本的输入ht−1 和 xt 的拼接与权重矩阵Wo 相乘,然后加上新的偏置项bo ,上述计算结果经过sigmoid函数得到 ot,最后将 ot 与经过tanh激活的传输信息 Ct 相乘,就得到了我们想要的 ht ,同样的,这里的ht并不是真正的输出,也只是一个隐藏状态而已,要想得到真正的输出依然需要经过一次额外的变换才能得到。

4. 目标检测(Object detection)算法综述

计算机视觉的任务很多,有图像分类、目标检测、语义分割、实例分割和全景分割等等。

图 22 52个目标检测模型

简单来说,图像分割就是对图像判断出所属的分类,比如在学习分类中数据集有人、羊、狗和猫,图像分类要求给定一个图片输出图像里面含有哪些分类;目标检测则是判断图片里面有什么,分别在哪里;语义分割通常又被称作目标分割,需要区分到图中每一点像素点,而不仅仅是用矩形框框住,但是对同一物体的不同实例不需要单独分割出来;实例分割其实就是目标检测和语义分割的结合。相对目标检测的边界框,实例分割可精确到物体的边缘;相对语义分割,实例分割需要标注出图上同一物体的不同个体。实例分割常用的算法是Mask R-CNN。Mask R-CNN通过向Faster R-CNN添加一个分支来进行像素级分割,该分支输出一个二进制掩码,该掩码表示给定像素是否为目标对象的一部分:该分支是基于卷积神经网络特征映射的全卷积网络。将给定的卷积神经网络特征映射作为输入,输出为一个矩阵,其中像素属于该对象的所有位置用1表示,其他位置则用0表示,这就是二进制掩码。一旦生成这些掩码,Mask R-CNN将RoIAlign与来自Faster R-CNN的分类和边界框相结合,以便进行精确的分割;全景分割是语义分割和实例分割的结合。跟实例分割不同的是:实例分割只对图像中的object进行检测,并对检测到的object进行分割,而全景分割是对图中的所有物体包括背景都要进行检测和分割。

目标检测是很多计算机视觉任务的鼻祖,不论我们需要实现图像与文字的交互还是需要识别精细类别,它都提供了可靠的信息。所以目标检测一向是比较热门的研究方向,它经历了传统的人工设计特征+浅层分类器的框架,到基于大数据和深度神经网络的End-To-End的物体检测框架的发展。受70年代落后的技术条件和有限应用场景的影响,目标检测直到上个世纪90年代才开始逐渐走入正轨。检测算法通常包含三个部分,第一个是检测窗口的选择,第二个是特征的设计,第三个是分类器的设计。物体检测对于人眼来说并不困难,通过对图片中不同颜色、纹理、边缘模块的感知很容易定位出目标物体,但对于计算机来说,面对的是RGB像素矩阵,很难从图像中直接得到狗和猫这样的抽象概念并定位其位置,再加上物体姿态、光照和复杂背景混杂在一起,使得物体检测更加困难。

近三年目标检测算法,参见:

  • 目标检测:CVPR2018的目标检测总结
  • CVPR2019目标检测论文汇总
  • 2020CVPR目标检测方向论文整理

4.1. 传统检测算法

在2001年,一篇基于Haar+Adaboost的检测方法第一次把检测做到实时,并且在当时的技术限制下,检测性能也做的非常亮眼。纵观2012年之前的物体检测算法,可以归结为三个方面的持续优化:

首先是检测窗口的选择。拿人脸检测举例,当给出一张图片时,我们需要框出人脸的位置以及人脸的大小,那么最简单的方法就是暴力搜索候选框,把图像中所有可能出现框的位置从左往右、从上往下遍历一次。并且通过缩放一组图片尺寸,得到图像金字塔来进行多尺度搜索。

但是这种方法往往计算量很大并且效率不高,在实际应用中并不可取。人脸具有很强的先验知识,比如人脸肤色YCbCr空间呈现很紧凑的高斯分布,通过肤色检测可以去除很大一部分候选区域,仅留下极小部分的区域作为人脸检测搜索范围。由于肤色的提取非常快,只是利用一些颜色分布的信息,把每个像素判断一下,整体速度提升很多。但肤色提取只是用到简单的颜色先验,如果遇到和肤色很像的,比如黄色的桌子,很有可能被误判成人脸的候选检测区域。

进一步提高精度衍生出如Selective Search或EdgeBox等proposal提取的方法,基于颜色聚类、边缘聚类的方法来快速把不是所需物体的区域给去除,相对于肤色提取精度更高,极大地减少了后续特征提取和分类计算的时间消耗。

第二个方面是特征的设计。在传统的检测中,Haar由于提取速度快,能够表达物体多种边缘变化信息,并且可以利用积分图快速计算,得到广泛的应用;LBP更多的表达物体的纹理信息,对均匀变化的光照有很好地适应性;HOG通过对物体边缘使用直方图统计来进行编码,特征表达能力更强,在物体检测、跟踪、识别都有广泛的应用。传统特征设计往往需要研究人员驱动,更新周期较长,通过对不同的特征进行组合调优,从不同维度描述物体可以进一步提升检测精度,如ACF检测,组合了20种不同的特征表达。

第三个方面是分类器的设计。传统的分类器包含Adaboost、SVM、Decision Tree等:

  • a.Adaboost:其算法基本原理就是将多个弱分类器(弱分类器一般选用单层决策树)进行合理的结合,使其成为一个强分类器。Adaboost采用迭代的思想,每次迭代只训练一个弱分类器,训练好的弱分类器将参与下一次迭代的使用。也就是说,在第n次迭代中,一共就有n个弱分类器,其中n-1个是以前训练好的,其各种参数都不再改变,本次训练第n个分类器。其中弱分类器的关系是第n个弱分类器更可能分对前n-1个弱分类器没分对的数据,最终分类输出要看这n个分类器的综合效果。一个弱分类器往往判断精度不高,通过Adaboost自适应地挑选分类精度高的弱分类器并将它们加权起来,从而提升检测性能。比如说,人脸检测中一个候选窗口需要判断是否为人脸,其中一些弱分类器为颜色直方图分量(如红黄蓝三种颜色),如果黄色分量大于100,那我就认为这块可能是人脸的候选区域,这就是个非常简单的弱分类器。可是,单个这么弱的分类器判断是很不准的,那么我们就需要引入另外一些分量做辅助。比如再引入红色分量大于150,将几个条件叠加起来,就组成了一个比较强的分类器。(参见:https://blog.csdn.net/px_528/article/details/72963977)
  • b. SVM分类器:SVM通过最大化分类间隔得到分类平面的支持向量,在线性可分的小数据集上有不错的分类精度,另外通过引入核函数将低维映射到高维,从而线性可分,在检测场景被广泛使用。

图 23 SVM分类器

比如线性SVM分类器就是一些支持向量,将物体表示为一些特征向量,实际当中学到的分类器就是一些系数向量,这些系数向量和特征向量做一个加权的话可以得到分类分数,对分数进行阈值判断,就可以判断是否是某一类。

  • c.Decision Tree:决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶子节点代表一种类别。用从树根到树叶的二叉树来举个简单例子。假如从树根进来有个二分类,我们需要区分它是人脸或者是非人脸,左边是非人脸,右边是人脸。当我进入第一个二叉树分类器节点判断,如果是非人脸的话直接输出结果,如果是人脸候选的话进入下一层再做进一步的分类。通过学习每个节点的分类器来构造决策树,最终形成一个强分类器。
  • Random Forest:通过对决策树进行Ensemble,组合成随机森林更好的提高分类或者回归精度。假设刚刚提到的决策树是一棵树,那么现在我想学十棵树,每个树采用不同的输入或者分类准则,从不同维度来做分类。以十棵树的分类结果进行投票,8个树认为这个框是人脸,2个认为是非人脸,最终输出为人脸。投票策略可以更好地降低分类误差,在实际场景中得到广泛应用。

图 24 Random Forest

4.2. 基于区域建议的算法

参见:基于深度学习的目标检测概述

检测算法的演变分为两个阶段,一个是基于传统特征的解决方法,另一个是深度学习算法。在2013年之前传统方法是检测学习的主流,大家都是基于传统的feature优化检测方法。然而,在2013年之后,,整个学术界和工业界都逐渐利用深度学习来做检测。

由于深度学习在分类上超越了很多传统的方法,在2012年的Image Net上,Hinton两个学生就曾用ConvNet获得了冠军。与传统方法相比,深度学习在分类精度上提高很多。起先,深度学习只是在分类上有非常明显的提升,之后也带动了检测这一块。从物体分类到物体检测,利用了深度学习比较强的feature的表达能力,可以进一步提高检测的精度。

检测方面有两个比较典型的公开测试集,PASCAL VOC和COCO。从这两个测试集上可以看到传统的检测方法和深度学习的检测方法在精度上的差别非常的大。传统的物体检测方法因为其特征比较弱,所以每类都需要训练一个检测器。每个检测器都是针对特定的物体训练,如果有20类的话,就需要跑20次前向预测,相当于单次检测的20倍,作为一个2C(to Customer)端产品,时间消耗和精度性能使得传统方法检测的应用场景不是很多。

目前最新的检测都是基于深度学习的方法,最开始的R-CNN,它算是深度学习应用到检测里的鼻祖,从起初它平均49.6的精度记录,到如今已然提升了快40个点。而在传统的方法中SVM-HOG,它的精度才到了31.5,和深度学习相比低了很多。值得注意的是,传统检测方法随着数据量增大检测性能会趋于饱和,也就是说随着数据量的增大,检测性能会逐渐提高,但到了一定程度之后数据量的提高带来的性能增益非常少。而深度学习的方法则不同,当符合实际场景分布的数据越来越多时,其检测性能会越来越好。

4.2.1. 几个基本概念

a. IOU的定义

物体检测需要定位出物体的bounding box,就像下面的图片一样,我们不仅要定位出车辆的bounding box 我们还要识别出bounding box里面的物体就是车辆。对于bounding box的定位精度,有一个很重要的概念,因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU。

IOU定义了两个bounding box的重叠度,如下图所示:

图 25 IOU定义的两个bounding box的重叠度

矩形框A、B的一个重合度IOU计算公式为:IOU=(A∩B)/(A∪B)

就是矩形框A、B的重叠面积占A、B并集的面积比例:IOU=SI/(SA+SB-SI)

b. 非极大值抑制(NMS)

非极大值抑制顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。

如上图所示,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制就是先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;然后假设B、D与F的重叠度超过阈值,那么就扔掉B、D,并标记第一个矩形框F,是我们保留下来的。再从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。就这样一直重复,找到所有被保留下来的矩形框。

c. PASCAL VOC2011 Example Images

http://host.robots.ox.ac.uk/pascal/VOC/voc2012/examples/index.html#aeroplane

4.2.2. R-CNN

R-CNN31 是利用深度学习进行目标检测的开山之作,相对于传统典型的Haar特征+Adaboost,Hog特征+SVM等算法准确率有了很大的提升,将PASCAL VOC 2007数据集的检测准确率从35.1%提升到了66%(mAP).

图 26 R-CNN算法流程图

图 26所示是R-CNN算法流程图,首先输入一张图片先定位出2000个物体候选框,然后采用CNN提取每个候选框中图片的特征向量,特征向量的维度为4096维,接着采用SVM算法对各个候选框中的物体进行分类识别。也就是整个过程分为三个程序:a. 找出候选框;b. 利用CNN提取特征向量;c. 利用SVM进行特征向量分类。

a. 找出候选框

当我们输入一张图片时,我们要搜索出所有可能是物体的区域,这个采用的方法是传统文献的算法:Selective Search for Object Recognition32 ,通过这个算法我们搜索出2000个候选框。然后从上面的总流程图中可以看到,搜出的候选框是矩形的,而且是大小各不相同。然而CNN对输入图片的大小是有固定的,如果把搜索到的矩形选框不做处理,就扔进CNN中,肯定不行。因此对于每个输入的候选框都需要缩放到固定的大小。下面我们讲解要怎么进行缩放处理,为了简单起见我们假设下一阶段CNN所需要的输入图片大小是个正方形图片227*227。因为我们经过selective search得到的是矩形框,paper试验了两种不同的处理方法:各向异性缩放和各向同性缩放。

通过上面处理完后,可以得到指定大小的图片,因为我们后面还要继续用这2000个候选框图片,继续训练CNN、SVM。然而人工标注的数据一张图片中就只标注了正确的bounding box,我们搜索出来的2000个矩形框也不可能会出现一个与人工标注完全匹配的候选框。因此我们需要用IOU为2000个bounding box打标签,以便下一步CNN训练使用。在CNN阶段,如果用selective search挑选出来的候选框与物体的人工标注矩形框的重叠区域IoU大于0.5,那么我们就把这个候选框标注成物体类别,否则我们就把它当做背景类别。

b. 利用CNN提取特征向量

提取特征向量分为三个阶段,网络结构设计阶段、网络有监督预训练阶段和fine-tuning(微调)阶段。
网络架构设计有两个可选方案:第一选择经典的AlexNet,第二选择VGG16。经过测试AlexNet精度为58.5%,VGG16精度为66%。VGG这个模型的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是AlexNet的7倍。为了简单起见,我们就直接选用AlexNet进行讲解。AlexNet特征提取部分包含了5个卷积层、2个全连接层,在AlexNet中p5层神经元个数为9216、f6、f7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。

参数初始化部分:物体检测的一个难点在于,物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的。这种情况下,最好的是采用某些方法,把参数初始化了,然后在进行有监督的参数微调,采用的是有监督的预训练33 。所以paper在设计网络结构的时候,是直接用AlexNet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。网络优化求解:采用随机梯度下降法,学习速率大小为0.001。

Fine-tuning阶段,继续采用selective search搜索出来的候选框,然后处理到指定大小图片,继续对上面预训练的CNN模型进行fine-tuning训练。假设要检测的物体类别有N类,那么我们就需要把上面预训练阶段的CNN模型的最后一层给替换掉,替换成N+1个输出的神经元(加1,表示还有一个背景),然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变;接着就可以开始继续随机梯度下降(SGD)训练了。开始的时候,SGD学习率选择0.001,在每次训练的时候,我们batch size大小选择128,其中32个事正样本、96个事负样本。

参见Fine-tuning:https://blog.csdn.net/weixin_42137700/article/details/82107208

c. 利用SVM进行特征向量分类

利用SVM进行特征向量分类是一个二分类问题,假设我们要检测车辆。我们知道只有当bounding box把整辆车都包含在内,那才叫正样本;如果bounding box没有包含到车辆,那么我们就可以把它当做负样本。但问题是当我们的检测窗口只有部分包好物体,那该怎么定义正负样本呢?作者测试了IOU阈值各种方案数值0,0.1,0.2,0.3,0.4,0.5。最后我们通过训练发现,如果选择IOU阈值为0.3效果最好(选择为0精度下降了4个百分点,选择0.5精度下降了5个百分点),即当重叠度小于0.3的时候,我们就把它标注为负样本。一旦CNN f7层特征被提取出来,那么我们将为每个物体累训练一个SVM分类器。当我们用CNN提取2000个候选框,可以得到20004096这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与SVM权值矩阵4096N点乘(N为分类类别数目,因为我们训练的N个SVM,每个SVM包好了4096个W),就可以得到结果了。

4.2.3. Fast R-CNN

Fast R-CNN34 同样使用大规模深度网络,Fast-RCNN和R-CNN相比,训练时间从84小时减少为9.5小时,一张图像的测试时间从47秒减少为0.32秒(不包括SS时间)。在PASCAL VOC 2007上的准确率相差不大,约在66.9%,主要优化了R-CNN在速度方面的缺陷。

之所以提出Fast R-CNN,主要是因为R-CNN存在以下几个问题:1. 训练分多步。R-CNN的训练先要fine tuning一个预训练的网络,然后针对每个类别都训练一个SVM分类器,最后还要用regressors对bounding box进行回归,另外region proposal也要单独用selective search的方式获得,步骤比较繁琐。2. 时间和内存消耗比较大。在训练SVM和回归的时候需要用网络训练的特征作为输入,特征保存在磁盘上再读入的时间消耗还是比较大的。3. 测试的时候也比较慢,每张图片的每个region proposal都要做卷积,重复操作太多。

图 27 Fast R-CNN 结构

Fast R-CNN网络有两个输入:图像和对应的region proposal。其中region proposal由selective search方法得到,没有表示在流程图中。对每个类别都训练一个回归器,且只有非背景的region proposal才需要进行回归。

ROI Pooling的作用是对不同大小的region proposal,从最后卷积层输出的feature map提取大小固定的feature map。简单讲可以看做是SPP Net的简化版本,因为全连接层的输入需要尺寸大小一样,所以不能直接将不同大小的region proposal映射到feature map作为输出,需要做尺寸变换。在Fast R-CNN35中,VGG16网络使用H=W=7的参数,即将一个hw的region proposal分割成HW大小的网格,然后将这个region proposal映射到最后一个卷积层输出的feature map,最后计算每个网格里的最大值作为该网格的输出,所以不管ROI Pooling之前的feature map大小是多少,ROI pooling后得到的feature map大小都是H*W。

因此,可以看出Fast R-CNN主要有3个改进:1. 卷积不再是对每个region proposal进行,而是直接对整张图像,这样减少了很多重复计算。原来RCNN是对每个region proposal分别做卷积,因为一张图像中有2000左右的region proposal,肯定相互之间的重叠率很高,因此产生重复计算;2. 用ROI pooling进行特征的尺寸变换,因为全连接层的输入要求尺寸大小一样,因此不能直接把region proposal作为输入;3. 将regressor放进网络一起训练,每个类别对应一个regressor,同时用softmax代替原来的SVM分类器。

在损失函数上将分类的loss和回归的loss整合在一起,其中分类采用log loss,即对真实分类的概率取负log,而回归的loss和R-CNN基本一样。分类层输出N+1维,表示N个类和1个背景类。

Fast R-CNN采用SVD分解改进全连接层。如果是一个普通的分类网络,那么全连接层的计算应该远不及卷积层的计算,但是针对object detection,Fast R-CNN在ROI pooling后每个region proposal都要经过几个全连接层,这使得全连接层的计算占网络的计算将近一半,如图 28,所以作者采用SVD来简化全连接层的计算。

图 28 采用SVD改进全连接层

Fast RCNN将RCNN众多步骤整合在一起,不仅大大提高了检测速度,也提高了检测准确率。其中,对整张图像卷积而不是对每个region proposal卷积,ROI Pooling,分类和回归都放在网络一起训练的multi-task loss是算法的三个核心。另外还有SVD分解等是加速的小贡献,数据集的增加时mAP提高的小贡献。

但是,Fast R-CNN依旧用SS提取RP(SS耗时2-3s,特征提取耗时0.32s);无法满足实时应用,没有真正实现端到端训练测试;利用了GPU,但是区域建议方法是在CPU上实现的。

4.2.4. Faster R-CNN

https://tryolabs.com/blog/2018/01/18/faster-r-cnn-down-the-rabbit-hole-of-modern-object-detection/

Faster R-CNN36 设计了提取候选区域的网络RPN,代替了费时的SS方法,将特征提取、proposal提取、Bounding Box Regression、Classification整合到一个网络中,使得检测速度大幅提升,一张图像的测试时间从2秒减少为0.2秒(前者包括SS时间),在PASCAL VOC 2007上的准确率基本相同,为66.9%。

图 29 Faster R-CNN网络结构

Faster R-CNN的流程如下:

  1. Faster R-CNN和Fast R-CNN相同,首先使用CNN网络提取候选图像的特征图,该特征图被共享用于后续RPN(Region Proposal Network)层和全连接(fully connection)层中;
  2. RPN网络用于生成区域候选图像块,该层通过softmax判断锚点(anchors)属于前景(foreground)或者背景(background),再利用边界框回归(bounding box regression)修正anchors获得精确的proposals;
  3. 目标区池化(RoI Pooling),该层收集输入的特征图和候选的目标区域,综合这些信息后提取目标区域的特征图,送入后续全连接层判定目标类别;
  4. 利用目标区域特征图计算目标区域的类别,同再次边界框回归获得检测框最终的精确位置。

Faster R-CNN最大的亮点在于提出了一种有效定位目标区域的方法,然后按区域在特征图上进行特征索引,大大降低了卷积计算的时间消耗,所以速度上有了非常大的提升。但是,Faster R-CNN依然无法达到实时检测目标;此外,获取region proposal,在对每个proposal分类计算量仍然比较大。

RPN网络由ZF网络的前5层得到特征图,在输入到RPN网络中,在特征图上滑动窗口,神经网络用于物体分类+框位置的回归,滑动窗口的位置提供了物体的大体位置信息,框的回归提供了框更精确的位置。

4.2.5. Mask R-CNN

Mask R-CNN可以看做是一个通用实例分割架构,Mask R-CNN以Faster R-CNN原型,增加了一个分支用于分割任务,Mask R-CNN比Faster R-CNN速度慢一些,达到了5fps,可用于人的姿态估计等其他任务。

Mask R-CNN的流程如下:

  1. 首先,输入一幅你想处理的图片,然后进行对应的预处理操作,或者预处理后的图片;
  2. 然后,将其输入到一个预训练好的神经网络中(RestNet等)获得对应的feature map;
  3. 接着,对这个feature map中的每一点设定预定个的RoI,从而获得多个候选RoI;
  4. 接着,将这些候选的RoI送入RPN网络进行二值分类(前景或背景)和BB回归,过滤掉一部分候选的RoI;
  5. 接着,对这些剩下的RoI进行RoI Align操作(即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来)部分候选的RoI;
  6. 最后,对这些RoI进行分类(N类别分类)、B Box回归和MASK生成(在每一个RoI里面进行FCN操作)。

Mask R-CNN分析了RoI Pool的不足,提升了RoI Align,提升了检测和实例分割的效果;将实例分割分解为分类和mask生成两个分支,依赖于分类分支所预测的类别标签来选择输出对应的mask。同时利用Binary Loss代替Multinomial Loss,消除了不同类别的mask之间的竞争,生成了准确的二值mask;Mask R-CNN并行进行分类和mask生成任务,对模型进行了加速。

4.2.6. Cascade R-CNN

Cascade R-CNN深入研究了目标检测中的IoU阈值选取问题,并通过大量的实验分析验证了IoU阈值选取对检测器性能的影响,基于对以上问题的分析,提出了级联版的Faster R-CNN,也即Cascade R-CNN目标检测算法,在不使用任何trick的情况下,在MS COCO通用目标检测数据集上展现了非常出色的性能。

图 30 几种网络结构的示意图

图 30(d)所示是Cascade R-CNN的结构,前半部分和Faster R-CNN结构相同,只是在尾部添加了级联结构。网络选用的级联结构共有多个stages, IoU阈值分别设定为递进的0.5/0.6/0.7,大于该阈值的选为正样本,其余均为负样本。

Cascade R-CNN改进了目标检测中长期以来无人问津但非常重要的问题——IoU阈值选取问题,是极具启发性的一篇工作,结合传统方法中的cascade思想和当前主流的Faster R-CNN检测框架,将two-stage方法在现有数据集上将检测性能又提升到了一个新高度。

4.3. 基于目标回归的检测算法

基于区域建议的深度学习模型精度虽高,但是在实时性上却达不到要求。其主要原因是在生成候选框时比较费时。而基于回归的方式就是彻底的去掉了region思想,也不使用RPN,直接在一个网络中进行回归和分类。其代表的方法主要有YOLO和SSD。由于减少了一个网络同时可以减少一些重复的计算,所以其在速度上有了较大的提升。

图 31 几种算法的对比

4.3.1. YOLO v1

YOLO37 的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。网络使用小卷积,即:11和33 (GoogLeNet)。虽然Faster R-CNN中也直接用整张图作为输入,但是Faster R-CNN整体还是采用了R-CNN那种proposal + classifier的思想,只不过是将提取proposal的步骤放在CNN中实现了,而YOLO则采用直接回归的思路。

图 32 YOLO v1的实现方法

YOLO将一幅图像分成S * S个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。每个网格要预测B个bounding box,每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。这个confidence代表了所预测的box中含有object的置信度和这个box预测的两重信息,其值是这样计算的:

其中如果有object落在一个grid cell里,第一项取1,否则取0。 第二项是预测的bounding box和实际的groundtruth之间的IoU值。每个bounding box要预测(x, y, w, h)和confidence共5个值,每个网格还要预测一个类别信息,记为C类。则S * S个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是SS(5*B+C)的一个tensor。整个网络的结构如图 33所示。

图 33 YOLO v1算法结构

YOLO v1的优缺点:

  1. 速度快,其增强版在Tian X GPU上能跑到45fps,简化版能达到155fps;
  2. 对靠的比较近的物体以及小物体效果不好,因为默认的每一个格子只检测一个物体;
  3. 由于格子是方正的,所对于一些不常见的形状泛化能力较差。

4.3.2. YOLOv2(YOLO9000)算法

YOLOV2主要是在YOLO上进行了大规模的改进,提高了MAP值,保证了速度,是目前在速度方面做得最好的模型。其具体改进方面如下:

  1. 过拟合方面:去掉了dropout层,根据Inception Net的思想选择了Bath Normalization在每一层的输入进行归一化,使输入的数据有相同的分布,加速学习的效率也避免过拟合;
  2. 改变模型的输入:目前对于一些常见的模型均是在ImageNet上进行预训练,然后在新的数据集上进行微调的,对于YOLO v1来说存在一个问题就是ImageNet使用的是224*224的分辨率作为输入,但是低分辨率不利于检测,所以训练检测模型时直接以448 * 448作为基础,这样直接使用预训练的分辨率迁移就会导致网络对新分辨率的适应性变差,因此YOLO v2在ImageNet上训练分类模型时添加了把448 * 448转化为224 * 224的微调部分,使其在输入的时候直接适应高分辨率,这样整个模型的mAP提高了约4%;
  3. 使用锚点(anchor boxes):在YOLO v1中,由于输出的图片被划分成了7 * 7的格子,每个格子使用了2个边框,最后采用全连接的方式直接对边界框进行预测。由于在选取的时候是根据具体图片的宽和高进行的,因此对于图片中的不同宽度比和不同高度比的物体定位较为困难。YOLO v2采用Faster R-CNN中的anchor的思想,对特征图中的每个锚点进行预测,预测的预选框形状是事先预测好的,然后对每一个框预测4个坐标值,一个置信度和个类别数(和Faster不一样,这是直接基于预选框做预测)。在模型的输入上,使用416 * 416的输入经过32倍下采样之后变成13*13的奇数大小,因为奇数大小在划分格子的时候整个图只有一个中心区域,对于一副图中,大的对象一般会占据图像的中心,所以希望用一个区域预测。相对于YOLO v1此时的BBox反而变多;
  4. 候选框大小:YOLO v2采用对数据集进行聚类的方式,找出对应的5个先验框作为预测过程中的anchor方法采用的框;
  5. 添加passthrough层:即将低层大区域特征转化成小区域和高层小区域融合以达到特征融合的目的解决小目标问题。对于一个2626的特征,抽取22的区域将转化为通道数(变成4个通道);
  6. 多尺度训练,由于YOLO v2去掉了全连接层,因此同一个网络可以对不同的输入尺寸进行训练。增强了模型的鲁棒性,当然改变尺寸也就意味着要对模型输出后的检测层进行修改;
  7. 使用新的Darknet-19网络结构,YOLO 9000的结构和YOLOv2的相同,区别在于YOLO 9000可以识别9000类的物品。采用了分类和检测联合训练的策略,在ImageNet上训练分类,在COCO数据集上训练检测,这样就可以扩充检测出的类别(因为ImageNet上的类别是比较多的),由于两个物体种类并不是完全互斥的,因此采用一种层级的方法,建立一个树结构,在预测时会给出一个区域和树状概率图,根据树的分支找到对应的概率图就是所需要的类别。

图 34 YOLO v2/YOLO 9000网络结构

4.3.3. YOLO v3

YOLO v3更多的是一种总结性的东西,其主要是在YOLO v2的基础上有以下几方面的改进:

  1. 改变预测函数:使用逻辑回归预测即将softmax改为sigmoid。主要是有的物品也许不属于一类。比如woman即属于woman也属于man。
  2. 改变网络结构:加入残差的思想以加深网络的构造,将网络扩深为Darknet-53。
  3. 采用FPN的思想,多个尺度相融合来进行预测。

4.3.4. YOLO v4

PyTorch版YOLO v4:

  • PyTorch版YOLOv4更新了!不仅适用于自定义数据集,还集成了注意力和MobileNet
  • 上述链接内容摘要: 一个基于PyTorch深度学习框架的YOLO v4复现版本,该版本基于YOLO v4作者给出的实现AlexeyAB/darknet,并在PASCAL VOC、COCO和自定义数据集上运行。项目地址:https://github.com/argusswift/YOLOv4-PyTorch
  • MobileNet YOLOv4项目地址

4.3.5. YOLO v5

一个小伙伴的笔记: YOLOv5在coco数据集的实战笔记

4.3.6. SSD

SSD38 是一种采用高低尺度相结合的策略,基于回归的一种模型,在实现上采用VGG-16网络为基础。去掉最后的全连接层改成卷积层,增加4个卷积层来构造网络结构。然后结合前面部分高纬度的网络结构,总共挑选出5个卷积层分别使用3*3的卷积计算,然后并行生成两个分支,一个是用来分类的,一个是用来预测边框的。最后在将所有的分支在通道上进行拼接(类似于inception),最终利用softmax进行分类。与YOLO对比,其具体流程如图 35所示。

SSD的算法流程:输入一幅图片,让图片经过卷积神经网络(CNN)提取特征,并生成 feature map;抽取其中六层的feature map,然后再 feature map 的每个点上生成 default box(各层的个数不同,但每个点都有);将生成的所有 default box 都集合起来,全部丢到 NMS(极大值抑制)中,输出筛选后的default box,并输出。

图 35 SSD和YOLO网络结构对比

通过对比可以发现,SSD的优点就是它生成的default box是多尺度的,这是因为SSD生成default box的feature map不仅仅是CNN输出的最后一层,还有利用比较浅层的feature map生成的default box。所以SSD对于小目标的检测一定会优于YOLO v1(小目标经过高层卷积后特征几乎都消失了)。同时,又因为SSD生成的多尺度default box一定有更高概率找到更加贴近于Ground Truth的候选框,所以模型的稳定性是肯定比YOLO强的(YOLO的bounding box很少,只有98个,如果距离GT比较远,那么修正bounding box的线性回归就不成立,训练时模型可能会跑飞)。但是SSD的候选框数量是三种经典网络中最多的,有8732个,所以训练时应该会比较慢。

SSD算法细节参见:深度学习 – SSD 算法流程详解

5. 语义分割(Semantic Segmentation)算法综述

参见:

  • 史上最全语义分割综述(FCN,UNet,SegNet,Deeplab,ASPP…)
  • 图像语义分割入门+FCN/U-Net网络解析

我们知道图像分类任务是把一张图片划分为某个类别,而语义分割则是更进一步的分类 — 在像素级别上的分类,属于同一类的像素都要被归为一类。语义分割通常又被称作目标分割,需要区分到图中每一点像素点,而不仅仅是用矩形框框住,但是对同一物体的不同实例不需要单独分割出来。早起的分割算法主要是灰度分割,条件随机场等一些较为传统的算法。

早起的分割算法主要是灰度分割,条件随机场等一些较为传统的算法。与此同时随着深度学习技术的不断发展,深度学习在语义分割任务中大放异彩,取得了骄人的成绩。从第一篇真正意义上的深度学习方法语义分割模型FCN说起,经典的SegNet,Deeplab系列,DenseASPP等等,再到近些年来(2020年以前)研究热点的NAS方法。不断的刷新各个分割数据集的Leaberboard。

5.1. 数据集与评价指标

5.1.1. 常用数据集

VOC2012:有20类目标,这些目标包括人类、机动车类以及其他类,可用于目标类别或背景的分割。

MSCOCO:是一个新的图像识别、分割和图像语义数据集,是一个大规模的图像识别、分割、标注数据集。它可以用于多种竞赛,与本领域最相关的是检测部分,因为其一部分是致力于解决分割问题的。该竞赛包含了超过80个物体类别。

Cityscapes :50个城市的城市场景语义理解数据集。

Stanford Background Dataset:至少有一个前景物体的一组户外场景。

Pascal Context:有400多类的室内和室外场景。

5.1.2. 评价指标

像素精度(pixel accuracy):
每一类像素正确分类的个数/每一类像素的实际个数;

均像素精度(mean pixel accuracy):
每一类像素的精度的平均值;

平均交并比(Mean Intersection over Union):
MIoU是指求出每一类的IOU取平均值。IOU指的是两块区域相交的部分/两个部分的并集,如下图中:绿色部分/总面积。这样的评价指标可以判断目标的捕获程度(使预测标签与标注尽可能重合),也可以判断模型的精确程度(使并集尽可能重合)。

5.2. 基于滑窗的语义分割模型

在2012年,Ciresan用CNN来挑战语义分割任务。Ciresan采取滑窗的方式,取以每个像素点为中心的小图像块(patch)输入CNN来预测该像素点的语义标签。这是个很有意义的尝试,打破CNN只用于目标分类的先河,作者也取得了当年state-of-art的成就。

我们以一张遥感图像的语义分割来讲解这个方法。我们按照预先设定好的窗口大小(比如77)从原图中取出一个77大小的图片。然后,将取出的图片送入卷积神经网络中。从而预测出该图片属于哪一类,然后将这个窗口的中心像素打上这个标签。重复这个取窗口和预测的过程,直到所有的像素点都被打上了对应的标签。不过,这个方法的缺点也很明显:

  1. 需要遍历每个像素点提取patch进行训练、预测,速度慢、很耗时;
  2. 取多大的窗口才合适?太小了缺少上下文信息,太大了会增加很多计算量;无疑很多窗口之间存在着大量冗余计算。

5.3. 基于候选区域的语义分割模型

滑窗方法的缺点在目标检测领域同样存在,学者用基于候选区域的方法解决这问题。而在语义分割领域,基于区域选择的几个算法也主要是由前人的有关于目标检测的工作渐渐延伸到语义分割的领域的。

先说目标检测阶段的模型发展进程:R-CNN、Fast R-CNN、Faster R-CNN.
语义分割阶段:Mask R-CNN、Mask Scoring R-CNN

5.4. 几个基于编码器-解码器(上采样/反卷积)结构的语义分割模型

5.4.1. FCN(2014/11/14)

论文:Fully Convolutional Networks for Semantic Segmentation

FCN的主要贡献:将端到端的卷积网络推广到语义分割中;重新将预训练好的Imagenet网络用于分割问题中;使用反卷积层进行上采样;提出了跳跃连接来改善上采样的粗糙程度。本文算是语义分割开天辟地之作,其全连接层的结构在最先进的分割模型中仍在使用。

5.4.2. U-Net(2015/5/18)

论文:U-Net: Convolutional Networks for Biomedical Image Segmentation

继承FCN的思想,继续进行改进。但是相对于FCN,有几个改变的地方,U-Net是完全对称的,且对解码器(应该自Hinton提出编码器、解码器的概念来,即将图像->高语义feature map的过程看成编码器,高语义->像素级别的分类score map的过程看作解码器)进行了加卷积加深处理,FCN只是单纯的进行了上采样。

Skip connection:两者都用了这样的结构,虽然在现在看来这样的做法比较常见,但是对于当时,这样的结构所带来的明显好处是有目共睹的,因为可以联合高层语义和低层的细粒度表层信息,就很好的符合了分割对这两方面信息的需求。在FCN中,Skip connection的联合是通过对应像素的求和,而U-Net则是对其的channel的concat过程。

6. 知识点补充

6.1. 关于图像的基本知识点

  1. 图像的数组、张量和维度表示
  2. 关于通道、RGB等知识点可以参见Photoshop教程。

6.2. OTSU算法

  1. OTSU算法(大津法—最大类间方差法)原理及实现;
  2. OpenCV官方文档;
  3. GtiHub-图像处理经典常用算法及论文复现

大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出。从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。

它被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

应用:是求图像全局阈值的最佳方法,应用不言而喻,适用于大部分需要求图像全局阈值的场合。
优点:计算简单快速,不受图像亮度和对比度的影响。

缺点:对图像噪声敏感;只能针对单一目标分割;当目标和背景大小比例悬殊、类间方差函数可能呈现双峰或者多峰,这个时候效果不好。

OpenCV接口:

double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)

6.3. Softmax详解

参见:

  • Softmax详解
  • GitHub项目地址:easy-algorithm-interview-and-practice

图 36 softmax的计算方式

Question: 如何选取Softmax回归分类器?

如果你在开发一个音乐分类的应用,需要对k种类型的音乐进行识别,那么是选择使用softmax分类器呢,还是使用logistic回归算法建立k个独立的二元分类器呢?

这一选择取决于你的类别之间是否互斥,例如,如果你有四个类别的音乐,分别为:古典音乐、乡村音乐、摇滚乐和爵士乐,那么你可以假设每个训练样本只会被打上一个标签(即:一首歌只能属于这四种音乐类型的其中一种),此时你应该使用类别数k = 4的softmax回归。(如果在你的数据集中,有的歌曲不属于以上四类的其中任何一类,那么你可以添加一个“其他类”,并将类别数 k 设为5。)

如果你的四个类别如下:人声音乐、舞曲、影视原声、流行歌曲,那么这些类别之间并不是互斥的。例如:一首歌曲可以来源于影视原声,同时也包含人声 。这种情况下,使用4个二分类的logistic回归分类器更为合适。这样,对于每个新的音乐作品,我们的算法可以分别判断它是否属于各个类别。

现在我们来看一个计算视觉领域的例子,你的任务是将图像分到三个不同类别中。

  1. 假设这三个类别分别是:室内场景、户外城区场景、户外荒野场景。你会使用sofmax回归还是 3个logistic 回归分类器呢?
  2. 现在假设这三个类别分别是室内场景、黑白图片、包含人物的图片,你又会选择 softmax 回归还是多个 logistic 回归分类器呢?

在第一个例子中,三个类别是互斥的,因此更适于选择softmax回归分类器 。而在第二个例子中,建立三个独立的 logistic回归分类器更加合适。

6.4. 特征融合

参见:深度特征融合—高低层(多尺度)特征融合

6.4.1. 基本概念

在很多工作中,融合不同尺度的特征是提高分割性能的一个重要手段。低层特征分辨率更高,包含更多位置、细节信息,但是由于经过的卷积更少,其语义性更低,噪声更多。高层特征具有更强的语义信息,但是分辨率很低,对细节的感知能力较差。如何将两者高效融合,取其长处,弃之糟泊,是改善分割模型的关键。

很多工作通过融合多层来提升检测和分割的性能,按照融合与预测的先后顺序,分类为早融合(Early fusion)和晚融合(Late fusion)。

早融合(Early fusion): 先融合多层的特征,然后在融合后的特征上训练预测器(只在完全融合之后,才统一进行检测)。这类方法也被称为skip connection,即采用concat、add操作。这一思路的代表是Inside-Outside Net(ION)和HyperNet。 两个经典的特征融合方法:

  1. concat:系列特征融合,直接将两个特征进行连接。两个输入特征x和y的维数若为p和q,输出特征z的维数为p+q;
  2. add:并行策略,将这两个特征向量组合成复向量,对于输入特征x和y,z = x + iy,其中i是虚数单位。

晚融合(Late fusion):通过结合不同层的检测结果改进检测性能(尚未完成最终的融合之前,在部分融合的层上就开始进行检测,会有多层的检测,最终将多个检测结果进行融合)。这一类研究思路的代表有两种:

  1. feature不融合,多尺度的feture分别进行预测,然后对预测结果进行综合,如Single Shot MultiBox Detector (SSD) , Multi-scale CNN(MS-CNN)
  2. feature进行金字塔融合,融合后进行预测,如Feature Pyramid Network(FPN)等。

6.4.2. add与concat

参见:深度特征融合—理解add和concat之多层特征融合

在各个网络模型中,ResNet,FPN等采用的element-wise add来融合特征,而DenseNet等则采用concat来融合特征。那add与concat形式有什么不同呢?事实上两者都可以理解为整合特征图信息。只不过concat比较直观,而add理解起来比较生涩。

图 37 特征融合 concat与add

从图中可以看出,concat是通道数增加,而add是特征图相加,通道数不变。可以理解为,add是描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类是有益的。而concat是通道数的合并,也就是说描述图像本身的特征数(通道数)增加了,而每一特征下的信息是没有增加。

concat每个通道对应着对应的卷积核。而add形式则将对应的特征图相加,再进行下一步卷积操作,相当于加了一个先验:对应通道的特征图语义类似,从而对应的特征图共享一个卷积核(对于两路输入来说,如果是通道数相同且后面带卷积的话,add等价于concat之后对应通道共享同一个卷积核)。

因此add可以认为是特殊的concat形式。但是add的计算量要比concat的计算量小得多。add相当于加了一种prior,当两路输入可以具有“对应通道的特征图语义类似”(可能不太严谨)的性质的时候,可以用add来替代concat,这样更节省参数和计算量(concat是add的2倍)。

6.5. 多尺度模型

参见:深度学习中的多尺度模型设计

所谓多尺度,实际上就是对信号的不同粒度的采样,通常在不同的尺度下我们可以观察到不同的特征,从而完成不同的任务。

如上两个图是同样的一维信号在不同采样频率下的结果,这是一条精度曲线。通常来说粒度更小/更密集的采样可以看到更多的细节,粒度更大/更稀疏的采样可以看到整体的趋势,不过此处由于使用了不同的颜色,曲线本身也存在较大的波动,所以粒度更小的右图反而能更直观的看到各个曲线的整体性能比较结果。

很多时候多尺度的信号实际上已经包含了不同的特征,为了获取更加强大的特征表达,在传统图像处理算法中,有一个很重要的概念,即图像金字塔和高斯金字塔。采样的方式可以是不重叠或者重叠的,如果是不重叠的,采样尺度因子为2,那就是每增加一层,行列分辨率为原来的1/2。

当然,为了满足采样定理,每一个采样层还需要配合平滑滤波器,因此更常用的就是高斯金字塔,每一层内用了不同的平滑参数,在经典的图像算子SIFT中被使用。

图 38 图像金字塔


  1. Rosenblatt, Frank. “The perceptron: a probabilistic model for information storage and organization in the brain.” Psychological review 65.6 (1958): 386. ↩︎

  2. Hopfield, John J. “Neural networks and physical systems with emergent collective computational abilities.” Proceedings of the national academy of sciences 79.8 (1982): 2554-2558. ↩︎

  3. Hayes, Brian. “First links in the Markov chain.” American Scientist 101.2 (2013): 252. ↩︎

  4. Smolensky, Paul. Information processing in dynamical systems: Foundations of harmony theory. No. CU-CS-321-86. COLORADO UNIV AT BOULDER DEPT OF COMPUTER SCIENCE, 1986. ↩︎

  5. Bourlard, Hervé, and Yves Kamp. “Auto-association by multilayer perceptrons and singular value decomposition.” Biological cybernetics 59.4-5 (1988): 291-294. ↩︎

  6. Marc’Aurelio Ranzato, Christopher Poultney, Sumit Chopra, and Yann LeCun. “Efficient learning of sparse representations with an energy-based model.” Proceedings of NIPS. 2007. ↩︎

  7. Kingma, Diederik P., and Max Welling. “Auto-encoding variational bayes.” arXiv preprint arXiv:1312.6114 (2013). ↩︎

  8. Vincent, Pascal, et al. “Extracting and composing robust features with denoising autoencoders.” Proceedings of the 25th international conference on Machine learning. ACM, 2008. ↩︎

  9. Lecun Y, Bottou L., Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11):2278-2324. ↩︎

  10. Bengio, Yoshua, et al. “Greedy layer-wise training of deep networks.” Advances in neural information processing systems 19 (2007): 153. ↩︎

  11. Zeiler, Matthew D., et al. “Deconvolutional networks.” Computer Vision and Pattern Recognition (CVPR), 2010 IEEE Conference on. IEEE, 2010. ↩︎

  12. Kulkarni, Tejas D., et al. “Deep convolutional inverse graphics network.” Advances in Neural Information Processing Systems. 2015. ↩︎

  13. Goodfellow, Ian, et al. “Generative adversarial nets.” Advances in Neural Information Processing Systems. 2014. ↩︎

  14. Hochreiter, Sepp, and Jürgen Schmidhuber. “Long short-term memory.” Neural computation 9.8 (1997): 1735-1780. ↩︎

  15. Chung, Junyoung, et al. “Empirical evaluation of gated recurrent neural networks on sequence modeling.” arXiv preprint arXiv:1412.3555 (2014). ↩︎

  16. Graves, Alex, Greg Wayne, and Ivo Danihelka. “Neural turing machines.” arXiv preprint arXiv:1410.5401 (2014). ↩︎

  17. He, Kaiming, et al. “Deep residual learning for image recognition.” arXiv preprint arXiv:1512.03385 (2015). ↩︎

  18. He, Kaiming, et al. “Deep residual learning for image recognition.” arXiv preprint arXiv:1512.03385 (2015). ↩︎

  19. Cambria, Erik, et al. “Extreme learning machines [trends & controversies].” IEEE Intelligent Systems 28.6 (2013): 30-59. ↩︎

  20. Maass, Wolfgang, Thomas Natschläger, and Henry Markram. “Real-time computing without stable states: A new framework for neural computation based on perturbations.” Neural computation 14.11 (2002): 2531-2560. ↩︎

  21. Kohonen, Teuvo. “Self-organized formation of topologically correct feature maps.” Biological cybernetics 43.1 (1982): 59-69. ↩︎

  22. Jaderberg, Max, et al. “Spatial Transformer Networks.” In Advances in neural information processing systems (2015): 2017-2025. ↩︎

  23. Cortes, Corinna, and Vladimir Vapnik. “Support-vector networks.” Machine learning 20.3 (1995): 273-297. ↩︎

  24. Lecun Y, Bottou L., Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11):2278-2324. ↩︎

  25. Krizhevsky A, Sutskever I, Hinton G. ImageNet Classification with Deep Convolutional Neural Networks[J]. Advances in neural information processing systems, 2012, 25(2). ↩︎

  26. Zeiler M D, Fergus R. Visualizing and Understanding Convolutional Networks[J]. 2013. ↩︎

  27. Simonyan K , Zisserman A . Very Deep Convolutional Networks for Large-Scale Image Recognition[J]. Computer ence, 2014. ↩︎

  28. Szegedy C , Liu W , Jia Y , et al. Going Deeper with Convolutions[J]. 2014. ↩︎

  29. Szegedy C , Vanhoucke V , Ioffe S , et al. Rethinking the Inception Architecture for Computer Vision[J]. 2015. ↩︎

  30. He K , Zhang X , Ren S , et al. Deep Residual Learning for Image Recognition[C]// IEEE Conference on Computer Vision & Pattern Recognition. IEEE Computer Society, 2016. ↩︎

  31. Girshick R , Donahue J , Darrell T , et al. Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation[C]// CVPR. IEEE, 2014.Tian Z et al. Detecting text in natural image with connectionist text proposal network[C]//European conference on computer vision. Springer, Cham, 2016. ↩︎

  32. Uijlings J R R , Sande K E A V D , Gevers T , et al. Selective Search for Object Recognition[J]. International Journal of Computer Vision, 2013, 104(2):154-171. ↩︎

  33. Girshick R , Donahue J , Darrell T , et al. Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation[C]// CVPR. IEEE, 2014.Tian Z et al. Detecting text in natural image with connectionist text proposal network[C]//European conference on computer vision. Springer, Cham, 2016. ↩︎

  34. Girshick R . Fast R-CNN[J]. Computer ence, 2015. ↩︎

  35. Girshick R . Fast R-CNN[J]. Computer ence, 2015. ↩︎

  36. Ren S , He K , Girshick R , et al. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2015, 39(6). ↩︎

  37. Redmon J , Divvala S , Girshick R , et al. You Only Look Once: Unified, Real-Time Object Detection[C]// Computer Vision & Pattern Recognition. IEEE, 2016. ↩︎

  38. Liu W , Anguelov D , Erhan D , et al. SSD: Single Shot MultiBox Detector[J]. 2016. ↩︎

CV学习笔记 | CV综述 [2020.10.01]相关推荐

  1. CV学习笔记-BP神经网络训练实例(含详细计算过程与公式推导)

    BP神经网络训练实例 1. BP神经网络 关于BP神经网络在我的上一篇博客<CV学习笔记-推理和训练>中已有介绍,在此不做赘述.本篇中涉及的一些关于BP神经网络的概念与基础知识均在< ...

  2. cv学习笔记(3)神经网络数学原理

    cv学习笔记(3)神经网络数学原理 根据一个神经网络例子来介绍 输入是年龄.收入.性别,输出是买车和不买车的概率.该神经网络包含一个输入层.一个隐含层.一个输出层,每个节点和下一层的所有节点都有连接, ...

  3. y空间兑换代码_【CV学习笔记】色彩空间

    关注"深度学习冲鸭",一起学习一起冲鸭! 设为星标,第一时间获取更多干货 作者:云时之间来源:知乎链接:https://zhuanlan.zhihu.com/p/103387082 ...

  4. FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇尾

    FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇一 FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇二 ...

  5. 【全栈之巅】Node.js + Vue.js 全栈开发王者荣耀手机端官网和管理后台学习笔记(4.1-4.10)

    [全栈之巅]Node.js + Vue.js 全栈开发王者荣耀手机端官网和管理后台学习笔记(4.1-4.10) 本项目是 学习Bilibili 全栈之巅 视频教程相关源码和体会 https://git ...

  6. 【全栈之巅】Node.js + Vue.js 全栈开发王者荣耀手机端官网和管理后台学习笔记(3.6-3.10)

    [全栈之巅]Node.js + Vue.js 全栈开发王者荣耀手机端官网和管理后台学习笔记(3.6-3.10) 本项目是 学习Bilibili 全栈之巅 视频教程相关源码和体会 https://git ...

  7. 【CV学习笔记】图像预处理warpaffine-cuda加速

    1.前言 在上个学习笔记中学习warpaffine,并且在opencv下面实现了图像的预处理,而warpaffine可以很好的利用cuda加速来实现,于是基于手写AI的项目,又学习了warpaffie ...

  8. CV学习笔记-推理和训练

    推理和训练 1. 概述 训练(Training): 一个初始神经网络通过不断的优化自身参数,来让自己变得准确.这整个过程就称之为训练(Training) 推理(Inference): 你训练好了一个模 ...

  9. CV学习笔记-浅述CV方向

    浅述CV方向 一.浅述人工智能的一些术语 1. 人工智能初探 人工智能是通过机器来模拟人类认知能力的技术 人工智能最核心的能力就是根据给定的输入做出判断或预测 关键时间节点:1956年,达特茅斯会议, ...

最新文章

  1. 凶猛的飞禽 超跑奥迪
  2. 【深入Java虚拟机】二 类加载与双亲委派
  3. LEGv8指令集中分支和跳转的地址范围
  4. PrintJ的设计模式之旅——1.模式之父
  5. 分享一个帮助你在线测试响应式设计的web工具 - Screenqueri.es
  6. 网络爬虫--13.数据提取之JSON与JsonPATH
  7. [UE4] Pawn 移动时没有碰撞的解决办法:使用 AddActorWorldOffset 并勾选 Sweep
  8. 网易云课堂测试微专业前置课
  9. DB2 开发系列 从入门开始--概述
  10. 纯JavaScript实现HTML5 Canvas六种特效滤镜
  11. 《终身成长》卡罗尔 德韦克_epub+mobi+azw3
  12. 计算机技术工种技师,技师10个职业(工种)国家职业标准要求申报条件
  13. 机器学习——模型融合
  14. 众泰Z700导航升级高德地图
  15. Unbuntu22.04安装教程以及Unbuntu下C++环境的配置
  16. eNSP路由器连接外网
  17. 叁拾伍- Django Websocket 绝望之旅(dwebsocket 以及 channels)
  18. android开发手机推荐 2015,绝对巅峰 目前Android最强的8款手机推荐
  19. 制作启动U盘重装系统
  20. Redis6客户端工具——Jedis

热门文章

  1. 浅析丨实体交易如何上链?
  2. 网站分析实战——如何以数据驱动决策:提升网站价值
  3. UE4 关于远距离没有阴影的问题解决方案
  4. Arm确认对华禁售先进处理器IP!平头哥宣布:RISC-V成功运行安卓12
  5. Android8.0蓝牙配对失败和配对分析
  6. 极简面试自我介绍5句话公式,妹子一口气拿下阿里,美团,华为,网易等名企offer!
  7. 使用LSTM生成文本
  8. 基于log4net的日志组件扩展封装,实现自动记录交互日志 XYH.Log4Net.Extend(微服务监控)...
  9. 数分下第9讲(9.3节) 隐函数定理和逆映射微商
  10. 图书推荐:德鲁克管理思想精要(珍藏版)