1、文件结构如图所示 训练集 测试集 下面分布存有正负样本
2、代码分析:设置标签 自动读取 分别生成一个txt 文件,自动读取TXT文件访问图片
clc;
clear ;
%% 训练阶段
ReadList1 = textread('I:\SVM\train\pos\pos.txt','%s','delimiter','\n');%载入正样本列表
ReadList1(1001)=[];
sz1=size(ReadList1);
label1=ones(sz1(1),1); %正阳本标签
ReadList2 = textread('I:\SVM\train\neg\neg.txt','%s','delimiter','\n');%载入负样本列表
ReadList2(1001)=[];
sz2=size(ReadList2);
label2=zeros(sz2(1),1);%负样本标签
label=[label1',label2']';%标签汇总
total_num=length(label);
data=zeros(total_num,1764);
3、使用传统hog svm 提取特征与融合 完整的代码如下
clc;
clear ;
%% 训练阶段
ReadList1 = textread('I:\SVM\train\pos\pos.txt','%s','delimiter','\n');%载入正样本列表
ReadList1(1001)=[];
sz1=size(ReadList1);
label1=ones(sz1(1),1); %正阳本标签
ReadList2 = textread('I:\SVM\train\neg\neg.txt','%s','delimiter','\n');%载入负样本列表
ReadList2(1001)=[];
sz2=size(ReadList2);
label2=zeros(sz2(1),1);%负样本标签
label=[label1',label2']';%标签汇总
total_num=length(label);
data=zeros(total_num,1764);
% num=0;
%读取正样本并计算hog特征
for i=1:sz1(1)
name= char(ReadList1(i,1));
image=imread(strcat('train\pos\',name));
% image=imread(name); 作用同上
im=imresize(image,[64,64]); %%%%%%需要16的倍数 1152*864
% img=rgb2gray(im);
hog =hogcalculator(im);
data(i,:)=hog;
end
%读取负样本并计算hog特征
for j=1:sz2(1)
name= char(ReadList2(j,1));
image=imread(strcat('train\neg\',name));
im=imresize(image,[64,64]);
% img=rgb2gray(im);
hog =hogcalculator(im);
data(sz1(1)+j,:)=hog;
end
[train, test] = crossvalind('holdOut',label);
cp = classperf(label);
svmStruct = svmtrain(data(train,:),label(train));
save svmStruct svmStruct
classes = svmclassify(svmStruct,data(test,:));
classperf(cp,classes,test);
cp.CorrectRate
%% 训练完成后保存 svmStruct即可对新输入的对象进行分类了无需再执行上面训练阶段代码
load svmStruct
test=imread('test\0\2571.tif');
im=imresize(test,[64,64]);
figure;
% imshow(im);
% img=rgb2gray(im);
hogt =hogcalculator(im);
classes = svmclassify(svmStruct,hogt);
%classes的值即为分类结果
% charsImage1 = textread('I:\SVM\test\1\1.txt','%s','delimiter','\n');
charsImage1 = textread('I:\SVM\test\0\0.txt','%s','delimiter','\n');
charsImage1(end)=[];
legth=size(charsImage1);
testclasses=ones(1,800);
num=0;
for i=1:legth
testname= char(charsImage1(i,1));
testimage=imread(strcat('test\0\',testname));
testim=imresize(testimage,[64,64]); %需要16的倍数
% testimg=rgb2gray(testimage);
testhogt =hogcalculator(testim);
testclasses(i) = svmclassify(svmStruct,testhogt);
if testclasses(i)==1
num=num+1;
fprintf('The num is %3d\n',i)
end
end