原文:图像分类
图像识别领域大量的研究成果都是建立在PASCAL VOC、ImageNet等公开的数据集上。
PASCAL VOC是2005年发起的一个视觉挑战赛
ImageNet是2010年发起的大规模视觉识别竞赛(ILSVRC)的数据集
通常完整建立图像识别模型一般包括底层特征学习、特征编码、空间约束、分类器设计、模型融合等几个阶段:
1>.底层特征学习 : 通常从图像中按照固定步长、尺度提取大量局部特征描述。常用的局部特征包括SIFT(Scale-Invariant Feature Transform,尺度不变特征转换) 、HOG(Histogram of Oriented Gradient, 方向梯度直方图) 、LBP(Local Bianray Pattern, 局部二值模式) 等,一般也采用多种特征描述子,防止丢失过多的有用信息。
2>.特征编码:使用一种特征变换算法对底层特征进行编码,减少噪音影响。常用的特征编码包括向量量化编码、稀疏编码、局部线性约束编码、Fisher向量编码等
3>.空间约束:也称作特征汇聚,指在一个空间范围内,对每一维特征取最大值或者平均值,可以获得一定特征不变形的特征表达。常用的方法是金字塔特征匹配,这种方法提出将图像均匀分块,在分块内做特征汇聚。
4>.分类器设计:通常使用的分类器包括SVM(Support Vector Machine, 支持向量机)、随机森林等
Top-5介绍:
CNN:
传统CNN包含卷积层、全连接层等组件,并采用softmax多类别分类器和多类交叉熵损失函数。如下图:
卷积层(convolution layer): 执行卷积操作提取底层到高层的特征,发掘出图片局部关联性质和空间不变性质。
池化层(pooling layer): 执行降采样操作。通过取卷积输出特征图中局部区块的最大值(max-pooling)或者均值(avg-pooling)。降采样也是图像处理中常见的一种操作,可以过滤掉一些不重要的高频信息。
全连接层(fully-connected layer,或者fc layer): 输入层到隐藏层的神经元是全部连接的。
非线性变化: 卷积层、全连接层后面一般都会接非线性变化层,例如Sigmoid、Tanh、ReLu等来增强网络的表达能力,在CNN里最常使用的为ReLu激活函数。
Dropout : 在模型训练阶段随机让一些隐层节点权重不工作,提高网络的泛化能力,一定程度上防止过拟合
在CNN的训练过程总,由于每一层的参数都是不断更新的,会导致下一次输入分布发生变化,这样就需要在训练过程中花费时间去设计参数。在后续提出的BN算法中,由于每一层都做了归一化处理,使得每一层的分布相对稳定,而且实验证明该算法加速了模型的收敛过程,所以被广泛应用到较深的模型中。
VGG:
VGG 模型是由牛津大学提出的(19层网络),该模型的特点是加宽加深了网络结构,核心是五组卷积操作,每两组之间做Max-Pooling空间降维。同一组内采用多次连续的3X3卷积,卷积核的数目由较浅组的64增多到最深组的512,同一组内的卷积核数目是一样的。卷积之后接两层全连接层,之后是分类层。该模型由于每组内卷积层的不同主要分为 11、13、16、19 这几种模型
增加网络深度和宽度,也就意味着巨量的参数,而巨量参数容易产生过拟合,也会大大增加计算量。
GoogleNet:
GoogleNet模型由多组Inception模块组成,模型设计借鉴了NIN的一些思想.
NIN模型特点:
1) 引入了多层感知卷积网络(Multi-Layer Perceptron Convolution, MLPconv)代替一层线性卷积网络。MLPconv是一个微小的多层卷积网络,即在线性卷积后面增加若干层1x1的卷积,这样可以提取出高度非线性特征。
2)设计最后一层卷积层包含类别维度大小的特征图,然后采用全局均值池化(Avg-Pooling)替代全连接层,得到类别维度大小的向量,再进行分类。这种替代全连接层的方式有利于减少参数。
Inception 结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构。
上图是最Inception 简单的设计,输出是3个卷积层和一个池化层的特征拼接。上图设计采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合。但这种设计的缺点是池化层不会改变特征通道数,拼接后会导致特征的通道数较大,经过几层这样的模块堆积后,通道数会越来越大,导致参数和计算量也随之增大。因此借鉴NIN2,采用1x1卷积核来进行降维,如下图所示:
所谓的降维就是减少通道数,同时如NIN模型中提到的1x1卷积也可以修正线性特征。
GoogleNet由多组Inception模块堆积而成。其在网络最后没有采用传统的多层全连接层,而是像NIN网络一样采用了均值池化层;但与NIN不同的是,池化层后面接了一层到类别数映射的全连接层。除了这两个特点之外,由于网络中间层特征也很有判别性,GoogleNet在中间层添加了两个辅助分类器,在后向传播中增强梯度并且增强正则化,而整个网络的损失函数是这个三个分类器的损失加权求和。
GoogleNet整体网络结构如上图所示,总共22层网络:开始由3层普通的卷积组成;接下来由三组子网络组成,第一组子网络包含2个Inception模块,第二组包含5个Inception模块,第三组包含2个Inception模块;然后接均值池化层、全连接层。
任意nxn的卷积都可以通过1xn卷积后接nx1卷积来替代。
GoogleNet-v2 引入BN层;
GoogleNet-v3 对一些卷积层做了分解,进一步提高网络非线性能力和加深网络;
GoogleNet-v4 引入下面要讲的ResNet设计思路。
GoogleNet-v3:
1.使用了和VGG中一样的设计方法:将大的filters拆解成小型化,多层化的filters,其中比较新颖的是“非对称卷积”
2.优化了 inception v1 中的辅助分类器,采用更高维的表示方法能够更容易的处理网络的局部信息。在GoogleNet早期中的辅助分类器只会在最后提升网络精度,而在训练初期的时候并不能加速收敛。
3.提出了新的池化层方案:一种缩小特征图大小的方法,尽量避免了特征瓶颈。
4.增加了平滑标签,让网络的宽度和深度达到平衡
ResNet:
ResNet(Residual Network)是2015年ImageNet图像分类、图像物体定位和图像物体检测比赛的冠军。其针对训练卷积神经网络时加深网络导致准确度下降的问题,提出了采用残差学习。在已有设计思路(BN, 小卷积核,全卷积网络)的基础上,引入了残差模块。每个残差模块包含两条路径,其中一条路径是输入特征的直连通路,另一条路径对该特征做两到三次卷积操作得到该特征的残差,最后再将两条路径上的特征相加。
左边是基本模块连接方式,由两个输出通道数相同的3x3卷积组成。右侧结构中的中间3x3的卷积层首先在一个降维1x1卷积层下减少了计算,然后在另一个1x1的卷积层下做了还原,既保持了精度又减少了计算量。
ResNet训练收敛较快,成功的训练了上百乃至近千层的卷积神经网络。