matlab使用纹理特征(HOG+LBP)+svm(libsvm)对图片进行多分类

我的数据集不公开,分类代码就是这四个.m文件,具体使用说明可以看后文中的README

写在前面的碎碎念(可跳过)

想来想去还是把祖传代码给改了,目前只是调通了代码,但是分类accuracy只有80%左右,效果差了10%,但是本着做了工作就记录一下,不然就白做了的思想,可能后期还得学习一下svm的理论知识,把svm的参数调整一下,没准会更好。不过好像工作量挺大的样子,看来我又偷懒了。

下面这些和标题没啥关系,可以跳过,祖传代码是一份传奇的代码,我还没来的时候就有了,应该是参考以下这些博客的,感谢博主GoodboyBin,参考博客:https://www.cnblogs.com/xiangbin1207/p/6936993.html(这是一系列的博客,这个连接只是第一篇,总的内容包括了数据集怎么放置,然后还有代码,包括了hog和lbp特征,这是两种常见的纹理特征,理论知识网上特别多,LBP挺好懂的,HOG特征倒是卡了我很久,关于hog特征,有兴趣的可以看这个博客,写的超级无敌好https://blog.csdn.net/coming_is_winter/article/details/72850511,英语好可以看开山之作的原文:http://www.micc.unifi.it/delbimbo/wp-content/uploads/2011/03/reference_papers/Dalal.pdf

关于祖传代码,因为是以前学长学姐们给我的,不是我自己的东西,我就不贴代码了,把那个参考博客多看几遍应该就会了,尤其是这篇:https://www.cnblogs.com/xiangbin1207/p/6937017.html,祖传代码里面的东西我自己就加了2个地方,关于特征提取的调整参数的,我把改动贴一下,其实就是很基本的调参,这些参数基本上见名知意,多看几篇论文和博客就会知道的,更为详细的内容可以在matlab的命令行里面输入 help extractHOGFeatures 和help extractLBPFeatures。

featuresTest2 = extractHOGFeatures(imageTrain,'CellSize',[4,4]);%原博客中只能调CellSize这个参数,
featureTest2 = extractHOGFeatures(scaleTestImage,'CellSize',[32 32],'BlockSize',[3 3],'NumBins',9);%我改进后的还能调BlockSize,和Numbins,嗯这些都是matlab自带的,只是你没写也是存在的就用了默认的参数而已,自己可调整
 
 lbpFeatures = extractLBPFeatures(I,'CellSize',[16 16],'Normalization','None');%原博客没有使用归一化,也没有调整Upright的参数
 featuresTest1= extractLBPFeatures(imageTrain,'CellSize',[32 32],'Normalization','L2','Upright',true);


然后又在后面加了一个绘制混淆矩阵的功能,代码还是学长学姐找的,来源于GitHub和何凌霄,之前有整理过了,在这里https://blog.csdn.net/qigeyonghuming_1/article/details/97934871

正题

libsvm分类部分

model=svmtrain(double_trainLabels,featuresTrain,'-c 2 -g 1');%参数还暂时不懂什么意义,后期要加强学习
[predict_label,accuracy]=svmpredict(double_testLabels,featuresTest,model);
predict_label=predict_label';%绘制混淆矩阵需要该变量是行向量

上面的代码是下文libsvm_hog_lbp.m的部分节选,matlab使用纹理特征(HOG+LBP)+libsvm对图片进行多分类,libsvm分类需要四个变量,就是代码里面的double_trainLabels(代表训练集的标签)、featuresTrain(代表训练集提取到的特征——即LBP+HOG特征)、double_testLabels(代表测试集的标签)、feturesTest(代表测试集提取到的特征——即LBP+HOG特征)注意,这四个变量都必须是double类型(双精度),否则代码会报错的。
predict_label是一个m2X1的列向量,绘制混淆矩阵的参数需要是行向量,所以我们将他进行转置。
在这里插入图片描述

划分数据集

%% 划分数据集
pwd='E:\libsvm-hog_svm\libsvm_更新的数据集8bitROI';
currentPath = pwd;  % 获得当前的工作目录
 
imdsImage = imageDatastore(fullfile(pwd,'organ'),'IncludeSubfolders',true,'LabelSource','foldernames');   % 载入所有图片集合
 numImages = length(imdsImage.Files); %图片总的张数
 [imdsTrain,imdsTest] = splitEachLabel(imdsImage, 0.8,'randomized');%每个类都按比例随机拆分数据集,训练集和测试集8020

在这里插入图片描述

上面的代码是下文libsvm_hog_lbp.m的部分节选,祖传代码分两个文件夹分别存放训练集和测试集,而本代码则是使用一个文件夹存放所有数据集,文件夹内有若干个子文件夹,文件夹名是各个类的类别名,然后使用splitEachLabel随机将整个数据集拆分为训练集和测试集,且数目比例大致为训练集80%,测试集20%,请参考 https://ww2.mathworks.cn/help/matlab/ref/matlab.io.datastore.imagedatastore.spliteachlabel.html
以及 https://blog.csdn.net/wanzi1122/article/details/80491937?utm_medium=distribute.pc_relevant.none-task-blog-title-3&spm=1001.2101.3001.4242

完整代码 :libsvm_hog_lbp.m

clear all;                 
clc;
tic
%% 划分数据集
pwd='E:\libsvm-hog_svm\libsvm_更新的数据集8bitROI';
currentPath = pwd;  % 获得当前的工作目录
 
imdsImage = imageDatastore(fullfile(pwd,'dataset'),'IncludeSubfolders',true,'LabelSource','foldernames');   % 载入所有图片集合
 numImages = length(imdsImage.Files); %图片总的张数
 [imdsTrain,imdsTest] = splitEachLabel(imdsImage, 0.8,'randomized');%每个类都按比例随机拆分数据集,训练集和测试集8020%% 提取训练集的特征和训练集样本标签
 % 这一步我原先以为是没有用的,因为它只是I,只是一张但是后来发现,他只是要得到lbp的特征列数,也就是最后一句,这么做的目的是为了初始化特征矩阵
imageSize = [200 200];% 对所有图像进行此尺寸的缩放   参数1:图片大小
% 
 I = readimage(imdsTrain,1);
 scaleImage = imresize(I,imageSize); 
 m =size(scaleImage,3);%如果是彩色图片转成灰度图片,灰度图片则不处理
    if m>1
        scaleImage=rgb2gray(scaleImage);
    end    
    
%lbp的参数是以下三个,直接在这改,就不用在函数里一个一个的改动了
lbp_CellSize=32;
Normalization='L2';%参数有'None','L2'
Upright=true;%参数有true,false 

%hog的参数是以下三个,
hog_CellSize=32;
hog_BlockSize=3;
NumBins=9;

%构造和初始化两种特征向量矩阵
numTrainImages = length(imdsTrain.Files);  %训练集样本数
numTestImages = length(imdsTest.Files)
  • 27
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 35
    评论
### 回答1: MATLAB是一种计算机程序语言和交互式环境,它可以用于各种数据分析、科学计算和工程设计任务,包括图像分类和目标检测。其中,HOG(方向梯度直方图)和SVM(支持向量机)是两种常见的方法用于图像分类HOG特征表示一张图像中不同方向的梯度信息,并构建一个直方图来表示每个图像块的特征。这种特征提取方法在行人检测和人脸识别等领域得到了较好的应用。在MATLAB中,可以使用图像处理工具箱中的函数来提取HOG特征,并使用机器学习工具箱中的函数来训练分类器。 SVM是一种常用的分类器,它可以将不同类别的图像分开。对于训练样本,SVM可以找到一个最优的超平面将它们分割开来。在MATLAB中,可以使用机器学习工具箱中的函数来训练SVM分类器,并将其用于测试数据的分类。 将HOG特征和SVM分类器结合在一起,可以实现高效的图像分类。在MATLAB中,可以先使用HOG特征提取函数来生成图像特征,然后使用训练好的SVM分类器来实现分类。这种方法在机器视觉和计算机视觉中有广泛的应用,例如行人检测、人脸识别和物体识别等。总之,MATLAB图像分类hog svm方法是一种常用的图像识别方法,在各种不同的应用领域都有很好的表现。 ### 回答2: MATLAB是一款强大的编程软件,其中包括了图像处理和机器学习等领域的工具箱。其中,一种常见的图像分类算法是HOG+SVMHOG(Histogram of Oriented Gradients)提取图像中各个方向的梯度信息,并将其转化为直方图的形式,以描述图像的纹理和形状特征。SVM(Support Vector Machine)则利用这些特征来进行分类多分类的决策。这种方法广泛应用于人脸识别、物体检测等图像分类领域,具有较高的准确性和稳定性。在MATLAB中,用户可以通过调用相关函数,如hogFeatureExtractor、trainImageCategoryClassifier等,来实现该算法的图像分类。同时,用户也可以根据实际情况对算法进行优化和改进,例如:引入更多的特征描述符、设置合适的SVM参数等。总之,MATLAB提供了丰富的工具和方法,为用户快速、高效地进行图像分类和机器学习提供了便利。 ### 回答3: HOG-SVM分类器是一种常用的图像分类方法。HOG特征描述子是由Navneet Dalal和Bill Triggs于2005年提出的一种用于图像中物体检测的特征描述子。他们通过传统人工特征提取方法,从人眼视觉能够识别的局部图像特征出发,将图像转换成方向梯度直方图(Histogram of Oriented Gradient, HOG)特征。 HOG特征的提取,是指首先将图像分成很多小的单元格(cell),每个单元格内维护一个梯度方向直方图,然后使用经过分块(block)的梯度直方图来描述每个block中的梯度方向信息,最后将所有的分块信息串起来得到一个用于描述整张图片特征的向量。 SVM分类器则是通过对正负样本数据进行训练,使其能够将各类样本分开的一个分类器。SVM分类器最后将每个测试样本特征向量作为其输入,判定其属于哪个类别,并给出对于属于每个类别的置信度。 在图像分类中,使用HOG-SVM分类器能够实现对于目标物体的自动识别。先对训练数据进行HOG特征提取和SVM训练,训练完毕后,可以对测试数据进行HOG特征提取,并使用训练好的SVM分类进行物体的分类识别。实验表明,HOG-SVM分类器具有较高的分类准确率和较好的鲁棒性,广泛应用于目标检测、人脸识别等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值