图像分类 订阅
图像分类,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法。它利用计算机对图像进行定量分析,把图像或图像中的每个像元或区域划归为若干个类别中的某一种,以代替人的视觉判读。 展开全文
图像分类,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法。它利用计算机对图像进行定量分析,把图像或图像中的每个像元或区域划归为若干个类别中的某一种,以代替人的视觉判读。
信息
外文名
image classification
处理对象
图像
中文名
图像分类
工    具
计算机
图像分类分类方法
基于色彩特征的索引技术色彩是物体表面的一种视觉特性,每种物体都有其特有的色彩特征,譬如人们说到绿色往往是和树木或草原相关,谈到蓝色往往是和大海或蓝天相关,同一类物体往拍几有着相似的色彩特征,因此我们可以根据色彩特征来区分物体.用色彩特特征进行图像分类一可以追溯到Swain和Ballard提出的色彩直方图的方法.由于色彩直方图具有简单且随图像的大小、旋转变化不敏感等特点,得到了研究人员的厂泛关注,目前几乎所有基于内容分类的图像数据库系统都把色彩分类方法作为分类的一个重要手段,并提出了许多改进方法,归纳起主要可以分为两类:全局色彩特征索引和局部色彩特征索引。基于纹理的图像分类技术纹理特征也是图像的重要特征之一,其本质是刻画象素的邻域灰度空间分布规律由于它在模式识别和计算机视觉等领域已经取得了丰富的研究成果,因此可以借用到图像分类中。在70年代早期,Haralick等人提出纹理特征的灰度共生矩阵表示法(eo一oeeurrenee matrix representation),这个方法提取的是纹理的灰度级空间相关性(gray level Spatial dependenee),它首先基于象素之间的距离和方向建立灰度共生矩阵,再由这个矩阵提取有意义的统计量作为纹理特征向量。基于一项人眼对纹理的视觉感知的心理研究,Tamuar等人提出可以模拟纹理视觉模型的6个纹理属性,分别是粒度,对比度,方向性,线型,均匀性和粗糙度。QBIC系统和MARS系统就采用的是这种纹理表示方法。在90年代初期,当小波变换的理论结构建一认起来之后,许多研究者开始研究如何用小波变换表示纹理特征。smiht和chang利用从小波子带中提取的统计量(平均值和方差)作为纹理特征。这个算法在112幅Brodatz纹理图像中达到了90%的准确率。为了利用中间带的特征,Chang和Kuo开发出一种树型结构的小波变化来进一步提高分类的准确性。还有一些研究者将小波变换和其他的变换结合起来以得到更好的性能,如Thygaarajna等人结合小波变换和共生矩阵,以兼顾基于统计的和基于变换的纹理分析算法的优点。基于形状的图像分类技术形状是图像的重要可视化内容之一在二维图像空间中,形状通常被认为是一条封闭的轮廓曲线所包围的区域,所以对形状的描述涉及到对轮廓边界的描述以及对这个边界所包围区域的描述.目前的基于形状分类方法大多围绕着从形状的轮廓特征和形状的区域特征建立图像索引。关于对形状轮廓特征的描述主要有:直线段描述、样条拟合曲线、傅立叶描述子以及高斯参数曲线等等。实际上更常用的办法是采用区域特征和边界特征相结合来进行形状的相似分类.如Eakins等人提出了一组重画规则并对形状轮廓用线段和圆弧进行简化表达,然后定义形状的邻接族和形族两种分族函数对形状进行分类.邻接分族主要采用了形状的边界信息,而形状形族主要采用了形状区域信息.在形状进行匹配时,除了每个族中形状差异外,还比较每个族中质心和周长的差异,以及整个形状的位置特征矢量的差异,查询判别距离是这些差异的加权和。基于空间关系的图像分类技术在图像信息系统中,依据图像中对象及对象间的空间位置关系来区别图像库中的不同图像是一个非常重要的方法。因此,如何存贮图像对象及其中对象位置关系以方便图像的分类,是图像数据库系统设计的一个重要问题。而且利用图像中对象间的空间关系来区别图像,符合人们识别图像的习惯,所以许多研究人员从图像中对象空间位置关系出发,着手对基于对象空间位置关系的分类方法进行了研究。早在1976年,Tanimoto提出了用像元方法来表示图像中的实体,并提出了用像元来作为图像对象索引。随后被美国匹兹堡大学chang采纳并提出用二维符号串(2D一String)的表示方法来进行图像空间关系的分类,由于该方法简单,并且对于部分图像来说可以从ZD一String重构它们的符号图,因此被许多人采用和改进,该方法的缺点是仅用对象的质心表示空间位置;其次是对于一些图像来说我们不能根据其ZD一string完个重构其符号图;再则是上述的空间关系太简单,实际中的空间关系要复杂得多。,针对这些问题许多人提出了改进力一法。Jungert根据图像对象的最小包围盒分别在:x轴方向和y轴上的投影区间之间的交叠关系来表示对象之间的空间关系,随后Cllallg和Jungert等人又提出了广义ZD一string(ZDG一String)的方法,将图像对象进一步切分为更小的子对象来表示对象的空间关系,但是该方法不足之处是当图像对象数日比较多且空间关系比较复杂时,需要切分的子对象的数目很多,存储的开销太大,针对此Lee和Hsu等人提出了ZDC一string的方一法,它们采用Anell提出的13种时态间隔关系并应用到空间投影区问上来表达空间关系。在x轴方向和y轴方向的组合关系共有169种,他提出了5种基本关系转换法则,在此基础上又提出了新的对象切分方法。采用ZDC一string的方法比ZDG一string切分子对象的数目明显减少。为了在空间关系中保留两个对象的相对空间距离和对象的大小,Huang等人提出了ZDC书string的方法提高符号图的重构精度,并使得对包含对象相对大小、距离的符号图的推理成为可能。上述方法都涉及到将图像对象进行划分为子对象,且在用符号串重构对象时处理时间的开销都比较大,为解决这些方法的不足,Lee等人又提出了ZDB一String的方法,它不要求对象进一步划分,用对象的名称来表示对象的起点和终点边界。为了解决符号图的重构问题,Chin一ChenCllang等人提出了面向相对坐标解决符号图的重构问题,Chin一ChenChang等人提出了面向相对坐标符号串表示(RCOS串),它们用对象最小外接包围盒的左下角坐标和右上角坐标来表示对象之间的空间关系.对于对象之间的空间关系采用Allen提出的13种区间表示方法。实际上上述所有方法都不是和对象的方位无关,为此Huang等人又提出了RSString表示方法。虽然上述各种方法在对图像对象空间信息的分类起到过一定作用,由于它们都是采用对象的最小外接矩形来表示一个对象空间位置,这对于矩形对象来说是比较合适的,但是当两个对象是不规则形状,且它们在空间关系上是分离时,它们的外接矩形却存在着某种包含和交叠,结果出现对这些对象空间关系的错误表示。用上述空间关系进行图像分类都是定性的分类方一法,将图像的空间关系转换为图像相似性的定量度量是一个较为困难的事情。Nabil综合ZD一String方法和二维平面中对象之间的点集拓扑关系。提出了ZD一PIR分类方法,两个对象之间的相似与否就转换为两个图像的ZD一PIR图之间是否同构。ZD一PIR中只有图像对象之间的空间拓扑关系具有旋转不变性,在进行图像分类的时候没有考虑对象之间的相对距离。
收起全文
精华内容
下载资源
问答
  • 基于Python的图像分类

    2019-01-14 17:06:52
    基于Python的图像分类算法,用的是的图像案例是遥感数据,适合初学者的学习使用
  • opencv SVM图像分类工程文件

    千次下载 热门讨论 2015-07-30 08:37:40
    这是opencv svm图像分类的整个工程代码,在VS2010下打开即可。整个工程文件以及我的所有训练的图片存放在这里,需要的可以下载,自己在找训练图片写代码花了很多时间,下载完后自行解压,训练图片和测试图片可以从这...
  • opencv+svm实现图像分类代码+训练图片,新建opencv工程,导入两个文件就可以了。
  • 简单图像分类

    热门讨论 2015-05-02 21:23:33
    一个简单的图片分类程序,基于python(numpy & opencv),文件包含代码以及图片集,分类正确率约为89%。仅供学习使用…
  • 遥感图像分类

    万次阅读 多人点赞 2019-01-28 21:36:02
    遥感图像分类 一、背景简介 遥感图像分类就是利用计算机通过对遥感图像中各类地物的光谱信息和空间信息进行分析,选择特征,将图像中各个像元按照某种规则或算法划分不同的类别,然后获得遥感图像中与实际地物的...

    遥感图像分类

    一、背景简介

    遥感图像分类就是利用计算机通过对遥感图像中各类地物的光谱信息和空间信息进行分析,选择特征,将图像中各个像元按照某种规则或算法划分不同的类别,然后获得遥感图像中与实际地物的对应信息,从而实现图像的分类。遥感图像计算机分类的依据是遥感图像像素的相似度。常使用距离和相关系数来衡量相似度。常见的分类方法有:监督分类、非监督分类法。

    二、监督分类与非监督分类的区别及优缺点简要探讨:

    案例:数据源为ENVI自带的Landsat tm5数据Can-tmr.img,类别为:林地、草地/灌木、耕地、裸地、沙地、其它六类。 下面就分别用监督分类与非监督分类法次此案例进行简单分析。
    首先我们来了解一下什么是监督分类?
    监督分类是用于在数据集中根据用户定义的训练样本类别聚集像元。训练样本类别是像元的集合或单一波谱。在分类过程中,可以选择它们作为代表区域或分类素材。
    监督分类的大致步骤有:类别定义、样本选择、分类器选择、影像分类、分类后处理、结果验证。
    监督分类对本案例处理的简要流程:

    1、类别定义

    根据分类目的、影像数据自身的特征和分类区收集的信息确定分类系统;对影像进行特征判断,评价图像质量,决定是否需要进行影像增强等预处理。这个过程主要是一个目视查看的过程,为后面样本的选择打下基础。本例是以ENVI自带Landsat tm5数据Can-tmr.img为数据源,类别分为:林地、草地/灌木、耕地、裸地、沙地、其他六类。

    2、样本选择

    为了建立分类函数,需要对每一类别选取一定数目的样本,在ENVI,中是通过感兴趣区来确定,也可以将矢量文件转化为ROIs文件来获得,或者利用终端像元收集器来获得。本例中使用ROIs方法,打开分类图像,在Display->Overlay->Region of Interest,默认ROIs为多边形,按照默认设置在影像上定义训练样本。如图1-1示,设置好颜色和类别名称。
    在这里插入图片描述
    如图1-1 训练样本的选择

    3、分类器选择

    根据分类的复杂度,精度需求等确定哪一种分类器。目前监督分类可分为基于传统统计分析学的,包括平行六面体、最小距离、马氏距离、最大似然,基于神经网络的,基于模式识别,包括支持向量机、模糊分类等,针对高光谱有光谱角,光谱信息散度,二进制编码。

    4、影像分类

    选择支持向量机分类方法。主菜单下选择Classification>Supervised>Support Vector Machine。按照默认设置参数输出分类结果。如图1-2:
    在这里插入图片描述
    图1-2支持向量机分类器参数设置
    在这里插入图片描述
    图1-3支持向量机分类结果

    5、分类后处理

    分类后处理包括的很多过程都是可选项,包括更改类别颜色、分类后统计,小斑块处理等。如更给类别颜色:在主图像窗口中的显示菜单里,选择Display > Color Mapping > Class Color Mapping,分别选取颜色。
    在这里插入图片描述
    图1-4类别颜色更改后的效果
    在这里插入图片描述
    图1-5自动颜色更改的效果

    6、结果验证

    结果验证主要是对分类结果进行评价,确定分类的精度和可靠性。有两种方法:一是混淆矩阵,二是ROC曲线。在此不作具体介绍。
    让我们来了解一下什么是非监督分类?
    非监督分类:也称为聚类分析或点群分类。在多光谱图像中搜寻、定义其自 然相似光谱集群的过程。它不必对影像地物获取先验知识,仅依靠影像上不同类地物光谱(或纹理)信息进行特征提取,再统计特征的差别来达到分类的目的,最后对已分出的各个类别的实际属性进行确认。
    目前非监督分类器比较常用的是ISODATA、K-MEAN 等链状方法。
    非监督分类处理本案例的流程简要:

    1、影像分析

    大体上判断主要地物的类别数量。一般监督分类设置分类数目比最终分类数量要多2-3倍为宜,这样有助于提高分类精度。本案例的数据源为ENVI自带的 Landsat tm5 数据Can-tmr.img, 类别分为:林地、草地/灌木、耕地、裸地、沙 地、其它六类。

    2、分类器选择

    ISODATA重复自组织数据分析技术,计算数据空间中均匀分布的类均值,然后用最小距离技术将剩余像元进行迭代聚合,每次迭代都重新计算均值,且根据所得的新均值,对像元进行再分类。
    K-MEAN使用了聚类分析方法,随机地查找聚类簇的聚类相似度相近,即中心位置,是利用各聚类中心对象的均值所获得一个中心对象来进行计算的,然后迭代地重新配置它们,完成分类过程。

    3、影像分类

    打开ENVI,选择主菜单->Classificatio->Unsupervised->IsoData或者K-mean。如选择IsoData,在选择文件时,可以设置空间或光谱裁剪区。如选择Can-tmr.ing,按默认设置,之后跳出参数设置,如图1-6:ISODATA非监督分类结果。
    在这里插入图片描述
    1-6分类结果

    4、 类别定义

    在display中显示原始影像,在display->overlay->classification,选择ISODATA分类结果,如图所示,在Interactive Class Tool面板中,可以选择 各个分类结果显示。如图1-7:
    在这里插入图片描述
    图1-7影像与分类结果的叠加
    Interactive Class Tool面板中,选择Option->Edit class colors/names。 通过目视或者其他方式识别分类结果,填写相应的类型名称和颜色。如图1-8所 示为最终结果。
    在这里插入图片描述
    图1-8类别定义结果

    5、分类后处理

    对颜色的分类,统计分析等参考监督分类。

    6、 结果验证

    参照监督分类

    三、小结

    由此案例可得监督分类与非监督分类:
    区别:非监督分类的关键部分是类别定义。此过程需要数据的支持,甚至需要组织野外实地调查。
    监督分类中的样本选择和分类器的选择较关键。在样本选择时,为了更加清楚的查看地物类型,可以适当的对图像做一些增强处理。
    两者的根本区别是在于是否利用训练场地来获取先验的类别知识。

    优缺点:

    优点:可充分利用分类地区的先验知识,预先确定分类的类别;可控制训练样本的选择;可避免非监督分类中对光谱集群组的重新归类等。
    缺点:人为主观因素较强;训练样本的选取和评估需花费较多的人力,时间等。

    非监督分类:

    优点:无需对分类区域有广泛的了解,仅需一定的知识来解释分类出集群组;人为误差小;独特的,覆盖量小的类别均能被识别;简单,速度快等。
    缺点:对其结果进行大量处理后,才能得到可靠分类结果;不能精确控制分类的类别数等。

    扫码关注公众号,了解更多文章

    三山半落,一水中分。地纵经纬,理入乾坤。
    ~兰州交通大学地理信息科学爱好者集散地,欢迎你的加入~

    在这里插入图片描述

    展开全文
  • 从机器学习基础算法开始,然后进入到图像分类领域,使用MNIST手写数据集和CIFAR10图像数据集,从简单神经网络到深度神经网络,再到卷积神经网络,最终完成复杂模型:残差网络的搭建。完成这条主线,学员将可以自如地...
  • 卷积神经网络CNN进行图像分类
  • matlab实现用cnn高光谱图像分类
  • opencv使用SVM实现图像分类识别,代码已测试通过,能帮助我们更好理解SVM和opencv编程的使用。
  • 本例采用opencv的随机森林对图像分类,提取的是图像的颜色直方图,然后计算统计特征,采用csv文件存储图像特征。
  • 图像分类

    万次阅读 多人点赞 2018-01-21 15:31:47
    图像物体分类与检测算法综述 转自《计算机学报》 目录 图像物体分类与检测算法综述 目录 图像物体分类与检测概述 物体分类与检测的难点与挑战 物体分类与检测数据库 物体分类与检测发展历程 ...

    图像物体分类与检测算法综述

    转自《计算机学报》

    目录

    图像物体分类与检测是计算机视觉研究中的两个重要的基本问题,也是图像分割物体跟踪行为分析等其他高层视觉任务的基础。
    本文从物体分类与检测问题的基本定义出发,首先从实例、类别、语义三个层次对物体分类与检测研究中存在的困难与挑战进行了阐述。
    接下来,本文以物体检测和分类方面的典型数据库和国际视觉竞赛PASCAL VOC为主线对近年来物体分类与检测的发展脉络进行了梳理与总结,指出表达学习结构学习分别对于物体分类与检测的作用。
    最后本文对物体分类与检测的发展方向进行了思考和讨论,探讨了这一领域下一步研究的方向。

    关键词 物体分类 物体检测 计算机视觉 特征表达 结构学习


    图像物体分类与检测概述

    物体分类与检测是计算机视觉、模式识别与机器学习领域非常活跃的研究方向。物体分类与检测在很多领域得到广泛应用,包括安防领域人脸识别行人检测智能视频分析行人跟踪等,交通领域交通场景物体识别车辆计数逆行检测车牌检测与识别,以及互联网领域的基于内容的图像检索相册自动归类等。

    可以说,物体分类与检测已经应用于人们日常生活的方方面面,计算机自动分类与检测技术也在一定程度了减轻了人的负担,改变了人类生活方式。计算机视觉理论的奠基者,英国神经生理学家马尔认为,视觉要解决的问题可归结为“What is Where”,即什么东西在什么地方,即计算机视觉的研究中,物体分类和检测是最基本的研究问题之一。

    如图 1 所示,给定一张图片,物体分类要回答的问题是这张图片中是否包含某类物体(比如牛);物体检测要回答的问题则是物体出现在图中的什么地方,即需要给出物体的外接矩形框,如图 1(b)所示。

    物体分类与检测的研究,是整个计算机视觉研究的基石,是解决跟踪、分割、场景理解等其他复杂视觉问题的基础。欲对实际复杂场景进行自动分析与理解,首先就需要确定图像中存在什么物体(分类问题),或者是确定图像中什么位置存在什么物体(检测问题)。鉴于物体分类与检测在计算机视觉领域的重要地位,研究鲁棒、准确的物体分类与检测算法,无疑有着重要的理论意义和实际意义。

    这里写图片描述


    本文从物体分类与检测问题的基本定义出发,首先从实例、类别、语义三个层次对物体分类与检测研究中存在的困难与挑战进行了阐述。接下来,本文以物体检测和分类方面的主流数据库和国际视觉竞赛 PASCAL VOC 竞赛为主线对近年来物体分类与检测算法的发展脉络进行了梳理与总结,指出物体分类与检测算法的主流方法:基于表达学习和结构学习。在此基础上,本文对物体分类与检测算法的发展方向进行了思考和讨论,指出了物体检测和物体分类的有机统一,探讨了下一步研究的方向。

    物体分类与检测的难点与挑战

    物体分类与检测是视觉研究中的基本问题,也是一个非常具有挑战性的问题。物体分类与检测的难点与挑战在本文中分为三个层次:实例层次类别层次语义层次,如图 2 所示。

    这里写图片描述

    实例层次:
    针对单个物体实例而言,通常由于图像采集过程中光照条件、拍摄视角、距离的不同,物体自身的非刚体形变以及其他物体的部分遮挡使得物体实例的表观特征产生很大的变化,给视觉识别算法带来了极大的困难。

    类别层次:
    困难与挑战通常来自三个方面,首先是类内差大,也即属于同一类的物体表观特征差别比较大,其原因有前面提到的各种实例层次的变化,但这里更强调的是类内不同实例的差别,例如图 3(a)所示,同样是椅子,外观却是千差万别,而从语义上来讲,有“坐”的功能的器具都可以称椅子;其次是类间模糊性,即不同类的物体实例具有一定的相似性,如图 3(b)所示,左边的是一只狼,右边的是一只哈士奇,但我们从外观上却很难分开二者;再次是背景的干扰,在实际场景下,物体不可能出现在一个非常干净的背景下,往往相反,背景可能是非常复杂的、对我们感兴趣的物体存在干扰的,这使得识别问题的难度大大加大。
    本文从物体分类与检测问题的基本定义出发,首先从实例、类别、语义三个层次对物体分类与检测研究中存在的困难与挑战进行了阐述。
    接下来,本文以物体检测和分类方面的主流数据库和国际视觉竞赛 PASCAL VOC 竞赛为主线对近年来物体分类与检测算法的发展脉络进行了梳理与总结,指出物体分类与检测算法的主流方法基于表达学习和结构学习。在此基础上,本文对物体分类与检测算法的发展方向进行了思考和讨论,指出了物体检测和物体分类的有机统一,探讨了下一步研究的方向。

    语义层次:
    困难与挑战与图像的视觉语义相关,这个层次的困难往往非常难以处理,特别是对现在的计算机视觉理论水平而言。一个典型的问题称为多重稳定性。如图所示,图 3(c)左边既可以看成是两个面对面的人,也可以看成是一个燃烧的蜡烛;右边则同时可以解释为兔子或者小鸭。同样的图像,不同的解释,这既与人的观察视角、关注点等物理条件有关,也与人的性格、经历等有关,而这恰恰是视觉识别系统难以很好处理的部分。

    这里写图片描述

    这里写图片描述

    物体分类与检测数据库

    数据是视觉识别研究中最重要的因素之一,通常我们更多关注于模型、算法本身,事实上,数据在视觉任务的作用正越来越明显,大数据时代的到来,也使得研究人员开始更加重视数据。在数据足够多的情况下,我们甚至可以使用最简单的模型、算法,比如最近邻分类朴素贝叶斯分类器都能得到很好的效果。鉴于数据对算法的重要性,我们将在本节对视觉研究中物体分类与检测方面的主流数据进行概述,从中也可以一窥目标分类、检测的发展。在介绍不同数据库时,将主要从数据库图像数目、类别数目、每类样本数目、图像大小、分类检测任务难度等方面进行阐述,如表 3 中所示。
    早期物体分类研究集中于一些较为简单的特定任务,如 OCR、形状分类等。OCR 中数字手写识别是一个得到广泛研究的课题,相关数据库中最著名的是 MNIST数据库。MNIST 是一个数字手写识别领域的标准评测数据集,数据库大小是60000,一共包含 10 类阿拉伯数字,每类提供 5000张图像进行训练,1000 张进行测试。MNIST 的图像大小为 28×28,即 784 维,所有图像手写数字,存在较大的形变。形状分类是另一个比较重要的物体分类初期的研究领域,相关数据库有 ETHZ Shape ClassesMPEG-7等。其中 ETHZ ShapeClasses 包含 6 类具有较大差别的形状类别:苹果、商标、瓶子、长颈鹿、杯子、天鹅,整个数据库包含 255 张测试图像。

    CIFAR-10&CIFAR-100 数 据 库 是 Tiny images的两个子集,分别包含了 10 类和 100 类物体类别。这两个数据库的图像尺寸都是 32×32,而且是彩色图像。CIFAR-10 包含 6 万的图像,其中 5 万用于模型训练,1 万用于测试,每一类物体有 5000 张图像用于训练,1000 张图像用于测试。

    CIFAR-100 与 CIFAR-10 组成类似,不同是包含了更多的类别:20 个大类,大类又细分为 100 个小类别,每类包含 600 张图像。CIFAR-10 和 CIFAR-100数据库尺寸较小,但是数据规模相对较大,非常适合复杂模型特别是深度学习模型训练,因而成为深度学习领域主流的物体识别评测数据集。

    Caltech-101是第一个规模较大的一般物体识别标准数据库,除背景类别外,它一共包含了 101类物体,共 9146 张图像,每类中图像数目从 40 到800 不等,图像尺寸也达到 300 左右。Caltech-101是以物体为中心构建的数据库,每张图像基本只包含一个物体实例,且居于图像中间位置,物体尺寸相对图像尺寸比例较大,且变化相对实际场景来说不大,比较容易识别。Caltech-101 每类的图像数目
    差别较大,有些类别只有很少的训练图像,也约束了 可以使 用的训 练集大小 。

    Caltech 256 与Caltech-101 类似,区别是物体类别从 101 类增加到了 256 类,每类包含至少 80 张图像。图像类别的增加,也使得 Caltech-256 上的识别任务更加困难,使其成为检验算法性能与扩展性的新基准。15Scenes 是由 Svetlana Lazebnik 在 FeiFei Li 的13 Scenes 数据库的基础上加入了两个新的场景构成的,一共有 15 个自然场景,4485 张图像,每类大概包含 200 到 400 张图像,图像分辨率约为300 × 250。15 Scenes 数据库主要用于场景分类评测,由于物体分类与场景分类在模型与算法上差别不大,该数据库也在图像分类问题上得到广泛的使用。

    PASCAL VOC 从 2005 年到 2012 年每年发布关于分类、检测、分割等任务的数据库,并在相应数据库上举行了算法竞赛,极大地推动了视觉研究的发展进步。最初 2005 年 PASCAL VOC 数据库只包含人、自行车、摩托车、汽车 4 类,2006 年类别数目增加到 10 类,2007 年开始类别数目固定为 20 类,以后每年只增加部分样本。PASCAL VOC数据库中物体类别均为日常生活常见的物体,如交通工具、室内家具、人、动物等。PASCAL VOC 2007数据库共包含 9963 张图片,图片来源包括 Filker等互联网站点以及其它数据库,每类大概包含96-2008 张图像,均为一般尺寸的自然图像。PASCAL VOC 数据库与 Caltech-101 相比,虽然类别数更少,但由于图像中物体变化极大,每张图像可能包含多个不同类别物体实例,且物体尺度变化很大,因而分类与检测难度都非常大。该数据库的提出,对物体分类与检测的算法提出了极大的挑战,也催生了大批优秀的理论与算法,将物体识别研究推向了一个新的高度。

    随着分类与检测算法的进步,很多算法在以上提到的相关数据库上性能都接近饱和,同时随着大数据时代的到来,硬件技术的发展,也使得在更大规 模 的 数 据 库 进 行 研 究 和 评 测 成 为 必 然 。

    ImageNet是由 FeiFei Li 主持构建的大规模图像数据库,图像类别按照 WordNet 构建,全库截至2013 年共有 1400 万张图像,2.2 万个类别,平均每类包含 1000 张图像。这是目前视觉识别领域最大的有标注的自然图像分辨率的数据集,尽管图像本身基本还是以目标为中心构建的,但是海量的数据和海量的图像类别,使得该数据库上的分类任务依然极具挑战性。除此之外,ImageNet 还构建了一个包含 1000 类物体 120 万图像的子集,并以此作为ImageNet 大尺度视觉识别竞赛的数据平台,逐渐成为物体分类算法评测的标准数据集。

    SUN 数据库的构建是希望给研究人员提供一个覆盖较大场景、位置、人物变化的数据库,库中的场景名是从 WordNet 中的所有场景名称中得来。SUN 数据库包含两个评测集,一个是场景识别数据集,称为 SUN-397,共包含 397 类场景,每类至少包含 100 张图片,总共有 108,754 张图像。另一个评测集为物体检测数据集,称为 SUN2012,包含 16,873 张图像。Tiny images是一个图像规模更大的数据库,共包含 7900 万张 32×32 图像,图像类别数目有 7.5 万,尽管图像分辨率较低,但还是具有较高的区分度,而其绝无仅有的数据规模,使其成为大规模分类、检索算法的研究基础。我们通过分析表 1 可以看到,物体分类的发展过程中,数据库的构建大概可以分为 3 个阶段,经历了一个从简单到复杂,从特殊到一般,从小规模到大规模的跨越。

    早期的手写数字识别 MNIST,形状分类 MPEG-7 等都是研究特定问题中图像分类,之后研究人员开始进行更广泛的一般目标分类与检 测 的 研 究 , 典 型 的 数 据 库 包 括 15 场 景 ,Caltech-101/256, PASCAL VOC 2007 等;随着词包模型等算法的发展与成熟,更大规模的物体分类与检测研究得到了广泛的关注,这一阶段的典型数据库包括 SUN 数据库、ImageNet 以及 Tiny 等。
    近年来,数据库构建中的科学性也受到越来越多的关注,Torralba 等人对数据库的 Bias、泛化性能、价值等问题进行了深入的讨论,提出排除数据库构建过程中的选择偏好,拍摄偏好,负样本集偏好是构造更加接近真实视觉世界的视觉数据库中的关键问题。伴随着视觉处理理论的进步,视觉识别逐渐开始处理更加真实场景的视觉问题,因而对视觉数据库的泛化性、规模等也提出了新的要求和挑战。
    我们也可以发现,物体类别越多,导致类间差越小,分类与检测任务越困难,图像数目、图像尺寸的大小,则直接对算法的可扩展性提出了更高的要求,如何在有限时间内高效地处理海量数据、进行准确的目标分类与检测成为当前研究的热点

    这里写图片描述

    物体分类与检测发展历程

    图像物体识别的研究已经有五十多年的历史。各类理论和算法层出不穷,在这部分,我们对物体分类与检测的发展脉络进行了简单梳理,并将其中里程碑式的工作进行综述。特别的,我们以国际视觉竞赛 PASCAL VOC竞赛为主线对物体分类与检测算法近年来的主要进展进行综述,这个系列的竞赛对物体分类检测的发展影响深远,其工作也代表了当时的最高水平

    物体分类 任务要求回答一张图像中是否包含某种物体,对图像进行特征描述是物体分类的主要研究内容。一般说来,物体分类算法通过手工特征或者特征学习方法对整个图像进行全局描述,然后使用分类器判断是否存在某类物体。

    物体检测 任务则更为复杂,它需要回答一张图像中在什么位置存在一个什么物体,因而除特征表达外,物体结构是物体检测任务不同于物体分类的最重要之处。总的来说,近年来物体分类方法多侧重于学习特征表达,典型的包括词包模型(Bag-of-Words)、深度学习模型;物体检测方法则侧重于结构学习,以形变部件模型为代表。

    这里我们首先以典型的分类检测模型来阐述其一般方法和过程,之后以 PASCAL VOC(包含 ImageNet)竞赛历年来的最好成绩来介绍物体分类和物体检测算法的发展,包括物体分类中的词包模型、深度学习模型以及物体检测中的结构学习模型,并分别对各个部分进行阐述。

    4.1 基于词包模型的物体分类

    从表 2 我们可以发现,词包模型是 VOC 竞赛中物体分类算法的基本框架,几乎所有的参赛算法都是基于词包模型。我们将从底层特征特征编码空间约束分类器设计模型融合几个方面来展开阐述。

    词包模型(Bag-of-Words)最初产生于自然语言处理领域,通过建模文档中单词出现的频率来对文档进行描述与表达。Csurka 等人于 2004 年首次将词包的概念引入计算机视觉领域, 由此开始大量的研究工作集中于词包模型的研究,并逐渐形成了由下面四部分组成的标准目标分类框架:

    1. 底层特征提取

    底层特征是物体分类与检测框架中的第一步,底层特征提取方式有两种:一种是基于兴趣点检测另一种是采用密集提取的方式

    兴趣点检测算法通过某种准则选择具有明确定义的、局部纹理特征比较明显的像素点、边缘、角点、区块等,并且通常能够获得一定的几何不变性,从而可以在较小的开销下得到更有意义的表达,最常用的兴趣点检测算子有 Harris 角点检测子、FAST(Features from Accelerated Segment Test) 算子LoG (Laplacian of Gaussian)DoG (Difference ofGaussian)等。近年来物体分类领域使用更多的则是密集提取的方式,从图像中按固定的步长、尺度提取出大量的局部特征描述,大量的局部描述尽管具有更高的冗余度,但信息更加丰富,后面再使用词包模型进行有效表达后通常可以得到比兴趣点检测 更 好 的 性 能 。
    常 用 的 局 部 特 征 包 括 SIFT(Scale-invariant feature transform,尺度不变特征转换)HOG(Histogram of Oriented Gradient, 方向梯度直方图)LBP(Local Binary Pattern, 局部二值模式) 等。从表 2 可以看出,历年最好的物体分类算法都采用了多种特征采样方式上密集提取与兴趣点检测相结合,底层特征描述也采用了多种特征描述子,这样做的好处是,在底层特征提取阶段,通过提取到大量的冗余特征,最大限度的对图像进行底层描述,防止丢失过多的有用信息,这些底层描述中的冗余信息主要靠后面的特征编码和特征汇聚得到抽象和简并。事实上,近年来得到广泛关注的深度学习理论中一个重要的观点就是手工设计的底层特征描述子作为视觉信息处理的第一步,往往会过早的丢失有用的信息,直接从图像像素学习到任务相关的特征描述是比手工特征更为有效的手段。

    2.特征编码

    密集提取的底层特征中包含了大量的冗余与噪声,为提高特征表达的鲁棒性,需要使用一种特征变换算法对底层特征进行编码,从而获得更具区分性、更加鲁棒的特征表达,这一步对物体识别的性能具有至关重要的作用,因而大量的研究工作都集中在寻找更加强大的特征编码方法,重要的特征编码算法包括向量量化编码、核词典编码、稀疏编码、局部线性约束编码、显著性编码、Fisher 向量编码、超向量编码等。最简单的特征编码是向量量化编码,它的出现甚至比词包模型的提出还要早。向量量化编码是通过一种量化的思想,使用一个较小的特征集合(视觉词典)来对底层特征进行描述,达到特征压缩的目的。向量量化编码只在最近的视觉单词上响应为 1,因而又称为硬量化编码、硬投票编码,这意味着向量量化编码只能对局部特征进行很粗糙的重构。但向量量化编码思想简单、直观,也比较容易高效实现,因而从 2005 年第一届PASCAL VOC 竞赛以来,就得到了广泛的使用
    在实际图像中,图像局部特征常常存在一定的模糊性,即一个局部特征可能和多个视觉单词差别很小,这个时候若使用向量量化编码将只利用距离最近的视觉单词,而忽略了其他相似性很高的视觉单词。为了克服这种 模糊性问题,Gemert 等提出了软量化编码(又称核视觉词典编码)算法,局部特征不再使用一个视觉单词描述,而是由距离最近的 K 个视觉单词加权后进行描述,有效解决了视觉单词的模糊性问题,提高了物体识别的精度。稀疏表达理论近年来在视觉研究领域得到了大量的关注,研究人员最初在生理实验中发现细胞在绝大部分时间内是处于不活动状态,也即在时间轴上细胞的激活信号是稀疏的。稀疏编码通过最小二乘重构加入稀疏约束来实现在一个过完备基上响应的稀疏性
    ℓ 约束是最直接的稀疏约束,但通常很难进行优化,近年来更多使用的是 ℓ 约束,可以更加有效地进行迭代优化,得到稀疏表达。2009 年杨建超等人 将稀疏编码应用到物体分类领域,替代了之前的向量量化编码和软量化编码,得到一个高维的高度稀疏的特征表达,大大提高了特征表达的线性可分性, 仅仅使用线性分类器就得到了当时最好的物体分类结果,将物体分类的研究推向了一个新的高度上。稀疏编码在物体分类上的成功也不难理解,对于一个很大的特征集合(视觉词典),一个物体通常只和其中很少的特征有关,例如,自行车通常和表达车轮、车把等部分的视觉单词密切相关,与飞机机翼、电视机屏幕等关系很小,而行人则通常在头、四肢等对应的视觉单词上有强响应。稀疏编码存在一个问题,即相似的局部特征可能经过稀疏编码后在不同的视觉单词上产生响应,这种变换的不连续性必然会产生编码后特征的不匹配,影响特征的区分性能。
    局部线性约束编码的提出就是为了解决这一问题,它通过加入局部线性约束,在一个局部流形上对底层特征进行编码重构,这样既可以保证得到的特征编码不会有稀疏编码存在的不连续问题,也保持了稀疏编码的特征稀疏性。局部线性约束编码中,局部性是局部线性约束编码中的一个核心思想,通过引入局部性,一定程度上改善了特征编码过程的连续性问题,即距离相近的局部特征在经过编码之后应该依然能够落在一个局部流形上。
    局部线性约束编码可以得到稀疏的特征表达,与稀疏编码不同之处就在于稀疏编码无法保证相近的局部特征编码之后落在相近的局部流形。从表 2 可以看出,2009 年的分类竞赛冠军采用了混合高斯模型聚类和局部坐标编码(局部线性约束编码是其简化版本),仅仅使用线性分类器就取得了非常好的性能。不同于稀疏编码和局部线性约束编码,显著性编码引入了视觉显著性的概念,如果一个局部特征到最近和次近的视觉单词的距离差别很小,则认为这个局部特征是不“显著的”,从而编码后的响应也很小。显著性编码通过这样很简单的编码操作,在 Caltech 101/256, PASCAL VOC 2007 等数据库上取得了非常好的结果,而且由于是解析的结果,编码速度也比稀疏编码快很多。黄等人发现显著性表达配合最大值汇聚在特征编码中有重要的作用,并认为这正是稀疏编码、局部约束线性编码等之所以在图像分类任务上取得成功的原因。
    超向量编码,Fisher 向量编码是近年提出的性能最好的特征编码方法,其基本思想有相似之处,都可以认为是编码局部特征和视觉单词的差。 Fisher 向量编码同时融合了产生式模型和判别式模型的能力,与传统的基于重构的特征编码方法不同,它记录了局部特征与视觉单词之间的一阶差分和二阶差分。超向量编码则直接使用局部特征与最近的视觉单词的差来替换之前简单的硬投票。这种特征编码方式得到的特征向量表达通常是传统基于重构编码方法的M 倍(这里 M 是局部特征的维度)。尽管特征维度要高出很多,超向量编码和 Fisher 向量编码在PASCAL VOC、ImageNet 等极具挑战性、大尺度数据库上获得了最好的性能,并在图像标注、图像分类、图像检索等领域得到应用。
    2011 年 ImageNet分类竞赛冠军采用了超向量编码,2012 年 VOC 竞赛冠军则是采用了向量量化编码和 Fisher 向量编码。

    3.特征汇聚

    空间特征汇聚是特征编码后进行的特征集整合操作,通过对编码后的特征,每一维都取其最大值或者平均值,得到一个紧致的特征向量作为图像的特征表达。这一步得到的图像表达可以获得一定的特征不变性,同时也避免了使用特征集进行图像表达的高额代价。最大值汇聚在绝大部分情况下的性能要优于平均值汇聚,也在物体分类中使用最为广泛。由于图像通常具有极强的空间结构约束,空间金字塔匹配 (Spatial Pyramid Matching, SPM)提出将图像均匀分块,然后每个区块里面单独做特征汇聚操作并将所有特征向量拼接起来作为图像最终的特征表达。空间金字塔匹配的想法非常直观,是金字塔匹配核 (Pyramid Matching Kernel, PMK) 的图像空间对偶,它操作简单而且性能提升明显,因而在当前基于词包模型的图像分类框架中成为标准步骤。实际使用中,在Caltech 101/256 等数据库上通常使用 1×1, 2×2, 4×4的空间分块,因而特征维度是全局汇聚得到的特征向量的 21 倍,在 PASCAL VOC 数据库上,则采用1×1,2×2,3×1 的分块,因而最终特征表达的维度是全局汇聚的8倍。

    4.使用支持向量机等分类器进行分类

    从图像提取到特征表达之后,一张图像可以使用一个固定维度的向量进行描述,接下来就是学习一个分类器对图像进行分类。这个时候可以选择的分类器就很多了,常用的分类器有支持向量机K 近邻神经网络随机森林等。基于最大化边界的支持向量机是使用最为广泛的分类器之一,在图像分类任务上性能很好,特别是使用了核方法的支持向量机。杨建超等人提出了 ScSPM 方法,通过学习过完备的稀疏特征,可以在高维特征空间提高特征的线性可分性,使用线性支持向量机就得到了当时最好的分类结果,大大降低了训练分类器的时间和空间消耗。随着物体分类研究的发展,使用的视觉单词大小不断增大,得到的图像表达维度也不断增加,达到了几十万的量级。这样高的数据维度,相比几万量级的数据样本,都与传统的模式分类问题有了很大的不同。随着处理的数据规模不断增大,基于在线学习的线性分类器成为首选,得到了广泛的关注与应用。

    4.2 深度学习模型

    深度学习模型是另一类物体识别算法,其基本思想是通过有监督或者无监督的方式学习层次化的特征表达,来对物体进行从底层到高层的描述 。 主 流 的 深 度 学 习 模 型 包 括 自 动 编 码 器(Auto-encoder)受限波尔兹曼机(Restricted Boltzmann Machine, RBM)深度信念网络(Deep Belief Nets, DBN)卷积神经网络(Convolutional Neural Netowrks, CNN)生物启发式模型等。

    自动编码器(Auto-encoder)是上世纪 80 年代提出的一种特殊的神经网络结构,并且在数据降维、特征提取等方面得到广泛应用。自动编码器由编码器和解码器组成,编码器将数据输入变换到隐藏层表达,解码器则负责从隐藏层恢复原始输入。隐藏层单元数目通常少于数据输入维度,起着类似“瓶颈”的作用,保持数据中最重要的信息,从而实现数据降维与特征编码。自动编码器是基于特征重构的无监督特征学习单元,加入不同的约束,可以 得 到 不 同 的 变 化 , 包 括 去 噪 自 动 编 码 器(Denoising Autoencoders)、 稀疏 自动编 码器(Sparse Autoencoders)等,在数字手写识别、图像分类等任务上取得了非常好的结果。

    受限玻尔兹曼机是一种无向二分图模型,是一种典型的基于能量的模型(Enery-based Models,EBM)。之所以称为“受限”,是指在可视层和隐藏层之间有连接,而在可视层内部和隐藏层内部不存在连接。受限玻尔兹曼机的这种特殊结构,使得它具有很好的条件独立性,即给定隐藏层单元,可视层单元之间是独立的,反之亦然。这个特性使得它可以实现同时对一层内的单元进行并行 Gibbs 采样。受限玻尔兹曼机通常采用对比散度(Contrastive Divergence,CD算法进行模型学习。受限玻尔兹曼机作为一种无监督的单层特征学习单元,类似于前面提到的特征编码算法,事实上加了稀疏约束的受限玻尔兹曼机可以学到类似稀疏编码那样的Gabor 滤波器模式。

    深度信念网络(DBN)是一种层次化的无向图模型。DBN 的基本单元是 RBM(Restricted Boltzmann Machine),首先先以原始输入为可视层,训练一个单层的RBM,然后固定第一层 RBM 权重,以 RBM 隐藏层单元的响应作为新的可视层,训练下一层的 RBM,以此类推。通过这种贪婪式的无监督训练,可以使整个 DBN 模型得到一个比较好的初始值,然后可以加入标签信息,通过产生式或者判别式方式,对整个网络进行有监督的精调,进一步改善网络性能。DBN 的多层结构,使得它能够学习得到层次化的特征表达,实现自动特征抽象,而无监督预训练过程则极大改善了深度神经网络在数据量不够时严重的局部极值问题。Hinton 等人通过这种方式,成功将其应用于手写数字识别、语音识别、基于内容检索等领域。

    卷积神经网络(CNN)最早出现在上世纪80 年代,最初应用于数字手写识别,取得了一定的成功。然而,由于受硬件的约束,卷积神经网络的高强度计算消耗使得它很难应用到实际尺寸的目标识别任务上。Wisel 和 Hubel 在猫视觉系统研究工作的基础上提出了简单、复杂细胞理论,设计卷积神经网络(CNN)最早出现在上世纪80 年代,最初应用于数字手写识别,取得了一定的成功。然而,由于受硬件的约束,卷积神经网络的高强度计算消耗使得它很难应用到实际尺寸的目标识别任务上。Wisel 和 Hubel 在猫视觉系统研究工作的基础上提出了简单、复杂细胞理论,设计这里我们将最为流行的词包模型与卷积神经网络模型进行对比,发现两者其实是极为相似的。在词包模型中,对底层特征进行特征编码的过程,实际上近似等价于卷积神经网络中的卷积层,而汇聚层所进行的操作也与词包模型中的汇聚操作一样。不同之处在于,词包模型实际上相当于只包含了一个卷积层和一个汇聚层,且模型采用无监督方式进行特征表达学习,而卷积神经网络则包含了更多层的简单、复杂细胞,可以进行更为复杂的特征变换,并且其学习过程是有监督过程,滤波器权重可以根据数据与任务不断进行调整,从而学习到更有意义的特征表达。从这个角度来看,卷积神经网络具有更为强大的特征表达能力,它在图像识别任
    务中的出色性能就很容易解释了。

    下面我们将以 PASCAL VOC 竞赛ImageNet竞赛为主线,来对物体分类的发展进行梳理和分析。2005 年第一届 PASCAL VOC 竞赛数据库包含了 4 类物体:摩托车、自行车、人、汽车, 训练集加验证集一共包含 684 张图像,测试集包含 689 张图像,数据规模相对较小。从方法上来说,词包模型开始在物体分类任务上得到应用,但也存在很多其他的方法,如基于检测的物体分类、自组织网络等。从竞赛结果来看,采用“兴趣点检测-SIFT 底层特征描述-向量量化编码直方图-支持向量机”得到了最好的物体分类性能。对数线性模型和logistic 回归的性能要略差于支持向量机,这也说明了基于最大化边缘准则的支持向量机具有较强的鲁棒性,可以更好得处理物体的尺度、视角、形变等变化。
    2006 年玛丽王后学院的张等人使用词包模型获得了 PASCAL VOC 物体分类竞赛冠军。与以前不同,在底层特征提取上,他们采用了更多的兴趣点检测算法,包括 Harris-Laplace 角点检测和Laplacian 块检测。除此以外,他们还使用了基于固定网格的密集特征提取方式,在多个尺度上进行特征提取。底层特征描述除使用尺度不变的 SIFT 特征外,还使用了 SPIN image 特征。
    词包模型是一个无序的全局直方图描述,没有考虑底层特征的空间信息,张等人采用了 Lazebnik 提出的空间金字塔匹配方法,采用 1×1, 2×2, 3×1 的分块,因而最终特征表达的维度是全局汇聚的 8 倍。另一个与之前不同的地方在于,他们使用了一个两级的支持向量机来进行特征分类,第一级采用卡方核 SVM对空间金字塔匹配得到的各个词包特征表达进行分类,第二级则采用 RBF 核 SVM 对第一级的结果进行再分类。通过采用两级的 SVM 分类,可以将不同的 SPM 通道结果融合起来,起到一定的通道选择作用。2007 年来自 INRIA 的 Marcin Marszałek 等人获得物体分类冠军,他们所用的方法也是词包模型,基本流程与 2006 年的冠军方法类似。不同在于,他们在底层特征描述上使用了更多的底层特征描述子,包括 SIFT, SIFT-hue, PAS edgel histogram等,通过多特征方式最大可能保留图像信息,并通过特征编码和 SVM 分类方式发掘有用信息成为物体分类研究者的共识。另一个重要的改进是提出了扩展的多通道高斯核,采用学习线性距离组合的方式确定不同 SPM 通道的权重, 并利用遗传算法进行优化。
    2008 年阿姆斯特丹大学和萨里大学组成的队伍获得了冠军,其基本方法依然是词包模型。
    有三个比较重要的不同之处,首先是他们提出了彩色描述子来增强模型的光照不变性与判别能力;其次是使用软量化编码替代了向量量化编码,由于在实际图像中,图像局部特征常常存在一定的模糊性,即一个局部特征可能和多个视觉单词相似性差别很小,这个时候使用向量量化编码就只使用了距离最近的视觉单词,而忽略了其他同样很相似的视觉单词。为了克服这种模糊性问题,Gemert提出了软量化编码(又称核视觉词典编码)算法,有效解决了视觉模糊性问题,提高了物体识别的精度。另外,他们还采用谱回归核判别分析得到了比支持向量机更好的分类性能。2009 年物体分类研究更加成熟,冠军队伍不再专注于多底层特征、多分类器融合,而是采用了密集提取的单 SIFT 特征,并使用线性分类器进行模式分类。他们的研究中心放在了特征编码上,采用了混合高斯模型 (Gaussian Mixture Model,GMM)和局部坐标编码(Local Coordinate Coding,LCC)两种特征编码方法对底层 SIFT 特征描述子进行编码,得到了高度非线性的、局部的图像特征表达,通过提高特征的不变性、判别性来改进性能。另外,物体检测结果的融合,也进一步提升了物体分类的识别性能。局部坐标编码提出的“局部性”概念,对物体分类中的特征表达具有重要的意义 , 之 后 出 现 的 局 部 线 性 约 束 编 码(Locality-constrained linear coding,LLC)也是基于局部性的思想,得到了“局部的”、“稀疏的”特征表达,在物体分类任务上取得了很好的结果。
    2010 年冠军依旧以词包模型为基础,并且融合了物体分割与检测算法。一方面通过多底层特征、向量量化编码和空间金字塔匹配得到图像的词包模型描述,另一方面,通过使 Mean shift、过分割、基于图的分割等过分割算法,得到Patch 级的词包特征表达。这两种表达作为视觉特征表达,与检测结果以多核学习的方式进行融合。
    在分类器方面,除使用了 SVM 核回归外,还提出了基于排他上下文的 Lasso 预测算法。所谓排他上下文是指一个排他标签集合中至多只能出现一种类别。排他标签集合的构建使用 Graph Shift 方法,并采用最小重构误差加稀疏约束也即 Lasso 进行预测。排他上下文作为一种不同于一般共生关系的上下文,高置信度预测可以大大抑制同一排他标签集中其他类别的置信度,改善分类性能。
    2011 年冠军延续了 2010 年冠军的基本框架。来自阿姆斯特丹大学的队伍从最显著窗口对于物体分类任务的作用出发,在词包模型基础上进行了新的探索。他们发现单独包含物体的图像区域可以得到比整个图像更好的性能,一旦物体位置确定,上下文信息的作用就很小了。在物体存在较大变化的情况下,部件通常比全局更具有判别性,而在拥挤情况下,成群集合通常要比单个物体更加容易识别。基于此,他们提出了包含物体部件,整个物体,物体集合的最显著窗口框架。检测模型训练使用人工标注窗口,预测使用选择性搜索定位。词包模型和最显著窗口算法融合得到最终的分类结果。
    2012 年冠军延续了 2010 年以来的算法框架,在词包模型表达方面,使用了向量量化编码、局部约束线性编码、Fisher 向量编码替代原来的单一向量量化编码。这里有两个比较重要的改进,一个是广义层次化匹配算法。考虑到传统的空间金字塔匹配算法在物体对齐的假设下才有意义,而这在实际任务中几乎不能满足,为解决这个问题,他们使用 Side 信息得到物体置信图,采用层次化的方式对局部特征进行汇聚,从而得到更好的特征匹配。另一个重要的改进是子类挖掘算法,其提出的主要目的是改进类间模糊与类内分散的问题。
    基本步骤是:
    1)计算样本类内相似度;
    2)计算类间模糊性;
    3)使用 Graph Shift 算法来检测密集子图;
    4)子图向子类的映射。

    这里写图片描述

    相比 PASCAL VOC 竞赛, ImageNet 竞赛的图像数据规模更大,类别数更多,对传统的图像分类、检测算法都是一个大的挑战。下面将近年 ImageNet竞赛的主流算法也做一个简要介绍。2010 年冠军由美国 NEC 研究院和 UIUC 获得,其方法基于词包模型,底层特征采用了密集提取的HOG 和 LBP 特征,特征编码算法使用了局部坐标编码和超向量编码,并且采用了空间金字塔匹配。最终图像的分类采用了基于平均随机梯度下降的大尺度 SVM。相比 PASCAL 竞赛算法,这里的算法更多采用了在计算上极为高效的底层特征和编码算法,分类器及其优化也专门针对大规模数据进行了设计,最终获得了 71.8%的 top 5 分类精度。
    2011 年冠军是施乐欧洲研究中心,其基本方法仍旧是基于词包模型,主要改进在三个方面:
    特征编码方法采用 Fisher 向量编码,可以引入更多的高阶统计信息,得到更具判别性的表达;使用乘积量化(Product Quantization,PQ) 算法进行特征压缩;分类器使用基于随机梯度下降的线性支持向量机
    2012 年加拿大多伦多大学的 Hinton 教授及其学生 Krizhevsky 利用 GPU 在 ImageNet 竞赛上获得了前所未有的成功,他们训练了一个参数规模非常大的卷积神经网络,并通过大量数据生成dropout 来抑制模型的过拟合,在大规模图像分类任务上获得了非常好的效果,取得了第一名的成绩,top 5 分类精度达到了 84.7%,比第二名使用 Fisher向量编码算法要高大约 10 个百分点,充分显示了深度学习模型的表达能力。
    对比 PASCAL 竞赛,ImageNet 竞赛中使用的算法更加简单高效,因而也更加接近实用。在大规模图像识别场景下,传统图像识别的很多算法和技术面临极大的挑战,包括高计算强度,高内存消耗等,多特征、非线性分类器等这些在 PASCAL 竞赛中广为使用的算法和策略无法在 ImageNet 这样规模的数据库上高效实现。在性能和效率的权衡中,逐渐被更为简单高效的算法(单特征、特征压缩、线性分类器等)替代。大数据时代的来临,更激发了数据驱动的深度学习模型的发展,实现了更高效的特征提取与图像分类,将图像分类的发展推向一个新的高度
    这里写图片描述

    4.3 物体检测

    PASCAL VOC 竞赛从 2005 年第一届开始就引入了物体检测任务竞赛,主要任务是给定测试图片预测其中包含的物体类别与外接矩形框。物体检测任务与物体分类任务最重要的不同在于,物体结构信息在物体检测中起着至关重要的作用,而物体分类则更多考虑的是物体或者图像的全局表达。物体检测的输入是包含物体的窗口,而物体分类则是整个图像,就给定窗口而言,物体分类和物体检测在特征提取、特征编码、分类器设计方面很大程度是相通的,如表 3 所示。根据获得窗口位置策略的不同,物体检测方法大致可分为滑动窗口和广义霍夫变换两类方法。滑动窗口方法比较简单,它是通过使用训练好的模板在输入图像的多个尺度上进行滑动扫描,通过确定最大响应位置找到目标物体的外接窗口。广义霍夫投票方法则是通过在参数空间进行累加,根据局部极值获得物体位置的方法,可以用于任意形状的检测和一般物体检测任务。滑动窗口方法由于其简单和有效性,在历年的 PASCAL VOC 竞 赛 中 得 到 了 广 泛 的 使 用 。 特 别 是HOG(Histograms of Oriented Gradients)模型、形变部件模型的出现和发展,使得滑动窗口模型成为主流物体检测方法。
    与物体分类问题不同,物体检测问题从数学上是研究输入图像 X 与输出物体窗口 Y 之间的关系,这里 Y 的取值不再是一个实数,而是一组“结构化”数据,指定了物体的外接窗口和类别,是一个典型的结构化学习问题。结构化支持向量机(Structrual SVM, SSVM) 基于最大化边缘准则,将普通支持向量机推广到能够处理结构化输出,有效扩展了支持向量机的应用范围,可以处理语法树、图等更一般的数据结构,在自然语言处理、机器学习、模式识别、计算机视觉等领域受到越来越多的关注。隐 变 量 支 持 向 量 机 (Latent SVM, LSVM) 是Pedro Felzenszwalb 等人在 2007 年提出用于处理物体检测问题,其基本思想是将物体位置作为隐变量放入支持向量机的目标函数中进行优化,以判别式方法得到最优的物体位置。弱标签结构化支持向量机(weak-label Structrual SVM,WL-SSVM)是一种更加一般的结构化学习框架,它的提出主要是为了处理标签空间和输出空间不一致的问题,对于多个输出符合一个标签的情况,每个样本标签都被认为是“ 弱 标 签 ”。 SSVM 和 LSVM 都 可 以 看 做 是WL-SSVM 的特例,WL-SSVM 通过一定的约简可以转化为一般的 SSVM 和 LSVM。条件随机场(Conditional Random Field, CRF)作为经典的结构化学习算法,在物体检测任务上也得到一定的关注。Schnitzspan 等人将形变部件模型与结构化学习结合,提出了一种隐条件随机场模型(latent CRFs),通过将物体部件标签建模为隐藏节点并且采用 EM算法来进行学习,该算法突破了传统 CRF 需手动给定拓扑结构的缺点,能够自动学习到更为灵活的结构,自动发掘视觉语义上有意义的部件表达。张等提出了基于数据驱动的自动结构建模与学习来从训练数据中学习最为合适的拓扑结构。由于一般化的结构学习是一个 NP 难问题,张提出了混合结构学习方案,将结构约束分成一个弱结构项和强结构项。弱结构项由传统的树状结构模型得到,而强结构项则主要依靠条件随机场以数据驱动方式自动学习得到。

    下面我们将以历年 PASCAL VOC 物体检测竞赛来探讨物体检测的方法演变与发展。

    2005 年物体检测竞赛有 5 支队伍参加,采用的方法呈现多样化,Darmstadt 使用了广义霍夫变换,通过兴趣点检测和直方图特征描述方式进行特征表达,并通过广义 Hough 投票来推断物体尺度与位置,该方法在他们参加的几类中都得到了最好的性能。INRIA 的 Dalal 则采用了滑动窗口模型,底层特征使用了基于 SIFT 的描述,分类器使用支持向量机,通过采用在位置和尺度空间进行穷尽搜索,来确定物体在图像中的尺度和位置,该方法在汽车类别上取得了比广义 Hough 变换更好的性能,但在人、自行车等非刚体类别上性能并不好。
    2006 年最佳物体检测算法是 Dalal 和 Triggs 提出的HOG(Histograms of Oriented Gradients)模型。他们的工作主要集中于鲁棒图像特征描述研究,提出了物体检测领域中具有重要位置的 HOG 特征。HOG 是梯度方向直方图特征,通过将图像划分成小的 Cell,在每个 Cell 内部进行梯度方向统计得到直方图描述。与 SIFT 特征相比,HOG 特征不具有尺度不变性,但计算速度要快得多。整体检测框架依然是滑动窗口策略为基础,并且使用线性分类器进行分类。这个模型本质上是一个全局刚性模板模型,需要对整个物体进行全局匹配,对物体形变不能很好地匹配处理。
    2007 年 Pedro Felzenszwalb 等人提出了物体检测领域里程碑式的工作:形变部件模型(Deformable Part-based Model),并以此取得了 2007 年 PASCAL VOC 物体检测竞赛的冠军。底层特征采用了Dalal 和 Triggs 提出的 HOG 特征,但与 Dalal 等人的全局刚体模板模型不同的是,形变部件模型由一个根模型和若干可形变部件组成。另一个重要的改进是提出了隐支持向量机模型,通过隐变量来建模物体部件的空间配置,并使用判别式方法进行训练优化。形变部件模型奠定了当今物体检测算法研究的基础,也成为后续 PASCAL VOC 竞赛物体检测任务的基础框架。
    2008 年物体检测冠军同样采用了滑动窗口方式。特征表达利用了 HOG 特征和基于密集提取SIFT 的词包模型表达。训练过程对前、后、左、右分别训练独立的模型,并使用线性分类器和卡方核SVM 进行分类。测试过程采用了两阶段算法,第一阶段通过滑动窗口方式利用分类器得到大量可能出现物体的位置,第二阶段基于 HOG 和 SIFT 特征对前面一阶段得到的检测进行打分,最后使用非极大抑制算法去除错误检测窗口,并融合分类结果得到最终检测结果。这里分类信息可以看成是一种上下文信息,这个也是物体检测研究的一个重要内容。
    2009 年除了形变部件模型以外,牛津大学视觉几何研究组在滑动窗口框架下,基于多核学习将灰度 PHOW、颜色 PHOW、PHOC、对称 PHOG、SSIM、视觉词典等多种特征进行融合,取得了与形变部件模型相近的效果,获得共同检测冠军。多核学习是进行多特征、多模型融合的重要策略,可以自动学习多个核矩阵的权重,从而得到最佳的模型融合效果。考虑到滑动窗口搜索的效率问题,提出了
    类似级联 Adaboost 方式的多级分类器结构。第一级分类器采用线性 SVM 分类器以滑动窗口或者跳跃窗口方式快速对图像窗口进行粗分类;第二级采用拟线性 SVM,利用卡方核进行进一步细分类;第三级采用更强的非线性卡方-RBF 分类器,这一步准确度更高但比前面步骤计算代价更大,由于前面两级已经快速滤除大部分备选窗口,这一级可以专注于更难的样本分类。
    2010 年中国科学院自动化研究所模式识别国家重点实验室获得了物体检测冠军,其方法是以形变部件模型为基础,对底层 HOG 特征进行了改进,提出了 Boosted HOG-LBP 特征,利用Gentle Boost 选择出一部分 LBP 特征与 HOG 特征融合,使得物体检测结果产生显著提升。另一个重要改进是采用了多种形状上下文,包括空间上下文、全局上下文、类间上下文。空间上下文由包含了窗口位置尺度信息的 6 维向量构成,全局上下文包括 20 维的物体分类分数和 20 维的最大窗口分数,其中分类方法采用了黄等人提出的显著性编码、词典关系算法计算词包模型表达。类间上下文用于建模相邻物体之间的弱空间关系,分别由20 维的窗口附近最强的 HOG 特征分数和 LBP 特征分数构成。最终得到 87 维的特征,使用 RBF SVM进行上下文学习。该方法在 VOC2010 数据库上取得了 6 项第一,5 项第二,平均精度达到了 36.8%。
    2011 年物体检测冠军依然是中国科学院自动化研究所模式识别国家重点实验室,算法上与2010 年不同之处是针对形变部件模型提出了一种数据分解算法,并引入了空间混合建模和上下文学习。
    2012 年阿姆斯特丹大学获得物体检测冠军,其方法主要创新在于选择性搜索、混合特征编码、新的颜色描述子、再训练过程。图像中物体本身构成一种层次结构,通常很难在一个尺度上检测所有物体,因而对图像块进行层次化组织,在每个层次上进行选择搜索,可以有效提升检测的召回率。考虑到经典的向量量化编码使用小的特征空间分块能够捕获更多图像细节,而丢失了分块内部的细节,而超向量编码和 Fisher 向量量化编码等差异编码方法则可以很好的描述分块内部细节,更大空间分块可以描述更大范围的图像细节,综合这两种编码模式,提出了混合特征编码算法,将两种编码的优点融合到一起。

    5 对物体分类与检测的思考

    物体分类与检测的研究在以 PASCAL VOC 竞赛为平台的理论和算法研究上已经取得了一系列的进展,分类模型建立了以词包模型和深度学习模型为基础的体系框架检测模型则以可形变模型为核心发展出多种方法。在分析目前物体分类和检测算法的基础上,本文接下来对物体分类和检测算法的统一性和差异性进行了讨论,并探讨了物体分类与检测算法发展的方向。

    5.1 物体检测和物体分类的统一性

    – 物体检测可以取代物体分类?

    物体检测的任务是解决物体所在的位置问题,物体分类的任务是判断物体的种类,从直观上而言,物体检测的隐含信息包括了物体的类别信息,也就是需要事先知道需要定位的物体的类别信息,比如需要检测人,那么就需要先验的给出人的标注信息,以此来判断人的位置,从这个角度而言,物体检测似乎包括了物体分类的步骤,也就是物体检测就能够回答“什么物体在什么地方”,但这里有一个误区,其中的“什么物体”是先验给出的,也就是在训练过程中标注出的,并不一定是真实的结果。在模型区分性比较强的情况下,也就是物体检测能给出准确的结果的情况下,物体检测在一定程度上可以回答“什么物体在什么地方”,但在真实的世界中,很多情况下模版不能唯一的反映出物体类别的唯一性,只能给出“可能有什么物体在什么地方”,此时物体分类的介入就很有必要了。由此可见,物体检测是不能替代物体分类的。

    – 物体检测和物体分类之间的差异性和互补性

    以 PASCAL VOC 竞赛为例,从模型的角度而言,物体检测主要采用的是可变的部件模型, 更多的关注局部特征,物体分类中主要的模型是词包模型,从两者的处理流程来看,他们利用的信息是不同的,物体检测更多的是利用了物体自身的信息,也就是局部信息,物体分类更多的是利用了图像的信息,也就是全局的信息。他们各有优劣,局部信息考虑了更多的物体结构信息,这使得物体检测和分类的准确性更高,但同时也带来物体分类的鲁棒性不强的问题;全局信息考虑了更多的是图像的全局统计信息,尤其是图像的语义信息,这使得能考虑更多的信息来进行判断,但信息量的增加可能带来准确度的提高,也可能由于冗余降低分类的性能,但是从统计意义而言,其鲁棒性是能够得到一定的提高的。由此可见,物体检测和物体分类之间存在着较大的差异性,同时也就说明存在着比较大的互补性。

    5.2 物体分类与检测的发展方向

    物体分类任务要确定图像中是否包含物体,全局表达更关键物体检测任务则要确定图像中物体的位置和尺度,物体结构更为关键。因此,物体分类检测的研究也主要有两种思路:

    专注于学习结构,即结构化学习。观察变量与其他变量构成结构化的图模型,通过学习得到各个变量之间的关系,结构包括有向图模型(贝叶斯网络)、无向图模型(马尔科夫网络)。结构化学习通常变量具有显式的物理意义,变量之间的连接也具有较强的因果关系,解释性较好。

    专注于学习层次化表达,即深度学习。深度学习从人脑的层次化视觉处理和函数表达理论出发,采用层次化特征表达的思想来进行特征从底层到高层语义的提取。深度学习专注于表达的学习,也即更注重一个输入得到的相应输出,对中间的特征变换缺少自然的解释,更像一个黑盒系统。
    两条思路各有侧重,但并不是说是互相独立的。在这两条发展线路的基础上,建立更为统一的物体识别框架,同时处理物体分类与检测任务,也是一个重要的研究课题。如何利用物体检测和物体分类之间的互补性去构建统一的物体识别框架是计算机视觉和视觉认知领域的研究热点,也是视觉认知计算模型研究的重点之一。

    5.3 结构化学习存在的难点与挑战

    模型表达问题。对于一个特定问题,选择什么样的模型,如有向图模型、无向图模型,模型如何进行参数化,都是值得研究的。

    模型学习问题。在给定模型表达后,如何从给定数据中学习模型的参数,是结构化学习中的一个核心问题。目前通常有基于概率的学习方法,如最大似然估计、最大后验估计等,也有基于最小化损失函数的方法。不同的方法,在学习的效率,准确性上都具有差异,研究快速有效的学习算法,具有特别重要的价值。

    模型推断问题。给定学习好的模型,进行快速、准确的模型推断是至关重要的。目前经典的方法包括消息传播算法、变分推断算法、采样算法等。不同方法在速度、准确度上各有差异。研究大规模图模型,实现人类视觉系统快速识别人脸那样的快速准确推断,是一个重要研究方向。

    5.4 层次化学习 (深度学习) 存在的难点与挑战

    在大数据时代,海量的图像、视频数据绝大多数是没有标签的,大量进行标注也是不现实的。从大量的没有标签的图像数据中自动挖掘知识,无疑有着重要的意义。Google Brain 计划也验证了数据驱动的自主学习的可行性与有效性。但目前深度学习还存在一些难点和挑战。

    •解释性差。层次化表达在视觉皮层理论和函数论等方面具有其理论依据,然而,在实际应用中,学习到的模型通常没有很好的解释性。第一层网络可以通过可视化的方式进行直接查看,在大多数视觉数据中,第一层学习到的是类似 Gabor的滤波器,可以实现基本的边缘检测。然而,对于更高层的特征,通常很难直观的查看其学习到的是什么。研究有效的高层特征解释方式,无疑对于深度学习的发展具有非常重要的意义。

    •模型复杂度高,优化困难。神经网络的容量没有上限,表达能力非常强,这是它的一个重要的优点。另一方面也对模型的优化造成了非常大的困难。网络越复杂,模型的能量面越高低崎岖,到处是极小点。研究模型初始化方式、优化算法,对于提高神经网络的判别能力,是深度学习的一个重要研究内容。

    • 计算强度高。目前虽然每层是高度并行化的前馈网络,但是计算强度还是比较高,需要采用GPU 等硬件来完成。对于一个刺激信号,人脑中绝大多数细胞是处于不活动状态,只有相关的细胞才会有活动,这是一种非常经济的响应形式。而对于深度学习,输入一个视觉信号,所有的神经元都会进行计算,人为加的一些稀疏约束只是会使某些神经元输出为 0,但不代表该神经元“处于不活动”状态。这方面是将来建立庞大学习网络时实现实时推理的一个可行思路。

    • 模型缺少结构约束。深度学习模型通常只对网络的“ 输入–输出”进行建模,却缺少必要的结构先验的约束。例如,对人脸关键点可以采用卷积神经网络进行回归,网络学习到的是一种隐式的“输入–输出”结构,却完全没有加入显式的结构先验,包括预测输出的位置点处的表观特征。这个问题的直接后果就是单个网络尽管可以做到任意的复杂度,却无法得到很高的精度,很多检测错误看起来是非常简单的:本来应该落在具有明显特征的嘴角处,却落在了嘴角旁边的脸部区域。为了克服这个问题,就需要采用从粗到细,从全局到局部的策略,级联多个网络来不断纠正网络预测。在大数据时代,海量视频数据所带来的纷繁复杂的易变性(variability)将给传统的特征学习方法带来巨大挑战。而深度学习模型天然的强大数据表达能力,无疑将会对大数据背景下的整个视觉的研究产生极大的影响,也必然会将图像物体检测、分类的研究推向新的高度。当然,目前深度学习模型还存在着解释性差、模型复杂度高,优化困难、计算强度高等诸多问题,这些都需要研究者们进一步的思考。例如,将显式结构先验嵌入深度学习模型中,可以有效降低网络参数空间的规模,减少局部极值的问题,从而可以更加有效地解决检测、分割等任务。

    6.结论

    物体分类与检测在计算机视觉研究中具有重要的理论意义和实际应用价值,同时目前也存在诸多困难与挑战。本文以计算机视觉目标识别竞赛PASCAL VOC 为主线,对物体分类与检测历年最佳算法的发展进行了详尽的阐述,强调了表达学习和结构学习分别在物体分类和物体检测中的重要意义。以此为基础,本文还讨论了物体分类与检测的统一性与差异性,对物体分类与检测的发展方向进一步思考,从基于深度学习的表达学习和结构学习两个方向进行了分析与展望。

    (完)

    文档下载地址:中国知网
    http://kns.cnki.net/KCMS/detail/detail.aspx?dbcode=CJFQ&dbname=CJFD2014&filename=JSJX201406001&v=MjkzMjhZK1p1Rnlyblc3M0pMejdCZHJHNEg5WE1xWTlGWllSOGVYMUx1eFlTN0RoMVQzcVRyV00xRnJDVVJMMmY=



    展开全文
  • 深度学习图像处理之垃圾分类

    万人学习 2019-09-29 14:32:47
    【超实用课程内容】 深度学习在图像处理领域的发展过程; 解析经典的卷积神经网络; 垃圾分类实战。本课程将使用Pytorch深度学习框架进行实战,并在ubuntu系统上进行演示,包括:不同标注文件下的数据集读取、编写...
  • 基于支持向量机的图像分类(下篇:MATLAB实现)

    万次阅读 多人点赞 2018-04-11 00:19:20
    摘要:本文通过图文详细介绍如何利用支持...点我下载:SVM图像分类的MATLAB完整程序及图片集文件 1. 前言 机器学习是人工智能研究发展到一定阶段的必然产物。二十世纪八十年代是机器学习成为一个独立学...

    摘要:本文通过图文详细介绍如何利用支持向量机对图像进行分类,经过上篇文章对原理的介绍,这里介绍利用MATLAB编程实现。更多相关资源详解也可参考博主最新博文基于支持向量机的手写数字识别详解(MATLAB GUI代码,提供手写板)。本文后续章节将介绍的主要部分有:

    • 图片数据集整理
    • 特征提取
    • SVM训练与测试
    • 分类结果评价
    • 结果显示

    点我下载:SVM图像分类的MATLAB完整程序及图片集文件


    1. 前言

    机器学习是人工智能研究发展到一定阶段的必然产物。二十世纪八十年代是机器学习成为一个独立学科的学科领域、各种机器学习技术百花绽放的时期。支持向量机于1995年正式发表[Cortes and Vapnik,1995],由于在文本分类任务中的卓越性能[Joachims,1998],很快成为机器学习的主流技术,并直接掀起了“统计学习”(statistical learning)在2000年前后的高潮。——《机器学习》 周志华

    2010年前后,随着计算能力的迅猛提升和大数据的涌现,神经网络研究在“深度学习”的名义下又重新崛起,并迎来又一次发展高潮。近年研究SVM的论文少了很多,SVM的风头很多时候确实已被强势崛起的深度学习浪潮所淹没,95年的SVM比我们年龄还大,有点仿佛英雄迟暮的感觉。不过在我看来,实现简单而且非常强大的分类算法SVM仍然有其研究价值,与神经网络相比SVM亦有过人之处,如特征维数多于样本数的情况,而小样本学习至今仍是深度学习的一大难题。

    当浅层神经网络效果不佳时,人们将目光转向支持向量机,而支持向量机亦不负众望,以不错的成绩让人们对机器学习重拾信心。感谢支持向量机,感谢在神经网络几经起落的时候,支持向量机继往开来、自成一脉,填补了机器学习的一段空窗期,让这条曲折向上的研究之路绵延至今迎来了现在人工智能百花齐放的时代!

    接下来就通过简单的图片分类问题,通过MATLAB程序理解认识一下这一简单而强大的分类算法——支持向量机.


    2. 图片数据集整理

    首先需要准备好分类的数据集,数据的整理是机器学习中的重要一环。这里我们自行整理一个用于分类的图片集,图片集有四类图片,分别为车、猫、花、鱼。从百度上下载这四种图片,并分别存放在四个文件夹中,如下图所示

    四类图片每类分别下载100张左右的图片,这四百张图片作为分类的数据集,以7:3的比例将其分为训练图片集和测试图片集,分别放到picturestestPictures两个文件夹中。这两个文件夹下同上图一样都有car、cat、flw、fsh四个文件夹,值得注意的是测试样本的图片应可能不出现在训练集图片库中。做好以上工作,用于分类的图片集就准备完毕了。

    (当然用于分类的图片集常用的是cafir10图片集,这个数据集是写论文或研究时普遍用到的,可能会在后面的文章中介绍其用法,这里就暂时不使用cafir了。)

    为了便于后面的特征提取等对每张图片进行的操作,这里在程序中有必要将图片文件的存储位置、数量、类别等信息整理到一个数据结构中,新建一个m文件,程序代码如下

    dir=('D:\pictures');
    testdir=('D:\testPictures\test');
    trainingSet = imageSet(dir,'recursive');
    testSet = imageSet(testdir,'recursive');
    

    以上代码中用到imageSet( )函数是一个图片集整理的函数(MATLAB R2016b及以上版本支持),返回的是dir文件路径下文件夹内的文件信息。例如得到的trainingSet为一个1*4的imageSet变量,每个imageSet变量由Description、ImageLocation、Count三个属性组成,分别代表对子文件的描述、文件存储位置和图片数量。如下图所示是testSet(1)内部情况


    3. 主要步骤

    和深度学习的算法相比,传统的机器学习在进行图片分类时输入的不是原始图片而是先进行一个特征提取的步骤。在上篇中已经介绍了特征提取的相关内容,这里用的是方向梯度直方图(HOG)以及灰度共生矩阵(GLCM)。

    3.1 GLCM提取

    MATLAB中灰度共生矩阵的提取可以调用graycomatrix( )函数,不过这里为了取不同方向(0、45、90、135度)的灰度共生矩阵,通过循环计算各个方向的灰度共生矩阵并进行归一化处理(计算对比度、逆差距、熵、自相关),然后取平均值和方差作为最终提取的特征。

    新建一个m文件并命名为getGLCMFeatures,输入以下代码

    function [features] = getGLCMFeatures(image)
    features_all  = [];
    for i = 1:10
        glcm = graycomatrix(image, 'Offset', [0,i]);
        stats = graycoprops(glcm);
        
        glcm45 = graycomatrix(image, 'Offset', [-i,i]);
        stats45 = graycoprops(glcm45);
        
        glcm90 = graycomatrix(image, 'Offset', [-i,0]);
        stats90 = graycoprops(glcm90);
        
        glcm135 = graycomatrix(image, 'Offset', [-i,-i]);
        stats135 = graycoprops(glcm135);
        
        stats7x4 = [stats.Contrast stats.Correlation stats.Energy stats.Homogeneity;
            stats45.Contrast stats45.Correlation stats45.Energy stats45.Homogeneity;
            stats90.Contrast stats90.Correlation stats90.Energy stats90.Homogeneity;
            stats135.Contrast stats135.Correlation stats135.Energy stats135.Homogeneity];
        features_all = [features_all mean(stats7x4,1) std(stats7x4,0,1)];
    end
    features = features_all;
    

    新建的getGLCMFeatures函数输入为彩色图像转换后的灰度图像矩阵,输出为提取后的灰度共生矩阵特征。

    3.2 合并特征

    自己编写一个提取特征的函数命名为extractFeature,这个函数输入为整理过的训练集和测试集,输出为训练集的特征、标签和测试集的特征、标签。这个函数的功能是将HOG特征和前面提取的GLCM特征合并。

    代码第2到13行是为了确定每张图片提取特征后得到的矩阵大小,以方便后面的操作同时也是为了预分配空间以提高代码效率。首先取第一张图片进行灰度化以及阈值分割,将图片大小调整在256*256的范围(统一大小)分别进行HOG和GLCM的特征提取,分别得到两种特征向量,取两个向量的长度之和就是一张图片特征提取后的总长度了。

    function [trainingFeatures,trainingLabels,testFeatures,testLabels]=extractFeature(trainingSet,testSet)
    %% 确定特征向量尺寸
    img = read(trainingSet(1), 1);
    %转化为灰度图像
    img=rgb2gray(img);
    %转化为2值图像
    lvl = graythresh(img);
    img = im2bw(img, lvl);
    img=imresize(img,[256 256]);
    cellSize = [4 4];
    [hog_feature, vis_hog] = extractHOGFeatures(img,'CellSize',cellSize);
    glcm_feature = getGLCMFeatures(img);
    SizeOfFeature = length(hog_feature)+ length(glcm_feature);
    
    %% 构建训练样本特征向量和训练样本标签
    trainingFeatures = [];
    trainingLabels   = [];
    for digit = 1:numel(trainingSet)       
        numImages = trainingSet(digit).Count;
        features  = zeros(numImages, SizeOfFeature, 'single');%初始化特征向量
        % 遍历每张图片
        for i = 1:numImages
            img = read(trainingSet(digit), i);% 取出第i张图片
            
            img=rgb2gray(img);                % 转化为灰度图像
            glcm_feature = getGLCMFeatures(img);  % 提取GLCM特征
           
            lvl = graythresh(img);            % 阈值化
            img = im2bw(img, lvl);            % 转化为2值图像
            img=imresize(img,[256 256]);
            % 提取HOG特征
            [hog_feature, vis_hog] = extractHOGFeatures(img,'CellSize',cellSize);
            % 合并两个特征
            features(i, :) = [hog_feature glcm_feature];
        end
        % 使用图像描述作为训练标签
        labels = repmat(trainingSet(digit).Description, numImages, 1);  
        % 逐个添加每张训练图片的特征和标签
        trainingFeatures = [trainingFeatures; features];
        trainingLabels   = [trainingLabels; labels];       
    end
    
    
    %% 提取测试图片集的特征向量
    testFeatures = [];
    testLabels   = [];
    for digit = 1:numel(testSet)
               
        numImages = testSet(digit).Count;
        %初始化特征向量
        features  = zeros(numImages, SizeOfFeature, 'single');
        
        for i = 1:numImages
            
            img = read(testSet(digit), i);
            %转化为灰度图像
            img=rgb2gray(img);
            glcm_feature = getGLCMFeatures(img);
            %转化为2值图像
            lvl = graythresh(img);
            img = im2bw(img, lvl);
            img=imresize(img,[256 256]);
            [hog_4x4, vis4x4] = extractHOGFeatures(img,'CellSize',cellSize);
            features(i, :) = [hog_4x4 glcm_feature];
        end
        
        % 使用图像描述作为训练标签
        labels = repmat(testSet(digit).Description, numImages, 1);
            
        testFeatures = [testFeatures; features];
        testLabels=[testLabels; labels];
            
    end
    end
    

    代码18-41行是构建训练样本特征向量和训练样本标签,与前面步骤相似,只不过现在是遍历训练集每一张图片,对其进行灰度化、阈值化、调整大小,然后进行特征提取,将HOG特征和GLCM特征合并成一个向量作为特征矩阵的一行即一张图片的特征向量。样本的标签构建则将每张图片所处的文件夹的名字作为该图片的标签,并与特征向量顺序相对应。

    第47-73行是构建测试样本特征向量和训练样本标签,这里将图片集换成了测试集,而步骤与训练集是一致的。

    3.3 SVM训练与测试

    调用前面的特征提取函数得到训练和测试用的特征向量与对应的标签,便可以进行SVM的训练和测试。MATLAB自带的训练svm函数可以用fitcecoc函数,测试可以用predict函数预测结果,训练和测试的代码如下

    % 训练一个svm分类器
    % fitcecoc 使用11的方案
    classifier = fitcecoc(trainingFeatures, trainingLabels);
    save classifier.mat classifier;
    
    % 使用测试图像的特征向量预测样本标签
    predictedLabels = predict(classifier, testFeatures);
    

    代码中classifier为训练得到的SVM分类器,利用该分类器以及测试集特征向量预测测试集的标签predictLabels。后面可以将predictLabels与实际的测试标签进行对比即可评估分类好坏。

    3.4 分类结果评价

    在上一篇文章中提到过了,为了评价分类的好坏可以通过混淆矩阵,通过计算混淆矩阵对角线上的值占每行总数的比值得出分类正确率,其实现代码如下

    %% 评估分类器
    % 使用没有标签的图像数据进行测试,生成一个混淆矩阵表明分类效果
    confMat=confusionmat(testLabels, predictedLabels)
    accuracy=(confMat(1,1)/sum(confMat(1,:))+confMat(2,2)/sum(confMat(2,:))+...
        confMat(3,3)/sum(confMat(3,:))+confMat(4,4)/sum(confMat(4,:)))/4
    

    其结果如下图所示

    3.5 结果显示

    尽管以上代码能得到分类正确率,但我们希望更直观的看到输入一张图片后SVM分类器的分类结果,这里编写一个函数通过图形窗口显示预测结果。新建一个m文件命名为Predict,输入如下代码

    function [] = Predict(imageurl)
    load classifier.mat;
    figure;
    img = imread(imageurl);
    imshow(img);
    
    %提取图像的特征向量
    %转化为灰度图像
    img=rgb2gray(img);
    glcm_feature = getGLCMFeatures(img);
    %转化为2值图像
    lvl = graythresh(img);
    img = im2bw(img, lvl);
    
    % imshow(img);
    % figure
    img=imresize(img,[256 256]);
    [hog_4x4, ~] = extractHOGFeatures(img,'CellSize',[4 4]);
    testFeature = [hog_4x4 glcm_feature];
    
    
    % 使用测试图像的特征向量预测样本标签
    predictedLabel = predict(classifier, testFeature);
    
    str = ['分类结果:' predictedLabel];
    dim = [0.25 0.0004 0.2 0.2];
    annotation('textbox', dim, 'string', str, 'fontsize', 20, 'color', 'g','edgecolor', 'none');
    

    函数输入为图片的存储路径,调用函数则会通过图形窗口显示图片及分类结果,如在命令窗口输入如下代码

    Predict('D:\testPictures\test\car\car9.jpg');
    

    输出结果如下图


    4. 完整代码

    为了方便使用这里贴出完整代码

    主函数:

    clear;
    dir=('D:\pictures');
    testdir=('D:\testPictures\test');
    trainingSet = imageSet(dir,'recursive');
    testSet = imageSet(testdir,'recursive');
    
    [trainingFeatures,trainingLabels,testFeatures,testLabels]=extractFeature(trainingSet,testSet);
    %% 
    %训练一个svm分类器
    %fitcecoc 使用11的方案
    classifier = fitcecoc(trainingFeatures, trainingLabels);
    save classifier.mat classifier;
    
    % 使用测试图像的特征向量预测样本标签
    predictedLabels = predict(classifier, testFeatures);
    
    %% 评估分类器
    %使用没有标签的图像数据进行测试,生成一个混淆矩阵表明分类效果
    confMat=confusionmat(testLabels, predictedLabels)
    accuracy=(confMat(1,1)/sum(confMat(1,:))+confMat(2,2)/sum(confMat(2,:))+...
        confMat(3,3)/sum(confMat(3,:))+confMat(4,4)/sum(confMat(4,:)))/4
    
    Predict('D:\testPictures\test\car\car9.jpg');
    

    getGLCMFeatures.m:

    function [features] = getGLCMFeatures(image)
    features_all  = [];
    for i = 1:10
        glcm = graycomatrix(image, 'Offset', [0,i]);
        stats = graycoprops(glcm);
        
        glcm45 = graycomatrix(image, 'Offset', [-i,i]);
        stats45 = graycoprops(glcm45);
        
        glcm90 = graycomatrix(image, 'Offset', [-i,0]);
        stats90 = graycoprops(glcm90);
        
        glcm135 = graycomatrix(image, 'Offset', [-i,-i]);
        stats135 = graycoprops(glcm135);
        
        stats7x4 = [stats.Contrast stats.Correlation stats.Energy stats.Homogeneity;
            stats45.Contrast stats45.Correlation stats45.Energy stats45.Homogeneity;
            stats90.Contrast stats90.Correlation stats90.Energy stats90.Homogeneity;
            stats135.Contrast stats135.Correlation stats135.Energy stats135.Homogeneity];
        features_all = [features_all mean(stats7x4,1) std(stats7x4,0,1)];
    end
    features = features_all;
    

    extractFeature.m:

    function [trainingFeatures,trainingLabels,testFeatures,testLabels]=extractFeature(trainingSet,testSet)
    %% 确定特征向量尺寸
    img = read(trainingSet(1), 1);
    %转化为灰度图像
    img=rgb2gray(img);
    %转化为2值图像
    lvl = graythresh(img);
    img = im2bw(img, lvl);
    img=imresize(img,[256 256]);
    cellSize = [4 4];
    [hog_feature, vis_hog] = extractHOGFeatures(img,'CellSize',cellSize);
    glcm_feature = getGLCMFeatures(img);
    SizeOfFeature = length(hog_feature)+ length(glcm_feature);
    
    %% 构建训练样本特征向量和训练样本标签
    trainingFeatures = [];
    trainingLabels   = [];
    for digit = 1:numel(trainingSet)       
        numImages = trainingSet(digit).Count;
        features  = zeros(numImages, SizeOfFeature, 'single');%初始化特征向量
        % 遍历每张图片
        for i = 1:numImages
            img = read(trainingSet(digit), i);% 取出第i张图片
            
            img=rgb2gray(img);                % 转化为灰度图像
            glcm_feature = getGLCMFeatures(img);  % 提取GLCM特征
           
            lvl = graythresh(img);            % 阈值化
            img = im2bw(img, lvl);            % 转化为2值图像
            img=imresize(img,[256 256]);
            % 提取HOG特征
            [hog_feature, vis_hog] = extractHOGFeatures(img,'CellSize',cellSize);
            % 合并两个特征
            features(i, :) = [hog_feature glcm_feature];
        end
        % 使用图像描述作为训练标签
        labels = repmat(trainingSet(digit).Description, numImages, 1);  
        % 逐个添加每张训练图片的特征和标签
        trainingFeatures = [trainingFeatures; features];
        trainingLabels   = [trainingLabels; labels];       
    end
    
    
    %% 提取测试图片集的特征向量
    testFeatures = [];
    testLabels   = [];
    for digit = 1:numel(testSet)
               
        numImages = testSet(digit).Count;
        %初始化特征向量
        features  = zeros(numImages, SizeOfFeature, 'single');
        
        for i = 1:numImages
            
            img = read(testSet(digit), i);
            %转化为灰度图像
            img=rgb2gray(img);
            glcm_feature = getGLCMFeatures(img);
            %转化为2值图像
            lvl = graythresh(img);
            img = im2bw(img, lvl);
            img=imresize(img,[256 256]);
            [hog_4x4, vis4x4] = extractHOGFeatures(img,'CellSize',cellSize);
            features(i, :) = [hog_4x4 glcm_feature];
        end
        
        % 使用图像描述作为训练标签
        labels = repmat(testSet(digit).Description, numImages, 1);
            
        testFeatures = [testFeatures; features];
        testLabels=[testLabels; labels];
            
    end
    end
    

    Predict.m:

    function [] = Predict(imageurl)
    load classifier.mat;
    figure;
    img = imread(imageurl);
    imshow(img);
    
    %提取图像的特征向量
    %转化为灰度图像
    img=rgb2gray(img);
    glcm_feature = getGLCMFeatures(img);
    %转化为2值图像
    lvl = graythresh(img);
    img = im2bw(img, lvl);
    
    % imshow(img);
    % figure
    img=imresize(img,[256 256]);
    [hog_4x4, ~] = extractHOGFeatures(img,'CellSize',[4 4]);
    testFeature = [hog_4x4 glcm_feature];
    
    
    % 使用测试图像的特征向量预测样本标签
    predictedLabel = predict(classifier, testFeature);
    
    str = ['分类结果:' predictedLabel];
    dim = [0.25 0.0004 0.2 0.2];
    annotation('textbox', dim, 'string', str, 'fontsize', 20, 'color', 'g','edgecolor', 'none');
    

    5. 结束语

    本博文的完整MATLAB程序文件与图片集文件已经上传,下载即可运行(注意根据实际修改程序中的图片路径哦)下载地址如下

    点我下载:SVM的图像分类MATLAB完整程序及图片集文件

    更多相关资源详解也可参考博主最新博文基于支持向量机的手写数字识别详解(MATLAB GUI代码,提供手写板)

    公众号获取
        本人微信公众号已创建,扫描以下二维码并关注公众号“AI技术研究与分享”,后台回复“SV20180411”即可获取全部资源文件信息。

    由于编者能力有限,代码即使经过了多次校对,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。

    展开全文
  • 图像分类算法

    热门讨论 2011-12-14 23:38:22
    这是09年发表在计算机视觉与模式识别会议(CVPR)上的论文源码,里面包含了图像分类的基本方法,对于图像分类效果非常好
  • 基于支持向量机的图像分类.MATLAB
  • 目的:遥感图像分类。 利用envi专业遥感图像处理软件对遥感图像进行最小距离分类***************envi4.7经典版链接:https://pan.baidu.com/s/1bUx7Sym9jyd7ZpSSiu2QVw 提取码:h0pq 基于python编程实现对遥感...

    模式识别实验报告

    • 实验目的

    目的:遥感图像分类。

    1. 利用envi专业遥感图像处理软件对遥感图像进行最小距离分类***************envi4.7经典版链接:https://pan.baidu.com/s/1bUx7Sym9jyd7ZpSSiu2QVw    提取码:h0pq
    2. 基于python编程实现对遥感图像的最小距离分类
    • 实验原理

    最小距离分类法是分类器里面最基本的一种分类方法,它是通过求出未知类别向量X到事先已知的各类别(如A,B,C等等)中心向量的距离D,然后将待分类的向量X归结为这些距离中最小的那一类的分类方法

    最小距离分类的原理:

    在一个n维空间中,最小距离分类法首先计算每一个已知类别X(用向量表示是的各个维度的均值,形成形成一个均值 ,用向量表示A为类别的名称, 是类别A的样本特征集合是类别A的第1维特征集合,是第一维特征集合的均值,n为总的特征维数),同理,计算另一个类别(用向量表示是)的均值用向量表示,那么对于一个待分类的样本特征向量(用向量表示是),怎么判断它是属于类别还是呢?我们只需要分别计算的距离,以欧式距离为例,距离的计算公式如下:

    然后找中的最小值,如果前者最小,那么X属于A类,如果后者小,那么X属于B类。

    上面只是分了2类,在我下面的实验中分了6类,当然可以分成更多类。

     

    • 实验方案

    (一)ENVI实现

    1、File→Open image file→选择3个波段,对应RGB波段,对应下图。

     

    2、Basic Tools→Region Of Interest→ROI Tool,选择测试样本和训练样本

     

    3、ClassificationSupervisedMinimum Distance

                                     

                                 

     

     

    4、计算混淆矩阵,精度评估,Classification→Post Classification→Confusion Matrix

     

     

    (二)Python编程实现

    下面我们来谈谈最小距离分类法的一般步骤,说是最小距离分类器的步骤,其实是我们做监督分类基本的几个步骤。

    1、确定类别m,并提取每一类所对应的已知的样本

    2、从样本中提取出一些可以作为区分不同类别的特性,也就是我们通常所说的特征提取,如果提取出了n个不同的特性,那么我们就叫它n维空间,特征提取对分类的精度有重大的影响

    3、分别计算每一个类别的样本所对应的特征,每一类的每一维都有特征集合,通过集合,可以计算出一个均值,也就是特征中心。

    4、通常为了消除不同特征因为量纲不同的影响,我们对每一维的特征,需要做一个归一化,或者是放缩到(-1,1)等区间,使其去量纲化

    5、利用选取的距离准则,对待分类的本进行判定。

     

    Python代码:

    说明:

    1. 运行环境:python3.7;
    2. 主要用gdal、numpy模块。
    import gdal
    import numpy as np
    import os
    
    class Dataset:
        def __init__(self, in_file):
            self.in_file = in_file  # Tiff或者ENVI文件
            dataset = gdal.Open(self.in_file)
            self.XSize = dataset.RasterXSize  # 网格的X轴像素数量307
            self.YSize = dataset.RasterYSize  # 网格的Y轴像素数量250
            self.GeoTransform = dataset.GetGeoTransform()  # 投影转换信息
            self.ProjectionInfo = dataset.GetProjection()  # 投影信息
    
        def get_data(self):
            dataset = gdal.Open(self.in_file)
            # BBand = dataset.GetRasterBand(band)
            im_geotrans = dataset.GetGeoTransform()  # 仿射矩阵
            im_proj = dataset.GetProjection()  # 地图投影信息
            self.data = dataset.ReadAsArray(0, 0, self.XSize, self.YSize).astype(np.float32)
            data=self.data
            return im_geotrans,im_proj,data
    
        def get_local(self,classcount):
            X=[[] for j in range(classcount)]
            i=1
            # print(type(self.data[0][0]),type(i))
            while i <= classcount:
                for y in range(0, self.YSize):
                    for x in range(0, self.XSize):
                            if int(self.data[y][x])==i:
                                X[i-1].append([y,x])
                i=i+1
            return X
    #######################################################################
        def get_duiying_local(self,data,XX):#找到对应像素出的波值求均值
            avg=0
            sixclass=[]
            for dat in data:
                for Xx in XX:
                    y=Xx[0]
                    x=Xx[1]
                    avg = avg + dat[y][x]
                avg_sum=avg/len(XX)
                sixclass.append(avg_sum)
                avg=0.0
            return sixclass
    #######################################################################
    #######################################################################
        def cal_box(self,Xband6class,data):  # 计算矩阵求最小值
            piexl=[]
            pic=[[0 for i in range(self.XSize)] for j in range(self.YSize)]
            mat_list_class6 = np.array(Xband6class)
            for y in range(0, self.YSize):
                for x in range(0, self.XSize):
                    for dat in data:
                        piexl.append(dat[y][x])
                    piexl80=np.array(piexl)
                    cha=piexl80-mat_list_class6
                    mat_list_class6_tranpose=np.transpose(cha)
                    dot_result=np.dot(mat_list_class6_tranpose,cha)
                    # print(dot_result)
                    pic[y][x]=dot_result
                    piexl=[]
            return pic
    
        def select_min(self,pic_class):
            mins=[[0 for i in range(self.XSize)] for j in range(self.YSize)]
            six_6_class_list=[]
            for y in range(self.YSize):
                for x in range(self.XSize):
                    for pic_class_single in pic_class:
                        six_6_class=pic_class_single[y][x]
                        six_6_class_list.append(six_6_class)
                    min_class=min(six_6_class_list)
                    # print(min_class)
                    num_class=six_6_class_list.index(min_class)
                    num_class=num_class+1
                    mins[y][x]=num_class
                    six_6_class_list=[]
            return mins
    ############################################################
        def writeimage(self,pic_rgb):
            # print(pic_rgb)
            pic=[[[0 for i in range(self.XSize)] for j in range(self.YSize)] for k in range(3)]
            #定义类别的颜色,我分为6类所以定义6种颜色,也可以定义为其它颜色,根据分类数定义类别#颜色的数量
            pic_rgb_red=[255,0,0]
            pic_rgb_green=[0,255,0]
            pic_rgb_blue=[0,0,255]
            pic_rgb_rg=[255,255,0]
            pic_rgb_rb=[255,0,255]
            pic_rgb_gb=[0,255,255]
    
            for j in range(self.YSize):
                for i in range(self.XSize):
                    if pic_rgb[j][i]==1:
                        pic[0][j][i]=pic_rgb_red[0]
                        pic[1][j][i]=pic_rgb_red[1]
                        pic[2][j][i]=pic_rgb_red[2]
                    if pic_rgb[j][i]==2:
                        pic[0][j][i] = pic_rgb_green[0]
                        pic[1][j][i] = pic_rgb_green[1]
                        pic[2][j][i] = pic_rgb_green[2]
                    if pic_rgb[j][i]==3:
                        pic[0][j][i] = pic_rgb_blue[0]
                        pic[1][j][i] = pic_rgb_blue[1]
                        pic[2][j][i] = pic_rgb_blue[2]
                    if pic_rgb[j][i]==4:
                        pic[0][j][i] = pic_rgb_rg[0]
                        pic[1][j][i] = pic_rgb_rg[1]
                        pic[2][j][i] = pic_rgb_rg[2]
                    if pic_rgb[j][i]==5:
                        pic[0][j][i] = pic_rgb_rb[0]
                        pic[1][j][i] = pic_rgb_rb[1]
                        pic[2][j][i] = pic_rgb_rb[2]
                    if pic_rgb[j][i]==6:
                        pic[0][j][i] = pic_rgb_gb[0]
                        pic[1][j][i] = pic_rgb_gb[1]
                        pic[2][j][i] = pic_rgb_gb[2]
            return pic
    
        def write_img(self,filename,im_proj,im_geotrans,im_data):
    
            #gdal数据类型包括
            #gdal.GDT_Byte,
            #gdal .GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32,
            #gdal.GDT_Float32, gdal.GDT_Float64
            #判断栅格数据的数据类型
            if 'int8' in im_data.dtype.name:
                datatype = gdal.GDT_Byte
            elif 'int16' in im_data.dtype.name:
                datatype = gdal.GDT_UInt16
            else:
                datatype = gdal.GDT_Float32
            #判读数组维数
            if len(im_data.shape) == 3:
                im_bands, im_height, im_width = im_data.shape
            else:
                im_bands, (im_height, im_width) = 1,im_data.shape
    
            #创建文件
            driver = gdal.GetDriverByName("ENVI")            #数据类型必须有,因为要计算需要多大内存空间或者GTiff
            dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)
    
            dataset.SetGeoTransform(im_geotrans)              #写入仿射变换参数
            dataset.SetProjection(im_proj)                    #写入投影
    
            if im_bands == 1:
                dataset.GetRasterBand(1).WriteArray(im_data)  #写入数组数据
            else:
                for i in range(im_bands):
                    # print(im_data[i])
                    dataset.GetRasterBand(i+1).WriteArray(im_data[i])
            del dataset
    #####################################################################
    
    #样本信息处理
    def main1():
        dir_path = r"D:\Python_DATA\game project\模式识别\images"
        filename = "xuanlian.img"
        file_path = os.path.join(dir_path, filename)
        dataset = Dataset(file_path)
        dataset.get_data()
        classcount=6 #分为6类,当然也可以分为更多类,这个参数可以根据选择的训练样本的类数改变
        return dataset.get_local(classcount)
    
    def main2(X):
        dir_path = r"D:\Python_DATA\game project\模式识别\images"
        filename = "PHI.tif"
        file_path = os.path.join(dir_path, filename)
        dataset = Dataset(file_path)
        geotrans,proj,data=dataset.get_data()
        pic_class=[]
        for XX in X:
            Xband6class = dataset.get_duiying_local(data, XX)
            pics=dataset.cal_box(Xband6class,data)
            pic_class.append(pics)
        mins=dataset.select_min(pic_class)
        impic=dataset.writeimage(mins)
        impic=np.array(impic)
        print(impic.shape)
        dataset.write_img("re_img_changzhou.img",proj,geotrans,impic)
    
    if __name__=="__main__":
        X=main1()
        main2(X)

     

    输出结果re_img_changzhou.img

     

    • 结果分析

     

    (envi分类后结果)

     

    (编程实现分类后结果)

    由上两张图可以看出,编程实现的结果和envi分类的结果都是比较理想的。精度在85%以上,所以分类的效果是比较明显的。

     

    • 总结

    最小距离分类法原理简单,容易理解,计算速度快,但是因为其只考虑每一类样本的均值,而不用管类别内部的方差(每一类样本的分布),也不用考虑类别之间的协方差(类别和类别之间的相关关系),所以分类精度不高,因此,一般不用它作为我们分类对精度有高要求的分类,但它可以在快速浏览分类概况中使用。

    最小距离分类算法是比较简单的好理解的。但是在编程实现的过程中出现的问题是值得铭记的,以防在下一次出现类似的错误。

     

     

     

     

     

     

    展开全文
  • 遥感图像分类技术

    千次阅读 2019-06-05 21:01:54
    什么是遥感图像分类技术? 图像分类是将土地覆盖类别分配给像素的过程。例如,这9个全球土地覆盖数据集将图像分为森林、城市、农业和其他类别。 https://gisgeography.com/free-global-land-cover-land-use-data/ ...
  • 图像分类(SVM)

    热门讨论 2012-07-22 23:26:23
    程序对图像进行了很好的分类,好不容易找到的代码。
  • 本篇文章主要通过Tensorflow+Opencv实现CNN自定义图像分类案例,它能解决我们现实论文或实践中的图像分类问题,并与机器学习的图像分类算法进行对比实验。基础性文章,希望对您有所帮助,如果文章中存在错误或不足之...
  • 图像分类网络综述

    千次阅读 2020-12-18 11:14:33
    2数据集 目前常用的图像分类数据库主要包括以下5个,且数据库在数据体量及复杂程度上依次递增: 2.1MNIST MNIST是图像分类领域最经典的一个数据库,包含70 000张28 dpi×28 dpi的灰度图像,由数字(0~9)构成,共...
  • TensorFlow2.0 教程-图像分类

    万次阅读 多人点赞 2019-03-16 21:04:02
    TensorFlow 教程-图像分类 from __future__ import absolute_import, division, print_function import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers import numpy ...
  • 细粒度图像分类(FGVC)---综述

    万次阅读 多人点赞 2019-04-28 16:28:02
    什么是细粒度图像分类 细粒度图像分类问题是对大类下的子类进行识别。细粒度图像分析任务相对通用图像(General/Generic Images)任务的区别和难点在于其图像所属类别的粒度更为精细。 以图1为例,通用图像分类其...
  • AI智能垃圾分类主要通过构建基于深度学习技术的图像分类模型,实现垃圾图片类别的精准识别重点处理图片分类问题。 采用深圳市垃圾分类标准,输出该物品属于可回收物、厨余垃圾、有害垃圾和其他垃圾分...
  • 高光谱图像分类 初学者指南 (Beginner’s Guide) This article provides detailed implementation of different classification algorithms on Hyperspectral Images(HSI). 本文提供了在高光谱图像(HSI)上不同分类...
  • 图像分类基本流程及 KNN 分类器

    千次阅读 2018-09-07 16:14:06
    1. 图像分类以及基本流程 1.1 什么是图像分类   所谓图像分类问题,就是已有固定的分类标签集合,然后对于输入的图像,从分类标签集合中找出一个分类标签,最后把分类标签分配给该输入图像。虽然看起来挺简单的...
  • SVM实现图像分类

    千次阅读 2018-05-07 16:01:20
    SVM的原理不多赘述在MATLAB中配置libsvm,网上有很多教程,注:64位的系统不需要编译,配置好MATLAB的路径就可以使用啦介绍libsvm实现分类的两个常用函数svmtrain——train svm 实现分类——model=svm(train_label,...
  • EfficientNet是谷歌2019年提出的分类模型,自从提出以后这个模型,各大竞赛平台常常能看到他的身影,成了霸榜的神器。下图是EfficientNet—B0模型的网络结构。 从网络中可以看出,作者构建了MBConv,结构如下图: ...
  • 图像分类算法优化技巧

    万次阅读 多人点赞 2018-12-26 20:58:43
    这篇文章是亚马逊科学家介绍CNN网络调优的细节,许多实验是在图像分类算法做的,比如ResNet,作者不仅复现出原论文的结果,在许多网络结构上甚至超出原论文的效果,而且对于目标检测、图像分割算法同样有提升作用。...
  • 欢迎大家来自《图像分类》专栏,今天讲述细粒度图像分类问题,这是计算机视觉领域一项极具挑战的研究课题,本文介绍了细粒度图像分类算法的发展现状、相关数据集和竞赛,供大家参考学...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 297,226
精华内容 118,890
关键字:

图像分类