CV领域初窥--图像分类(一)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CV领域初窥--图像分类(一)相关的知识,希望对你有一定的参考价值。

参考技术A 图像分类是计算机视觉中最基础的任务,其中可以分为跨物种语义级别的图像分类,子类细粒度图像分类,以及实例级图像分类三大类别。

在不同物种的层次上识别不同类别的对象,例如猫狗分类,这样的分类任务的特征是,较大的类间方差,较小的类内方差,例如典型的cifar10是在交通工具以及动物内部进行区分,都是语义上完全可以区分开的对象

细粒度图像分类,是一个大类中的子类的分类,例如不同鸟类的分类,不同狗类的分类,不同车型的分类等等。例如Caltech-UCSD Birds-200-2011数据集,他是包含200类,11788张图像的鸟类书籍,为每一张图提供了15哥局部区域位置,1个标注框。这种细粒度级别的检测需要更为精细的分类器设计

如果我们需要区分不同的个体,不仅仅是物种类别或者子类,其就是一个识别问题,例如最典型的任务就是人脸识别。人脸识别对于计算机视觉领域落地是十分有意义的,它能够完成很多任务,例如安全维稳,考勤打卡,人脸解锁等应用场景都是和人脸识别这个实例级图像分类任务密切相关的。

MNIST数据集在当时是一个baseline,其包含60000个训练数据,10000个测试数据,图像均为灰度图像,大小为32*32。在这个数据集中,其实传统方法表现的也不错,例如SVM以及KNN,SVM为代表的方法可以将MNIST分类错误率降低到0.56%, 超过当时的人工神经网络。

后来经过多次迭代,LeNet5在1998年诞生,这是一个经典的卷积神经网络,饱含着一些重要的特性:

虽然LeNet5的错误率在0.7%左右,不如SVM方法,但随着网络结构的发展,神经网络方法很快的超过了其他的所有方法,有着很好的效果。

为了在工业界落地更加复杂的图像分类任务,李飞飞等人数年时间的整理下,2009年,ImageNet数据集发布了。ImageNet数据集共有1400多万张图片,共有2万多个类别,不过论文中常用的都是1000类的基准。

AlexNet在2012年时横空出世,是第一个真正意义上的深度网络,与LeNet5的5层相比,它的层数增加了3层,网络的参数量也大大增加,输入也从28变成了224,同时GPU的面世,也使得深度学习从此进行GPU为王的训练时代。
AlexNet有以下的特点:

VGGNet探索了卷积神经网络的深度与其性能之间的关系,成功地构筑了16~19层深的卷积神经网络,证明了增加网络的深度能够在一定程度上影响网络最终的性能,使错误率大幅下降,同时拓展性又很强,迁移到其它图片数据上的泛化性也非常好。到目前为止,VGG仍然被用来提取图像特征。
VGGNet可以看成是加深版本的AlexNet,都是由卷积层、全连接层两大部分构成.全部使用3×3的卷积核和2×2的最大池化核,简化了卷积神经网络的结构。VGGNet很好的展示了如何在先前网络架构的基础上通过简单地增加网络层数和深度就可以提高网络的性能。虽然简单,但是却异常的有效,在今天,VGGNet仍然被很多的任务选为基准模型。

GoogLeNet也是将网络层次加深了,不过GoogLeNet做了更加大胆的网络结构的尝试,其深度只有22层,从参数数量来看,GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择;但是从模型结果来看,GoogLeNet的性能却更加优越。

一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题:
(1)参数太多,如果训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。

解决这些问题的方法当然就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。比较通用的方法是使用dropout的方法,相当于从原始的网络中找到一个更”瘦“的网络(有待考究)

GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。

什么是Inception呢?Inception历经了V1、V2、V3、V4等多个版本的发展,不断趋于完善,下面一一进行介绍

通过设计一个稀疏网络结构,但是能够产生稠密的数据,既能增加神经网络表现,又能保证计算资源的使用效率。谷歌提出了最原始Inception的基本结构:

该结构将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。

网络卷积层中的网络能够提取输入的每一个细节信息,同时5x5的滤波器也能够覆盖大部分接受层的的输入。还可以进行一个池化操作,以减少空间大小,降低过度拟合。在这些层之上,在每一个卷积层后都要做一个ReLU操作,以增加网络的非线性特征

然而这个Inception原始版本,所有的卷积核都在上一层的所有输出上来做,而那个5x5的卷积核所需的计算量就太大了,造成了特征图的厚度很大,为了避免这种情况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用,这也就形成了Inception v1的网络结构

对上图说明如下:
(1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
(2)网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
(3)虽然移除了全连接,但是网络中依然使用了Dropout ;
(4)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。

Inception V2版本的解决方案就是修改Inception的内部计算逻辑,提出了比较特殊的“卷积”计算结构。
2.1 卷积分解(Factorizing Convolutions)
GoogLeNet团队提出可以用2个连续的3x3卷积层组成的小网络来代替单个的5x5卷积层,即在保持感受野范围的同时又减少了参数量
2.2 降低特征图大小

如果想让图像缩小,可以有如下两种方式:先池化再作Inception卷积,或者先作Inception卷积再作池化。但是方法一(左图)先作pooling(池化)会导致特征表示遇到瓶颈(特征缺失),方法二(右图)是正常的缩小,但计算量很大。为了同时保持特征表示且降低计算量,将网络结构改为下图,使用两个并行化的模块来降低计算量(卷积、池化并行执行,再进行合并)

使用Inception V2作改进版的GoogLeNet,网络结构图如下:

Inception V3一个最重要的改进是分解(Factorization),将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加速计算,又可以将1个卷积拆成2个卷积,使得网络深度进一步增加,增加了网络的非线性(每增加一层都要进行ReLU)。

Inception V4主要利用残差连接(Residual Connection)来改进V3结构,得到Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4网络。

CV开山之作:《AlexNet》深度学习图像分类经典论文总结学习笔记(原文+总结)

  本文将为大家总结经典CV神经网络的开山力作——AlexNet(ImageNet Classification with Deep Convolutional Neural Networks)

论文原文:https://dl.acm.org/doi/pdf/10.1145/3065386

目录

深度学习论文总结

前言

一.Abstract-摘要

二.Introduce-介绍

三.The Dataset-数据集

四.The Architecture-网络结构

五.Reducing Overfitting-减少过拟合

六.Qualitative Evaluations-定性评估

总结


前言

为此文章为深度学习在计算机视觉领域的开山之作AlexNet,也是非常适合深度学习领域的小白观看的经典论文,本文为在学习论文期间的论文总结,也算是学习笔记,希望能帮助到大家,有不足地方还希望大家谅解,以后会给大家带来更高质量的学习论文笔记总结。


一.Abstract-摘要

摘要中主要提到这三件事:  ①AlexNet的结构; 

                                           ②AlexNet使用的非饱和(non-saturating)神经元(ReLU)和GPU的合理使用加快了训练;   

                                           ③防止过拟合的方式:dropout。

二.Introduce-介绍

      当前的复杂的图像识别任务需要更大的数据集,ImageNet图像的数量还不够,还得对图像进行处理后得到新图像来扩大数据集。CNN是用于图像的效果比较好的神经网络,且比起传统的feedforward neuralnetwork,它所需的参数更少,且效果不差。

      AlexNet作者认为本文的贡献有:①提出一些技巧加快了训练;

                                                        ②由于网络过大,提出了防止过拟合的一些技巧;

                                                        ③AlexNet的网络层数是很好的,去掉任何一层都会使性能下降。

三.The Dataset-数据集

     本文采用数据集:ImageNet。有很多图就对了。由于每张图的大小不一样,作者要统一裁剪成256 x256的图片 。

     剪裁方法:先对原始图片进行缩放,使得图片较短的一边长度是256,另一个长边在这一步操作中也会根据长宽比进行调整,然后从图片中心对长边进行两侧的裁剪,最终得到256*256的尺寸大小的图片。

四.The Architecture-网络结构

网络结构主要包含以下几个关键点:

1.ReLU函数:作者将修正线性单元(ReLU,为非饱和非线性激活函数)用在了模型里,发现训练速度显著提高,原因在于原来所使用的传统函数为饱和非线性激活函数:sigmoid和tanh,这两个激活函数都是saturating(饱和非线性)的,会把两边的梯度压成0,而对于ReLU,它是non-saturating(非饱和非线性)的,只要input是正的,就不会发生这种情况。从而使用ReLU函数可以加快训练速度,克服梯度消失的问题。

    

上图为作者使用tanh和ReLU训练模型的结果,可以清晰看出在相同性能的情况下,ReLU只需5个epoch就能实现,而tanh则需要36个epoch。

2.用多个GPU进行训练:因为当时的GPU内存还不够大,限制了训练网络的最大大小,且实验使用的训练样本任务对于一个GPU来说太大了。

           因此作者提出创新方法:把网络存在两个GPU里,有的层需要跨GPU计算,有的不需要。这里就不具体展开了。

           使用多个GPU后带来的好处:① 错误率下降了:与在一个GPU上训练的网络相比,这种组合让本文的top-1和top-5错误率分别下降了1.7%和1.2%。
                                                           ②训练时间更少:本文的两个GPU网络训练花费的时间比一个GPU的时间要少。

3.局部响应归一化(Local Response Normalization):对于sigmoid和tanh,为了防止input值过大或过小导致梯度变为0,就需要对input做normalization把input变为zero-centered;而对于ReLU则不需要,因为只要input是正的,梯度就不会为0。但文章还是提出了在ReLu层之前应用了一种新的normalization的方式:局部响应归一化(Local Response Normalization),定义为:

使用局部响应归一化后带来的好处:①错误率降低了,Top-1和Top-5错误率分别降低了1.4%和1.2%。

                                                           ②在CIFAR-10数据集上验证了该方案的有效性:一个四层的CNN 在没有归一化的情况下测试错误率为13%,在加入了归一化后测试错误率为11%。

实验证明这样操作让准确度提高了。(现在基本没人用这个了)

4.重叠池化(Overlapping Pooling):传统的池化层的卷积核的步长应等于核的宽,而作者改进后选取了小于核的宽的步长

  使用重叠池化后带来的好处:①错误率降低了,与非重叠方案 比,该方案的top-1和top-5错误率分别降低了0.4%和0.3%。

                                                  ②在训练过程中观察到,使用重叠池的模型发现过度拟合的差异变大。

(对传统的用Pooling的方法做了一定的改动,改动不大,但效果很好)

5.整体架构(Overlapping Pooling)

 这里最初的输入图像大小是224x224x3是因为经过裁剪了。网络结构采用两个GPU,所以结构一分为2,整个结构分为八层,每一层都使用了ReLu函数,而局部响应归一化运用到了第一层和第二层,前面五层均为卷积层,注意第1,2,4,5层的卷积是只在各自的GPU上做的。后面三层为全连接层,最后为softmax。

五.Reducing Overfitting-减少过拟合

(接下来文章讲为了防止过拟合的几个技巧)

1.数据增强(Data Augmentation)其实就是把原有图像经过处理后来人为扩充数据集。比如:(1)裁剪图像后水平翻转(论文里是裁了大小为224x224 x 3的图)。在测试的时候预测图像属于的类的方式是:分别裁剪图像的四个角落与中心的大小为224 x 224 x3的图,并且水平翻转,从而得到10个inputs。然后将10个softmax的outputs的值求平均,得到最终分类结果。(2)改变图像RGB每个通道的灰度值。

2.Dropout: 普通的dropout。想法就是将dropout看作一种集成(ensemble)的算法,集成了多个模型训练,防止了过拟合。现在大家认为它就是一个正则项。

六.Qualitative Evaluations-定性评估

 最主要是右边的图。作者把倒数第二层的向量拿出来,进行计算,从而得到相近的图片,这表明神经网络有效地提取了图像特征。


总结

1.本论文利用深度神经网络,来进行图片分类。而且取得了十分不错的效果。(用的数据集是ImageNet)

2.作者解决关键:(1)把网络存在两个GPU里,有的层需要跨GPU计算,有的不需要。(2)AlexNet使用的非饱和(non-saturating)神经元(ReLU)和GPU的合理使用加快了训练。用ReLU可以加快训练速度。(3)dropout可以有效减少过拟合。(4)整体架构:前面五层均为卷积层,注意第1,2,4,5层的卷积是只在各自的GPU上做的。后面三层为全连接层,最后为softmax。(4)数据集:ImageNet。(6).overlapping pooling(重叠池):一般来说两个Pooling是不会重叠的,但我现在要重叠。(对传统的用Pooling的方法做了一定的改动,改动不大,但效果很好)

3.论文贡献:推广了SGD算法,在此之后,SGD基本上在机器学习界成为了最主流的一个优化算法。

4.补充:训练使用模型:用SGD(随机梯度下降法)来训练模型,我们的权重用的是均值为0方差为0.01的高斯随机变量来初始化的,在第二层,第四层和第五层的卷积层把偏移量初始化成1,剩下的全部初始化为0,全连接层也都初始化为1。每一层用一个同样的学习率,我们的学习率是从0.01开始的,如果验证误差不往下降了,就将学习率手动降低十倍。

以上是关于CV领域初窥--图像分类(一)的主要内容,如果未能解决你的问题,请参考以下文章

基于传统CV实现图片分类(以图搜图)

基于传统CV实现图片分类(以图搜图)

计算机视觉(CV)基于卷积神经网络实现美食分类

图像分类Vision Transformer理论解读+实践测试

骚操作!想了解垃圾分类的图像识别嘛?1小时带你实战Google图像分割模型,送书10本

计算机视觉(CV)基于高层API实现宝石分类