四、SVM提取建筑物信息
想要一个人独立实现SVM机器学习算法还是有一定的难度的,涉及的知识点比较多,SVM的公式推导过程也是一些大公司的面试题,这里懂得SVM的实现原理就ok了,这里就直接调用matlab里的SVM接口吧,QAQ。
这里利用的SVM(支持向量机)是一种二分类(还有多分类的)模型,其基本原理可以简单描述为:找到一个超平面,将数据集分成两类,使得距离最近的非同类点的距离最大。其最重要的环节就是,寻找支持向量(离超平面最近的点)以确定超平面,从而把数据可以分类成两个类别。在二分类的处理中,超平面的选择就是一条直线,但是很多数据都不能用一个简单的直线进行划分两个类别,这时候就需要通过核函数的处理,将数据映射到更高维的空间,便于SVM能通过一条直线(超平面)进行二分类。通过训练数据的选取,进行SVM训练,得到相应的模型,再进行预测得到相应的精度。在精度合理之后即可进行完整模型的生成,提取出相应的建筑物信息。
部分代码片段:
msgbox(strcat('请选择',num2str(edit2_text_value/2),'个背景训练数据'),'目标样','help');
figure;imshow(RGB_image);
for i=1:edit2_text_value/2
if h>=5000
pause;
end
[x,y]=ginput(1);
x=floor(x);
y=floor(y);
hold on;
plot(x,y,'r*');
TrainData_background(i,:)=RGB_image(y,x,:);%第i行的所有列
accuracy(i,1)=x;
accuracy(i,2)=y;
%LBP_TrainData_background(i,:)=LBP_image(y,x,:);
end
%% 选取目标训练数据
msgbox(strcat('请选择',num2str(edit2_text_value/2),'个目标数据'),'目标样','help');
pause;%按任意键进行
for i=1:edit2_text_value/2
if h>=5000
pause;
end
[x,y]=ginput(1);
x=floor(x);
y=floor(y);
hold on
plot(x,y,'b*');
TrainData_foreground(i,:)=RGB_image(y,x,:);%数组的前两个参数是行和列,图像的是坐标x和y
%LBP_TrainData_foreground(i,:)=LBP_image(y,x,:);
accuracy(i+edit2_text_value/2,1)=x;
accuracy(i+edit2_text_value/2,2)=y;
end
%% 整合训练数据和标号数据
TrainData=[TrainData_background;TrainData_foreground];
%train_data=TrainData; %用于输出训练数据
%LBP_TrainData=[LBP_TrainData_background;LBP_TrainData_foreground];
%按列向量的形式加入原来的TrainData后
%TrainData=horzcat(TrainData,LBP_TrainData);
%length(TrainData_background)%找出维数长度的最大值
text_str=write("----------------------------------------------------------------------------");
text_str=write("训练数据:");
for i=1:edit2_text_value
text_str=write(strcat(num2str(TrainData(i,1))," ",num2str(TrainData(i,2))," ",num2str(TrainData(i,3))));
if i==edit2_text_value/2
text_str=write("------------------------------以下为目标数据------------------------------");
end
end
text_str=write("----------------------------------------------------------------------------");
end
TrainLabel=[zeros(length(TrainData)/2,1);ones(length(TrainData)/2,1)];
%LBP_TrainLabel=[zeros(length(LBP_TrainData_background),1);ones(length(LBP_TrainData_foreground),1)];
%训练支持向量积
model=fitcsvm(TrainData,TrainLabel);
%LBP_model=fitcsvm(LBP_TrainData,LBP_TrainLabel);
%%训练数据预测分类
preTrainLabel=predict(model,TrainData);
%LBP_preTrainLabel=predict(LBP_model,LBP_TrainData);
num=sum(preTrainLabel == TrainLabel);
%LBP_num=sum(LBP_preTrainLabel == LBP_TrainLabel);
p_num=num/length(TrainLabel)*100;
%LBP_p_num=LBP_num/length(LBP_TrainLabel)*100;
%% 图像分类
[m,n,k]=size(RGB_image);
TestData=reshape(RGB_image,m*n,k);
%[m1,n1,k1]=size(LBP_image);
%LBP_TestData=reshape(LBP_image,m1*n1,1);
%TestData=horzcat(TestData,LBP_TestData);
TestData=double(TestData);
%LBP_TestData=double(LBP_TestData);
TestLabel=predict(model,TestData);%二分类的结果也就0或1
%LBP_TestLabel=predict(LBP_model,LBP_TestData);
%二值分类结果
img_seg=reshape(TestLabel,m,n);
%LBP_img_seg=reshape(LBP_TestLabel,m1,n1);
figure;imshow(img_seg);
%figure;imshow(LBP_img_seg); %背景数据二值分类结果
%% 目标提取结果
%ind=repmat(img_seg,1,1,k); %复制K次(深度)
pic_seg=RGB_image;
global Build_number;
for i=1:n
for j=1:m
if img_seg(j,i)==0
pic_seg(j,i,:)=0;
else
Build_number=Build_number+1;
end
end
end
text_str=write(strcat("建筑物面积:",num2str(Build_number)));
%pic_seg(~ind)=0; %非目标数据灰度值设为0
%LBP_pic_seg=LBP_image;
%LBP_background=int16(LBP_img_seg);
%LBP_pic_seg(~LBP_background)=0;
% for i=1:n1
% for j=1:m1
% if LBP_background(j,i)==0
% LBP_pic_seg(j,i)=0;
% end
% end
% end
figure;imshow(pic_seg);
imshow(pic_seg,'Parent',handles.axes1)
Build_image=pic_seg;
RGB_count=0;
if accuracy(:,1)~=0
for i=1:edit2_text_value
if img_seg(accuracy(i,2),accuracy(i,1))==0 && i<edit2_text_value/2+1
RGB_count=RGB_count+1;
end
if img_seg(accuracy(i,2),accuracy(i,1))==1 && i>=edit2_text_value/2+1
RGB_count=RGB_count+1;
end
end
else
for k=1:length(TrainData)
label=0;
for i=1:n
for j=1:m
if (TrainData(k,1)==RGB_image(j,i,1)) && (TrainData(k,2)==RGB_image(j,i,2)) &&(TrainData(k,3)==RGB_image(j,i,3)) &&img_seg(j,i)==0 && k<length(TrainData)/2+1
RGB_count=RGB_count+1;
label=1;
break;
end
if (TrainData(k,1)==RGB_image(j,i,1)) && (TrainData(k,2)==RGB_image(j,i,2)) &&(TrainData(k,3)==RGB_image(j,i,3)) &&img_seg(j,i)==1 && k>=length(TrainData)/2+1
RGB_count=RGB_count+1;
label=1;
break;
end
end
if label==1
break;
end
end
end
end
RGB_accuracy=RGB_count/length(TrainData)*100;
text_str=write(strcat("分类精度为:",num2str(RGB_accuracy),"%"));
%figure;imshow(LBP_pic_seg);
%LBP纹理图像对应的彩色图像结果
% LBP_RGB=RGB_image;
% %LBP_RGB_count=0;
% for i=1:n1
% for j=1:m1
% if LBP_pic_seg(j,i)==0
% LBP_RGB(j,i,:)=0;
% end
% end
% end
% figure;imshow(LBP_RGB);
figure;
%% 显示提取结果
subplot(1,3,1);imshow(RGB_image);
subplot(1,3,2);imshow(img_seg);
subplot(1,3,3);imshow(Build_image);
需要完整代码的童鞋,关注我私聊哈。