zoukankan      html  css  js  c++  java
  • 计算机视觉中图像分类任务脉络梳理

    本文大致梳理了计算机视觉中图像分类的脉络,包括常用数据集、经典模型和性能对比。

    1 图像分类常用数据集

    以下是几种常用的分类数据集,难度依次递增。列举了各算法在各数据集上的性能排名。

    • MNIST,60k训练图像、10k测试图像、10个类别、图像大小1×28×28、内容是0-9手写数字。
    • CIFAR-10,50k训练图像、10k测试图像、10个类别、图像大小3×32×32。
    • CIFAR-100,50k训练图像、10k测试图像、100个类别、图像大小3×32×32。
    • ImageNet,1.2M训练图像、50k验证图像、1k个类别。每年会举行基于ImageNet数据集的ILSVRC竞赛,这相当于计算机视觉界奥林匹克。鉴于图像分类任务上,DL已经超越人类水平,ImageNet挑战赛在2017年是最后一届。

    2 图像分类经典结构

    基本架构 我们用conv代表卷积层、bn代表批量归一层、pool代表池化层。最常见的网络结构顺序是conv -> bn -> relu -> pool,其中卷积层用于提取特征、池化层用于减少空间大小。随着网络深度的进行,图像的空间大小将越来越小,而通道数会越来越大。当然也有不少其他架构。

    两个特点:纵观这些卷积神经网络提高效果的方向,主要是更深、更宽、更多的分支结构和短连接等;AlexNet提出了卷积网络5+3的结构,后续不少经典网络都是在此基础上改进。

    经典网络:

    • LeNet-5
    • AlexNet
    • ZF-Net
    • GoogLeNet
    • VGG
    • ResNet
    • ResNeXt
    • DenseNet
    • SENet

    2.1 LeNet-5

    早期卷积神经网络中最有代表性的架构,是Yann LeCun在1998年设计的,用于手写数字识别的卷积神经网络,当年美国很多银行用它来识别支票上面的手写数字。

    2.2 AlexNet

    2012年ILSVRC冠军,6千万参数。由于准确率远超传统方法的第二名(top5错误率为15.3%,第二名为26.2%),引起了很大的轰动。自此之后,CNN成为在图像识别分类的核心算法模型,带来了深度学习的大爆发。这里有整体架构的可视化具体的参数。

    特点:

    • 采用更深的网络结构,为了减弱梯度消失,使用Relu替换之前的sigmoid的作为激活函数;
    • 使用Dropout和数据扩充Data Augmentation抑制过拟合;
    • 使用Overlapping Pooling(覆盖的池化操作)
    • 多GPU训练和LRN(但是没啥用)

    2.3 ZF-Net

    2013年ILSVRC冠军,结构和AlexNet区别不大,分类效果也差不多。这篇文章的贡献在于,提出了一种CNN特征可视化方法:反池化、反激活、反卷积,从而成为CNN特征可视化的开山之作。

    2.4 VGG

    2014年ILSVRC亚军网络,1.38亿参数。由于网络结构十分简单,很适合迁移学习,因此至今VGG-16仍在广泛使用。

    特点:

    2.5 GoogLeNet

    2014年ILSVRC冠军网络。同样也是5+3的模式(以池化层为界),参数量约为5百万,核心模块是Inception Module。Inception历经了V1、V2、V3、V4等多个版本的发展,不断趋于完善。GoogLeNet取名中L大写是为了向LeNet致敬,而Inception的名字来源于盗梦空间中的"we need to go deeper"梗。

    Inception V1:加大深度、加大宽度(通过增加分支)、减少参数

    深度方面:层数更深,论文采用了22层,为了避免梯度消失问题,GoogLeNet在不同深度处(4b和4e处,以最大池化为界)增加了两个分支,来回传梯度。

    宽度方面:采用多分支分别处理然后拼接的Inception Module。

    • 用1×1、3×3、5×5、max pooling这四种核并行的方式,让网络自己决定该用什么样的卷积核;
    • 采用不同大小的卷积核意味着不同大小的感受野,可以捕捉到不同尺度的信息,最后拼接意味着不同尺度的特征进行信息融合;(不同于2011年Yann LeCun的交通标志识别模型,那个是不同层级特征,这个是不同视野)
    • 为了避免concat起来的feature map厚度过大,Inception模块在3×3前、5×5前、max pooling后分别加上了1×1的卷积核,降低feature map厚度。

    另外,为了减少参数,网络最后采用了average pooling来代替第一个全连接层,参数可以减少一个数量级。

    Inception V2:主要做了两个改动

    • 学习VGG网络,将7×7和5×5卷积分解成若干等效3×3卷积;(减少参数同时增加非线性转换)
    • 增加了BN层,加快收敛速度,且有一定的正则化效果;(配合其他操作:增大学习率,更彻底的对训练数据进行shuffle,减少数据增广中图像的光学畸变等;要达到V1结构相同的准确率,训练时间只有之前的1/14)

    Inception V3:主要在两个方面改造

    • 引入Factorization into small convolutions的思想,将一个较大的二维卷积拆成两个较小的一维卷积,比如将7×7卷积拆成1×7卷积和7×1卷积。适用于中度大小的feature map,对于m×m大小的feature map,建议m在12到20之间。作用是:1.节约参数,减小计算量,减轻过拟合;2.中间可以加一层relu激活,增加模型非线性表达能力;
    • 优化Inception Module的结构。现在模块中有35×35、17×17和8×8三种不同的结构。这些Inception Module只在网络的后部出现,前部还是普通的卷积层。并且还在Inception Module的分支中还使用了分支。

    Inception V4:结合了残差神经网络ResNet,进一步降低了0.4%的错误率

    2.6 ResNet


    2015年ILSVRC冠军网络。核心是带短连接的残差模块,其中主路径有两层卷积核(Res34),短连接把模块的输入信息直接和经过两次卷积之后的信息融合,相当于加了一个恒等变换。短连接是深度学习又一重要思想,除计算机视觉外,短连接思想也被用到了机器翻译、语音识别/合成领域。

    两篇论文,分别提出V1版V2版。

    结构特点:

    • 总体架构:类似5+3结构,第一个模块为普通卷积,第2、3、4、5为模块组,然后经过一个平均池化,直接送到最后一层fc;(注意:GoogleNet中将fc6换成了平均池化层,然后经过fc7,fc8,但是ResNet直接将fc7也省掉了)
    • 两种残差模块:除了左图的残差模块,对于很深的网络(超过50层),ResNet使用了更高效的瓶颈结构(BottleNeck)(主路径的第一层和第三层均为1×1卷积,如右图);
    • 两路信息融合时:若前后特征图厚度一致,则直接相加;若前后特征图厚度不一致,则用1×1卷积来线性变换(注:前后特征图尺寸不一致时,1×1卷积核的步长为2,起到了下采样的效果);
    • 更好的残差模块preResNet:作者在V2中对不同的残差单元做了细致的分析与实验,最优的残差结构如下图所示。改进前后一个明显的变化是采用pre-activation,BN和ReLU都提前了。

    残差网络解决了什么,为什么有效?

    背景要点:

    • NN好用的原因:一是表达能力特别强大,能拟合任意函数;二是免去了繁重的特征工程,特别适合于非结构化数据。
    • 但NN总是有一些问题,除了过拟合之外,还有特别常见的梯度消失/爆炸,和网络退化的问题。
    • 网络退化的原因:虽然56层网络的解空间包含了20层网络的解空间,但是我们在训练网络用的是随机梯度下降策略,往往解到的不是全局最优解,而是局部的最优解,显而易见56层网络的解空间更加的复杂,所以导致使用随机梯度下降算法无法解到最优解。
    • 残差网络解决了网络深度过大带来的网络退化问题。

    残差网络为何有效的三种解释:

    • 何恺明等人从前后向信息传播的角度给出了残差网络的一种解释。在反向传播过程中,由于模块学习的是F(x)+x,导数为F(x)的导数加1,因此后面的梯度能比较顺畅地传到前面,即抑制了梯度消失的现象;而在前向传播的过程中,由于普通网络中x在经过网络层时候总要乘以其中的权重矩阵,因此很难保持前后恒等,换句话说,当网络深度过大时候,超出的层因为没法保证这一模块的输入输出一致,导致模型退化,而残差模块F(x)+x因为加了一个恒等项,模块学习的就不再是恒等映射H(x)=x,而是H(x)=0,后者比前者更容易学习,因此在很大程度上解决了网络退化的问题。综上可以认为残差连接使得信息前后向传播更加顺畅。(当然也有人认为主要是解决的网络退化问题,因为梯度消失问题基本上已经通过relu、特殊的初始化、BN来解决了。残差模块虽然有助于减轻梯度消失,但主要还是解决了网络退化。)
    • 集成学习的角度。16年一篇论文指出,残差网络展开后实际上相当于一系列浅层网络的集成,在训练中贡献了梯度的是那些相对较短的路径。
    • 梯度破碎的角度。2018年的一篇论文指出了一个新的观点,尽管残差网络提出是为了解决梯度弥散和网络退化的问题,但它解决的实际上是梯度破碎问题。梯度破碎就是在标准前馈神经网络中,随着深度增加,梯度逐渐呈现为白噪声的现象,即神经元梯度的相关性(corelation)按指数级减少;同时,梯度的空间结构也随着深度增加被逐渐消除。因为现在基于梯度的许多优化方法假设梯度在相邻点上是相似的,所以破碎的梯度会使这些优化方法的效果大打折扣。而残差连接可以极大地保留梯度的空间结构,缓解了梯度破碎问题。2018年有一篇可视化的论文支持这一说法,作者比较了Res56网络带残差模块和不带残差模块的损失函数三维图,不带残差模块的损失函数表面是一片怪石嶙峋,而带残差模块的损失函数表面像一片平缓的山丘,更有利于优化。

    这里有一篇文章,讲的非常清晰,推荐一波。

    2.7 ResNeXt

    ResNet的另一改进。主要是采用了VGG堆叠思想和Inception的split-transform-merge思想,在不增加参数复杂度的前提下提高准确率。ResNeXt发现,增加分支数是比加深或加宽更有效地提升网络性能的方式。结构关键点是:

    • 沿用ResNet的短路连接,并且重复堆叠相同的模块组合;
    • 多分支分别处理;
    • 使用1×1卷积降低计算量;
    • 利用分组卷积进行实现(如图c),结构更简洁而且速度更快。

    2.8 DenseNet

    CVPR2017的oral。主要思想是将每一层都与后面的层连接起来,如果一个网络中有L层,那么会有L(L+1)/2个连接。通过这样的密集连接,每一层在正向时候都能直接接受原始输入信号,在反向时候也都能直接接受损失函数的梯度,即这种连接方式使得特征和梯度的传递更加有效,网络也就更加容易训练。

    当然,如果全部采用这种密集连接的方式,特征图的厚度就会很大。于是采用两种方式降低参数量:一是将密集连接的层做成一个模块,整个网络采用模块堆叠的方式,而不是所有层全部密集连接;二是在dense block中引入bottleneck layer,即卷积3x3前增加1x1卷积,以此来减少feature map数量。

    缺点是太吃显存。通常占用显存的主要是推断过程中产生的feature map和参数量。有些框架会有优化,自动把比较靠前的层的feature map释放掉,所以显存就会减少,或者inplace操作通过重新计算的方法减少一部分显存,但是densenet因为需要重复利用比较靠前的feature map,所以无法释放,导致显存占用过大。

    2.9 SENet

    2017年ILSVRC冠军网络。是一个模块,可以和其他的网络架构结合,比如GoogLeNet、ResNet等。

    两大步骤:Squeeze和Excitation。相当于在通道上应用注意力机制,即学习各个通道的权重,根据重要程度增强有用的通道、抑制没有用的通道。

    3 各种经典模型的比较

    前面介绍的各种图像分类模型都比较经典,特别是VGG16、GoogLeNet和ResNet,现在仍然在广泛使用。截至2017年初,各种经典架构对比如下。

    Reference

  • 相关阅读:
    cmd查看端口号是否占用
    重新安装安全狗以后,apchpe 启动不了。
    springcloud组件-eureka
    关于mybatis和spring整合后的一级缓存
    SpringCloud理解篇
    mycat的读写分离
    mycat的分库分表
    Linux下mysql服务器配置
    mycat理解
    linux配置mysql
  • 原文地址:https://www.cnblogs.com/inchbyinch/p/12695140.html
Copyright © 2011-2022 走看看