基于粒子群优化算法和gabor纹理特征提取的优化支持向量机的图像分类

   图像分类也是数学建模中的一类赛题,今天给大家分享一下提取图片的gabor纹理特征后,利用粒子群优化后的支持向量机进行图像分类。
特征提取代码
clc
clear
close all
%%
addpath gabor
fprintf('开始计算\n');
%%
filter_bank = construct_Gabor_filters(8, 5, [48 48]); %5个尺度8个方向
class1path=dir('正常');
data_matrix1=[];
for i=1:length(class1path)-2
    imgpath=['正常\' class1path(i+2).name];%图片的路径
    img1=imread(imgpath);%读取图片
    img2=rgb2gray(img1);%灰度化
    img3= double(imresize(img2,[48 48],'bilinear'));  %采用'bilinear':采用双线性插值算法扩展为48*48
    H2 = filter_image_with_Gabor_bank(img3,filter_bank,64);%%提取gabor纹理特征
    data_matrix1=[data_matrix1 H2];%将提取的特征放进data_matrix1中
    disp(sprintf('完成正常文件夹中第%i图的gabor特征提取',i));
end
tz_image1=data_matrix1';

%%
class1path=dir('溃疡');
data_matrix1=[];
for i=1:length(class1path)-2
    imgpath=['溃疡\' class1path(i+2).name];%的路径
    img1=imread(imgpath);%读取图片
    img2=rgb2gray(img1);%灰度化
    img3= double(imresize(img2,[48 48],'bilinear'));  %采用'bilinear':采用双线性插值算法扩展为48*48
    H2 = filter_image_with_Gabor_bank(img3,filter_bank,64);%%提取gabor纹理特征
    data_matrix1=[data_matrix1 H2];%将提取的特征放进data_matrix1中
    disp(sprintf('完成溃疡文件夹中第%i图的gabor特征提取',i));
end
tz_image2=data_matrix1';

%% 
input=[tz_image1;tz_image2];
output=[ones(1,size(tz_image1,1)) 2*ones(1,size(tz_image2,1))]';


未优化的SVM
%% 清空环境变量以及加载数据
clc
clear
close all
warning off 
format long
format compact
%% 利用支持向量机进行分类,先添加libsvm相关工具,即把libsvm-3.12 添加路径(以包含子文件夹方式)
%% 网络结构建立
%读取数据
load img_tz %纹理特征

%%
%由于特征维数过高,每个gabbor特征有1440维,不利于训练网络,因此我们用PCA进行降维
[pca1,pca2,pca3]=pca(input);
input=pca2(:,1:10);%这个函数是matlab自带的pca降维工具
% 这样就将gabor提取到的1440维降到了10维

%随机提取150组样本作为训练样本,剩下的作为测试样本--要换训练集样本数 修改m即可
rand('seed',0)
[m n]=sort(rand(1,size(input,1)));
m=150;
train_wine=input(n(1:m),:);
train_wine_labels=output(n(1:m),:);
test_wine=input(n(m+1:end),:);
test_wine_labels=output(n(m+1:end),:);

%% 支持向量机
% 参数设置
bestc=41.7265;
bestg=0.0106;
cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)];
% 训练SVM模型
model = svmtrain(train_wine_labels,train_wine,cmd);
[predict1] = svmpredict(train_wine_labels,train_wine,model);
%
[train_wine_labels n]=sort(train_wine_labels);%对结果进行排序,使得画出来的结果图只管一点

figure;
hold on;
stem(train_wine_labels,'o');
plot(predict1(n),'r*');
xlabel('训练集样本','FontSize',12);
ylabel('类别标签','FontSize',12);
legend('实际训练集分类','预测训练集分类');
title('训练集分类结果','FontSize',12);
grid on;

%% SVM网络预测
[predict_label,accuracy] = svmpredict(test_wine_labels,test_wine,model);
% 打印测试集分类准确率
total = length(test_wine_labels);
right = sum(predict_label == test_wine_labels);


%% 结果分析
[test_wine_labels n]=sort(test_wine_labels);

figure;
hold on;
stem(test_wine_labels,'o');
plot(predict_label(n),'r*');
xlabel('测试集样本','FontSize',12);
ylabel('类别标签','FontSize',12);
legend('实际测试集分类','预测测试集分类');
title('测试集分类结果','FontSize',12);
grid on;
pso优化SVM
%% 清空环境变量以及加载数据
clc
clear
close all
warning off 
format long
format compact
%% 网络结构建立
%读取数据
load img_tz %纹理特征

%%
%由于特征维数过高,每个gabbor特征有1440维,不利于训练网络,因此我们用PCA进行降维
[pca1,pca2,pca3]=pca(input);
proportion=0;
i=1;
while(proportion < 95)
    proportion = proportion + pca3(i);
    i = i+1;
end
input=pca2(:,1:10);
%随机提取训练样本,预测样本
rand('seed',0)
[m n]=sort(rand(1,size(input,1)));
m=150;
train_wine=input(n(1:m),:);
train_wine_labels=output(n(1:m),:);
test_wine=input(n(m+1:end),:);
test_wine_labels=output(n(m+1:end),:);

%% 
%%%%% 选择最佳的SVM参数c&g-利用粒子群算法进行选择
% 粒子群参数初始化
pso_option = struct('c1',0.9,'c2',0.9,...
    'maxgen',200,'sizepop',50, ...
    'k',0.6,'wV',0.8,'wP',0.8, ...
    'popcmax',10^2,'popcmin',10^(-2),...
    'popgmax',10^2,'popgmin',10^(-2));
%%
[bestacc,bestc,bestg,trace] = psoSVMcgForClass(train_wine_labels,train_wine,test_wine_labels,test_wine,pso_option);
GlobalParams=[bestc bestg];

figure
plot(trace(:,1),'p-','LineWidth',1.5);hold on
plot(trace(:,2),'*-','LineWidth',1.5)
xlabel('迭代次数')
legend('当前最优适应度值','当前平均适应度值')
ylabel('适应度(分类错误率)')
line1 = '适应度曲线Accuracy[PSO寻优]';
line2 = ['终止代数=', ...
    num2str(pso_option.maxgen),',种群数量pop=', ...
    num2str(pso_option.sizepop),')'];
line3 = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
    ' CVAccuracy=',num2str((1-trace(end,1))*100),'%'];
title({line1;line2;line3},'FontSize',12);



%%
cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)];
model = svmtrain(train_wine_labels,train_wine,cmd);
[predict1] = svmpredict(train_wine_labels,train_wine,model);
[train_wine_labels n]=sort(train_wine_labels);

figure;
hold on;
stem(train_wine_labels,'o');
plot(predict1(n),'r*');
xlabel('训练集样本','FontSize',12);
ylabel('类别标签','FontSize',12);
legend('实际训练集分类','预测训练集分类');
title('训练集分类结果','FontSize',12);
grid on;

%% SVM网络预测
[predict_label,accuracy] = svmpredict(test_wine_labels,test_wine,model);
% 打印测试集分类准确率
total = length(test_wine_labels);
right = sum(predict_label == test_wine_labels);


%% 结果分析
[test_wine_labels n]=sort(test_wine_labels);

figure;
hold on;
stem(test_wine_labels,'o');
plot(predict_label(n),'r*');
xlabel('测试集样本','FontSize',12);
ylabel('类别标签','FontSize',12);
legend('实际测试集分类','预测测试集分类');
title('测试集分类结果','FontSize',12);
grid on;

 结果展示

优化后的结果

 未优化的结果

 

 可以看出,优化后的分类效果比未优化后的分类效果好。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值