【matlab】libsvm-3.18安装与使用

安装

1. 在http://www.csie.ntu.edu.tw/~cjlin/ 中下载libsvm

2. 按照http://zjhello123.blog.163.com/blog/static/25495143201251792625811/ 中的安装方法安装libsvm

3. 设置路径。 如果不设置的话会报错:Error using svmtrain (line 233) Y must be a vector or a character array. 

我开始设置了也报错,后来重新make了一下,就好了。不知道为什么。

 

使用

用libsvm对人和车分类

1. 先分别在两个文件夹下放入若干张人和车的图片,做训练样本。再用两个文件夹中放若干图片做测试样本。

2. 读入图片,保存成mat数据。具体代码如下:

clc;clear;
pathname=uigetdir(cd,'请选择文件夹');
if pathname==0
    msgbox('您没有正确选择文件夹');
    return;
end

% pathnamesub=uigetdir(cd,'请选择文件夹');
% if pathname==0
%     msgbox('您没有正确选择文件夹');
%     return;
% end

% 可以打开几乎所有的图像类型
filesbmp=ls(strcat(pathname,'\*.bmp'));
filesjpg=ls(strcat(pathname,'\*.jpg'));
filesjpeg=ls(strcat(pathname,'\*.jpeg'));
filesgif=ls(strcat(pathname,'\*.gif'));
filestif=ls(strcat(pathname,'\*.tif'));
filespng=ls(strcat(pathname,'\*.png'));
files=[cellstr(filesbmp);cellstr(filesjpg);...
    cellstr(filesjpeg);cellstr(filesgif);...
    cellstr(filestif);cellstr(filespng)];
len=length(files);
flag=[];

% 开始批量处理图像,转换格式
num=0;
for ii=1:len
    if strcmp(cell2mat(files(ii)),'')
        continue;
    end
    num=num+1;
    Filesname{num}=strcat(pathname,'\',files(ii));
    page{num}=imread(cell2mat(Filesname{num}));

end


filename=input('outputfilename:','s');
save (['C:\Documents\MATLAB\svm数据\',filename],'page');

对训练和测试的四个文件夹分别调用上面代码,会把每个文件夹中的图片都存在 page里面 自己再改名字 我分别命名为 

3.

将上面的数据转换成svmtrain调用时需要的数据: 包括灰度化、统一大小、提取特征(这里用的hog特征)、生成label数据等

%获取训练数据
load('C:\Users\Documents\MATLAB\svm数据\car_train_svm_rgb.mat');
load('C:\Users\Documents\MATLAB\svm数据\person_train_svm_rgb.mat');

num_train_car = size(car_train_svm_rgb);
num_train_person = size(person_train_svm_rgb);
train_num = num_train_car(1, 2) + num_train_person(1, 2); %总训练样本数目
train_data = zeros(train_num, 1); 
train_label = zeros(train_num, 1);

for i = 1 : 1 : num_train_car(1, 2)
    data_gray=rgb2gray(car_train_svm_rgb{1,i});
    data_resize=double(imresize(data_gray,[64 64]));  %把数据都转为64 * 64大小的灰度图
    feature_of_one = hog(data_resize);  %获取hog特征
    [m1, n1] = size(feature_of_one);
    for j = 1 : 1 : n1
        oneline = feature_of_one{1, j};
        [m, n] = size(oneline);
        colb = (j - 1) * n + 1;
        cole = j * n;
        train_data(i, colb : cole) = oneline;
        train_label(i, 1) = 1;        %car的标签为1
    end
end

for i = 1 : 1 : num_train_person(1, 2)
    data_gray=rgb2gray(person_train_svm_rgb{1,i});
    data_resize=double(imresize(data_gray,[64 64]));  %把数据都转为64 * 64大小的灰度图
    feature_of_one = hog(data_resize);  %获取hog特征
    [m1, n1] = size(feature_of_one);
    for j = 1 : 1 : n1
        oneline = feature_of_one{1, j};
        [m, n] = size(oneline);
        colb = (j - 1) * n + 1;
        cole = j * n;
        train_data(i + num_train_car(1, 2), colb : cole) = oneline;
        train_label(i + num_train_car(1, 2), 1) = 2;        %person的标签为2
    end
end

%获取测试数据
load('C:\Users\Documents\MATLAB\svm数据\car_test_svm_rgb.mat');
load('C:\Users\Documents\MATLAB\svm数据\person_test_svm_rgb.mat');

num_test_car = size(car_test_svm_rgb);
num_test_person = size(person_test_svm_rgb);
test_num = num_test_car(1, 2) + num_test_person(1, 2); %总训练样本数目
test_data = zeros(test_num, 1); 
test_label = zeros(test_num, 1);

for i = 1 : 1 : num_test_car(1, 2)
    data_gray=rgb2gray(car_test_svm_rgb{1,i});
    data_resize=double(imresize(data_gray,[64 64]));  %把数据都转为64 * 64大小的灰度图
    feature_of_one = hog(data_resize);  %获取hog特征
    [m1, n1] = size(feature_of_one);
    for j = 1 : 1 : n1
        oneline = feature_of_one{1, j};
        [m, n] = size(oneline);
        colb = (j - 1) * n + 1;
        cole = j * n;
        test_data(i, colb : cole) = oneline;
        test_label(i, 1) = 1;        %car的标签为1
    end
end

for i = 1 : 1 : num_test_person(1, 2)
    data_gray=rgb2gray(person_test_svm_rgb{1,i});
    data_resize=double(imresize(data_gray,[64 64]));  %把数据都转为64 * 64大小的灰度图
    feature_of_one = hog(data_resize);  %获取hog特征
    [m1, n1] = size(feature_of_one);
    for j = 1 : 1 : n1
        oneline = feature_of_one{1, j};
        [m, n] = size(oneline);
        colb = (j - 1) * n + 1;
        cole = j * n;
        test_data(i + num_test_car(1, 2), colb : cole) = oneline;
        test_label(i + num_test_car(1, 2), 1) = 2;        %person的标签为2
    end
end

hog特征提取代码: 网上找的,可以用。抱歉不记得来源了。

function feature = hog(img)

[m n]=size(img);

img=sqrt(img);      %伽马校正

%下面是求边缘
fy=[-1 0 1];        %定义竖直模板
fx=fy';             %定义水平模板
Iy=imfilter(img,fy,'replicate');    %竖直边缘
Ix=imfilter(img,fx,'replicate');    %水平边缘
Ied=sqrt(Ix.^2+Iy.^2);              %边缘强度
Iphase=Iy./Ix;              %边缘斜率,有些为inf,-inf,nan,其中nan需要再处理一下


%下面是求cell
step=16;                %step*step个像素作为一个单元
orient=9;               %方向直方图的方向个数
jiao=360/orient;        %每个方向包含的角度数
Cell=cell(1,1);              %所有的角度直方图,cell是可以动态增加的,所以先设了一个
ii=1;                      
jj=1;
for i=1:step:m - step          %如果处理的m/step不是整数,最好是i=1:step:m-step
    ii=1;
    for j=1:step:n - step      %注释同上
        tmpx=Ix(i:i+step-1,j:j+step-1);
        tmped=Ied(i:i+step-1,j:j+step-1);
        tmped=tmped/sum(sum(tmped));        %局部边缘强度归一化
        tmpphase=Iphase(i:i+step-1,j:j+step-1);
        Hist=zeros(1,orient);               %当前step*step像素块统计角度直方图,就是cell
        for p=1:step
            for q=1:step
                if isnan(tmpphase(p,q))==1  %0/0会得到nan,如果像素是nan,重设为0
                    tmpphase(p,q)=0;
                end
                ang=atan(tmpphase(p,q));    %atan求的是[-90 90]度之间
                ang=mod(ang*180/pi,360);    %全部变正,-90变270
                if tmpx(p,q)<0              %根据x方向确定真正的角度
                    if ang<90               %如果是第一象限
                        ang=ang+180;        %移到第三象限
                    end
                    if ang>270              %如果是第四象限
                        ang=ang-180;        %移到第二象限
                    end
                end
                ang=ang+0.0000001;          %防止ang为0
                Hist(ceil(ang/jiao))=Hist(ceil(ang/jiao))+tmped(p,q);   %ceil向上取整,使用边缘强度加权
            end
        end
        Hist=Hist/sum(Hist);    %方向直方图归一化
        Cell{ii,jj}=Hist;       %放入Cell中
        ii=ii+1;                %针对Cell的y坐标循环变量
    end
    jj=jj+1;                    %针对Cell的x坐标循环变量
end

%下面是求feature,2*2个cell合成一个block,没有显式的求block
[m n]=size(Cell);
feature=cell(1,(m-1)*(n-1));
for i=1:m-1
   for j=1:n-1           
        f=[];
        f=[f Cell{i,j}(:)' Cell{i,j+1}(:)' Cell{i+1,j}(:)' Cell{i+1,j+1}(:)'];
        feature{(i-1)*(n-1)+j}=f;
   end
end


%到此结束,feature即为所求
%下面是为了显示而写的
% l=length(feature);
% f=[];
% for i=1:l
%     f=[f;feature{i}(:)'];  
% end 
% figure
% mesh(f)
end

4.训练预测

model = svmtrain(train_label, train_data, '-s 0 -t 2 -c 1 -g 0.1');
[predicted_label, accuracy, decision_values] = svmpredict(test_label, test_data, model);

 

结果如下:

posted @ 2014-07-16 16:19  匡子语  阅读(1491)  评论(0编辑  收藏  举报