利用Matlab仿真实现图像烟雾识别(k-means聚类图像分割+LBP+PCA+SVM)

利⽤Matlab仿真实现图像烟雾识别(k-means聚类图像分
割+LBP+PCA+SVM)
⽬录
⼀、算法简介
1.1 c-means聚类算法
1 .
2 LBP算法
1.3 PCA算法
1.4 SVM算法
⼆、算法实现
2.1 烟雾识别算法流程
2.2 c-means算法实现
2.3 LBP算法实现
2.4 SVM算法实现
三、结果分析
⼀、算法简介
1.1 c-means聚类算法
聚类分析是根据在数据中发现的描述对象及其关系的信息,将数据对象进⾏分组。⽬的是使组内的对象相互之间是相似的(相关的),⽽不同组中的对象是不同的(不相关的)。组内相似性越⼤,组间差距越⼤,说明聚类效果越好。
也就是说,聚类的⽬标是得到较⾼的类内相似度和较低的类间相似度,使得类间的距离尽可能⼤,类内样本与类中⼼的距离尽可能⼩。在此,我们选⽤k-means聚类算法。
1 .
2 LBP算法
LBP(Local Binary Pattern,局部⼆值模式)是⼀种⽤来描述图像局部纹理特征的算⼦;它具有旋转不变性和灰度不变性等显著的优点。它是⾸先由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出,⽤于纹理特征提取,提取的特征是图像的局部的纹理特征。
原始的LBP算⼦定义为在3*3的窗⼝内,以窗⼝中⼼像素为阈值,将相邻的8个像素的灰度值与其进⾏⽐较,若周围像素值⼤于中⼼像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经⽐较可产⽣8位⼆进制数(通常转换为⼗进制数即LBP码,共256种),即得到该窗⼝中⼼像素点的LBP值,并⽤这个值来反映该区域的纹理信息。
1.3 PCA算法
PCA(Principal Component Analysis),即主成分分析⽅法,是⼀种使⽤最⼴泛的数据降维算法。其算法步骤如下:
1)数据中⼼化——去均值,根据需要,有的需要归⼀化——Normalized;
2)求解协⽅差矩阵;
3)利⽤特征值分解/奇异值分解求解特征值以及特征向量;
4)将特征值从⼤到⼩排序,保留前k个特征向量
5)利⽤特征向量构造投影矩阵;
6)利⽤投影矩阵,得出降维的数据。
1.4 SVM算法
⽀持向量机(support vector machines, SVM)是⼀种⼆分类模型,它的基本模型是定义在特征空间上的间隔最⼤的线性分类器,间隔最⼤使它有别于感知机;SVM还包括核技巧,这使它成为实质上的⾮线性分类器。SVM的的学习策略就是间隔最⼤化,可形式化为⼀个求解凸⼆次规划的问题,也等价于正则化的合页损失函数的最⼩化问题。SVM的的学习算法就是求解凸⼆次规划的最优化算法。
SVM学习的基本想法是求解能够正确划分训练数据集并且⼏何间隔最⼤的分离超平⾯。如下图所⽰即为分类超平⾯,对于线性可分的数据集来说,这样的超平⾯有⽆穷多个(即感知机),但是⼏何间隔最⼤的分类超平⾯却是唯⼀的。如下图1-1SVM
算法⽰意图
图1-1SVM算法⽰意图
⼆、算法实现
2.1 烟雾识别算法流程
1)⾸先对所有图像进⾏预处理,假定将有烟当作正样本,将没烟看作负样本,train集的smoke⽂件夹改名为pos,train集的non⽂件夹改名为neg;同理将test集的smoke⽂件夹改名为pos,test集的non⽂件夹改名为neg。为了对所有图⽚进⾏处理,将train和test中的pos和neg中的图⽚全部规范命名格式为0001.jpg、0002.jpg、0003.jpg、0004.jpg、。将这些图⽚名字提取出来分别存到“、、pos_、neg_⽂本中。如下图2-1图2-2所⽰
图2-1
图2-2
2)利⽤c-means聚类算法对训练集和测试集图像的像素进⾏聚类,实现图像分割。
3)利⽤LBP对分割后的训练集图像和测试集图像进⾏特征提取。
4)分别对训练集和测试集使⽤主成分分析法(PCA)进⾏特征降维。
5)利⽤对训练集降维后得到的⼆维特征训练SVM⼆分类模型,
6)最后利⽤对测试集降维后得到的⼆维特征进⾏分类预测。
整体算法流程如下图2-3所⽰
图2-3 算法流程框图
2.2 c-means算法实现
图像分割是利⽤图像的灰度、颜⾊、纹理、形状等特征,把图像分成若⼲个互不重叠的区域,并使这些特征在同⼀区域内呈现相似性,在不同的区域之间存在明显的差异性。然后就可以将分割的图像中具有独特性质的区域提取出来⽤于不同的研究。图像识别的基础是图像分割,其作⽤是把反映物体真实情况的、占据不同区域的、具有不同特性的⽬标区分开来,并形成数字特征。因此本⽂利⽤c-means聚类算法实现图像分割,实现对噪声的过滤,在构建烟雾识别模型的过程中,⾸先分别对⽆烟和有烟的图像进⾏c-means聚类图像分割。
本⽂对预处理过后的训练集和测试集图像进⾏像素聚类,在此分别列举⼀张有烟图和⽆烟图的图像分割前后的效果对⽐。如图2-4和图2-5所⽰
图2-4 ⽆烟图像分割前后对照图
图2-5有烟图像分割前后对照图
2.3 LBP算法实现
本⽂LBP算法将像素聚类(3类)以后的图像进⾏特征提取。在此分别列举⼀张有烟图和⽆烟图的图像特征提取前后的效果对⽐。
图2-6⽆烟三像素聚类LBP特征提取前后对照图
图2-7有烟三像素聚类LBP特征提取前后对照图
本⽂PCA算法将HOG或LBP提取的特征进⾏特征降维,使数据可视化。PCA算法可以获取原有特征的⼤部分信息,降维以后的前k个特征值保留下来的信息占原有信息的⽐例可有下式计算获得。
对LBP算法提取的特征进⾏特征降维,在此取前两维特征进⾏模型训练,前两维度保留的信息含有98.75%,如下图2-8所⽰.
2.4 SVM算法实现
在经过上述图像预处理、图像像素聚类、LBP特征提取、PCA特征降维⾄两维过程之后,将⼆维特征向量作为输⼊训练SVM 模型,最终得到模型在训练集上的分类准确度。
利⽤k-means+LBP+PCA+SVM算法,多次训练模型,最终取平均值,得到在训练集上的分类准确度为79%,在测试集上的分类准确度为78%。下图为模型在训练集上的分类效果图。
三、结果分析
经过第⼆章的算法实现,最终得到了完整的SVM⼆分类模型,利⽤该模型对test中的pos样本的图⽚和neg样本的图⽚进⾏预测。预测前,⾸先需要对测试集图⽚经过预处理、其次利⽤k-means3聚类法对像素进⾏聚类得到最终图像分割聚类图、然后对聚类图进⾏LBP特征提取、最后再利⽤PCA对提取出来的特征进⾏特征降维。将最终得到的⼆维特征向量作为模型的输⼊,进⾏分类预测,最终得到结果。对于LBP特征提取⽅法,在训练集和测试集上的准确率分别为79%和78%。经过对⽐可以发现模型的泛化性能良好。
最后笔者不得不提的是,之所以采取上诉⽅法实现烟雾识别是因为,⼤作业要求必须包含聚类、分类、降维。笔者也尝试过直接使⽤LBP+SVM实现烟雾识别的⽅法,并且对测试集的准确率可以达到93%。
这是两种不⼀样的解决问题的思路。若采⽤本⽂的思路是Pipeline,若直接采⽤LBP+SVM的思路叫做end2end,各有优缺点。Pipeline是将⼀个问题拆解成若⼲个⼦问题⼀次解决,然后串在⼀起,这种⽅法易于实现,且灵活性和可解释性更⾼,但缺点是多个⼦任务会造成错误累积。end2end是将⼀个问
题看成⼀个整体,⼀般可以获得⽐pipeline更⾼的性能,但是整体像⼀个⿊盒,可解释性差。现在深度学习最新研究的趋势是end2end的⽅法。
%基于LBP特征提取的主程序代码
clc;
clear ;
k = 2;
acc1 = 0;
acc2 = 0;
气泵接头acc = 0;
%%  标签制作
ReadList1  = textread('','%s','delimiter','\n');%载⼊正样本列表
sz1=size(ReadList1);水泥锥
label1=ones(sz1(1),1); %正样本标签
ReadList2  = textread('','%s','delimiter','\n');%载⼊负样本列表
sz2=size(ReadList2);
label2=zeros(sz2(1),1);%负样本标签
label_train = [label1',label2'];%训练集标签
ReadList_pos = textread('pos_','%s','delimiter','\n');%载⼊测试正样本列表
sz_pos=size(ReadList_pos);
label_pos=ones(sz_pos(1),1); %正样本标签
ReadList_neg  = textread('neg_','%s','delimiter','\n');%载⼊测试负样本列表
sz_neg=size(ReadList_neg);
label_neg=zeros(sz_neg(1),1);%负样本标签
label_test = [label_pos',label_neg'];%测试集误差
total_trainnum=length(label_train);
total_testnum = length(label_test);
data1 = zeros(total_trainnum,256);
data2 = zeros(total_testnum,256);
%% 提取特征
%读取训练集正样本并计算lbp特征
for i=1:sz1(1)数控剪床
name=char(ReadList1(i,1));
image1=imread(strcat('F:\模式识别matlab程序\模式识别⼤作业\yanwujiance\pos\',name));
I=double(image1)/255;
clu_kmeans=imkmeans(I,3);
clu_pic=clu_kmeans/3;
lbps = lbp(clu_pic);
data1(i,:)=lbps;
end
%读取训练集负样本并计算lbp特征
for j=1:sz2(1)
name= char(ReadList2(j,1));
image2=imread(strcat('F:\模式识别matlab程序\模式识别⼤作业\yanwujiance\neg\',name));
I=double(image2)/255;
clu_kmeans=imkmeans(I,3);
clu_pic=clu_kmeans/3;
lbps = lbp(clu_pic);
data1(sz1(1)+j,:)=lbps;
end
%读取测试集正样本并计算lbp特征
for m=1:sz_pos(1)
test_name= char(ReadList_pos(m,1));
image3=imread(strcat('F:\模式识别matlab程序\模式识别⼤作业\yanwujiance\test\pos_test\',test_name));      I=double(image3)/255;
clu_kmeans=imkmeans(I,3);
clu_pic=clu_kmeans/3;
lbpst= lbp(clu_pic);
data2(m,:)=lbpst;
end
%读取测试集负样本并计算lbp特征
for n =1:sz_neg(1)
test_name=char(ReadList_neg(n,1));
image4=imread(strcat('F:\模式识别matlab程序\模式识别⼤作业\yanwujiance\test\neg_test\',test_name));    I=double(image4)/255;
clu_kmeans=imkmeans(I,3);
clu_pic=clu_kmeans/3;
lbps = lbp(clu_pic);
data2(sz_pos(1)+n,:)=lbpst;
end
load data1
load data2
load svmStruct3
%数据降维
[COEFF SCORE latent]=princomp(data1(:,:));%训练集数据降维
pcaData1 = SCORE(:,1:k);
latent = 100*latent/sum(latent);
for i = 1:8
latent(i+1) = latent(i+1)+latent(i)
end
plot(latent(1:8));%画出前8个特征值所包含的图像信息⽐例
x0 = bsxfun(@minus,data2,mean(data2,1));
pcaData2_sw = x0*COEFF(:,:);
pcaData2 = pcaData2_sw(:,1:k);
%%  评估⽅法:交叉验证法
[train, test] = crossvalind('holdOut',label_train);  %随机选择训练集合测试集
cp = classperf(label_train);  %评估分类器性能
svmStruct3hog = svmtrain(pcaData1(train,1:k),label_train(train));%训练SVM分类器
%使⽤svmtrain进⾏训练,得到训练后的结构svmStruct3hog,在预测时使⽤
save svmStruct3hog  %%保存 svmStruct3hog
cros = svmclassify(svmStruct3hog,pcaData1(test,1:k));
classperf(cp,cros ,test);
cp.CorrectRate
vga连接器
%% 测试
load svmStruct3hog
for i=1:sz_pos(1)
classes = svmclassify(svmStruct3,pcaData2(i,:));%classes的值即为分类结果
if classes==1
acc1=acc1+1;%记录正确分类的样本数
end
end
for j = sz_pos(1)+1:1383
classes = svmclassify(svmStruct3,pcaData2(j,:));%classes的值即为分类结果
if classes~=1
acc2=acc2+1;%记录正确分类的样本数
end
end
acc = acc1+acc2;
fprintf('精确度为:%5.2f%%\n',(acc/(sz_neg(1)+sz_pos(1)))*100);%计算预测的正确率
%lbp特征提取代码
function result = lbp(varargin) % image,radius,neighbors,mapping,mode)
% Check number of input arguments.
系统中断控制器error(nargchk(1,5,nargin));
image=varargin{1};
d_image=double(image);
if nargin==1
spoints=[-1 -1; -1 0; -1 1; 0 -1; -0 1; 1 -1; 1 0; 1 1];
neighbors=8;
mapping=0;t28-464
mode='h';
end
if (nargin == 2) && (length(varargin{2}) == 1)
error('Input arguments');
end
if (nargin > 2) && (length(varargin{2}) == 1)
radius=varargin{2};
neighbors=varargin{3};
spoints=zeros(neighbors,2);
% Angle step.
a = 2*pi/neighbors;
for i = 1:neighbors
spoints(i,1) = -radius*sin((i-1)*a);
spoints(i,2) = radius*cos((i-1)*a);
end
if(nargin >= 4)
mapping=varargin{4};
if(isstruct(mapping) && mapping.samples ~= neighbors)
error('Incompatible mapping');
end
else
mapping=0;
end
if(nargin >= 5)
mode=varargin{5};
else
mode='h';
end
end
if (nargin > 1) && (length(varargin{2}) > 1)
spoints=varargin{2};
neighbors=size(spoints,1);
if(nargin >= 3)
mapping=varargin{3};
if(isstruct(mapping) && mapping.samples ~= neighbors)
error('Incompatible mapping');
end
else
mapping=0;
end
if(nargin >= 4)
mode=varargin{4};
else
mode='h';
end
end
% Determine the dimensions of the input image.
[ysize xsize] = size(image);
miny=min(spoints(:,1));
maxy=max(spoints(:,1));
minx=min(spoints(:,2));
maxx=max(spoints(:,2));
% Block size, each LBP code is computed within a block of size bsizey*bsizex bsizey=ceil(max(maxy,0))-floor(min(miny,0))+1;
bsizex=ceil(max(maxx,0))-floor(min(minx,0))+1;
% Coordinates of origin (0,0) in the block
origy=1-floor(min(miny,0));
origx=1-floor(min(minx,0));
% Minimum allowed size for the input image depends
% on the radius of the used LBP operator.
if(xsize < bsizex || ysize < bsizey)
error('Too small input image. Should be at least (2*radius+1) x (2*radius+1)');

本文发布于:2024-09-21 19:49:10,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/98808.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:特征   训练   图像   算法   测试
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议