精华内容
下载资源
问答
  • 高维多标签分类matlab

    2020-12-30 15:19:01
    高维多标签分类matlab knn,svm,随机森林等算法 784维数据 分为10类
  • 内含有大量多标签多类别分类算法和对应的代码,包括MIML_LPT,MIMLBoost,MIMLSVM,MIMLfast,KISAR,MIMLKNN,MLKNN,DMIMLSVM,MIMLMISVM等等,部分代码含有对应的文献,学习多类标分类的好资源。
  • matlab标注二分类数据

    2018-03-30 15:29:14
    用于进行训练数据标记的matlab脚本,通过鼠标在训练图片区域点点画多边形截取目标区域,获得一个与原图等大的01矩阵
  • 使用matlab处理分类数据多标签问题

    千次阅读 2019-01-20 22:33:40
    在使用matlab处理数据标签时, 1,首先要判断这张图片标签是否是符合规则的,对于不符合要舍去。在某些情况下,可能不能完全舍去。那么就需要,根据保留标签的特点,来存储数据。比如 使用case 语句。 2,标签可以...

    在使用matlab处理数据标签时,

    1,首先要判断这张图片标签是否是符合规则的,对于不符合要舍去。在某些情况下,可能不能完全舍去。那么就需要,根据保留标签的特点,来存储数据。比如 使用case 语句。

    2,标签可以过多或者需要融合,可以根据原始图片的特点来融合数据。

     

    展开全文
  • Matlab 基于svm的图像物体分类

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

    matlab 图像分类

    本周工作日志,老师布置了一个小作业,让我们使用matlab实现图像物体分类

    目录

    1分类原理

    基于一个很朴素的观点,不同物体在色素三维空间里的分布不同,使用svm可以构造一个分类面。

    2程序流程

    • 1首先加载图片
    • 2选取不同物体的代表点
    • 3训练svm分类器
    • 4将训练好的分类器应用到整张图片上。

    ##3代码如下

    %给初学者看得
    function showline(img)
    [n1,n2,~]=size(img);
    %我尽量写的简单易懂一点儿
    %首先你使用aa=imread(‘1.jpg’) 这个1.jpg 只是个例子,具体看你的图片叫什么,对了把图片放在你的工作目录里面
    %或者在1.jpg前面加上D:\研一\路径前缀
    %好,前期处理完成,showline(aa),这个具体是aa还是bb就看你怎么取得变量名了。
    %现在说一个比较关键的东西,学习matlab最踏实的办法,是哪个不会就help 它一下,但这个比较费时间因为讲的太细了。
    imshow(img);
    img2=img;
    
    %显示图片
    
    x1=floor(ginput(5));
    %函数运行到这儿,会弹出鼠标可以移动的十字架,在你觉得作为第一类样本的像素上,选5个点吧,加floor是确保得到的坐标都是整数。
    x2=floor(ginput(5));
    %这个同理,不过是第二类了。
    x3=floor(ginput(5));
    %这个也同理.
    
    x=zeros(10,3);
    %每次分类的时候都有10个样本,同时每个样本都有三个属性,rgb。
    for i=1:5
    x(i,:)=reshape(img(x1(i,2),x1(i,1),:),1,3);
    x(i+5,:)=reshape(img(x2(i,2),x2(i,1),:),1,3);
    end
    %赋值,因为图像像素值是N*m*3的矩阵,不好直接用,reshape为1*3的。
    
    y=[ones(5,1);-1*ones(5,1)];
    %标签集
    x=double(x);
    svmstruct=svmtrain(x,y);
    %svm训练
    group=svmclassify(svmstruct,double(reshape(img,n1*n2,3)));
    %使用svm
    
    group=reshape(group,n1,n2);
    %将group调整为一个n1*n2的存放类别标签的矩阵。
    for i=1:n1-1
         for j= 1:n2
             if group(i,j)*group(i+1,j)<1%两者类别不一致,分界线
                 if i<130 %这个是我估计的值,选择 陆地与天交接线下面一点儿的坐标就行
                 img2(i,j,:)=0;
                 end
             end
         end
    end
    
    for i=1:5
    x(i,:)=reshape(img(x2(i,2),x2(i,1),:),1,3);
    x(i+5,:)=reshape(img(x3(i,2),x3(i,1),:),1,3);
    end
    
    x=double(x);
    %赋值,因为图像像素值是N*m*3的矩阵,不好直接用,reshape为1*3的。
    y=[ones(5,1);-1*ones(5,1)];
    %标签集
    
    svmstruct=svmtrain(x,y);
    %svm训练
    group=svmclassify(svmstruct,double(reshape(img,n1*n2,3)));
    %使用svm
    group=reshape(group,n1,n2);
    %将group调整为一个n1*n2的存放类别标签的矩阵。
    for i=1:n1-1
         for j= 1:n2
             if group(i,j)*group(i+1,j)<1%两者类别不一致,分界线
                 if i<170 %这个是我估计的值,这次选择陆地水下面一点儿的值。
                 img2(i,j,1)=255;
                 end
             end
         end
    end
    
    imshow(img2);
    

    补充

    如果还是有不会的,可以扫码关注这个公众号:博主会在24小时内回复
    在这里插入图片描述

    展开全文
  • Matlab分类准确率代码

    2018-01-12 14:43:50
    matlab实现的计算但标签分类聚类准确率的计算代码。函数包含两个参数groundtruth以及分类/聚类模型给出的预测标签向量
  • 分类SVM的Matlab实现

    2018-04-04 16:19:17
    内含libsvm工具箱、SVMs的示例程序(含代码和实例数据)、SVR的示例程序(含代码和实例数据)
  • 用于多标签分类MATLAB / OCTAVE库 当前可用功能: 基于聚类的方法,CBMLC,HOMER,CLMLC SLEEC(?)基于集合的方法,ECC,RAkEL,RAkEL-d,fRAkEL,TREMLC,MLCEnsemble,COCOA 特征空间降维(FSDR) FSDR非监督...
  • 输入:特征和标签->模型->回归系数->预测:分类结果 功能:逻辑回归实现二分类
  • 通过分层分区和数据相关分组进行多标签分类Matlab代码 运行main_NMFGT.m以通过随机恒定权重和与数据相关的组测试方法进行多标签分类 通过标签分区运行main_HeNMFGT.m进行多标签分类,并分别应用NMF_MLGT并合并结果...
  • matlab开发-标签标签标签。创建三维绘图
  • 返回一个或多个测试实例的估计标签以及估计的准确性。 2. 以降序返回具有各自概率的标签。 使用鸢尾花数据集的示例 加载fisheriris X = 测量值; Y = 物种; Xnew = [min(X);mean(X);max(X)]; mdl = NaiveBayes('...
  • 使用分类器对特征数据做分类器,需要使用正负样本,本程序旨在为正负样本数据做标签
  • %% 本函数的功能是根据所给分类方程,产生一组带标签的数据点(二维) % row表示需要的数据点个数; % range_x、range_y分别是数据[横纵坐标取值范围],都是 1*2 矩阵. % 分类方程形式:y = a*x^m + b function data = ...

    一、实验原理:略
    二、实验步骤
    1,编辑函数generate_signedData;

    %% 本函数的功能是根据所给分类方程,产生一组带标签的数据点(二维)
    %  row表示需要的数据点个数;
    %  range_x、range_y分别是数据[横纵坐标取值范围],都是 1*2 矩阵.
    %  分类方程形式:y = a*x^m + b
    function data = generate_signedData(row,range_x,range_y,a,m,b)
    data=zeros(row,3);
    min_x=range_x(1);
    max_x=range_x(2);
    min_y=range_y(1);
    max_y=range_y(2);
    for i=1:1:row
        %rand('seed',0); %初始化高斯随机生成器为0,这对结果的可重复性很重要
        x = min_x+(max_x-min_x)*rand(1,1);
        y = min_y+(max_y-min_y)*rand(1,1);
        sign = zeros(1,1);
        if y>(a*x^m + b) 
            sign = 1;
        else
            sign = -1;
        end
        data(i,:)=[x,y,sign];
    end
    
    figure;
    %在图片中显示所有数据点
    for i=1:1:row
        x1 = data(i,1);
        x2 = data(i,2);
        sign = data(i,3);
        if sign == 1  
            plot(x1,x2,'r+','markersize',6); 
        elseif sign == -1  
            plot(x1,x2,'bo','markersize',6); 
        end 
        hold on;
    end;
    hold off;
    grid on;
    
    

    2、调用函数,分类线:y=2x+2
    X3=generate_signedData(100,[-8,8],[-8,8],2,1,2)
    Matlab 中输出:
    X3 =

    -4.3989 -2.3998 1.0000
    -3.4066 6.8398 1.0000
    -7.1790 1.4827 1.0000
    -5.3936 5.4145 1.0000
    -5.3190 0.0352 1.0000
    7.9893 -2.3135 -1.0000
    -7.2468 -4.5814 1.0000
    -1.6346 -2.6613 -1.0000
    -4.3264 6.9779 1.0000
    2.9310 7.3938 -1.0000
    -0.9924 7.0454 1.0000
    -7.9067 1.7649 1.0000
    4.8172 -4.2723 -1.0000
    6.9195 4.2122 -1.0000
    5.2232 1.1754 -1.0000
    4.6813 -2.7353 -1.0000
    -4.4246 -3.0018 1.0000
    1.3524 5.2786 1.0000
    -3.3526 -1.5591 1.0000
    5.7929 1.8358 -1.0000
    7.8590 -4.7408 -1.0000
    5.2353 2.8138 -1.0000
    -4.0168 -0.3874 1.0000
    -1.6148 1.5910 1.0000
    4.8084 -6.3189 -1.0000
    5.1431 5.4574 -1.0000
    -2.3279 -1.1189 1.0000
    1.1558 3.2132 -1.0000
    3.8795 4.1261 -1.0000
    -1.7739 -1.1312 1.0000
    7.3015 1.1675 -1.0000
    5.5956 -3.5785 -1.0000
    1.9572 1.4138 -1.0000
    7.4155 -6.6256 -1.0000
    0.0080 0.3454 -1.0000
    -6.5573 6.4747 1.0000
    6.1502 -0.9762 -1.0000
    4.5076 -5.6246 -1.0000
    1.9171 -3.8300 -1.0000
    -0.8695 5.5040 1.0000
    -4.8607 -3.1384 1.0000
    -0.2673 -2.5950 -1.0000
    4.7758 7.7998 -1.0000
    -5.4552 -4.2099 1.0000
    3.2358 -1.9925 -1.0000
    7.5793 7.5569 -1.0000
    2.2992 5.7616 -1.0000
    -1.5699 2.1109 1.0000
    7.7638 0.9516 -1.0000
    6.9375 3.5255 -1.0000
    -0.2554 2.2245 1.0000
    6.2022 -4.8202 -1.0000
    -1.6741 7.8748 1.0000
    -1.5624 2.5417 1.0000
    6.4216 7.9261 -1.0000
    2.4506 -6.2650 -1.0000
    -7.4222 1.8895 1.0000
    1.0743 7.3914 1.0000
    3.9377 2.6003 -1.0000
    0.3730 -3.8417 -1.0000
    7.3919 0.6433 -1.0000
    -7.5157 3.1410 1.0000
    0.3155 -7.0555 -1.0000
    6.2406 -2.7168 -1.0000
    -4.3248 -6.1768 1.0000
    -3.0252 -4.3451 -1.0000
    2.4320 -6.9414 -1.0000
    -3.5931 -3.4909 1.0000
    6.0811 -0.8907 -1.0000
    4.0946 1.6527 -1.0000
    4.5323 -6.1771 -1.0000
    7.6570 5.5775 -1.0000
    -7.1897 -0.5408 1.0000
    -2.7895 2.0833 1.0000
    -4.3152 1.2782 1.0000
    1.6505 1.5981 -1.0000
    -0.8252 -7.4332 -1.0000
    0.2210 -1.4763 -1.0000
    -6.2713 -0.6420 1.0000
    -0.7859 0.8182 1.0000
    4.8865 3.2136 -1.0000
    5.9558 -7.1649 -1.0000
    -4.4851 -0.6457 1.0000
    7.3365 4.6407 -1.0000
    -0.7700 -2.6651 -1.0000
    -7.0545 3.8545 1.0000
    0.1087 -4.8012 -1.0000
    -1.1649 -5.3010 -1.0000
    4.0271 -2.1064 -1.0000
    7.0691 -7.7252 -1.0000
    5.2649 2.0255 -1.0000
    0.6199 2.4081 -1.0000
    3.6261 -6.4882 -1.0000
    6.0412 -7.7702 -1.0000
    -3.2912 -5.1214 -1.0000
    6.8207 -6.9091 -1.0000
    1.2975 2.1944 -1.0000
    2.4203 5.8340 -1.0000
    -7.1048 5.0697 1.0000
    0.4628 3.1096 1.0000
    绘制出了数据点的图像:
    这里写图片描述
    3、测试二次函数分类线:y=x^2-4
    X3=generate_signedDataForEllipse(100,[-8,8],[-8,8],1,2,-4)
    输出结果:
    X3 =

    -6.1257 -4.1532 -1.0000
    2.9585 5.4281 1.0000
    7.5223 -4.5573 -1.0000
    4.1655 1.3456 -1.0000
    -1.5528 0.1606 1.0000
    -0.0697 2.4219 1.0000
    3.8993 -3.1687 -1.0000
    -6.5662 5.2154 -1.0000
    -1.7666 4.4049 1.0000
    -5.1301 -6.2502 -1.0000
    6.4825 6.0216 -1.0000
    7.9967 5.8281 -1.0000
    -7.4100 0.7149 -1.0000
    7.9619 0.1761 -1.0000
    5.9762 -6.8765 -1.0000
    7.8006 6.7634 -1.0000
    1.0282 -1.0966 1.0000
    -2.5945 3.5316 1.0000
    -7.7815 -2.0150 -1.0000
    6.7630 0.7437 -1.0000
    -0.4178 -0.0554 1.0000
    -3.0565 7.2134 1.0000
    7.7119 0.2170 -1.0000
    7.8814 -0.7065 -1.0000
    -1.1833 -4.5886 -1.0000
    -4.9080 5.3241 -1.0000
    3.6262 0.4759 -1.0000
    5.2653 0.1900 -1.0000
    0.8314 -4.5874 -1.0000
    1.4051 -5.7158 -1.0000
    -7.1644 2.9329 -1.0000
    1.7370 -4.4855 -1.0000
    -1.4995 2.0785 1.0000
    0.8849 -5.9587 -1.0000
    -5.2928 -7.9840 -1.0000
    -1.3094 -0.1842 1.0000
    -5.4421 2.6694 -1.0000
    -7.7133 -6.0852 -1.0000
    7.2340 7.6137 -1.0000
    -7.5054 -0.0979 -1.0000
    5.8036 -4.1140 -1.0000
    5.3483 5.0175 -1.0000
    2.0636 -7.9642 -1.0000
    -1.9244 6.4705 1.0000
    2.8856 -1.9388 -1.0000
    2.1113 -4.1077 -1.0000
    1.1426 7.7077 1.0000
    5.5949 -3.4649 -1.0000
    2.9193 -2.2700 -1.0000
    7.7908 -6.6562 -1.0000
    -3.9951 4.9815 -1.0000
    -6.6492 0.5001 -1.0000
    4.8100 3.8212 -1.0000
    -5.7334 -0.9937 -1.0000
    -2.3939 -0.3440 -1.0000
    1.3985 -5.6671 -1.0000
    6.4853 2.2431 -1.0000
    -5.3930 1.0546 -1.0000
    6.9059 4.5296 -1.0000
    2.9710 -0.5405 -1.0000
    -3.8349 1.1083 -1.0000
    -4.0197 -2.8912 -1.0000
    6.5728 6.1635 -1.0000
    4.7134 6.8130 -1.0000
    -5.1386 0.2807 -1.0000
    2.0321 6.6109 1.0000
    2.6235 -1.7729 -1.0000
    3.8401 5.0822 -1.0000
    1.6055 -6.6400 -1.0000
    6.7577 -7.1424 -1.0000
    0.4324 -6.0983 -1.0000
    -1.9177 5.0053 1.0000
    -4.0945 6.1508 -1.0000
    3.4023 -1.9496 -1.0000
    -4.0173 -3.9543 -1.0000
    4.2759 -7.2022 -1.0000
    2.9646 1.9244 -1.0000
    3.9470 7.6361 -1.0000
    -1.8574 -3.8367 -1.0000
    6.0395 4.8975 -1.0000
    -0.6221 -6.5446 -1.0000
    1.0283 -5.0019 -1.0000
    0.5070 -2.3195 1.0000
    -2.9635 3.6279 -1.0000
    0.2524 4.6503 1.0000
    -4.7281 2.8497 -1.0000
    -7.1602 4.8188 -1.0000
    2.8571 7.1361 1.0000
    -6.5351 6.5350 -1.0000
    0.1592 1.8385 1.0000
    -2.9429 -6.7602 -1.0000
    5.6098 -5.6876 -1.0000
    -2.0722 1.9583 1.0000
    7.9608 0.2775 -1.0000
    7.8482 -4.3754 -1.0000
    -1.6319 3.1451 1.0000
    -6.9657 3.9626 -1.0000
    -1.2736 4.9811 1.0000
    -1.9263 -2.8949 -1.0000
    7.7768 3.4909 -1.0000
    显示图片:
    这里写图片描述
    四、总结与思考:
    从实验结果看到,本函数对于二元一次、抛物线形式的分类条件具有较好的效果。

    展开全文
  • 基于支持向量机的图像分类(下篇: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”即可获取全部资源文件信息。

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

    展开全文
  • %% 生成txt格式的图像分类标签 path='D:\人工智能\图像识别数据\'; folders=dir(path);% dir是direcory的缩写,是目录的意思,返回的folders是结构体,包含所有的目录和两个特殊的目录,一个是“.”,代表该文件夹...
  • 返回一个或多个测试实例的估计标签。 2. 返回 k 个最近的训练实例的索引和各自的距离。 使用鸢尾花数据集的示例 加载fisheriris X = 测量值; Y = 物种; Xnew = [min(X);mean(X);max(X)]; k = 5; 公制 = '...
  • matlab自带分类工具分类箱使用

    千次阅读 2019-07-07 21:34:40
    其中本人matlab为2016b,工作空间中Data为540行12列,540个样本,11个维度,最后一列为标签。 打开maltab软件,输入“classificationLearner”,回车。 输入数据,选择“From Workspace”. 因为我的样本是行排列,则...
  • matlab开发-标签库更改标签。将照明算法更改为平面(均匀照明)
  • matlab----标签图像分类训练工具

    千次阅读 2017-12-04 18:18:36
    Label Images for Classification Model...matlab—-标签图像分类训练工具 http://cn.mathworks.com/help/vision/ug/label-images-for-classification-model-training.html?s_tid=srchtitle Description The Trainin
  • Matlab分类器大全

    千次阅读 2016-01-12 20:51:25
    train_data是训练特征数据, train_label是分类标签。 Predict_label是预测的标签MatLab训练数据, 得到语义标签向量 Scores(概率输出)。1.逻辑回归(多项式MultiNomial logistic Regression)Factor = mnrfit...
  • 分类数据标签增加噪声,输入数据和噪声比例,输出带有噪声的数据集,里面附带一个分类数据集
  • SVM(支持向量机)作为火了很久的算法,无论是在分类、回归、建模等方向都有“带头大哥”的作用。以此记录缓慢的科研过程。 一、理论和数据前期准备 (1)SVM的一般使用的形式为: train_set=xlsread('C:\Users\...
  • matlab快速实现人脸识别

    万次阅读 多人点赞 2018-08-25 21:43:35
    首先准备好人脸数据和类别标签,在我的基于PCA和SVM的人脸识别博客中有讲解,得到数据和标签后,将标签栏加在数据栏的最后一列,降维后的人脸数据是205*20,标签是205*1,则最后得到的数据和标签的组合数据data为205...
  • libsvm - 支持多类别分类的svm工具箱(matlab). 它扩展了matlab自带的svm分类器的功能(只能完成2分类),可配合DeepLearnToolbox使用
  • 文章目录SVM 多分类对带标签的高光谱数据建立分类模型代码1.训练集、测试集2、数据归一化3、参数选择4、模型训练5、模型测试 SVM 多分类 采用libSVM包进行多分类 对带标签的高光谱数据建立分类模型 数据描述:三个...
  • BP神经网络的MATLAB实现

    万次阅读 多人点赞 2017-05-18 15:56:04
    接下来,我们利用MATLAB对BP神经网络进行实现。我们直接上代码,并进行解释。MATLAB 代码整个代码是基于BP神经网络矩阵形式编写的,对公式有疑惑的同学可以参考下上篇博文。sigmoid.mfunction [ out ] = sigmoid( in...
  • 基于MATLAB的水果分级设计

    万次阅读 多人点赞 2018-06-14 14:19:35
    基于MATLAB的水果分级识别技术研究摘 要本次毕业设计介绍了基于MATLAB的水果分级自动识别,利用手机端获取苹果的样本图像,应用MATLAB软件编程实现了对样本图像的预处理,包括图像滤波、图像填充、图像灰度化、图像...
  • MATLAB自带分类模型APP——classification learner的使用 MATLAB自带分类模型APP——classification learner的使用MATLAB对常用的机器学习的分类模型做了集合,也就是形成了它自带的classification learner APP,...
  • matlab开发-勾选标签格式设置执行标签的动态格式。TickLabelFormat设置轴刻度标签格式。在缩放/平移/最大化过程中保留格式

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,169
精华内容 3,667
关键字:

matlab标签分类

matlab 订阅