精华内容
下载资源
问答
  • 遥感图像分类

    万次阅读 多人点赞 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、 结果验证

    参照监督分类

    三、小结

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

    优缺点:

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

    非监督分类:

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

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

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

    在这里插入图片描述

    展开全文
  • opencv SVM图像分类工程文件

    千次下载 热门讨论 2015-07-30 08:37:40
    这是opencv svm图像分类的整个工程代码,在VS2010下打开即可。整个工程文件以及我的所有训练的图片存放在这里,需要的可以下载,自己在找训练图片写代码花了很多时间,下载完后自行解压,训练图片和测试图片可以从这...
  • 模式识别实验报告 实验目的 目的:遥感图像分类。 利用envi专业遥感图像处理软件对遥感图像进行最小距离分类***************envi4.7经典版链接:...最小距离分类法是分类器里面最基本的一种分类方法,它...

    模式识别实验报告

    • 实验目的

    目的:遥感图像分类。

    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%以上,所以分类的效果是比较明显的。

     

    • 总结

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

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

     

     

     

     

     

     

    展开全文
  • 随机森林用于分类matlab代码

    热门讨论 2017-09-06 11:00:52
    根据随机森林的原理实现的matlab代码,里面有非常详细的注释,几乎每行都有,针对分类问题,可以运行,可以根据需要,修改到自己的算法中。
  • leetcode题目分类

    千次下载 热门讨论 2013-12-10 15:59:24
    这份文档列出了leetcode几乎所有题目(大约134题)的分类以及难度指示,是刷leetcode的必备良品。现在leetcode总的题目数已经达到150题,所以有部分题目没有包含在这个文档中,但是——足够了。po主刷leetcode的时候...
  • 深度学习笔记(13) Softmax分类

    万次阅读 2019-06-08 09:24:14
    Softmax 回归、练一个Softmax分类

    深度学习笔记(13) Softmax分类


    1. Softmax 回归

    有一种logistic回归的一般形式,叫做 Softmax回归
    能在试图识别某一分类时做出预测
    或者说是多种分类中的一个,不只是识别两个分类

    假设不单需要识别猫,而是想识别猫,狗和小鸡
    把猫加做类1,狗为类2,小鸡是类3
    如果不属于以上任何一类,就分到“其它”或者说“以上均不符合”这一类,把它叫做类0

    用大写的C来表示输入会被分入的类别总个数
    建立一个神经网络,其输出层有4个,或者说C个输出单元
    因此n,即输出层也就是L层的单元数量,等于4,或者一般而言等于C
    则输出层单元的数字代表这4种类型中每个的概率

    做到这一点的标准模型要用到Softmax层,以及输出层来生成输出
    对于L层,得到的z值
    在这里插入图片描述用这个元素取幂方法来计算 t:
    在这里插入图片描述
    把四个数字加起来得到176.3
    最终 a[l] = t / 176.3
    第一个节点输出 e5/176.3=0.842,也就是概率84.2%

    Softmax激活函数的特殊之处在于
    因为需要将所有可能的输出归一化,就需要输入一个向量,最后输出一个向量
    Softmax分类器还可以代表的决策边界


    2. 练一个Softmax分类器

    简单来说就是用临时变量t将它归一化,使总和为1,于是这就变成了a[L]
    注意到向量z中,最大的元素是5
    而最大的概率也就是第一种概率,Softmax把向量z变成这个向量
    在这里插入图片描述
    在Softmax分类中,一般用到的损失函数是来训练这个神经网络
    这就意味着,如果试图将它变小
    因为梯度下降法是用来减少训练集的损失的
    要使它变小的唯一方式就是使 -log y ^ \widehat{y} y 1 变小,即需要使 y ^ \widehat{y} y 1 尽可能大
    整个训练集的损失
    在这里插入图片描述


    参考:

    《神经网络和深度学习》视频课程


    相关推荐:

    深度学习笔记(12)Batch归一化网络
    深度学习笔记(11)超参数调试
    深度学习笔记(10)优化算法(二)
    深度学习笔记(9) 优化算法(一)
    深度学习笔记(8) 实践层面(三)


    谢谢!

    展开全文
  • 电影分类数据

    千次下载 热门讨论 2015-12-11 10:55:12
    康奈尔大学网站的2M影评数据集。 配合教程http://blog.csdn.net/lsldd/article/details/41542107
  • matlab版hog+svm图像二分类

    千次下载 热门讨论 2016-12-20 14:29:42
    该代码实现的是图像的二分类,hog用于图像的特征提取,svm表示的是对特征的分类。解压缩后,在添加到matlab的工作目录后,需要在代码中修改一下资源文件的路径(比如正负样本的图片路径),才可以正确运行。
  • 基于支持向量机的图像分类(下篇:MATLAB实现)

    万次阅读 多人点赞 2018-04-11 00:19:20
    摘要:本文通过图文详细介绍如何利用支持向量机对图像进行分类,经过上篇文章对原理的介绍,这里介绍利用MATLAB编程实现。后续章节将介绍的主要部分有: 图片数据集整理 特征提取 SVM训练与测试 分类结果...

    摘要:本文通过图文详细介绍如何利用支持向量机对图像进行分类,经过上篇文章对原理的介绍,这里介绍利用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”即可获取全部资源文件信息。

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

    展开全文
  • 这个链接是测试集,训练集请见我的资源 本语料库由复旦大学李荣陆提供。test_corpus.rar为测试语料,共9833篇文档;train_corpus.rar为训练语料,共9804篇文档,两个预料各分为20个相同类别。训练语料和测试语料...
  • Matlab 基于svm的图像物体分类

    万次阅读 热门讨论 2018-05-16 20:27:10
    本周工作日志,老师布置了一个小作业,让我们使用matlab实现图像物体分类 matlab 图像分类 1分类原理 基于一个很朴素的观点,不同物体在色素三维空间里的分布不同,使用svm可以构造一个分类面。 2程序流程 1...
  • 微信小程序云开发源码(垃圾分类源码)

    万次阅读 多人点赞 2019-09-09 13:25:27
    目录微信小程序云开发源码(垃圾分类源码)小程序云数据库介绍小程序界面小程序体验(扫描下方二维码体现效果)微信小程序源码 微信小程序云开发源码(垃圾分类源码) 最近发现全国大面积开始实行垃圾分类,基于...
  • opencv SVM图分类训练图片和测试图片

    千次下载 热门讨论 2015-07-30 08:29:45
    该训练图片共有四种,很适合做SVM图像分类的训练和测试,图像分类的代码可以自己写,也可以用我的工程文件,关于图像分类知识点和代码可以参考我的博客http://blog.csdn.net/always2015/article/details/47107129
  • 实验目的: 理解计算机图像分类的基本原理,掌握数字图像非监督分类以及监督分类的具体方法和过程,以及两种分类方法的区别。 二.实验平台:ERDAS IMAGINE 9.1 三.实验要求:掌握非监督分类;非监督分类结果评价;...
  • 现在很多城市都开始慢慢的实行垃圾分类了,但垃圾分类对于我们大众来说 很多人都是分不清楚这个垃圾是属于哪种分类,前面一片文章我们写了如何使用微信小程序识别垃圾分类,有了这个垃圾分类小程序我们对垃圾的分类...
  • 基于svm的中文文本分类

    热门讨论 2014-01-01 10:34:42
    基于内容的文本分类系统 (这是一个完整的分类系统,用java写的,分词是中科院64位的分词) 详情:http://blog.csdn.net/yinchuandong2/article/details/17717449 使用libsvm 进行分类 使用中科院的分词器ICTLAS对...
  • 这个CNN工具箱只用改一两个地方就可以对自己的数据集分类了 比github上的deeplearning的工具箱里的CNN改动要简单
  • 详解sigmoid与softmax, 多分类及多标签分类

    万次阅读 多人点赞 2018-09-19 21:35:50
    详解sigmoid与softmax, 多分类及多标签分类激活函数介绍sigmoid激活函数sigmoid激活函数的性质sigmoid激活函数的使用 激活函数介绍 对于熟悉机器学习或神经网络的读者来说,sigmoid与softmax两个激活函数并不陌生,...
  • 淘宝商品分类数据库

    热门讨论 2013-09-26 00:38:32
    淘宝商品三级分类数据库,三张表,要做商城之类的系统可以用得上,非常详尽,2000多条数据
  • 微信小程序 仿美团菜单 swiper分类菜单
  • 监督学习之分类学习:线性分类

    万次阅读 2021-04-29 17:44:12
    监督学习之分类学习 Introduction 分类学习是最为常见的监督学习问题,并且其中的经典模型也最为广泛地被应用。其中,最基础的便是**二分类(Binary Classification)问题,即判断是非,从两个类别中选择一个作为预测结果...
  • 分类和多分类的性能评价指标及python计算

    万次阅读 多人点赞 2019-08-15 16:05:29
    一、二分类 real\predict Positive Negative True TP FN False FP TN TP、TN、FP、FN 中的第二个字母(列标首字母)是机器学习算法或模型预测的结果(正例:P、反例:N) TP、TN、FP、FN 中的第一个...
  • ENVI监督分类及精度评价

    万次阅读 多人点赞 2019-02-24 20:22:13
    最近协助同学做了完整的监督分类数据,特此记录下来。对于ENVI监督分类,是每一个遥感从业者掌握的最基础的一个方法,但是完整的监督分类流程和精度评价,估计往往认识不够,所以以下的分享还是有点意义。 监督分类...
  • Android仿京东左右分类

    热门讨论 2015-03-15 19:47:53
    最近看到很多购物商城都是采用了一种布局,左边是list列表右侧是商品的列表
  • 文本分类——常见分类模型

    万次阅读 多人点赞 2018-11-06 17:37:56
      文本分类方法模型主要分为两个大类,一类是基于规则的分类模型;另一类是基于概率统计的模型。 基于规则的模型   基于规则的分类模型相对简单,易于实现。它在特定领域的分类往往能够取得较好的效果。相对于...
  • ENVI学习总结(十)——遥感图像监督分类

    万次阅读 多人点赞 2020-01-17 16:58:00
    10. 遥感图像监督分类 10.1内容介绍 监督分类,又称训练分类法,用被确认类别的样本像元去识别其他未知类别像元的过程。它就是在分类之前通过目视判读和野外调查,对遥感图像上某些样区中影像地物的类别属性有了...
  • 贝叶斯分类器详解

    万次阅读 多人点赞 2019-07-07 08:22:20
    本文介绍了贝叶斯的基本知识,然后给出了极大似然估计。最后给出了朴素贝叶斯分类器和半朴素贝叶斯分类器,并给出了西瓜书上相关的例题。
  • 贝叶斯分类

    万次阅读 多人点赞 2018-07-27 22:22:41
    贝叶斯分类器是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类器。而朴素贝叶斯分类器是贝叶斯分类器中最简单,也是最常见的一种分类方法。并且,朴素贝叶斯算法仍然是流行的十大挖掘算法之...
  • 分类:基于规则的分类技术

    千次阅读 2018-09-30 16:13:05
    基于规则的分类是一种比较简单的分类技术,下面从以下几个方面对其进行介绍  1.任务  所有的分类技术的任务都是利用数据集训练出分类器,然后为每条记录贴上标签,对其进行分类,基于规则的分类任务也是如此。 ...
  • 文本分类过程概述

    千次阅读 2019-01-09 19:15:11
    传统的文本分类过程通常包括训练模块和分类模块如下图所示:一般来讲文本分类过程包括预处理、文本表示、特征降维、训练分类器和分类性能评估。  文本分类过程图 1、文本分类预处理  由于计算机很难直接处...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,246,317
精华内容 898,526
关键字:

分类