基于PaddlePaddle的图片分类实战 | 深度学习基础任务教程系列

国内新闻 阅读(1276)
?

与文本相比,图像可以提供更生动,易懂和更具艺术性的信息。图像分类是根据图像的语义信息区分不同类型的图像。它是图像检测,图像分割,对象跟踪,行为分析等其他高级技术。视觉任务的基础。图像分类在安全,运输,互联网,医药等领域具有广泛的应用。

通常,图像分类通过手部提取特征或特征学习方法描述整个图像,然后使用分类器来区分对象类别。因此,如何提取图像特征非常重要。基于深度学习的图像分类方法可以通过监督或无监督地学习分层特征描述来代替分层设计或图像特征的选择。深度学习模型中的卷积神经网络(CNN)直接使用图像像素信息作为输入,最大程度地保留了输入图像的所有信息。通过卷积运算执行特征提取和高级抽象。模型输出直接是图像识别的结果。这种基于“输入 - 输出”的直接端到端学习方法取得了很好的效果。

本教程重点介绍图像分类的深度学习模型,以及如何使用PaddlePaddle在CIFAR10数据集上快速实现CNN模型。

项目地址:

有关基于ImageNet数据集培训的更多图像分类模型,以及相应的预训练模型和微调操作,请参阅Github:

表现显示

图像分类包括一般图像分类,细粒度图像分类等。图1显示了一般的图像分类效果,即模型可以正确识别图像上的主要对象。

img_pic_1555657289_0.png

图1.一般图像分类显示

图2显示了细粒度图像分类 - 花识别的效果,要求模型正确识别花的类型。

img_pic_1555657289_1.png

图2.细粒度图像分类显示

一个好的模型必须正确识别不同的类别,并且还应该能够正确识别具有不同视角,光照,背景,扭曲或部分遮挡的图像(这里我们统称为图像扰动)。图3显示了一些图像的扰动,一个更好的模型将像智能人类一样被正确识别。

img_pic_1555657289_2.png

图3.图像干扰显示[7]

模型概述

CNN:传统的CNN包括卷积层和完全连接层等组件,并使用softmax多类分类器和多类交叉熵损失函数。典型的卷积神经网络如图4所示。我们引入CNN来构建CNN。常用组件。

img_pic_1555657289_3.png

图4. CNN网络示例[5]

卷积层:执行卷积操作以提取底层到高级特征,并发现图像的局部关联属性和空间不变属性。

池化层:执行下采样操作。通过卷积获得特征图中局部块的最大值(最大池)或平均值(平均池)。下采样也是图像处理中的常见操作,可以过滤掉一些不重要的高频信息。

全连接层(或fc层):从输入层到隐藏层的神经元都是连接的。

非线性变化:卷积层和完全连通层通常后跟非线性变化函数,如Sigmoid,Tanh,ReLu等,以增强网络的表达能力。 CNN中最常用的ReN激活功能。

Dropout [1]:随机让一些隐藏层节点在模型训练阶段不起作用,提高网络的泛化能力,并在一定程度上防止过度拟合。

接下来我们主要介绍VGG,ResNet网络结构。

VGG:牛津大学VGG(Visual Geometry Group)在2014年ILSVRC中提出的模型被称为VGG模型[2]。与以前的模型相比,该模型进一步拓宽和深化了网络结构。其核心是五组卷积运算,并且每两组之间的Max-Pooling空间减少。在同一组中使用多个连续的3X3卷积。卷积核的数量从较浅组中的64增加到最深组中的512,并且同一组中的卷积核的数量是相同的。卷积后,连接两层完全连接的层,然后是分类层。由于每组中的卷积层不同,因此有11,13,16和19层的几种模型。下图显示了16层网络结构。 VGG模型结构相对简单。介绍之后,有很多基于这个模型的文章。例如,在ImageNet [4]上首次超过人眼识别的模型是从VGG模型的结构中学习。

img_pic_1555657289_4.png

图5.基于ImageNet的VGG16模型

ResNet:ResNet(残留网络)[3]是2015 路径加在一起。

剩余模块如图7所示。左侧是基本模块连接方法,它由两个3x3卷积和相同数量的输出通道组成。右边是瓶颈连接,称为瓶颈,因为上面的1x1卷积用于降维(图256-> 64),后面的1x1卷积用于升序维度(示例)即64- > 256),使得中间3×3卷积的输入和输出通道的数量很小(图64-> 64)。

img_pic_1555657289_5.png

图7.剩余模块

数据准备

由于ImageNet数据集较大,下载和培训速度很慢。为方便大家,我们使用CIFAR10数据集。 CIFAR10数据集包含60,000个32x32彩色图像,10个类别,每个包含6,000个。其中,50,000个图像用作训练集,10,000个用作测试集。图11从每个类别中随机抽取10个图像,显示所有类别。

img_pic_1555657289_6.png

图11. CIFAR10数据集[6]

Paddle API提供了cifar数据集模块paddle.dataset.cifar的自动加载。

您可以通过键入python train.py开始训练您的模型。以下部分将详细介绍train.py的详细信息。

模型结构

桨初始化

让我们首先导入Paddle Fluid API和辅助模块。

img_pic_1555657289_7.png

在本教程中,我们提供了两个模型VGG和ResNet的配置。

VGG

首先,介绍VGG模型结构。由于CIFAR10图像的大小和数量远小于ImageNet数据,因此此模型适用于CIFAR10数据。卷积部分介绍了BN和Dropout操作。 VGG核心模块的输入是数据层,vgg_bn_drop定义16层VGG结构,并且在每层卷积之后引入BN层和Dropout层。详细定义如下:

img_pic_1555657289_8.png

首先定义一组卷积网络,即conv_block。卷积内核大小为3x3,池化窗口大小为2x2,窗口滑动大小为2.组确定每组VGG模块是连续卷积操作,丢失指定丢失操作的概率。使用的img_conv_group是paddle.fluit.net中的预定义模块,由几组Conv-> BN-> ReLu-> Dropout和一组Pooling组成。

五组卷积运算,即五个conv_blocks。第一组和第二组使用两个连续的卷积运算。第三,第四和第五组使用三个连续的卷积运算。每组最后一次卷积后的丢失概率为0,即不使用Dropout操作。

最后,连接两层512维全连接。

这里,VGG网络首先提取高级特征,然后将它们映射到与完全连接层中的类别维度相同大小的向量,最后通过Softmax方法计算图片被分类到每个类别的概率。

RESNET

ResNet模型的步骤1,3和4与VGG模型相同,此处不再介绍。主要介绍CIFAR10数据集上ResNet核心模块的第二步。

首先介绍resnet_cifar10中的一些基本功能,然后介绍网络连接过程。

Conv_bn_layer:带BN的卷积层。

快捷方式:剩余模块的“直接连接”路径,“直接连接”实际上分为两种形式:当剩余模块的输入和输出特征通道数不相等时,1x1卷积用于向上维度操作;剩余模块输入和输出当通道相等时,采用直接连接操作。

“直接”路径组成。

Layer_warp:一组残余模块,由多个剩余模块堆叠。每组中的第一残差模块的滑动窗口的大小可以与其他模块的大小不同,以减小特征图在垂直和水平方向上的尺寸。

img_pic_1555657289_9.png

resnet_cifar10的连接结构主要有以下过程。

底层输入连接到一层conv_bn_layer,卷积层与BN连接。

然后连接3组残差模块,即在下面配置3组layer_warp,每组由图10的左残差模块组成。

最后,对网络进行平均并返回到该层。

注意:除了第一层卷积层和最后一层完全连接层之外,还要求layer_warp的总层数可以被6整除,也就是说,应该满足resnet_cifar10的深度

img_pic_1555657289_10.png

推理配置

网络输入被定义为data_layer(数据层),其是图像分类中的图像像素信息。 CIFRAR10是RGB 3通道32x32尺寸彩色图,因此输入数据大小为3072(3x32x32)。

img_pic_1555657289_11.png

训练配置

然后我们需要设置培训计划train_network。它首先根据推理程序进行预测。在训练期间,它将根据预测计算avg_cost。在监督训练中,有必要输入对应于图像的类别信息,该类别信息也由fluid.layers.data定义。在训练中,使用多类交叉熵作为损失函数,并且作为网络的输出,预测级将网络的输出定义为由分类器获得的概率信息。

请注意,训练程序应该返回一个数组。第一个返回参数必须是avg_cost。培训师使用它来计算梯度。

img_pic_1555657289_12.png

优化配置

在以下Adam优化器中,learning_rate是学习速率,它与网络的训练收敛速度有关。

Def optimizer_program():

返回fluid.optimizer.Adam(learning_rate=0.001)

培训模式

数据馈送器配置

在完成随机播放和批处理后,Cifar.train10()一次生成一个样本作为训练的输入。

img_pic_1555657289_13.png

实施培训师计划

我们需要为培训过程制定一个主程序。同样,我们需要为测试程序配置test_program。定义训练的位置并使用先前定义的优化器。

img_pic_1555657289_14.png

训练主循环和过程输出

在下一个主要的训练周期中,我们将使用输出来观察训练过程,或进行测试。

img_pic_1555657289_15.png

训练

由trainer_loop函数训练,这里我们只有2个Epoch,一般我们将在实际应用中执行超过一百个Epoch

注意: CPU,每个Epoch大约需要15到20分钟。这部分可能需要一段时间。随意修改代码并在GPU上运行测试以加快培训速度。

Train_loop()

下面显示了一轮训练日志的示例。 1次通过后,训练集的平均准确度为0.59,测试集的平均准确度为0.6。

img_pic_1555657289_16.png

图13是训练的分类错误率的图表。运行到第200遍后,它基本收敛,最后测试集上的分类错误率为8.54%。

img_pic_1555657289_17.png

图13. CIFAR10数据集上VGG模型的分类错误率

应用模型

您可以使用训练有素的模型对图像进行分类。以下程序显示如何加载训练有素的网络和参数以进行推理。

生成预测输入数据

Dog.png是一只小狗的照片。我们将其转换为numpy数组以满足馈线格式。

img_pic_1555657289_18.png

推理器配置和预测

与培训过程类似,推理器需要构建相应的过程。我们从params_dirname加载网络和训练过的参数。我们可以简单地插入前面定义的推理程序。现在我们准备做出预测。

img_pic_1555657290_19.png

img_pic_1555657290_20.png

总结

传统的图像分类方法由多个阶段组成,框架更加复杂,端到端的CNN模型结构可以一步实现,分类精度大大提高。在本文中,我们首先介绍VGG,GoogleNet和ResNet的三种经典模型。然后我们将介绍如何使用PaddlePaddle配置和训练基于CIFAR10数据集的CNN模型,尤其是VGG和ResNet模型。最后,我们将介绍如何使用PaddlePaddle的API接口来预测图像。和特征提取。对于其他数据集,如ImageNet,配置和培训过程是相同的,请参考

参考

[1] G.E. Hinton,N。Srivastava,A。Krizhevsky,I。Sutskever和R.R. Salakhutdinov。通过防止特征检测器的共同适应来改善神经网络。 arXiv preprint arXiv: 1207.0580,2012。

[2] K. Chatfield,K。Simonyan,A。Vedaldi,A。Zisserman。细节中的魔鬼回归:深入研究卷积网。 BMVC,2014年。

[3] K. He,X。Zhang,S。Ren,J。Sun.深度残留学习的图像识别。 CVPR 2016。

[4] He,K.Zhang,X.Ren,S。和Sun,J。Delving Deep into Rectifiers:超越ImageNet分类的人类水平表现。 ArXiv电子版,2015年2月。

[5

[6