python图像分类实验总结_第4章图像分类
(imageclassification)基础
第4章 图像分类基础
⼀张图⽚胜过千⾔万语。我们不断地攫取视觉内容,解释它的含义,并且存储它们以备后⽤。
但是,对于计算机要解释⼀张图⽚的内容是很难的,因为计算机看到的图⽚是⼀个⼤的数字矩阵,它对图像传递的思想、知识和意义⼀⽆所知。
为了理解图像的内容,我们必须应⽤图像分类(image classification),这是使⽤计算机视觉和机器学习算法从图像中抽取意义的任务。这个操作可以简单的为⼀张图像分配⼀个标签,如猫、狗还是⼤象,或者也可以⾼级到解释图像的内容并且返回⼀个⼈类可读的句⼦。
图像分类是⼀个⾮常⼤的研究领域,包括各种各样的技术,随着深度学习的普及,它还在继续发展。
现在,是时候来驾驭深度学习与图像分类的浪潮了!
图像分类和图像理解是⽬前(并将继续是)未来⼗年最受欢迎的计算机视觉⼦领域。
在本章中,我将提供图像分类的⾼级概述,以及图像分类算法必须克服的许多挑战。我们还会复习与图像分类和机器学习相关的三种不同学习类型。最后,我们将通过讨论四个步骤来总结本章,这四个步骤是如何训练⼀个⽤于图像分类的深度学习⽹络,以及这四个步骤是如何与传统的⼿⼯设计的特征提取管道进⾏⽐较的。
1 图像分类是什么?
图像分类,核⼼是从给定的分类集合中给图像分配⼀个标签的任务。实际上,这意味着我们的任务是分析⼀个输⼊图像并返回⼀个将图像分类的标签。标签总是来⾃预定义的可能类别集。
⽰例:我们假定⼀个可能的类别集categories = {dog, cat, panda},之后我们提供⼀张图⽚(图1)给分类系统:
图1 图像分类⽬标是根据输⼊图⽚且根据预定义类别分配标签
这⾥的⽬标是根据输⼊图像,从类别集中分配⼀个类别,这⾥为dog。
我们的分类系统也可以根据概率给图像分配多个标签,如dog:95%,cat:4%,panda:1%。
更⼀般的,给定三个通道的W*H像素,我们的⽬标是取W*H*3=N个像素且出正确分类图像内容的⽅法。
1.1 关于术语的说明
当执⾏机器学习和深度学习时,数据集(dataset)是我们尝试提取知识的地⽅。在数据集中的每个例⼦/条⽬(可能使图像数据、⽂本数据、语⾳数据)称为数据点(data point)。
图2 数据集是数据点的集合
我们的⽬标是应⽤机器学习和深度学习算法来发现在数据集中的潜在模式,使我们能够正确的分类我们的算法还没有遇到的数据点(即泛化性能)。现在考虑下⾯的术语:
(1) 在图像分类⽅⾯,我们的数据集就是图像的集合;
(2) 因此,每个图像就是⼀个数据点。
注意:在后续过程中,我们将图像和数据点交替使⽤,可认为是同⼀个意义。
1.2 语义上的差异
看图3上部的左右图像,我们能够很容易的分辨出猫和狗,但是对于所有计算机来说看到的则是对应于图3下部左右的⼤的像素矩阵。
图3 上:⼈类认知图⽚的⽅式 下:计算机看到图⽚以矩阵⽅式
考虑到计算机看到的是⼤的像素矩阵,我们引⼊语义差异(semantic gap)问题。语义差距是⼈对图像内容的感知⽅式与计算机能够理解图像过程的表现⽅式之间的差异。
再次,⼈类可以快速揭⽰出图3上部两幅图的差异,但是计算机却不知道图中有动物存在。为了更清晰解释,看图4:
图4 当描述图⽚内容时,我们可能关注空间层次、颜⾊、质地传递的内容——计算机视觉算法也是同样关注这些
我们可能描述图像如下:
(1) 空间:天空在图像上部,沙滩和海洋在底部;
(2) 颜⾊:天空是深蓝⾊,海⽔颜⾊⽐天空浅,⽽沙⼦是黄⾊的;
(3) 质地:天空⽐较均匀,沙⼦较粗糙
那么,我们怎么编码这些信息使得计算机能够理解?答案就是应⽤特征提取(feature extraction)来量化
图像的内容。特征提取是输⼊⼀副图像、实施⼀个算法、且获得量化我们图像的⼀个特征向量(feature vector)(例如,⼀系列数字)的过程。
为了完成这个过程,我们可以考虑使⽤⼿⼯设计的功能,如HOG、LBPs或其它传统⽅法来度量图像。⽽本书中采⽤的是另⼀种⽅法,即应⽤深度学习来⾃动学习⼀系列特征,这些特征可以⽤来度量且最终标记图像本⾝的内容。
但是,⼀旦我们开始检查真实世界的图像,我们将⾯临很多很多的挑战。
1.3 挑战
如果语义差异还不是⼀个⼤问题,那么我们还要处理图像或对象的变化因素(factors of variation)。图5显⽰了不同的变化因素:
图5 我们需要认识到物体是如何在不同的视点、光照条件、遮挡和尺度等等下出现的。
⾸先,我们看视点变化(viewpoint variation),即物体对应于是如何被拍照或获取的造成是原始还是多维度旋转的图像,但不管怎么视点变化,树莓派还是树莓派如图5左上所⽰。
我们还将⾯对缩放变化(scale variation),如图5的scale variation所⽰,⽆论如何缩放除了⼤⼩size不同,它们是同样的东西。图像分类⽅法必须适应这种变化。
最困难的则是变形(deformation),如图5的deformation所⽰,所有这些图像都包含了图像的特性,但是它们之间都是弹性、扭曲、动态变化的。
关于python的书图像分类还应当处理闭合变化(occlusions variation),即如图5的occlusion variation所⽰,两幅图中都是狗,但是右图被隐藏在其它图像之下,图像分类应当能够处理这种情况。
就像变形和闭合的挑战⼀样,我们还要⾯临光照变化(illumination variation),如图5所⽰,我们应当能够分类出同样得到咖啡杯,但是由于光照使得他们看起来很不同。
我们还要处理背景杂乱(background clutter),如图5所⽰,当我们需要在杂乱背景下要分类出图像的特定物体时,对于我们都是困难的,何况是电脑了。
最后,我们还要处理类内变化(intra-class variation),如图5所⽰,同样的椅⼦确有不同的种类,⽽我们的图像分类算法必须能够识别出所有正确的种类。
有没有感到⼀点困难?更困难的是,图像分类器不仅仅是⾯对上述单个的变化,往往⾯临着多个变化的联合。
那么,我们该如何处理如此多的变化呢?⼀般来说,尽最⼤努⼒去做。我们对图像的内容和希望容忍的变化做出假定,我们也考虑项⽬的最终⽬的是什么?以及我们尝试去构建什么样的系统?
部署到现实世界中的成功的计算机视觉、图像分类和深度学习系统,在编写⼀⾏代码之前,要做出谨慎的假设和考虑。如果你的⽅法过于宽泛,如我想对厨房⾥的每⼀件物品进⾏分类,那么你的分类系统很可能不是很好。但是如果你把问题缩⼩,如我想对⽕炉和冰箱进⾏分类,那么你的分类系统更容易获得较⾼的准确率。
这⾥的关键是要始终考虑图像分类器的范围。尽管深度学习和CNNs在不同的挑战下具有极⼤的鲁棒性和分类能⼒,但是你仍然要关注项⽬的范围尽可能紧致且定义明确。
深度学习不是魔法,它有时是很有⼒的⼯具但是如果使⽤不当也是很危险的。在这本书的其余部分,我将指导你的深度学习之旅,并帮助你指出什么时候你应该使⽤这些强⼒的⼯具,什么时候你应该使⽤更简单的⽅法(或者提到是否⼀个问题⽤图像分类来解决是不合理的)。
2 学习的类型
在深度学习和机器学习领域主要有三种学习类型:监督学习、⾮监督学习和半监督学习。本书主要关注深度学习背景下的监督学习。这⾥将简要描述三种类型。
2.1 监督学习
监督学习是机器学习中研究最⼴泛的⼀类。给定训练数据,创建⼀个训练过程的模型(分类器),这个模
型对输⼊数据做出预测且预测不准确时将进⾏纠正。持续这个训练过程直到达到⼀些期望的停⽌准则,如较低的错误率或达到最⼤的训练次数等。
常见的监督学习算法包括Logistic Regression、Support Vector Machines(SVMs)、Random Forests和ANN。
在图像分类的背景下,我们假定图像数据集包括图像本⾝和对应的分类标签(class labels),分类标签⽤于训练机器学习分类器将每个种类看起来像什么。如果分类器做出了错误预测,则可以运⽤⼀些⽅法来纠正错误。
即监督学习中,每个数据点都由标签、特征向量构成。
2.2 ⾮监督学习
与监督学习对应,⾮监督学习(也称为⾃学)没有标签数据,只有特征向量。
⾮监督学习是机器学习和深度学习的“圣杯”。因为现实世界中很容易获得⼤量⽆标签数据,如果我们能够从⽆标签数据中学的模式,那么可以不必花费⼤量时间和⾦钱来标记标签数据⽤于监督学习。
经典的⾮监督学习机器算法包括PCA和K均值。应⽤到神经⽹络,有Autoencoders、Self Organizing
Maps (SOMs)和Adaptive Resonance Theory可⽤于⾮监督学习。⾮监督学习是⼀个极其活跃的、还没有解决的领域,本书将不关注⾮监督学习。
2.3 半监督学习
如果⼀部分数据有标签,另⼀部分没有标签,则称之为半监督学习。
半监督式学习在计算机视觉中尤其有⽤,因为在训练集中,给每⼀张图⽚都贴上标签通常是费时、乏味和昂贵的(⾄少在⼯时⽅⾯)。我们可以对数据中的⼀⼩部分标签,然后利⽤半监督学习给剩余的数据进⾏标签和分类。
半监督学习算法常⼯作在较⼩的数据集上在可以容忍的精确度下。即半监督学习考虑了精确度与数据⼤⼩的关系,在可容忍的限度下保持分类精确度,可以极⼤的降低训练的数据量⼤⼩。半监督学习常见的选择包括label spreading、label propagation、ladder networks和co-learning/co-training。
再次,我们在本书中主要研究监督学习,因为⾮监督和半监督学习在计算机视觉的深度学习背景下的研究仍然是⾮常新的领域且还没有清晰的⽅法可以使⽤。(该书是2017年出版的,那么可能写作是在2015-2016?那么现在为2018年,是否还没有清晰的⽅法)
3 深度学习分类步骤
通过前两节的学习,你可能会开始觉得在构建⼀个图像分类器时,新的术语、考虑和看起来不可逾越的变化会给你带来⼀些压⼒,但事实是,⼀旦你理解了这个过程,构建⼀个图像分类器是相当简单的。
在本节中,我们将回顾当在深度学习⼯作中需要考虑的在⼼态⽅⾯的⼀个重要转变。我们将回顾在构建⼀个深度、基于学习的图像分类器的4个步骤,并且对⽐传统的基于特征的机器学习和端到端的深度学习。
3.1 ⼼态的转变
我们可能写过成百上千的基于过程的或基于对象的函数,这些函数都有很好的定义,且很容易的验证其结果。
不幸的是,在深度学习和图像分类中不是这样的过程。
对于猫、狗的图⽚,我们不能简单的编写确定的语句来识别它们,因此,与其试图构建⼀个基于规则的系统来描述每个类别的“外观”,我们可以采⽤基于数据驱动的⽅法,提供每个类别的⽰例,然后教我们的算法使⽤这些⽰例识别类别之间的差异。
我们输⼊这些打上标签的训练数据集,在训练集中的每个数据点包括:
(1) ⼀张图像;
(2) 这张图像的标签或分类。
3.2 步骤⼀:收集数据集
构建深度学习⽹络的第⼀个部件是收集最初的数据集。我们需要图像本⾝和与图像相关的标签。标签应当是⼀个有限的类别集合。
此外,每个种类中的图像数据应当是均匀的(例如,每个类别的图像数⽬相同)。如果数⽬不同则造成类别失衡,类别失衡是机器学习的常见问题,我们在后续中来介绍不同的⽅法,但是注意避免类别失衡产⽣的学习问题的最佳⽅法是避免类别失衡。
3.3 步骤⼆:划分数据集
既然我们有了数据集,我们需要划分成两部分:
(1)训练集(training set)
(2)测试集(testing set)
我们的分类器使⽤训练集通过在输⼊数据上做出预测来“学习”每个类别看起来像什么,且当预测错误的时候分类器做出纠正。分类器完成训练之后,我们可以在测试集上评估性能。
训练集和测试集是互相独⽴且互不重叠,是极其重要的常见的训练集和测试集划分为66.7%/33/3%,75%/25%,90%/10%,如图6所⽰:
图6 常见训练集和测试集划分
这些划分是合理的,那么我们需要调整的参数是什么呢?神经⽹络中有⼀些控制参数(如学习率、衰减因⼦、正则化因⼦等)需要调整以达到⽹络最佳性能,这些参数我们称之为超参数(hyperparameters),它们设定的合理是极其重要的。
实际上,我们需要⼀堆超参数且需要识别出最佳的超参数集合。你可能想使⽤测试集来调整这些超参数值,再次注意:测试集仅仅⽤作评估⽹络性能!
⽽是,我们需要第三个划分的数据集称为验证集(validation set),这个数据集合通常来⾃训练集且⽤作“假测试数据”,⽤于调整超参数。仅在我们使⽤验证集确定了超参数值之后,我们才会在测试集上收集最终的精确度结果。
我们通常分配训练集的10%—20%⽤于验证。
划分数据集听起来很复杂,实际上,将在下⼀章将要讲到的,归功于python的scikit-learn库,我们可以使⽤⼀⾏代码即可划分。
3.4 步骤三:训练⽹络
给定图像的训练集,我们现在可以训练⽹络了。我们⽹络的⽬标是学习怎样识别标签数据中的每个类别。当⽹络做出错误预测时,它将从错误中学习且提⾼⾃⼰的预测能⼒。
那么,真实的“学习”是怎样⼯作的?⼀般来说,我们使⽤⼀种梯度下降的形式(a form of gradient descent),将在第9章中介绍。本书的剩余部分将从头来例证怎样训练神经⽹络,因此这⾥我们推迟它,直到需要时再进⾏详细的训练过程讨论。
3.5 步骤四:评估
最后,我们需要评估我们训练的⽹络。对于测试集中的每个图像,送⼊⽹络中且⽹络预测它认为这张图像的标签是什么。之后,我们的⽹络模型将测试集中对图像的预测结果列表化。
最后,这些模型预测将与测试集的真实标签结果进⾏⽐对。我们将能够计算出模型预测的正确的数⽬,且获得⼀些聚合报告,如精确度(precision)、召回率(recall)、f-度量(f-measure)等,这些参数通常⽤来度量整个⽹络性能。
3.6 图像分类:基于特征的学习VS深度学习
传统上,对于图像分类的基于特征的学习,实际上是在步骤⼆和步骤三中间插⼊⼀个步骤:特征提取(feature extraction)。在这⼀阶段,我们采⽤⼿动设计的算法如HOG、LBPs等,基于我们想编码(例如形状、颜⾊、质地等)的图像的特定部分来度量图像的内容。给定这些特征,我们之后执⾏训练⽹络和评估⽹络。
当构建CNNs⽹络的时候,我们实际上跳过了特征提取的步骤。原因是CNNs是⼀个端到端的模型。我们将原始输⼊数据(像素)输⼊⽹络。然后⽹络学习隐藏层内的过滤器,这些过滤器可以⽤来区分对象类。⽹络的输出是类别标签上的概率分布。
其中⼀个激动的⽅⾯是,我们可以让CNNs⾃动的学习特征⽽不需要⼿动设计特征。但是这种权衡是有代价的。训练CNNs是⼀个不平凡的过程,所以要准备好花⼤量的时间让⾃⼰熟悉这些经验,并做很多实验来确定什么是有效的,什么是⽆效的。
3.7 当预测不正确时,发⽣了什么?
我们训练好了⽹络,也在测试集上获得了良好的性能,但是当我们的⽹络对不在训练集也不在测试集中的其它外部未见到的图像进⾏预测时,获得了较差的性能,这个问题称之为泛化(generalization)。
泛化是⽹络泛化的能⼒,即正确的预测即不存在训练集也不存在与测试集中的图像的类别标签的能⼒。
⽹络的泛化将在本书多次讨论,这⾥仅是⼤概介绍。当不能正确的预测图像分类时,不要沮丧,要考虑第2章中提到的变化因素。你的训练集正确的反映了这些变化因素吗?如果没有,那么你需要收集更多的训练数据(且需要读本书的剩余部分,来学习其它技术来克服泛化)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论